编写程序求解某同学某个时间点的位置(不许用if语句和switch语句)

题目描述

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 hour, minute, second;
    scanf("%d:%d:%d", &hour, &minute, &second);

    int time = hour * 3600 + minute * 60 + second;

    char* locations[] = {"dormitory", "classroom", "canteen"};
    int start_times[] = {6 * 3600, 0, 6 * 3600, 12 * 3600, 17 * 3600};
    int end_times[] = {18 * 3600, 6 * 3600, 7 * 3600, 13 * 3600, 18 * 3600};

    int num_locations = sizeof(locations) / sizeof(locations[0]);

    int found_location = 0;
    int i = 0;

    while (!found_location && i < num_locations) {
        int is_valid_time = (time >= start_times[i]) & (time < end_times[i]);
        int location_index = is_valid_time * i;
        printf("%s\n", locations[location_index]);
        found_location = is_valid_time;
        i++;
    }

    return 0;
}

我们使用了位运算符&来替代if语句。通过将判断条件(time >= start_times[i])(time < end_times[i])进行位与运算,可以得到一个表示是否为有效时间的值。然后,我们将该值乘以位置的索引,得到一个表示位置索引或无效索引的值。最后,通过使用该值作为索引访问locations数组,即可输出正确的位置名称。

这种方法避免了直接使用if语句和switch语句,而是使用位运算符来进行条件判断。这样可以实现相同的功能,同时遵守了不使用if语句和switch语句的要求。

 

© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享