是什么导致我的数字达到疯狂的值?

0 c

只是故意重复 if 语句程序来进行备用更改,但由于未知原因,它会拍摄应该为 0 的数字到某个最大值?我真的很想得到一些帮助来解释为什么

#include <stdio.h>

int main(void) {

   int a;
   int b;
   int c;
   int d;
   int e;
   int cha;
   
   scanf("%d", &cha);
   
   if(cha == 0){
      printf("No change\n");
      return 0;
   }   
   if(cha >= 100){
      a = cha / 100;
      cha = cha % 100;
   }
   if(100> cha && cha >= 25){
      b = cha / 25;
      cha = cha % 25;
   }
   if(25 > cha && cha >= 10){
      c = cha / 10;
      cha = cha % 10;
   }
   if(10 > cha && cha >= 5){
      d = cha / 5;
      cha = cha % 5;
   }
   if(5 > cha && cha >= 1){
      e = cha;
   }
   if(a == 1){
      printf("%d Dollar\n",a);
   }
   if(a > 1){
      printf("%d Dollars\n",a);
   }
   if(b == 1){
      printf("%d Quarter\n",b);
   }
   if(b > 1){
      printf("%d Quarters\n",b);
   }
   if(c == 1){
      printf("%d Dime\n",c);
   }
   if(c > 1){
      printf("%d Dimes\n",c);
   }
   if(d == 1){
      printf("%d Nickle\n",d);
   }
   if(d > 1){
      printf("%d Nickles\n",d);
   }
   if(e == 1){
      printf("%d Penny\n",e);
   }
   if(e > 1){
      printf("%d Pennies\n",e);
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是产生的示例

输入

45
Run Code Online (Sandbox Code Playgroud)

你的输出

1 Quarter
2 Dimes
****875483616** Nickles**
**32766 Pennies**
Run Code Online (Sandbox Code Playgroud)

预期产出

1 Quarter
2 Dimes
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 5

为了合并注释,您的变量未初始化,并且您的条件不会导致它们在打印之前全部初始化。您只需将这些变量初始化为 即可避免这种情况0

int main(void) {
   int a = 0;
   int b = 0;
   int c = 0;
   int d = 0;
   int e = 0;
   int cha = 0;

   // ...
Run Code Online (Sandbox Code Playgroud)

但您还应该使用更具描述性的名称。

int main(void) {
   int dollars = 0;
   int quarters = 0;
   int dimes = 0;
   int nickels = 0;
   int pennies = 0;
   int change = 0;
Run Code Online (Sandbox Code Playgroud)

并检查返回值scanf以确保它读取了一个值并且该值大于或等于零。

int main(void) {
   int dollars = 0;
   int quarters = 0;
   int dimes = 0;
   int nickels = 0;
   int pennies = 0;
   int change = 0;

   if (scanf("%d", &change) != 1 || change < 0) {
      printf("Invalid input.\n");
      return 1;
   } 
Run Code Online (Sandbox Code Playgroud)

编写程序时不要重复自己,这一点很重要,这样您就可以循环数组。

#define NUM_COINS 5

int main(void) {
   char *singular_coin_names[] = {
      "dollar", "quarter", "dime",
      "nickel", "penny"
   };

   char *plural_coin_names[] = {
      "dollars", "quarters", "dimes",
      "nickels", "pennies"
   };

   int coin_values[] = { 100, 25, 10, 5, 1 };
   int change_amounts[NUM_COINS] = {0};
   int change;

   if (scanf("%d", &change) != 1 || change < 0) {
      printf("Invalid input.\n");
      return 1;
   } 

   for (size_t i = 0; i < NUM_COINS; i++) {
      if (change == 0) {
         change_amounts[0] = 0;
      }
      else {
         change_amounts[i] = change / coin_values[i];
         change %= coin_values[i];
      }
   }

   for (size_t i = 0; i < NUM_COINS; i++) {
      printf(
         "%d %s\n",
         change_amounts[i],
         change_amounts[i] == 1 
             ? singular_coin_names[i] 
             : plural_coin_names[i]
      );
   }
}
Run Code Online (Sandbox Code Playgroud)