Задача.
Временной интервал. Заданы моменты начала и конца некоторого промежутка времени в часах, минутах и секундах (в пределах одних суток). Найти продолжительность этого промежутка в тех же единицах измерения.
Тесты
Момент начала промежутка | Момент конца промежутка | Ответ | ||||||
Часы | Минуты | Секунды | Часы | Минуты | Секунды | Часы | Минуты | Секунды |
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 |
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; } |
Я разберу частный случай, при котором минуты и секунды конечного момента времени меньше минут и секунд начального момента времени. Вот конкретная строка из кода, отвечающая за этот случай:
23 24 25 26 |
if ((min1 < min) && (sek1 < sek)) //Случай, при котором минуты и секунды конца промежутка меньше начальных.// { minn = min1 - min - 1 + 60; sekk = sek1 - sek + 60; chh = ch1 - ch - 1; } |
Остальные частные случаи вычисляются по такому же принципу (перевод одного часа в минуты / одной минуты в секунды).
Например, когда минуты начального момента времени и конечного момента времени будут равны, а секунды конечного момента времени меньше начального, то в ответе всегда получится 59 минут. (т.к. разность минут равна нулю, а одна минута нам нужна для того, чтобы оставить секунды в области допустимых значений, а 0 минут то же самое, что и 60 минут, а 60-1=59).
Второй вариант решения этой задачи выглядит намного проще. С теми же самыми тестами.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#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].
Либо еще один вариант решения при помощи операций деления и остатка от деления.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#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.
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 + " секунд(ы) с начала отсчета"); } } } } |
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 + " секунд(ы) с начала отсчета"); } } |
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 + " секунд(ы) с начала отсчета"); } } |
— «внимание я приделил» лучше «уделил». Кстати, можно писать заметки на украинском языке. Вообще, украинский, русский и английский языки можно использовать без дополнительного согласования. Если удобнее на каком-то другом, то согласуйте с преподавателем. Но ошибок нельзя будет делать в любом случае.
— «В этой задачи конкретного алгоритма нет» — конечно же есть. Вы именно его и «запрограммировали»
— Вы реализовали классический алгоритм вычитания столбиком с заёмом единиц старшего разряда. Для сложных систем, какими являются не метрические системы отсчёта времени, проще поступать иначе.
1. Переводим всё в наименьшие единицы измерения. Обычно большие единицы составляют целое число меньших единиц. В нашем случае в секунды.
2. Находим разность между начальным и конечным значением
3. При помощи операций деления и остатка от деления переводим полученный результат в часы-минуты-секунды.
Почему я снял два балла?
Ваше решение использует условные операторы, а тема — линейные вычисления.
Как получить 10 баллов? Добавьте в Ваш текст то решение в несколько строк, которое я описал (только не удаляйте старое оно мне кажется полезным!). Или избавьтесь в своей программе от ветвления. Вдруг это возможно?
Добавил два аналогичных друг другу решения.
Дописал алгоритм и формулы. Все исправил.
Хорошо. Я засчитываю работу.
Только, пожалуйста, уберите условный оператор проверки корректности исходных данных. Это задача на линейные вычисления и условных операторов в ней пока ещё не должно быть.
И, кстати, при вставке кода можно указать с какого числа начинать нумерацию строк. Если Вы вставляете кусок кода программы, лучше сохранять нумерацию. Тогда легче определить где это в общем коде.
Условный оператор убрал, добавил правильную нумерацию.
Исправлено
Хорошо получилось
Да, зачтено