在 C 语言中编程狡猾的 if 语句?

Programming in c dodgy if statements?

我正在编写代码来读取用水量输入并显示账单。固定价格是 10 美元。前 30 米每米 0.6 美元,接下来的 20 米每米 0.8 美元,接下来的 10 米每米 1.2 美元,额外的米是 1.2 美元,但出于某种原因,我的代码要求用户输入一个值并执行没有其他的。我究竟做错了什么?是我的 if 语句吗?我觉得好像他们还好,我的计算可能有问题。这是到目前为止的代码:

#include <stdio.h>
int main()
{
    int watercom, fixedrate, first30, next20, next10, additional, firstcal, secondcal,thirdcal, fourthcal;

    printf("what is our water consumption?\n");
    scanf("%i\n",&watercom);

    fixedrate = 10;
    first30 = 0.6;
    next20 = 0.8;
    next10 = 1.0;
    additional = 1.2;

    firstcal = fixedrate * first30;
    secondcal = fixedrate * next20;
    thirdcal = fixedrate * next10;
    fourthcal = fixedrate * additional;

    if ( watercom <= 30)
        printf("your bill is %i", &firstcal);
    else if (watercom >= 31 && watercom  <= 50)
        printf("your bil is %i", &secondcal);
    else if (watercom >= 51 && watercom >= 60)
        printf("your bill is %i", &thirdcal);
    else if (watercom >= 61)
        printf("your water bill is %i", fourthcal);
    return 0;
}
if ( watercom <= 30)
    printf("your bill is %i", &firstcal);
else if (watercom >= 31 && watercom  <= 50)
    printf("your bil is %i", &secondcal);
else if (watercom >= 51 && watercom >= 60)
    printf("your bill is %i", &thirdcal);
else if (watercom >= 61)
    printf("your water bill is %i", fourthcal);

有许多可以应用的简化:

您不需要每个 if 语句中的 >= 部分,就好像 watercom <= 30 那么它隐含地 >= 31.

而且你不把address-of&)值传给printf,你直接传值。

watercom 超出预期值范围时,您也没有默认情况:

if ( watercom <= 30 )
    printf("your bill is %i", firstcal);
else if ( watercom  <= 50)
    printf("your bill is %i", secondcal);
else if ( watercom <= 60)
    printf("your bill is %i", thirdcal);
else
    printf("your water bill is %i", fourthcal);

计算的代数,因为它们出现在这个 post 的第一个版本中,对我来说似乎都是错误的。为了让你开始这样做:除了这些 amount * rate 乘法,你还需要执行加法 --- 一个固定利率项,如果你超过 加上 另一个数额初始津贴,加上进入下一个价格范围时的另一个金额,依此类推。要计算这些条款中的每一项,您需要减去之前条款中已经支付的水量。

但这不是问题。你问为什么程序根本不打印任何东西。对我来说,在 Windows 上使用 Visual Studio 从中创建一个命令行可执行文件后,我确实复制了这个问题:我输入了值,然后似乎没有任何反应。但是当我按下 control-C 停止程序时,答案 最终打印出来。

要解决此问题,请从 scanf 命令中删除 \n

然后继续解决您的其他问题,其中包括 (a) 获得正确的代数,以及 (b) 打印变量的值(例如 firstCal)而不是地址(&firstCal) .

除了其他人指出的之外,您所有的变量都是 int,但有些变量需要 double [因为您将它们设置为 0.6,等等。] :

int watercom;
double fixedrate;
double first30;
double next20;
double next10;
double additional;
int firstcal;
int secondcal;
int thirdcal;
int fourthcal;

是的,你唯一的整数是 fixedRate。其余都是花车。 另外,根据您在问题中所说的内容,这不是您程序中的内容。如果 fixedRate 为 10 且前 30 个速率为 .6,那么如果我输入 30,我应该得到 fixedRate + (30*.6)。 您需要将 fixedRate 添加到所有计算中,并将每个层级的计算加在一起以获得最终金额。

在尝试编写程序之前先在纸上解决问题。在测试程序之前,您应该知道期望的输出是什么。 快乐的一天!