王小二° 发表于 2023-10-27 23:14:36

麻烦看看这个怎么写

任务描述
X同学是好学生。他每天严格按作息时间过着“宿舍-食堂-教室”三点一线的生活。他早6点前晚6点后在宿舍学习,早上6点至7点、中午12点至1点、下午5点至6点在食堂吃饭,其余时间在教室上课。
你知道X现在在哪里吗?(不许用if语句和switch语句)

输入格式:
一行中给出当天的一个时间点,形如:HH:MM:SS,HH表示小时,MM表示分,SS表示秒,全天时间采用24小时制表示。

输出格式:
根据不同情况,输出一行文本,确定在宿舍输出:dormitory;确定在食堂输出:canteen;确定在教室输出:classroom;两段时间交接处不确定在哪里时输出:on the way。

我写的程序是#include <stdio.h>
int main()
{
    int a,b,c;
    scanf("%d:%d:%d",&a,&b,&c);
   ((a==6)&&(b==0)&&(c==0))?printf("on the way"):((a<6)||(a>18))?printf("dormitory"):((6<a&&a<7)||(12<a&&a<13)||(17<a&&a<18))?printf("canteen"):((7<a&&a<12)||(13<a&&a<17))?printf("classroom"):1;
   ((a==7)&&(b==0)&&(c==0))?printf("on the way"):((a==12)&&(b==0)&&(c==0))?printf("on the way"):((a==13)&&(b==0)&&(c==0))?printf("on the way"):((a==17)&&(b==0)&&(c==0))?printf("on the way"):((a==18)&&(b==0)&&(c==0))?printf("on the way"):1;

}
它有一些时间的输入输出不了结果,麻烦帮忙看看指出错误在哪里,谢谢。

Mike_python小 发表于 2023-10-27 23:14:37

代码错误分析:

1. 输入格式问题:在scanf函数中,时间的分隔符应为冒号:而不是中文冒号:。正确的格式为%d:%d:%d。

2. 逻辑错误:大括号的位置和条件判断有问题。当前的代码会执行所有的判断语句,而不是根据条件输出一个特定的结果。这导致了多个输出的情况。

3. 缺少返回值:main函数的返回类型是int,但是没有在最后添加返回语句return 0;。

以下是修复后的代码:


#include <stdio.h>

int main() {
    int a, b, c;
    scanf("%d:%d:%d", &a, &b, &c);

    if ((a == 6 && b == 0 && c == 0) ||
      (a == 7 && b == 0 && c == 0) ||
      (a == 12 && b == 0 && c == 0) ||
      (a == 13 && b == 0 && c == 0) ||
      (a == 17 && b == 0 && c == 0) ||
      (a == 18 && b == 0 && c == 0)) {
      printf("on the way");
    } else if (a < 6 || a > 18) {
      printf("dormitory");
    } else if ((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18)) {
      printf("canteen");
    } else if ((7 < a && a < 12) || (13 < a && a < 17)) {
      printf("classroom");
    }
   
    return 0;
}


请注意代码的排版和缩进,这有助于提高代码的可读性和易于理解。

还有一种更简洁的方法来处理这个问题,可以使用逻辑运算符和条件表达式来减少代码的复杂性。以下是相应的修改后的代码:


#include <stdio.h>

int main() {
    int a, b, c;
    scanf("%d:%d:%d", &a, &b, &c);

    if ((a == 6 && b == 0 && c == 0) ||
      (a == 7 && b == 0 && c == 0) ||
      (a == 12 && b == 0 && c == 0) ||
      (a == 13 && b == 0 && c == 0) ||
      (a == 17 && b == 0 && c == 0) ||
      (a == 18 && b == 0 && c == 0)) {
      printf("on the way");
    } else if ((a < 6 || a > 18) ? 1 : (((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18)) ? 1 : ((7 < a && a < 12) || (13 < a && a < 17)))) {
      printf("dormitory");
    } else if ((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18)) {
      printf("canteen");
    } else if ((7 < a && a < 12) || (13 < a && a < 17)) {
      printf("classroom");
    }
   
    return 0;
}


这种改进可以将条件表达式嵌套减少,但对于初学者来说可能会更难理解。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-10-27 23:15:41

你的程序有一些逻辑错误,导致无法正确输出结果。以下是你程序中的错误和需要修改的地方:

1. 在使用scanf函数读取时间输入时,你使用了全角冒号(:)而不是半角冒号(:)。请修改为scanf("%d:%d:%d", &a, &b, &c)。

2. 你使用了三元运算符来判断时间所在的位置,但是条件表达式的判断逻辑有误。在判断时间是否在宿舍、食堂和教室的条件中,你使用了逻辑或(||)运算符,但是运算符的使用有误。应该使用逻辑与(&&)运算符。请修改为((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18))。

3. 在判断时间是否在两个时间段交接处时,你使用了多个独立的条件表达式,但是这些条件表达式之间没有连接起来。你需要使用逻辑或(||)运算符将这些条件表达式连接起来。请修改为((a == 7 && b == 0 && c == 0) || (a == 12 && b == 0 && c == 0) || (a == 13 && b == 0 && c == 0) || (a == 17 && b == 0 && c == 0) || (a == 18 && b == 0 && c == 0))。

修改后的代码如下:

#include <stdio.h>

int main() {
    int a, b, c;
    scanf("%d:%d:%d", &a, &b, &c);

    if ((a == 6 && b == 0 && c == 0) || (a > 18) || (a < 6)) {
      printf("dormitory");
    } else if ((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18)) {
      printf("canteen");
    } else if ((7 < a && a < 12) || (13 < a && a < 17)) {
      printf("classroom");
    } else if ((a == 7 && b == 0 && c == 0) || (a == 12 && b == 0 && c == 0) || (a == 13 && b == 0 && c == 0) || (a == 17 && b == 0 && c == 0) || (a == 18 && b == 0 && c == 0)) {
      printf("on the way");
    }

    return 0;
}


这样修改后的代码可以正确判断时间所在的位置,并输出相应的结果。

王小二° 发表于 2023-10-28 09:35:59

isdkz 发表于 2023-10-27 23:15
你的程序有一些逻辑错误,导致无法正确输出结果。以下是你程序中的错误和需要修改的地方:

1. 在使用sca ...

谢谢,但是题目说了,不能用if语句

王小二° 发表于 2023-10-28 09:36:39

Mike_python小 发表于 2023-10-27 23:16
代码错误分析:

1. 输入格式问题:在scanf函数中,时间的分隔符应为冒号:而不是中文冒号:。正确的格式为% ...

谢谢回答,但是题目要求不能使用if语句

王小二° 发表于 2023-10-28 10:33:17

#include <stdio.h>
int main()
{
        int a,b,c;
        scanf("%d:%d:%d",&a,&b,&c);
        (((a==6)&&(b==0)&&(c==0))||((a==7)&&(b==0)&&(c==0))||((a==12)&&(b==0)&&(c==0))||((a==13)&&(b==0)&&(c==0))||((a==17)&&(b==0)&&(c==0))||((a==18)&&(b==0)&&(c==0)))?printf("on the way"):((a<6)||(a>18))?printf("dormitory"):((7<a&&a<12)||(13<a&&a<17))?printf("classroom"):1;
    (((a==6)&&(b!=0||c!=0))||((a==12)&&(b!=0||c!=0))||((a==17)&&(b!=0||c!=0)))?printf("canteen"):(((a==7)&&(b!=0||c!=0))||((a==13)&&(b!=0||c!=0)))?printf("classroom"):((a==18)&&(b!=0||c!=0))?printf("dormitory"):1;
    return 0;
       
       
}
这个是可以通过的。

六翻了 发表于 2023-10-28 10:46:04

如果不允许使用if和switch语句,你可以使用条件运算符(也称为三元运算符)来代替。条件运算符的语法是condition ? expression1 : expression2。如果condition为真,则执行expression1,否则执行expression2。

以下是一个使用条件运算符来解决这个问题的示例代码:

#include <stdio.h>
#include <time.h>

int main() {
    Time current_time;
    current_time.hour = 14;
    current_time.minute = 30;
    current_time.second = 0;

    // 使用条件运算符判断当前时间
    printf("%s\n", (current_time.hour < 6 || current_time.hour > 18) ? "dormitory" :
         (current_time.hour == 6 && current_time.minute == 0 && current_time.second == 0) ? "on the way" :
         (current_time.hour == 12 && current_time.minute == 0 && current_time.second == 0) ? "on the way" :
         "canteen");

    return 0;
}
在上面的代码中,我们使用了条件运算符来判断当前时间,并根据不同的情况输出相应的字符串。注意,这里我们使用了自定义的结构体Time来存储当前时间,你可以根据需要进行修改以适应你的实际需求
页: [1]
查看完整版本: 麻烦看看这个怎么写