我希望我的程序使用while循环并执行此兴趣计算。如果输入-1作为主体的值,我希望循环结束。
我觉得我错过了一些非常重要的内容,并且不允许我的程序相应地运行。
该程序有时会崩溃,有时会运行,但从不计算利息。
float interest;
float rate;
float principal;
int days;
while(principal !=-1)
{
interest = principal * rate * days / 365;
printf("%s""Enter loan principal (-1 to end):");
scanf("%f", &principal);
printf("%s""Enter interest rate:");
scanf("%f", &rate);
printf("%s""Enter term of the loan in days:");
scanf("%d", &days);
printf("The interest charge is $%.2f", interest);
}
答案 0 :(得分:2)
这里有几个经典的编程错误。这个问题应该迁移到StackOverflow,但我会在此之前提供答案。
在考虑给定代码块的行为时,请始终考虑“什么是价值。”
在这种情况下,在第3行
float principal
执行后变量principal中存储的值是多少? [简单回答:我们不知道。我们需要知道什么类型的编译器,使用哪个版本以及用于从此源创建可执行文件的标志]
为什么我们不知道?与之比较,
float principal = 0.0
现在我们可以清楚地说明价值是什么。
所以,鉴于我们不知道本金的初始值是什么,当它与-1的值相比时会发生什么?为此,我们需要了解浮点值和整数如何存储在特定硬件平台上的内部结构。让我们选择-1的通用格式(如果我们用十六进制表示的位)对应于0xFFFF。现在我们要将该值与本金的值进行比较......由于本金当前具有随机/未知数据,因此它肯定不会等于...这是好消息,因为我们将进入循环!有时...当主体碰巧有位模式0xFFFF
时那么,为什么程序会在进入循环时崩溃呢? 这与代码中的语法错误有关,我认为在编译时会产生警告信息......
我只会查看一行,但所有printf语句都有同样的问题。
printf("%s""Enter loan principal (-1 to end):");
printf在基本时期望打印一个参数或两个参数 - 第一个是如何打印第二个参数的格式。
在这种情况下,你只有一个字符串 - 编译器将两个引用的项目混合成printf的一个参数...这是查看%s的格式说明符并期望第二个字符串...所以它从堆栈中获取一个随机值,并使用它来打印第二个字符串。你应该:
printf("%s", "Enter loan principal (-1 to end):");
修复这些错误,您的代码将正常运行。如果为主体和其他变量提供了良好的值,那么它将正确运行。
答案 1 :(得分:0)
C和C ++编程的一个关键部分是,除非您明确地为其指定值,否则您声明的大多数变量都不会赋值。如果你没有为变量指定一个值,那么变量中的初始值就是 undefined ,这意味着它可以是任何东西。
在大多数系统中,这可能只是在为该变量保留的内存位置中发生的任何值,这实际上是随机的。
因此,您不能假设您声明的变量具有某些已知值,例如0,除非您为它们分配一个。在您的情况下,您需要在声明变量时初始化变量:
float interest = 0.0f;
float rate = 0.0f;
float principal = 0.0f;
int days = 0;
只有这样才能依赖存储在每个变量中的有效值。
如果您希望程序在用户为主体输入-1后立即退出循环,则需要更改循环以在用户输入值后立即检查。
< / LI>这意味着您需要将while
中的条件更改为true
(以便它不会在循环迭代的开始或结束时退出)并添加条件循环中break
。你没有有来检查循环的开始或结束。
在您从用户处获得兴趣值之前,您也不应该计算兴趣值。这意味着计算应该在输入提示之后,但在输出结果之前进行。
如果printf()
语句只打印一个静态字符串,则无需指定要打印的字符串以外的任何内容。在提示的末尾也应该有一个空格,这样输入就不会在没有空格的提示旁边。
具有更正的代码如下:
/* Declare and initialize all variables. */
float interest = 0.0f;
float rate = 0.0f;
float principal = 0.0f;
int days = 0;
/* Don't check for any condition at the start of the loop, just run the loop. */
while(true)
{
printf("Enter loan principal (-1 to end): ");
scanf("%f", &principal);
/* If principal is -1, exit from the loop now. */
if(principal == -1.0f)
break;
printf("Enter interest rate: ");
scanf("%f", &rate);
printf("Enter term of the loan in days: ");
scanf("%d", &days);
/* Compute the interest charge once the input is read. */
interest = principal * rate * days / 365;
/* Display the result. */
printf("The interest charge is $%.2f", interest);
}