题目描述
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