【问题标题】:why does my program not accept subtractions?为什么我的程序不接受减法?
【发布时间】:2021-01-15 20:14:53
【问题描述】:

所以我正在尝试为我的一个类编写代码,但由于某种原因,当我尝试编译它时,它根本不接受减法部分。有谁知道怎么回事?

代码如下:

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

int main(void) {
    float value;
    
    do {
        value = get_float("enter value: ");
    } while (value >= 0);

    value * 100;
    
    int quarter = 25;
    int dime = 10;
    int nickel = 5;
    int penny = 1;

    if (value >= quarter) {
        while (value >= quarter) {
            quarter - value;
        }
        int quarters = 0;
        quarters++;
    } else {
        while (value >= dime) {
            dime - value;
        }
        int dimes = 0;
        dimes++;
    } else {
        while (value >= nickel) {
            nickel - value;
        }
        int nickels = 0;
        nickels++;
    } else {
        while (value >= penny) {
            penny - value;
        }
        int pennies = 0;
        pennies++;
    }
    printf ("%i pennies, %i nickels, %i dimes, %i quarters\n", pennies, nickels, dimes, quarters);
}

每当我尝试编译它时,它都会显示cash.c:25:20: error: expression result unused [-Werror,-Wunused-value] quarter - value; 或任何其他数学表达式。我一直无法编译它,所以如果这不起作用,我想提醒一下。谢谢各位。

【问题讨论】:

  • @trollergutz_playz 明白我的意思是写几行代码并在你继续之前让它们工作吗?你的第一个 do while 循环的逻辑是错误的(正如 Ted 所说)。
  • 哦,没注意到。谢谢老兄。
  • 好吧,谢谢大家的帮助,我想我会重新开始。再见。
  • BTW 不适用于float 而是整数,例如int cents = (int)round(value*100); 请阅读Why not use Double or Float to represent currency?
  • @TedLyngmo 强制转换专门用于使编译器静音(违背所有智慧),并且乘法和舍入保留了必要的精度。通过失去float 的不精确性,我们获得精度。

标签: c cs50


【解决方案1】:

您的代码中有多个问题:

  • 只要输入的值为&gt;= 0do / while 循环就会继续。这与您想要的完全相反。如果值为负,则应继续。

  • 语句value * 100;dime - value;... 没有任何副作用,正如编译器所诊断的那样。你应该写value *= 100;value = value * 100;等等。

  • float 值乘以100 可能不会产生整数,因为浮点类型的精度有限并且无法准确表示0.01 的倍数。您应该使用 value = round(value * 100); 将值四舍五入到最接近的整数

  • else 子句系列阻止正确计算要给出的更改。按照编码,您只能提供一种硬币,并且只能提供一种。

  • 变量quartersdimesnickelspennies 定义为在最终printf 语句之前结束的本地范围,因此它们在那里未定义,编译器会产生错误。

您可以使用int quarters = floor(value / 25); 等计算季度数。

这是修改后的版本:

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

int main(void) {
    float value;
    
    do {
        value = get_float("enter value: ");
    } while (value < 0);

    value = round(value * 100);
    
    int quarters = floor(value / 25);
    value -= 25 * quarters;
    int dimes = floor(value / 10);
    value -= 10 * dimes;
    int nickels = floor(value / 5);
    value -= 5 * nickels;
    int pennies = value;

    printf ("%i pennies, %i nickels, %i dimes, %i quarters\n", pennies, nickels, dimes, quarters);
    return 0;
}

使用整数运算将value 拆分为硬币可以简化代码,使用模运算符%

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

int main(void) {
    float value;
    
    do {
        value = get_float("enter value: ");
    } while (value < 0);

    int cents = round(value * 100);
    
    int quarters = cents / 25;  cents %= 25;
    int dimes    = cents / 10;  cents %= 10;
    int nickels  = cents / 5;   cents %= 5;
    int pennies  = cents;

    printf ("%i pennies, %i nickels, %i dimes, %i quarters\n", pennies, nickels, dimes, quarters);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2016-07-09
    相关资源
    最近更新 更多