【问题标题】:This is Cs50 problem set1 cash. I don't know what's wrong with this code can someone help me这是 Cs50 问题 set1 现金。我不知道这段代码有什么问题可以帮助我
【发布时间】:2021-10-14 06:12:21
【问题描述】:

这是 Cs50 问题 set1 现金。我不知道这段代码有什么问题,有人可以帮助我。我只是添加了引号,因为 stackoverflow 不允许我发布它。 您的程序应按照以下示例运行。

$ ./cash
Change owed: 0.41
4
#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main(void)
{
    int i = 0;
    int a = 0;
    int b = 0;
    int c = 0;
    float change_owed;
    do
    {
        change_owed = get_float("change owed: ");
    }
    while (change_owed <=0); 

    change_owed=round(change_owed*100);
    printf("%f\n", change_owed);

    if (change_owed>25)
    ;
    {
    while (change_owed>=25);
    ;
    {
        change_owed=change_owed-25;
        i++;
    }
    }
    if (change_owed>=10)
    ;
    {
    while (change_owed>=10);
    ;
    {
        change_owed=change_owed-10;
        a++;
    }
    }
    if (change_owed>=5)
    ;
    {
    while (change_owed>=5;c++;)
    ;
    {
        change_owed=change_owed-5;
    }
    }
    if (change_owed>=1)
    ;
    {
    while(change_owed>=1)
    ;
    {
        change_owed=change_owed-1;
        b++;
    }
    }
    int final = i+a+b+c;
    printf("%d + %d + %d+ %d = %d", i, a, b, c, final);
    printf("\n");"
   
}

}

这是 Cs50 问题 set1 现金。我不知道这段代码有什么问题,有人可以帮助我

【问题讨论】:

  • 欢迎来到 SO。请打开你的编译器警告。你可能会得到类似“流浪”的东西;一段时间后”警告或类似的。再次检查控制结构的语法。 if()while 不会单独使用 ;,而只是为了终止它们正在控制的指令。你那里有空的说明。
  • if (X) while (X) ... 不是一个非常有用的模式。如果Xfalse,则循环无论如何都不会运行。无需在循环前添加具有相同条件的额外if
  • 请解释这段代码应该做什么,给出一些示例输入,正确的响应,以及你所看到的。
  • 采用一种代码风格并使用它。正确缩进。将编译器警告提高到最大,然后更改代码,直到所有错误和警告都消失。在while 之后避免;,因为这意味着一个空循环体。
  • 我刚刚添加了引号,因为 stackoverflow 不允许我发布它。”是什么意思??您是否因此添加了分号 (;)?它们没有任何意义,并且会改变代码的行为。见How do I format my code blocks?

标签: c cs50


【解决方案1】:

程序不会崩溃,它会永远循环在while (change_owed&gt;=25);

对于基本语句和控制语句的语法存在根本性的误解。 ; 结束一个语句,包括空语句。所以while (change_owed&gt;=25);被解析为

    while (change_owed >= 25)
        /* empty statement */;

由于change_owned 在循环体中没有变化,所以循环运行永远是change_owed 开头是&gt;= 25。

同样

if (change_owed>=1)
;

被解析为

if (change_owed >= 1)
    /* do nothing */;

没有效果。

这里是修改版:

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

int main(void) {
    int i = 0;
    int a = 0;
    int b = 0;
    int c = 0;
    float change_owed;
    do {
        change_owed = get_float("change owed: ");
    } while (change_owed <= 0); 

    change_owed = round(change_owed * 100);
    printf("%f\n", change_owed);

    if (change_owed > 25) {
        while (change_owed >= 25) {
            change_owed = change_owed - 25;
            i++;
        }
    }
    if (change_owed >= 10) {
        while (change_owed >= 10) {
            change_owed = change_owed - 10;
            a++;
        }
    }
    if (change_owed >= 5) {
        while (change_owed >= 5) {
            change_owed = change_owed - 5;
            b++;
        }
    }
    if (change_owed >= 1) {
        while (change_owed >= 1) {
            change_owed = change_owed - 1;
            c++;
        }
    }
    int final = i + a + b + c;
    printf("%d + %d + %d+ %d = %d", i, a, b, c, final);
    printf("\n");
    return 0;
}

请注意,if 语句以及最后一个循环都是多余的,并且使用更明确的变量名代码将更具可读性:

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

int main(void) {
    int quarters = 0;
    int dimes = 0;
    int nickels = 0;
    int pennies = 0;
    float change_owed;
    do {
        change_owed = get_float("change owed: ");
    } while (change_owed <= 0); 

    int cents = round(change_owed * 100);
    printf("%d\n", cents);

    while (cents >= 25) {
        cents -= 25;
        quaters++;
    }
    while (cents >= 10) {
        cents -= 10;
        dimes++;
    }
    while (cents >= 5) {
        cents -= 5;
        nickels++;
    }
    pennies = cents;
    int coins = quarters + dimes + nickels + pennies;
    printf("%d + %d + %d + %d = %d\n", quarters, dimes, nickels, pennies, coins);
    return 0;
}

最后,你可以使用整数除法来代替循环:

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

int main(void) {
    float change_owed;
    do {
        change_owed = get_float("change owed: ");
    } while (change_owed <= 0); 

    int cents = round(change_owed * 100);
    printf("%d\n", cents);

    int quarters = cents / 25;
    cents -= quarters * 25;  // or cents %= 25;
    int dimes = cents / 10;
    cents -= dimes * 10;     // or cents %= 10;
    int nickels = cents / 5;
    int pennies = cents % 5;
    int total = quarters + dimes + nickels + pennies;
    printf("%d + %d + %d + %d = %d\n", quarters, dimes, nickels, pennies, total);
    return 0;
}

甚至更简单:

最后,你可以使用整数除法来代替循环:

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

int main(void) {
    float change_owed;
    do {
        change_owed = get_float("change owed: ");
    } while (change_owed <= 0); 

    int cents = round(change_owed * 100);
    printf("%d\n", cents);

    int quarters = cents / 25;
    int dimes = cents % 25 / 10;
    int nickels = cents % 25 % 10 / 5;
    int pennies = cents % 5;
    int total = quarters + dimes + nickels + pennies;
    printf("%d + %d + %d + %d = %d\n", quarters, dimes, nickels, pennies, total);
    return 0;
}

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2016-05-13
    • 2012-09-08
    相关资源
    最近更新 更多