鱼C论坛

 找回密码
 立即注册
查看: 1328|回复: 6

[已解决]麻烦看看这个怎么写

[复制链接]
发表于 2023-10-27 23:14:36 | 显示全部楼层 |阅读模式
20鱼币
任务描述
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;

}
它有一些时间的输入输出不了结果,麻烦帮忙看看指出错误在哪里,谢谢。
最佳答案
2023-10-27 23:14:37
代码错误分析:

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

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

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

以下是修复后的代码:
  1. #include <stdio.h>
  2. int main() {
  3.     int a, b, c;
  4.     scanf("%d:%d:%d", &a, &b, &c);
  5.     if ((a == 6 && b == 0 && c == 0) ||
  6.         (a == 7 && b == 0 && c == 0) ||
  7.         (a == 12 && b == 0 && c == 0) ||
  8.         (a == 13 && b == 0 && c == 0) ||
  9.         (a == 17 && b == 0 && c == 0) ||
  10.         (a == 18 && b == 0 && c == 0)) {
  11.         printf("on the way");
  12.     } else if (a < 6 || a > 18) {
  13.         printf("dormitory");
  14.     } else if ((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18)) {
  15.         printf("canteen");
  16.     } else if ((7 < a && a < 12) || (13 < a && a < 17)) {
  17.         printf("classroom");
  18.     }
  19.    
  20.     return 0;
  21. }
复制代码

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

还有一种更简洁的方法来处理这个问题,可以使用逻辑运算符和条件表达式来减少代码的复杂性。以下是相应的修改后的代码:
  1. #include <stdio.h>
  2. int main() {
  3.     int a, b, c;
  4.     scanf("%d:%d:%d", &a, &b, &c);
  5.     if ((a == 6 && b == 0 && c == 0) ||
  6.         (a == 7 && b == 0 && c == 0) ||
  7.         (a == 12 && b == 0 && c == 0) ||
  8.         (a == 13 && b == 0 && c == 0) ||
  9.         (a == 17 && b == 0 && c == 0) ||
  10.         (a == 18 && b == 0 && c == 0)) {
  11.         printf("on the way");
  12.     } 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)))) {
  13.         printf("dormitory");
  14.     } else if ((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18)) {
  15.         printf("canteen");
  16.     } else if ((7 < a && a < 12) || (13 < a && a < 17)) {
  17.         printf("classroom");
  18.     }
  19.    
  20.     return 0;
  21. }
复制代码

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

球一个最佳答案谢谢啦!这对我非常重要!

最佳答案

查看完整内容

代码错误分析: 1. 输入格式问题:在scanf函数中,时间的分隔符应为冒号:而不是中文冒号:。正确的格式为%d:%d:%d。 2. 逻辑错误:大括号的位置和条件判断有问题。当前的代码会执行所有的判断语句,而不是根据条件输出一个特定的结果。这导致了多个输出的情况。 3. 缺少返回值:main函数的返回类型是int,但是没有在最后添加返回语句return 0;。 以下是修复后的代码: 请注意代码的排版和缩进,这有助于提高代码的可读性和 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-27 23:14:37 | 显示全部楼层    本楼为最佳答案   
代码错误分析:

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

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

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

以下是修复后的代码:
  1. #include <stdio.h>
  2. int main() {
  3.     int a, b, c;
  4.     scanf("%d:%d:%d", &a, &b, &c);
  5.     if ((a == 6 && b == 0 && c == 0) ||
  6.         (a == 7 && b == 0 && c == 0) ||
  7.         (a == 12 && b == 0 && c == 0) ||
  8.         (a == 13 && b == 0 && c == 0) ||
  9.         (a == 17 && b == 0 && c == 0) ||
  10.         (a == 18 && b == 0 && c == 0)) {
  11.         printf("on the way");
  12.     } else if (a < 6 || a > 18) {
  13.         printf("dormitory");
  14.     } else if ((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18)) {
  15.         printf("canteen");
  16.     } else if ((7 < a && a < 12) || (13 < a && a < 17)) {
  17.         printf("classroom");
  18.     }
  19.    
  20.     return 0;
  21. }
复制代码

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

还有一种更简洁的方法来处理这个问题,可以使用逻辑运算符和条件表达式来减少代码的复杂性。以下是相应的修改后的代码:
  1. #include <stdio.h>
  2. int main() {
  3.     int a, b, c;
  4.     scanf("%d:%d:%d", &a, &b, &c);
  5.     if ((a == 6 && b == 0 && c == 0) ||
  6.         (a == 7 && b == 0 && c == 0) ||
  7.         (a == 12 && b == 0 && c == 0) ||
  8.         (a == 13 && b == 0 && c == 0) ||
  9.         (a == 17 && b == 0 && c == 0) ||
  10.         (a == 18 && b == 0 && c == 0)) {
  11.         printf("on the way");
  12.     } 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)))) {
  13.         printf("dormitory");
  14.     } else if ((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18)) {
  15.         printf("canteen");
  16.     } else if ((7 < a && a < 12) || (13 < a && a < 17)) {
  17.         printf("classroom");
  18.     }
  19.    
  20.     return 0;
  21. }
复制代码

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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))。

修改后的代码如下:

  1. #include <stdio.h>

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

  5.     if ((a == 6 && b == 0 && c == 0) || (a > 18) || (a < 6)) {
  6.         printf("dormitory");
  7.     } else if ((6 < a && a < 7) || (12 < a && a < 13) || (17 < a && a < 18)) {
  8.         printf("canteen");
  9.     } else if ((7 < a && a < 12) || (13 < a && a < 17)) {
  10.         printf("classroom");
  11.     } 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)) {
  12.         printf("on the way");
  13.     }

  14.     return 0;
  15. }
复制代码


这样修改后的代码可以正确判断时间所在的位置,并输出相应的结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-10-28 09:35:59 | 显示全部楼层
isdkz 发表于 2023-10-27 23:15
你的程序有一些逻辑错误,导致无法正确输出结果。以下是你程序中的错误和需要修改的地方:

1. 在使用sca ...

谢谢,但是题目说了,不能用if语句
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-10-28 09:36:39 | 显示全部楼层
Mike_python小 发表于 2023-10-27 23:16
代码错误分析:

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

谢谢回答,但是题目要求不能使用if语句
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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;
       
       
}
这个是可以通过的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-28 10:46:04 | 显示全部楼层
如果不允许使用if和switch语句,你可以使用条件运算符(也称为三元运算符)来代替。条件运算符的语法是condition ? expression1 : expression2。如果condition为真,则执行expression1,否则执行expression2。

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

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

  3. int main() {
  4.     Time current_time;
  5.     current_time.hour = 14;
  6.     current_time.minute = 30;
  7.     current_time.second = 0;

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

  13.     return 0;
  14. }
复制代码

在上面的代码中,我们使用了条件运算符来判断当前时间,并根据不同的情况输出相应的字符串。注意,这里我们使用了自定义的结构体Time来存储当前时间,你可以根据需要进行修改以适应你的实际需求
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 06:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表