Будильник на C

#c #clock #alarm

#c #часы #тревога

Вопрос:

Код работает идеально, пока не напечатает xx.00.00, который он печатает дважды. Весь остальной код выполняется без проблем, но каждый раз, начиная с 23.59.59 -) 00.00.00, он печатается дважды. ПОЖАЛУЙСТА, ПОМОГИТЕ МНЕ

 #include <stdio.h>
void check(int number) {
    if (number < 10) {
        printf("0%d", number);
    }
    else {
        printf("%d", number);
    }
}
void count(int present_time, int time_for_alarm) {
    int present_hour = present_time/10000;
    int present_min = (present_time/100) % 100;
    int present_sec = (present_time % 100);
    int alarm_hour = time_for_alarm/10000;
    int alarm_min = (time_for_alarm/100) % 100;
    int alarm_sec = (time_for_alarm % 100);
    while (present_hour != alarm_hour) {
        if (present_hour == alarm_hour amp;amp; present_min == alarm_min amp;amp; present_sec == alarm_sec) {
            printf("ALARM");
        }
        else {
            if (present_sec <= 60) {
                present_sec  ;
                if (present_sec == 60) {
                    present_sec = 0;
                    present_min  ;
                }
                if (present_min == 60) {
                    present_min = 0;
                    present_hour  ;
                }
                if (present_hour == 24) {
                    present_hour = 0;
                }
                check(present_hour);
                printf(":");
                check(present_min);
                printf(":");
                check(present_sec);
                printf("n");
            }
        }
    }
    while (present_min != alarm_min) {
        if (present_hour == alarm_hour amp;amp; present_min == alarm_min amp;amp; present_sec == alarm_sec) {
            printf("ALARM");
        }
        else {
            if (present_sec <= 60) {
                present_sec  ;

                if (present_sec == 60) {
                    present_sec = 0;
                    present_min  ;
                }
                check(present_hour);
                printf(":");
                check(present_min);
                printf(":");
                check(present_sec);
                printf("n");
            }
        }
    }
    while (present_sec != alarm_sec) {
            check(present_hour);
            printf(":");
            check(present_min);
            printf(":");
            check(present_sec);
            printf("n");
        present_sec  ;
    }
}
int main() {
    int present_time, time_for_alarm;
    printf("What time is it? (HHMMSS)");
    scanf("%d", amp;present_time);
    printf("What time should the alarm go off? (HHMMSS)");
    scanf("%d", amp;time_for_alarm);
    count(present_time, time_for_alarm);
    printf("ALARM");
    return 0;
}
  

Комментарии:

1. Ваши циклы кажутся мне странными. ericlippert.com/2014/03/05/how-to-debug-small-programs

2. Ваша функция проверки станет ненужной, как только вы снова прочитаете документацию printf. Он предлагает печать с заданной и дополненной шириной.

3. Я вижу три места, где вы что-то печатаете. Измените «:» на другие символы, чтобы вы всегда могли определить, какой вывод откуда поступает. Бьюсь об заклад, вы обнаружите, что неожиданные два выхода поступают из разных циклов.

4. Это: while (present_hour != alarm_hour) { if (present_hour == alarm_hour amp;amp; present_min == alarm_min amp;amp; present_sec == alarm_sec) { printf("ALARM"); } является проблемой, потому что по определению внутри вашего цикла while present_hour всегда будет отличаться от alarm_hour, поэтому код внутри вашего условия if никогда не будет выполняться

5. Несвязанный: вместо check(hour); printf(":"); ... использования printf("d:d:d", hour, min, sec);

Ответ №1:

Проблема прямо здесь:

 while (present_sec != alarm_sec) {
        check(present_hour);
        printf(":");
        check(present_min);
        printf(":");
        check(present_sec);
        printf("n");
    present_sec  ;
}

  

В любом другом цикле вы сначала продвигаетесь present_sec вперед, а затем печатаете время. В этом цикле вы продвигаетесь после. Когда вы достигнете нужного часа и минуты, вы войдете в этот цикл, и вы всегда будете дублировать время здесь. Попробуйте ввести 225555 и 225605. Вы увидите дублирование 22:56:00.