提问人:NgoMinh 提问时间:10/9/2023 最后编辑:NgoMinh 更新时间:10/9/2023 访问量:136
奋斗:C 语言中的 if-else 语句(我是一个完全的初学者,我刚刚学习了 C 2 周)
Struggle: If-else statement in C ( I'm a totall beginner and I've just learned C for 2 weeks )
问:
我的老师给了我们这个关于if-else语句的作业,我不知道为什么,但我的代码只通过了5个测试用例中的3个,你能帮我解决这个问题吗?非常感谢你,希望你有美好的一天!
问题:
根据接送时间计算停车费。 摩托车停车场的规定如下:
- 不要过夜停车。
- 18:00前取车,票价为5000越南盾/辆车。
- 从18:00开始取车,票价为8000越南盾/辆车。 编写一个程序,以 HH:MM 格式输入进入和退出时间。 如果进入时间大于退出时间(输入时间错误),则输出值 -1。 如果进入时间等于退出时间,则输出 0。 否则,请根据上述公式进行计算。
INPUT
12:00 13:35
OUTPUT
5000
INPUT
12:00 11:35
OUTPUT
-1
这是我的代码,我尝试修复它,但它没有成功
#include <stdio.h>
int main()
{ int hour1, min1;
int hour2, min2;
scanf("%i%*c%i", &hour1, &min1);
scanf("%i%*c%i", &hour2, &min2);
if (hour1<24 && hour2<24 && min1<59 && min2<59){
if (hour1 == hour2 && min1 == min2)
printf("0");
if (hour1>hour2)
printf("-1");
else if (hour1 == hour2 && min1>min2)
printf("-1");
else {
if (hour2<18)
printf("5000");
else if (hour2>18)
printf("8000");
}
}
return 0;
}
答:
0赞
kiner_shah
10/9/2023
#1
当外出时间小时等于 18 时,您错过了支票。 我添加了更多检查并对其进行了改进,请阅读代码注释。
#include <stdio.h>
int main()
{
// Time can't be negative - use unsigned
unsigned int in_hour, in_min;
unsigned int out_hour, out_min;
// As suggested, check for return value of scanf
if (scanf("%u:%u", &in_hour, &in_min) != 2)
{
printf("Error during input\n");
return 1;
}
if (scanf("%u:%u", &out_hour, &out_min) != 2)
{
printf("Error during input\n");
return 1;
}
//printf("In time: %02u:%02u\n", in_hour, in_min);
//printf("Out time: %02u:%02u\n", out_hour, out_min);
// 00:00 is the min allowed time value
// 23:59 is the max allowed time value
// NOTE the NOT sign '!'
if ( ! (in_hour <= 23 && in_min <= 59 && out_hour <= 23 && out_min <= 59))
{
printf("Invalid in or out time\n");
return 1;
}
if (in_hour > out_hour || (in_hour == out_hour && in_min > out_min))
{
printf("-1\n");
}
else if (in_hour == out_hour && in_min == out_min)
{
printf("0\n");
}
else
{
if (out_hour < 18)
{
printf("5000");
}
// No need to check for >= 18, just use else
else
{
printf("8000");
}
}
}
0赞
led
10/9/2023
#2
一些小事情可以改善这一点以及原因:
- 首先,也是最重要的一点:你不敢在运算符之间使用空格 - 当你试图快速获得印象时,这会使代码不可读。使用 代替 。
a < b
a<b
- 通常尽量在 C 语言中非常明确。不要试图将代码塞进尽可能小的空间中。由于您阅读代码的次数多于编写代码的次数,因此可读性是重中之重。
- 代码中唯一的错误处理是你编写的错误处理。因此,如上所述kiner_shah检查每个函数的返回:.如果必须查找错误,这也有助于调试。例如,您可以在此处找到标准函数的返回。
if (scanf(...) != 2) { do error handling }
- 这更像是我个人的提示。您签入的状态越少,就越容易查看是否处理了所有状态。
if()
- 如果您检查多个状态,如果您不使用最终 .即使你非常确定你已经得到了大多数可能的情况,一个可能仍然有用的错误处理。在上面的例子中就是这种情况。
if()
else()
else()
if (hour1 < 24 && hour2 < 24 && min1 < 59 && min2 < 59){
if (hour1 == hour2) {
if (min1 == min2)
printf("0");
if (min1 > min2)
printf("-1");
} else if (hour1 > hour2) {
printf("-1");
} else {
if (hour2 < 18) {
printf("5000");
} else {
printf("8000");
}
}
}
下一个:链接多个大于/小于运算符
评论
18:30
hour2
< 18
>18
min1<59 && min2<59
想成为...差一个...min1 < 60 && min2 < 60
-1
-1
hour1 == hour2
min1 > min2
if (hour1>hour2)
应该是 。else if (hour1>hour2)