#c #while-loop #output
Вопрос:
Я сделал будильник на языке Си, который запрашивает у пользователя текущее время и время будильника в виде HHMMSS. Он разбивает их на часы, минуты и секунды, прежде чем зацикливаться, начиная с ввода текущего времени, до ввода времени будильника, когда он печатает «БУДИЛЬНИК» вместо времени. Проблема в том, что вывод пропускает ввод текущего времени, вместо этого начиная через секунду после него. См. Ввод и вывод ниже:
What time is it? (HHMMSS) 235958 When should the alarm go? (HHMMSS) 000003 ________ 23:59:59 00:00:00 00:00:01 00:00:02 ALARM
Но результат, который я хочу, это:
23:59:58 23:59:59 00:00:00 00:00:01 00:00:02 ALARM
Я просмотрел циклы while, изменив три printf("d:d:d n", present_hour, present_minute, present_second);
оператора, чтобы в каждом из них были разные значения между числами, поэтому в одном из них были двоеточия, в другом точки с запятой, а в последнем-дефисы. Выполнение этого и попытка использовать разные входные данные показали мне, что каждый цикл while имеет одну и ту же проблему пропуска текущего времени на выходе. Я предполагаю, что это означает, что ошибка заключается в общем коде, который есть у каждого из циклов. Я бы предположил, что что-то может быть не так с состоянием циклов и/или первым оператором if в каждом из них, но если это так, я не понимаю, почему он игнорирует ввод текущего времени на выходе.
Вот мой код:
#include lt;stdio.hgt; int present_time, time_for_alarm; int present_hour, present_minute, present_second; int alarm_hour, alarm_minute, alarm_second; void update_time(); int main() { input_time(); update_time(present_time, time_for_alarm); return 0; } void input_time(int present_time, int time_for_alarm) { printf("What time is it now? (HHMMSS) n"); scanf("%d", amp;present_time); while(present_time gt; 235959 || present_time lt; 0){ printf("Invalid time. What time is it now? (HHMMSS) n"); scanf("%d", amp;present_time); } printf("When should the alarm go? (HHMMSS) n"); scanf("%d", amp;time_for_alarm); while(time_for_alarm gt; 235959 || time_for_alarm lt; 0){ printf("Invalid time. When should the alarm go? n"); scanf("%d", amp;time_for_alarm); } printf("________ n"); update_time(present_time, time_for_alarm); printf("ALARM"); } void update_time(int present_time, int time_for_alarm) { int present_hour = present_time/10000; int present_minute = (present_time/100)0; int present_second = present_time0; int alarm_hour = time_for_alarm/10000; int alarm_minute = (time_for_alarm/100)0; int alarm_second = time_for_alarm0; while(present_hour != alarm_hour){ if(present_hour == alarm_hour amp;amp; present_minute == alarm_minute amp;amp; present_second == alarm_second){ printf("ALARM"); } else{ if(present_second lt; 60){ present_second ; if(present_second == 60) { present_second = 0; present_minute ; } if(present_minute == 60){ present_minute = 0 ; present_hour ; } if(present_hour == 24){ present_hour = 0; } printf("d:d:d n", present_hour, present_minute, present_second); } } } while(present_minute != alarm_minute){ if(present_hour == alarm_hour amp;amp; present_minute == alarm_minute amp;amp; present_second == alarm_second){ printf("ALARM"); } else{ if(present_second lt; 60){ present_second ; if(present_second == 60){ present_second = 0; present_minute ; } printf("d:d:d n", present_hour, present_minute, present_second); } } } while(present_second != alarm_second){ present_second ; if(present_hour == alarm_hour amp;amp; present_minute == alarm_minute amp;amp; present_second == alarm_second) { printf("ALARM"); } else{ printf("d:d:d n", present_hour, present_minute, present_second); } } }
Любые идеи или предложения будут оценены по достоинству. Мне потребовалось совсем немного времени, чтобы понять, почему мой вывод также включал время будильника до «БУДИЛЬНИКА», но мне удалось исправить это самостоятельно. Хотя я определенно застрял на этом.
Комментарии:
1. Потому что вы печатаете время после его изменения?
2. @user253751 Только что понял, что мой цикл while(present_second != alarm_second) был старой версией. Приношу свои извинения за это. Перемещение инструкций printf до обновления времени в лучшем случае приведет к правильному запуску вывода, но вместо этого было пропущено 00:00:00.
Ответ №1:
Перемещение инструкций printf до обновления времени в лучшем случае приведет к правильному запуску вывода, но вместо этого было пропущено 00:00:00.
Вы забыли переместить последнее printf
значение до обновления времени, поэтому 00:00:00 было пропущено.