Задача.
Временной интервал. Заданы моменты начала и конца некоторого промежутка времени в часах, минутах и секундах (в пределах одних суток). Найти продолжительность этого промежутка в тех же единицах измерения.
Тесты
Момент начала промежутка |
Момент конца промежутка |
Ответ |
Часы |
Минуты |
Секунды |
Часы |
Минуты |
Секунды |
Часы |
Минуты |
Секунды |
ch |
min |
sek |
ch1 |
min1 |
sek1 |
chh |
minn |
sekk |
3 |
24 |
30 |
10 |
44 |
35 |
7 |
20 |
5 |
2 |
11 |
20 |
10 |
21 |
10 |
8 |
9 |
50 |
2 |
10 |
31 |
10 |
10 |
44 |
8 |
0 |
13 |
2 |
11 |
30 |
10 |
6 |
20 |
7 |
54 |
50 |
2 |
11 |
20 |
10 |
6 |
30 |
7 |
55 |
10 |
3 |
4 |
4 |
3 |
4 |
4 |
Не прошло ни секунды с начала отсчета |
0 |
30 |
11 |
0 |
44 |
15 |
0 |
14 |
4 |
0 |
11 |
70 |
0 |
15 |
80 |
Неправильно введены данные |
0 |
0 |
30 |
0 |
0 |
55 |
0 |
0 |
25 |
Код программы на C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
#include <iostream> #include <math.h> int main() { int ch, min, sek, ch1, min1, sek1, chh, minn, sekk; //Описание переменных для хранения входных данных.// scanf("%d%d%d%d%d%d", &ch, &min, &sek, &ch1, &min1, &sek1); //Чтение из стандартного потока ввода.// if ((min1 >= min) && (sek1 >= sek)) //Случай, при котором минуты и секунды конца промежутка больше либо равны начальным.// { minn = min1 - min; sekk = sek1 - sek; chh = ch1 - ch; } if ((min1 >= min) && (sek1 < sek)) //Случай, при котором минуты конца промежутка больше либо равны начальным, а секунды - меньше начальных.// { if (min1 == min) //В случае, если минуты равны.// { minn = 59; chh = ch1 - ch - 1; } else { minn = min1 - min - 1; chh = ch1 - ch; } sekk = sek1 - sek + 60; } if ((min1 < min) && (sek1 < sek)) //Случай, при котором минуты и секунды конца промежутка меньше начальных.// { minn = min1 - min - 1 + 60; sekk = sek1 - sek + 60; chh = ch1 - ch - 1; } if ((min1 < min) && (sek1 >= sek)) //Случай, при котором минуты конца промежутка меньше начальных, а секунды больше либо равны начальным.// { minn = min1 - min + 60; sekk = sek1 - sek; chh = ch1 - ch - 1; } if ((ch1 == ch) && (min1 == min) && (sek1 == sek)) //Случай, при котором часы, минуты и секунды конца и начала промежутка равны.// { printf("Не прошло ни секунды с начала отсчета"); } else { if ((ch1 == 0) && (ch == 0) && ((min > min1) || (sek > sek1))) //Случай, при котором часы равны 0, а минуты либо секунды конца промежутка больше минут и секунд начала промежутка.// { printf("Неправильно введены данные"); } else { printf("Прошло %d часа(ов) ", chh); printf("%d минут(ы)", minn); //Вывод конечного результата.// printf(" %d секунд(ы) с начала отсчета", sekk); } } return 0; } |
В данной задаче я отнимал от конечного момента времени (часов, минут, секунд) начальный момент времени (часы, минуты, секунды) и получал результат. Особое внимание я уделил частным случаям. Здесь есть несколько основных условий при который обычного вычитания не достаточно, а требуются особые вычисление (т.к. в часах 60 минут, а в минутах 60 секунд).
Я разберу частный случай, при котором минуты и секунды конечного момента времени меньше минут и секунд начального момента времени. Вот конкретная строка из кода, отвечающая за этот случай:
|
if ((min1 < min) && (sek1 < sek)) //Случай, при котором минуты и секунды конца промежутка меньше начальных.// { minn = min1 - min - 1 + 60; sekk = sek1 - sek + 60; chh = ch1 - ch - 1; } |
Разберем на конкретном примере. Начальный момент времени равен 2 часа 11 минут 30 секунд, а конечный — 10 часов 6 минут 20 секунд. (Строка 4 таблицы значений). Отнимая, 10-2=8, 6-11=-5, 20-30=-10, выходим за область значений и минуты с секундами получаются отрицательными. Для того, чтобы этого не случилось следует один час перевести в минуты и одну минуту перевести в секунды, то есть, соответственно, отнять единичку от конечных значений часов и минут. Получаем 9 часов 65 минут и 80 секунд. Это значение высчитывается в программе и является промежуточным вычислением, которое не выводится на экран, но участвует в расчетах. Отнимая, 9-2=7 , 65-11=54 , 80-30=50 , что уже и является результатом
(7 часов 54 минуты 50 секунд).
Остальные частные случаи вычисляются по такому же принципу (перевод одного часа в минуты / одной минуты в секунды).
Например, когда минуты начального момента времени и конечного момента времени будут равны, а секунды конечного момента времени меньше начального, то в ответе всегда получится 59 минут. (т.к. разность минут равна нулю, а одна минута нам нужна для того, чтобы оставить секунды в области допустимых значений, а 0 минут то же самое, что и 60 минут, а 60-1=59).
Второй вариант решения этой задачи выглядит намного проще. С теми же самыми тестами.
Код программы на C++:
|
#include <iostream> #include <math.h> int main() { int ch, min, sek, ch1, min1, sek1, chh, minn, sekk, beg, end, dif ; //Описание переменных для хранения входных данных.// scanf("%d%d%d%d%d%d", &ch, &min, &sek, &ch1, &min1, &sek1); //Чтение из стандартного потока ввода.// ch *= 3600 ; ch1 *= 3600 ; min *= 60 ; min1 *= 60 ; //Перевод величин в наименьшие единицы измерения. beg = ch + min + sek ; //Находим момент начала промежутка в наименьших единицах измерения (секундах). end = ch1 + min1 + sek1 ;//Находим момент конца промежутка в наименьших единицах измерения (секундах). dif = end-beg ;//Нахождение промежутка. chh = dif / 3600 ; //Нахождение промежутка времени в часах. minn = ( dif - 3600 * chh ) / 60 ; //Нахождение промежутка времени в минутах. sekk = dif - 3600 * chh - minn * 60 ; //Нахождение промежутка времени в секундах. printf("Прошло %d часа(ов) %d минут(ы) %d секунд(ы) с начала отсчета", chh, minn, sekk); return 0; } |
Алгоритм:
- Переводим всё в наименьшие единицы измерения (в секунды). [latex]ch*=3600 [/latex], [latex]min*=60[/latex],[latex]ch1*=3600 [/latex], [latex]min1*=60[/latex]
- Находим начальное значение в секундах: [latex]beg=ch+min+sek [/latex], конечное значение в секундах [latex]end=ch1+min1+sek1[/latex].
- Находим разность между начальным и конечным значением, тем самым находим промежуток. [latex]dif=end-beg[/latex].
- Вычисляем значения часов, минут и секунд промежутка по формулам: [latex]chh = \frac{dif}{3600}[/latex], [latex]minn = \frac{dif — 3600 * chh}{60}[/latex], [latex]sekk = dif — 3600 * chh — minn * 60[/latex].
Либо еще один вариант решения при помощи операций деления и остатка от деления.
Код программы на C++:
|
#include <iostream> #include <math.h> int main() { int ch, min, sek, ch1, min1, sek1, chh, minn, sekk, beg, end, dif ; //Описание переменных для хранения входных данных.// scanf("%d%d%d%d%d%d", &ch, &min, &sek, &ch1, &min1, &sek1); //Чтение из стандартного потока ввода.// ch *= 3600 ; ch1 *= 3600 ; min *= 60 ; min1 *= 60 ; //Перевод величин в наименьшие единицы измерения. beg = ch + min + sek ; //Находим момент начала промежутка в наименьших единицах измерения (секундах). end = ch1 + min1 + sek1 ;//Находим момент конца промежутка в наименьших единицах измерения (секундах). dif = end-beg ; //Нахождение промежутка. chh = dif / 3600 ; //Нахождение промежутка времени в часах. minn = dif % 3600 / 60 ; //Нахождение промежутка времени в минутах. sekk = dif % 60 ; //Нахождение промежутка времени в секундах. printf("Прошло %d часа(ов) %d минут(ы) %d секунд(ы) с начала отсчета", chh, minn, sekk); return 0; } |
Алгоритм тот же кроме последнего пункта, где формулы становятся такими:
chh = dif / 3600,
minn = dif % 3600 / 60,
sekk = dif % 60.
Код программы на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
import java.util.*; import java.lang.*; import java.io.*; class TimeInterval { public static void main (String[] args) throws java.lang.Exception { //Описание переменных для хранения входных данных.// int chh = 0, minn = 0, sekk = 0; Scanner in = new Scanner(System.in); //Чтение из стандартного потока ввода.// int ch = in.nextInt(); int min = in.nextInt(); int sek = in.nextInt(); int ch1 = in.nextInt(); int min1 = in.nextInt(); int sek1 = in.nextInt(); if ((min1 >= min) && (sek1 >= sek)) //Случай, при котором минуты и секунды конца промежутка больше либо равны начальным.// { minn = min1 - min; sekk = sek1 - sek; chh = ch1 - ch; } if ((min1 >= min) && (sek1 < sek)) //Случай, при котором минуты конца промежутка больше либо равны начальным, а секунды - меньше начальных.// { if (min1 == min) //В случае, если минуты равны.// { minn = 59; chh = ch1 - ch - 1; } else { minn = min1 - min - 1; chh = ch1 - ch; } sekk = sek1 - sek + 60; } if ((min1 < min) && (sek1 < sek)) //Случай, при котором минуты и секунды конца промежутка меньше начальных.// { minn = min1 - min - 1 + 60; sekk = sek1 - sek + 60; chh = ch1 - ch - 1; } if ((min1 < min) && (sek1 >= sek)) //Случай, при котором минуты конца промежутка меньше начальных, а секунды больше либо равны начальным.// { minn = min1 - min + 60; sekk=sek1 - sek; chh = ch1 - ch - 1; } if ((ch1 == ch) && (min1 == min) && (sek1 == sek)) //Случай, при котором часы, минуты и секунды конца и начала промежутка равны.// { System.out.printf("Не прошло ни секунды с начала отсчета"); } else { if ((ch1 == 0) && (ch == 0) && ((min > min1) || (sek > sek1))) //Случай, при котором часы равны 0, а минуты либо секунды конца промежутка больше минут и секунд начала промежутка.// { System.out.printf("Неправильно введены данные"); } else { //Вывод конечного результата.// System.out.printf("Прошло " + chh + " часа(ов) " + minn + " минут(ы) " + sekk + " секунд(ы) с начала отсчета"); } } } } |
И второе решение:
Код программы на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
import java.util.*; import java.lang.*; import java.io.*; class TimeInterval { public static void main (String[] args) throws java.lang.Exception { //Описание переменных для хранения входных данных.// int beg, end, dif, chh, minn, sekk; Scanner in = new Scanner(System.in); //Чтение из стандартного потока ввода.// int ch = in.nextInt(); int min = in.nextInt(); int sek = in.nextInt(); int ch1 = in.nextInt(); int min1 = in.nextInt(); int sek1 = in.nextInt(); ch *= 3600 ; ch1 *= 3600 ; min *= 60 ; min1 *= 60 ; //Перевод величин в наименьшие единицы измерения. beg = ch + min + sek ; //Находим момент начала промежутка в наименьших единицах измерения (секундах). end = ch1 + min1 + sek1 ;//Находим момент конца промежутка в наименьших единицах измерения (секундах). dif = end - beg ;//Нахождение промежутка. chh = dif / 3600 ; //Нахождение промежутка времени в часах. minn = ( dif - 3600 * chh ) / 60 ; //Нахождение промежутка времени в минутах. sekk = dif - 3600 * chh - minn * 60 ; //Нахождение промежутка времени в секундах. System.out.printf("Прошло " + chh + " часа(ов) " + minn + " минут(ы) " + sekk + " секунд(ы) с начала отсчета"); } } |
Код решения на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
import java.util.*; import java.lang.*; import java.io.*; class TimeInterval { public static void main (String[] args) throws java.lang.Exception { //Описание переменных для хранения входных данных.// int beg, end, dif, chh, minn, sekk; Scanner in = new Scanner(System.in); //Чтение из стандартного потока ввода.// int ch = in.nextInt(); int min = in.nextInt(); int sek = in.nextInt(); int ch1 = in.nextInt(); int min1 = in.nextInt(); int sek1 = in.nextInt(); ch *= 3600 ; ch1 *= 3600 ; min *= 60 ; min1 *= 60 ; //Перевод величин в наименьшие единицы измерения. beg = ch + min + sek ; //Находим момент начала промежутка в наименьших единицах измерения (секундах). end = ch1 + min1 + sek1 ;//Находим момент конца промежутка в наименьших единицах измерения (секундах). dif = end-beg ; //Нахождение промежутка. chh = dif / 3600 ; //Нахождение промежутка времени в часах. minn = dif % 3600 / 60 ; //Нахождение промежутка времени в минутах. sekk = dif % 60 ; //Нахождение промежутка времени в секундах. System.out.printf("Прошло " + chh + " часа(ов) " + minn + " минут(ы) " + sekk + " секунд(ы) с начала отсчета"); } } |
Related Images:
Для отправки комментария необходимо войти на сайт.