C while循环计算兴趣

时间:2015-03-19 20:45:32

标签: crash c

我希望我的程序使用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);
}

2 个答案:

答案 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 ++中,变量通常没有任何特定值,除非您为其分配一个

  • 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);
}