2012-08-07 86 views
-1

所以我一直在研究iTunes U上的哈佛CS50课程,并且遇到了一些问题。代码运行然后停止。我解释了代码给我带来麻烦的问题。代码运行正常,但在执行的一半中随机停止

// Program calculates the amount of change you can give with the least amount of coins. 

#include <stdio.h> 
#include <cs50.h> 
#include <math.h> 

int 
main(void) 
{ 

    float change = 0, inputflag = 1; 
    int changeint = 0; 
    int quarter = 25, dime = 10, nickel = 5, penny = 1; // Coins and values 
    int qc = 0, dc = 0, nc = 0, pc = 0; // Coin value change (Qc = Quarter Change) 

// Prompts user for input and validates. 

    while (inputflag == 1) 
    { 
     printf("How much change? "); 
     change = GetFloat(); 

     if (change == 0) 
     { 
      printf("You have no change!\n"); 
      inputflag = 0; 
     } 
     else if (change > 0) 
     { 
      printf("%.2f\n", change); 
      inputflag = 0; 
     } 
     else 
     { 
      printf("Please enter a non-negative number! \n"); 
     } 
    } 

程序在此停止。我运行代码,输入一个可接受的值,然后程序停止运行。它不会移动到下面的部分。

我已经花了最后一个小时过去了,仍然无法弄清楚什么是让程序运行。 inputflag值被设置为0,从而打破第一个while循环,然后应该在下面移动,如果(更改!= 0),它不会......因此,任何建议将不胜感激。

if (change != 0) // If the change is zero, this section is skipped 
     { 
      changeint = round(100 * change); 
      printf("%d", changeint); 
     } 

     // The following four sections subtract coin amount, compare it, and add 1 to count. 
      while (changeint >= quarter);  
      { 
       changeint = changeint - quarter; 
       qc = qc + 1; 
      } 

      while (changeint >= dime); 
      { 
       changeint = changeint - dime; 
       dc = dc + 1; 
      } 

      while (changeint >= nickel); 
      { 
       changeint = changeint - nickel; 
       nc = nc + 1; 
      } 

      while (changeint >= penny); 
      { 
       changeint = changeint - penny; 
       pc = pc + 1; 
      } 

//Prints output 

      printf("You owe a total of %d coins!", qc + dc + nc + pc); 

} 
+0

此外,您可能需要阅读模数('%')运算符。它会让你摆脱这个应用程序中的很多代码。 – duskwuff 2012-08-07 00:27:55

+0

顺便说一下,你可以使用'break;'打破循环,不需要使用变量 – 2012-08-07 00:28:08

+0

哦,我忘了 - GetFloat语句是在一个课程独家图书馆。但是,我不认为这是问题,因为它没有突破外观。我会尝试'break;'语句并回报 – user1580558 2012-08-07 00:31:27

回答

6

在每个while声明的第一行的分号是责任。您应该删除它们,以避免一个必然的无限循环:

 while (changeint >= quarter) 
     { 
      changeint = changeint - quarter; 
      qc = qc + 1; 
     } 

     while (changeint >= dime) 
     { 
      changeint = changeint - dime; 
      dc = dc + 1; 
     } 

     while (changeint >= nickel) 
     { 
      changeint = changeint - nickel; 
      nc = nc + 1; 
     } 

     while (changeint >= penny) 
     { 
      changeint = changeint - penny; 
      pc = pc + 1; 
     } 

是,即使是最简单的问题可能被忽略,和/同时用分号语句是其中之一(可以预期)。

+1

这就是为什么你应该编译并注意警告。海湾合作委员会,至少,警告这个错误。 – Kevin 2012-08-07 00:48:31

+0

甜。这个伎俩。然而,我仍然对为什么代码没有执行到'if(change!= 0)而感到困惑//如果变化为零,这部分被跳过 { changeint = round(100 * change) ; printf(“%d”,changeint); } '如果问题出现在while语句中 – user1580558 2012-08-07 00:51:26

+0

printf()调用不能保证程序没有执行任何语句。你可能没有看到这个值被打印到标准输出,这让你做了这个假设。但是请记住,一旦printf()被调用,实际的打印过程就被系统所占用,并且在调用之后可能不会立即发生。 – 2012-08-07 00:58:34