在 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 添加到所有计算中,并将每个层级的计算加在一起以获得最终金额。
在尝试编写程序之前先在纸上解决问题。在测试程序之前,您应该知道期望的输出是什么。
快乐的一天!
我正在编写代码来读取用水量输入并显示账单。固定价格是 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 添加到所有计算中,并将每个层级的计算加在一起以获得最终金额。
在尝试编写程序之前先在纸上解决问题。在测试程序之前,您应该知道期望的输出是什么。 快乐的一天!