鱼C论坛

 找回密码
 立即注册
查看: 864|回复: 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;

以下是修复后的代码:
#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;}
这种改进可以将条件表达式嵌套减少,但对于初学者来说可能会更难理解。

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

最佳答案

查看完整内容

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

使用道具 举报

发表于 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;}
这种改进可以将条件表达式嵌套减少,但对于初学者来说可能会更难理解。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> 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))。

修改后的代码如下:
#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;
}

这样修改后的代码可以正确判断时间所在的位置,并输出相应的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

1. 在使用sca ...

谢谢,但是题目说了,不能用if语句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

谢谢回答,但是题目要求不能使用if语句
想知道小甲鱼最近在做啥?请访问 -> 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;
       
       
}
这个是可以通过的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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来存储当前时间,你可以根据需要进行修改以适应你的实际需求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 08:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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