Программа, которая вычисляет ваше время пробуждения и печатает его

#c

#c

Вопрос:

Вот моя задача, а ниже приведена большая часть кода, который я уже написал:

Напишите программу, которая просит пользователя ввести текущее время в 24-часовом формате и спрашивает, как долго вы хотите спать. Затем программа вычисляет ваше время пробуждения и печатает его. Программа должна проверить, что значения введены в правильном формате, и должна напечатать сообщение об ошибке, если введен неверный ввод.

Программа также должна проверить, что введенные числа находятся в допустимом диапазоне (0 — 23 / 0 — 59).

Пример:

Введите текущее время (чч: мм): 21:56
Сколько времени вы хотите спать (чч: мм): 8:30
Если вы ложитесь спать сейчас, вы должны проснуться в 6:26.

КОНКРЕТНЫЙ ВОПРОС:

Мой код добавляет число за пределы формата 24 часа, например: «29 часов».

Как я могу проверить, превышает ли сумма минут 59? Чтобы он мог увеличивать часы и вычитать 1 час (60 минут) из минут

Наконец, как проверить, превышает ли количество часов 23? Поэтому необходимо вычесть 1 день (24 часа) из часов.

Код:

 #include <stdio.h>

int ValidateTime(int hh, int mm)
{
    int ret = 0;

    if (hh > 24)   ret = 1;
    if (mm > 60)   ret = 1;

    return ret;
}

int main()
{
    char string[100] = { 0 };

    int ret = 0;
    int hour1 = 0, min1 = 0;
    int hour2 = 0, min2 = 0;
    int hour_final = 0, min_final = 0;

    int sum = 0;

    printf("nEnter the time in "hh:mm" format : ");
    fgets(string, 100, stdin);       
    sscanf_s(string, "%d:%d", amp;hour1, amp;min1);

    ret = ValidateTime(hour1, min1);
    if (ret)
    {
        printf("nInvalid Time. Try Again.n");
    }

    do {
        printf("How long do you want to sleep in "h:mm" format: ");
        fgets(string, 100, stdin);
        sscanf_s(string, "%d:%d", amp;hour2, amp;min2);
        sum = hour1   hour2, min1   min2;

        ret = ValidateTime(hour2, min2);
        if (ret)
        {
            printf("nInvalid Time. Try Again.n");
        }

    } while (hour2 < 0);


    printf("If you go to bed now you must wake up at: %d:%d", sum);
    fgets(string, 100, stdin);
    sscanf_s(string, "%d:%d", amp;sum);
     
    return 0;
}
 
  

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

1. Вы можете использовать деление. например, 70/60 = 1.

2. Возможно, это выходит за рамки домашней задачи, но помните на будущее, что вы не можете делать математические вычисления таким образом. При переходе на летнее время вы будете просыпаться поздно (или рано). В реальном коде необходимо учитывать правила часовых поясов.

Ответ №1:

Вы можете использовать деление и по модулю:

 #include <stdio.h>

int main(void)
{
    int x = 29;

    printf("%d days, %d hoursn", x / 24, x % 24);
    return 0;
}
  

Вывод:

 1 days, 5 hours
  

То же самое для минут и часов, в этом случае используйте 60:

 int x = 257;

printf("%d hours, %d minutesn", x / 60, x % 60);
  

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

1. Спасибо. Наконец, не могли бы вы рассказать мне, как настроить «будильник», добавив текущее время сколько часов хотите спать? Я имею в виду, что у меня есть это в конце моего кода, но я не знаю, как изменить его с помощью вашего кода. Спасибо.

2. @MarcosSagretti вы читали другой ответ? кажется, что он просто отвечает на то, что вы ищете ( mktime ).

Ответ №2:

[Примечание: я понимаю, что это домашнее задание, а не практическая задача по математике. Я даю ответ по математике даты, потому что домашнее задание связано с обучением, а математика даты сложна.]

Напишите программу, которая просит пользователя ввести текущее время в 24-часовом формате и спрашивает, как долго вы хотите спать. Затем программа вычисляет ваше время пробуждения и печатает его.

Из-за правил перехода на летнее время вы не можете просто взять текущее время, добавить к нему часы и минуты и создать время для пробуждения. Если ЛЕТНЕЕ время изменится за ночь, вы проснетесь на час раньше (или позже).

Вместо этого, имея в наличии только стандартную библиотеку, вы можете преобразовать текущее время в эпохальное время (количество секунд с 1 января 1970 года по Гринвичу), добавить к нему секунды, а затем преобразовать обратно в местное время.

Сначала преобразуйте текущее время в полную локальную дату и время текущего дня. Используется time для получения времени в абсолютном количестве секунд независимо от часовых поясов. Затем localtime_r , чтобы превратить это в локальную дату и время. (Примечание: localtime_r может быть localtime_s в вашем компиляторе).

 #include <time.h>

// Get the current time since the epoch
time_t current_time = time(NULL);

// Convert it to the current local date and time.
struct tm start_local;
localtime_r(amp;current_time, amp;start_local);

// Set the local date to your given hour and minute.
start_local.tm_hour = hour1;
start_local.tm_min = min1;
  

Затем преобразуйте это обратно в время эпохи с mktime помощью .

 time_t start_time = mktime(amp;start_local);
  

Теперь мы можем спокойно заниматься математикой. start_time в секундах. Преобразуйте часы и минуты в секунды и добавьте их.

 time_t wake_time = start_time   (hour2 * 60 * 60)   (min2 * 60);
  

И преобразуйте это обратно в локальное время даты.

 struct tm wake_local;
localtime_r(amp;wake_time, amp;wake_local);
  

Для форматирования используйте strftime (Время в формате строки) .

 char time_part[10];
strftime(time_part, sizeof(time_part), "%H:%m", amp;wake_local);
  

Теперь нам нужно определить, является ли это время сегодняшним или завтрашним или чем-то еще.

 int day_diff = wake_local.tm_yday - start_local.tm_yday;

if( day_diff == 0 ) {
  printf("Wake at %s today.n", time_part);
}
else if( day_diff == 1 ) {
  printf("Wake at %s tomorrow.n", time_part)
}
else {
  printf("Wake at %s %d days from now. Are you a bear?n", time_part, day_diff);
}
  

Обратите внимание, что даже это неполно, что, если вы установите будильник в канун Нового года? Вам также нужно будет проверить год.


Если это кажется ужасно сложной работой, чтобы сделать что-то, по-видимому, простое: добро пожаловать в C. На самом деле, математика даты настолько сложна и подвержена ошибкам, что вы бы использовали библиотеку datetime для реального, но полезно знать о проблемах.