#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 для реального, но полезно знать о проблемах.