2016-04-08 16 views
0

Takılan para miktarının kullanıcı için bozuk paraya dönüştürüldüğü fatura değiştirici için bir kod yazmaya çalışıyorum. Sorun, 111.111'i girdiğimde 222.222 gibi 50c'lik miktarımın ondalıklarını tutmamdır. Benim 20c ve 10c kullanılmayan olduğunu .. Eğer bölünme sonrasında değerini yuvarlamak gerekir tamsayı değerlerine sahip amount zorlamak içinFatura değiştirici/bozuk para otomatı için bir kod yazılmaya çalışılıyor

#include <stdio.h> 

int main() 

{ 
    double sum50c=0, sum20c=0, sum10c=0, remainder, remainder2, remainder3, end=0; 
    double amount; 

    do 
    { 

    printf("Please enter an amount(dollars):"); 
    scanf("%lf", &amount); 

    amount=amount*100; 

    if(amount<0){ 
     printf("Invalid Input\n"); 
     printf("Re-enter your amount:"); 
     scanf("%lf", &amount); 
    } 

    if(amount>=50){ 
     remainder=amount/50; 
     sum50c=remainder; 

    }else 
    if(remainder!=0){ 
     remainder2=remainder/20; 
     sum20c=remainder2; 

    }else  
    if(remainder2!=0){ 
     remainder3=remainder3/10; 
     sum10c=remainder3; 

    } 

    if(sum50c>200||sum20c>200||sum10c>200){ 
     end++; 
    }else{ 
     end=0; 
    } 

    } 
     while(end<=0); 

    printf("The amount of 50cents=%lf, 20cents=%lf, 10cents=%lf", sum50c, sum20c, sum10c); 


} 
+6

Gerçek sayılar kullanmamalısınız. Tam olarak paralar dağıtılmış olduğundan ve 5.55 cent sikke olmadığından tamsayıları kullanın. Sentlerde çalışmak (1 sent atomiktir ve bundan daha küçük bir şey olamaz). –

+0

Ayrıca, 'bir şey/x 'size kalanı değil, bölümü verir. Tavsiye edildiği gibi tam sayılara geçin ve daha sonra '%' (modulo) operatöründe okuyun. – Lundin

cevap

0

yardım edin:

if(amount>=50) 
{ 
     remainder=round(amount/50); 
     sum50c=remainder; 
} 
1

Kodunuzdaki iki hatalar temelde vardır:

  • Kayan nokta sayılarını burada çalıştırmayın. Sikke sayısı, int veya belki de unsigned int olarak gösterilmesi gereken ayrık bir sayı olacaktır. Miktarın kendisi basitlik için kayan nokta sayısı olarak okunabilir, ancak yuvarlama hatalarını önlemek için integerin sırasına göre sent sayısına de dönüştürülmelidir.
  • Madeni paraların kombinasyonlarını bulmalısınız: 30c,% 1'dir, 20c + 1 × 10c. Bu, yalnızca bir tür bozuk parayı düşünecek olan else if zincirlerini kullanamayacağınız anlamına gelir. Önce her türlü bozuk paraya, yüksek tende cinsine muamele yapın ve sonra işlemek için gereken miktarı azaltın. En küçük para olarak 10c ile tüm tutarlar için tam bir değişiklik yapamayabileceğinizi unutmayın.

Burada dış döngü olmadan ve garip end iş olmadan size örnek:

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    int num50c = 0, 
     num20c = 0, 
     num10c = 0; 
    int amount;    // amount in cents 
    double iamount;   // input amount in dollars 

    printf("Please enter an amount: "); 
    scanf("%lf", &iamount); 

    amount = iamount * 100 + 0.5; 

    if (amount < 0) { 
     printf("Invalid Input\n"); 
     exit(1); 
    } 

    num50c = amount/50; 
    amount %= 50; 

    num20c = amount/20; 
    amount %= 20; 

    num10c = amount/10; 
    amount %= 10; 

    printf("%d x 50c = %d\n", num50c, num50c * 50); 
    printf("%d x 20c = %d\n", num20c, num20c * 20); 
    printf("%d x 10c = %d\n", num10c, num10c * 10); 
    printf("Remainder: %dc\n", amount); 

    return 0; 
} 
İlgili konular