奋斗: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 )

提问人:NgoMinh 提问时间:10/9/2023 最后编辑:NgoMinh 更新时间:10/9/2023 访问量:136

问:

我的老师给了我们这个关于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;
}
c if 语句

评论

6赞 derpirscher 10/9/2023
想象一下,如果您在 取车会发生什么。两者都不是也不是18:30hour2< 18>18
2赞 Fe2O3 10/9/2023
min1<59 && min2<59想成为...差一个...min1 < 60 && min2 < 60
0赞 Matt Pitkin 10/9/2023
当问题说“输出值 -1”时,我认为这意味着代码的返回值为 而不是打印到屏幕上。-1-1
2赞 Gerhardh 10/9/2023
你错过了这个案子,但是hour1 == hour2min1 > min2
1赞 Ian Abbott 10/9/2023
if (hour1>hour2)应该是 。else if (hour1>hour2)

答:

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 < ba<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");
            }
        }
    }