挣扎:C中的If-else语句(我是一个完全的初学者,我刚学了2周C)

jjhzyzn0  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(98)

我的老师给了我们这个家庭作业,关于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;
}
9udxz4iz

9udxz4iz1#

一些小的事情来改善这一点,为什么:

  • 首先是:不要在操作符之间不使用空格--这会让你在试图获得快速印象时代码变得不可读。使用a < b代替a<b
  • 一般来说,在C语言中要非常明确。不要试图将代码塞进尽可能小的空间。因为你读代码的时间比写代码的时间要多,所以可读性是最重要的。
  • 代码中唯一的错误处理是你编写的错误处理。因此,正如上面 kiner_shah 建议的那样,检查每个函数的返回值:if (scanf(...) != 2) { do error handling }。如果您必须找到错误,这也有助于调试。例如,你可以找到标准函数here的返回值。
  • 这更像是我个人的建议在一个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");
            }
        }
    }
txu3uszq

txu3uszq2#

当超时时间等于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");
        }
    }
}

相关问题