我正在创建一个计算器,它占用一码的平方英尺并吐出一美元金额用于支付成本以及估计时间和所需人数
这是我到目前为止所拥有的
#include <stdio.h>
#include <stdlib.h>
main(void)
{
// Define float values
float sqft,min,bill;
//Get the yard size in square feet from the user and store it in variable sqft
printf("Please enter in the yard size in square feet\n");
scanf("%d", &sqft);
// Gets the sqft from keyboard and puts it in one of three catagories, if it's less than 0 display an error message, if greater than 0 but less than 500 perform that operation//
// if greater than 500 but less than 2000 performs that operations, and if graeter than 2000, performs that operation//
if(500 >= sqft || sqft > 0 )
{
puts("The cost is $25, require 1 worker, and will take approximately 25 minutes.");
system("PAUSE");
return 0;
}
else if(500 < sqft || sqft <= 2000)
{
bill = sqft * 0.03 +10;
min = 5+ 0.04 * sqft;
printf("The cost is %2f, requires 2 workers, and will take approximately %i.\n", bill, min);
system("PAUSE");
return 0;
}
else if(2000< sqft)
{
bill = sqft * 0.025 + 20;
min = 60+ 0.0133;
printf("The cost is %2f, requires 3 workers, and will take apprxoimately %i.\n", bill, min);
system("PAUSE");
return 0;
}
else;
{
puts("Please enter a numerical value greater than 0");
system("PAUSE");
return 0;
}
return 0;
}
问题是每当我运行程序时,我只得到第一个if语句的响应,&#34;费用是25美元需要1个工作人员,大约需要25分钟。
如果值为0,501,20000甚至只是随机字母,它会给我这个响应。我已经敲了几个小时,有人对我有更好的想法吗?或者我只是在做一些愚蠢的事情?
编辑:根据下面的建议我做了一些改变,即
9. scanf("%f", &sqft);
12. if(500 >= sqft && sqft >0)
它现在正在工作,但我发现当我输入4,000作为值时,我的完成时间以负数回来,这是溢出问题吗?
有没有办法延长此限制?我希望它能在6位数的某个位置伴随任何理论码。
答案 0 :(得分:4)
您需要使用&&
(和)代替||
(或)
if(500 >= sqft || sqft > 0 )
如果其中一个条件为真,则始终为true,因此如果sqft
大于0
,则始终会完成第一个printf
。
if(500 >= sqft && sqft > 0 )
仅在两个条件均为真时才为真,因此sqft
必须大于0
且小于或等于500
请务必将scanf
从%d
更改为%f
以读取浮点数而不是整数,以及printf
的参数。
此外,正如可读性提示一样,比较更具可读性
if ((sqft > 0) && (sqft <= 500))
答案 1 :(得分:3)
您调用未定义的行为将sqft
声明为float
,然后尝试
scanf("%d", &sqft);
%d
格式说明符用于整数值,您需要使用%f
来读取浮点值。 (但我建议您使用double
而不是float
继续使用%lf
修饰符
您同样使用printf
语句在%i
语句中调用未定义行为,以获取float
值。 (您需要使用 long 修饰符来使用double
读取scanf
值,而使用不来使用printf
来打印%f
,{{默认为printf
处理double
的1}} 格式说明符。花费时间与man pages
一起 - 非常值得花费时间。)
你的逻辑可以使用一点点工作。最重要的是,总是,总是,验证scanf
的返回,否则您无法确信从那一点开始实际处理有效数据。你可以这样做:
#include <stdio.h>
#include <stdlib.h>
int main (void) { /* main is type 'int' */
/* declare and initialize double values */
double sqft = 0.0, min = 0.0, bill = 0.0;
printf ("enter yard size [in square feet]: ");
/* ALWAYS validate user input */
if (scanf( "%lf", &sqft) != 1) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
if (sqft <= 0) { /* less than or equal to zero */
fprintf (stderr, "error: sqft must be greater than zero.\n");
return 1;
}
if (sqft <= 500) /* less than or equal to 500 */
puts("The cost is $25, require 1 worker, and "
"will take approximately 25 minutes.");
else if (sqft <= 2000) { /* less than or equal to 2000 */
bill = sqft * 0.03 + 10;
min = 5 + 0.04 * sqft;
printf ("The cost is %.2f, requires 2 workers, and will "
"take approximately %.2f.\n", bill, min);
}
else if (sqft > 2000) { /* greater than 2000 */
bill = sqft * 0.025 + 20;
min = 60 + 0.0133;
printf ("The cost is %.2f, requires 3 workers, and will "
"take apprxoimately %.3f.\n", bill, min);
}
/* only hold terminal open on windoze */
#if defined (_WIN32) || defined (_WIN64)
getchar(); /* use getchar() to hold terminal open on windoze */
getchar(); /* (2-requied as '\n' remains in stdin after scanf) */
#endif
return 0;
}
这将确保您在稍后尝试在代码中使用它之前有一个有效的sqft
。
(注意:从不使用浮点值(float or double
)作为货币,当您开始赔钱以舍入错误时,人们会变得非常生气)< / p>