С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 25.09.2024
Сообщений: 6

Определить длительность пробежки

25.09.2024, 19:29. Показов 1613. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Условие задачи:

Феофан увлекается тремя вещами: программированием, музыкой, а также бегом. Однако, выйдя сегодня на пробежку, он забыл включить секундомер в начале, поэтому теперь не знает, сколько времени он бегал. Феофану пришла гениальная мысль — вычислить длительность пробежки, используя информацию о песнях, которые он послушал в процессе.

Он вспомнил, что за время пробежки он целиком послушал n
песен. Для каждой песни он выписал ее длительность в формате mm:ss. До двоеточия стоят ровно две цифры, обозначающие количество минут, а после — ровно две цифры, обозначающие количество секунд. Каждая песня длится строго меньше часа, количество минут и секунд лежат в отрезке от 0
до 59
включительно.

Помогите Феофану определить длительность пробежки и выведите ее в формате hh:mm:ss. Сначала ровно две цифры, обозначающие количество часов, затем две цифры — количество минут, и наконец — количество секунд. Гарантируется, что Феофан бегал строго меньше суток. Количество часов должно лежать в отрезке от 0
до 23
, а количество минут и секунд — в отрезке от 0
до 59
.

Формат входных данных
В первой строке дано одно целое число n
— количество песен, которые Феофан успел послушать за время пробежки (1≤n≤1000
).

Далее даны n
строк, каждая из которых имеет вид mm:ss — длительность очередной песни. Гарантируется, что длительности всех песен положительны.

Формат выходных данных
Выведите длительность пробежки в формате hh:mm:ss. Гарантируется, что Феофан бегал строго меньше суток.


Я решил эту задачу на С++, но в моем коде где-то есть одна или несколько ошибок, поэтому он работает неправильно.
Помогите, пожалуйста, найти ошибки и исправить их, чтобы код работал правильно.

Вот мой код:

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
int n;
cin >> n;
string arr0[1000]; //длительность песен
for (int i=0; i<n; i++)
{
cin >> arr0[i];
}
char arr1[1000][5]; //разделяем длительность песен
//на 5 символов и записываем в двумерный массив
for (int i=0; i<n; i++)
{
for (int j=0; j<5; j++)
{
arr1[i][j]=arr0[i].at(j);
}
}
//считаем время
int sum0, sum1, sum2, sum3, sum4, sum5;
sum0=0;
sum1=0;
sum2=0;
sum3=0;
sum4=0;
sum5=0;
 
for (int i=0; i<n; i++)
{
    sum5+=(int)arr1[i][4];
}
if (sum5>=10)
{
    sum4+=(sum5/10);
    sum5=sum5%10;
}
 
for (int i=0; i<n; i++)
{
    sum4+=(int)arr1[i][3];
}
if (sum4>=6)
{
    sum3+=(sum4/6);
    sum4=sum4%6;
}
 
for (int i=0; i<n; i++)
{
    sum3+=(int)arr1[i][1];
}
if (sum3>=10)
{
    sum2+=(sum3/10);
    sum3=sum3%10;
}
 
for (int i=0; i<n; i++)
{
    sum2+=(int)arr1[i][0];
}
if (sum2>=6)
{
    sum1+=(sum2/6);
    sum2=sum2%6;
}
 
if (sum1>=10)
{
    sum0+=(sum1/10);
    sum1=sum1%10;
}
 
cout << sum0 << sum1 << ":" << sum2 << sum3 << ":" << sum4 << sum5;
return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.09.2024, 19:29
Ответы с готовыми решениями:

Массив: Определить среднее время переговоров, длительность которых более трех минут.
Имеется массив данных о телефонных переговорах. Определить среднее время переговоров, длительность которых более трех минут. Определить...

Определить длительность проигрывания .flac
Подсмотрел на иностранном форуме простой способ и слегка модифицировал его: Option Explicit Dim Fi As Variant, Fe As Variant Dim X As...

Определить длительность подключения адаптера
Всем привет! Пишу &quot;мини-утилиту&quot; для мониторинга подключенных адаптеров в сеть. Через WMI получил почти все функции, которые мне нужны,...

16
Лежебока
 Аватар для Donkix
328 / 244 / 95
Регистрация: 12.05.2021
Сообщений: 1,429
Записей в блоге: 2
25.09.2024, 20:24
Цитата Сообщение от StormChaser88 Посмотреть сообщение
поэтому он работает неправильно
А что именно неправильно работает?
0
1 / 1 / 0
Регистрация: 25.09.2024
Сообщений: 6
25.09.2024, 20:35  [ТС]
Он работает неправильно, потому что в тесте не тот ответ:
я ввел:
2
10:01
00:59

должен вывести:
00:11:00

выводит:
18:04:36

Добавлено через 4 минуты
Он работает неправильно, потому что в тесте не тот ответ:
я ввел:
2
10:01
00:59

должен вывести:
00:11:00

выводит:
18:04:36

Ну и с другими тестами тоже какие-то непонятно откуда взявшиеся значения(
0
Лежебока
 Аватар для Donkix
328 / 244 / 95
Регистрация: 12.05.2021
Сообщений: 1,429
Записей в блоге: 2
25.09.2024, 23:05
Лучший ответ Сообщение было отмечено StormChaser88 как решение

Решение

Строка 20, было:
C++
1
arr1[i][j]=arr0[i].at(j);
Cтало:
C++
1
arr1[i][j]=arr0[i].at(j)-'0';
1
1 / 1 / 0
Регистрация: 25.09.2024
Сообщений: 6
25.09.2024, 23:26  [ТС]
Благодарю за помощь! )))
1
 Аватар для Dimon0401
79 / 62 / 17
Регистрация: 11.11.2019
Сообщений: 286
Записей в блоге: 1
06.10.2024, 22:22
Лучший ответ Сообщение было отмечено StormChaser88 как решение

Решение

Посмотрел на код, и у меня возник вопрос: а зачем для решения используется столько много циклов и двумерный массив?
У меня получился такой код.
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
#include <iostream>
 
int main()
{
    setlocale(LC_ALL, "RUS");
    
    unsigned int time_mm, time_ss;
    char c;
    int seconds=0, temp;
    unsigned int number_of_songs;
    
    std::cout << "Введите количество песен: ";
    std::cin >> number_of_songs;
 
    std::cout << "Введите длительность пеcен в формате mm:ss \n";
 
    for (int i = 1; i <= number_of_songs; ) {   //---------------------// Переменная i инкрементируется после проверки условия
        std::cout << "Трек N " << i << " ";
        std::cin >> time_mm >> c >> time_ss;    //---------------------// Заполняем время пробежки
    
        if (time_mm < 60 && time_ss < 60) {     //---------------------// Проверка корректности ввода времени
            temp = time_ss + (time_mm * 60);
            seconds += temp;
            i++;
        }
            else {
                std::cout << "Ошибка ввода! Повторите попытку: " << "\n";
            }
        
        if (seconds < 86400) {  //------------------------------------// Выходим из цикла если время пробежки больше суток
 
        }
            else { 
                std::cout << "Время пробежки больше суток: " << "\n";
                break; 
            }
    }
    
    std::cout << "Общее время пробежки: " 
        << (seconds / 3600) <<  "h:" //---------------------------------------------------------------------------// Считаем часы
        << ((seconds - (seconds / 3600) * 3600) / 60) << "m:" //--------------------------------------------------// Считаем минуты                                                        
        << (((seconds - (seconds / 3600) * 3600) - (((seconds - (seconds / 3600) * 3600) / 60)) * 60)) << "s\n";  // Считаем секунды
}
Дело в том, что я самостоятельно изучаю С++ и периодически почитываю форум в поисках разных задач. Так вот, тут у меня возник вопрос, является ли такой подход к решению задачи более правильным? Ведь можно просто посчитать общее кол-во секунд, и исходя из этого уже высчитать часы и минуты и уложится в один цикл.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,208
06.10.2024, 22:49
Лучший ответ Сообщение было отмечено StormChaser88 как решение

Решение

Цитата Сообщение от Dimon0401 Посмотреть сообщение
Посмотрел на код, и у меня возник вопрос: а зачем для решения используется столько много циклов и двумерный массив?
Это феерически ненужный и перегруженный бессмысленной работой подход автора вопроса. ТС фактически взялся реализовывать десятичную арифметику вручную. Незачем было это делать.

Цитата Сообщение от Dimon0401 Посмотреть сообщение
Так вот, тут у меня возник вопрос, является ли такой подход к решению задачи более правильным?
Да, ваш подход намного разумнее. Именно так и нужно было решать эту задачу.

Однако можно заметить этот странный паттерн, нередко встречающийся в "студенческом" коде: для вычисления остатка от деления a на b применяется гениальнейшая супермегаформула a - a / b * b, вместо того, чтобы просто написать a % b. Это явление цветет буйным цветом и в вашем коде.

Также можно заметить, что в условии задачи требуется вывести ответ в формате hh:mm:ss - строго по две цифры на позицию, т.е. при необходимости нужно выводить и ведущие нули. У вас этого не сделано.
2
 Аватар для Dimon0401
79 / 62 / 17
Регистрация: 11.11.2019
Сообщений: 286
Записей в блоге: 1
06.10.2024, 22:56
TheCalligrapher, благодарю за пояснение! Буду иметь ввиду.
0
1 / 1 / 0
Регистрация: 25.09.2024
Сообщений: 6
08.10.2024, 01:15  [ТС]
Я понимаю, что мой код плохой, но решить как-то по-другому я не смог и не успел бы. Я изучаю программирование относительно недавно, где-то больше года, и не могу сразу найти рациональный подход к решению задачи, уж извините. Благодарю всех вас за помощь!
0
 Аватар для analogov net
2523 / 1122 / 493
Регистрация: 17.11.2018
Сообщений: 2,830
08.10.2024, 23:35
Цитата Сообщение от StormChaser88 Посмотреть сообщение
найти ошибки и исправить их
например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <iomanip> 
 
using namespace std;
int main() {
    size_t n, sum = 0; 
    
    cin >> n;
    while (n--) {
        string s;
        
        cin >> s;
        sum += stoi(s.substr(0, 2)) * 60 + stoi(s.substr(3, 2));
    }
    cout << setfill('0') << setw(2) << sum / 3600 << ':' << setw(2) << (sum % 3600) / 60 << ':' << setw(2) << (sum % 3600) % 60 << endl;
}
0
 Аватар для Dimon0401
79 / 62 / 17
Регистрация: 11.11.2019
Сообщений: 286
Записей в блоге: 1
09.10.2024, 00:08
Цитата Сообщение от StormChaser88 Посмотреть сообщение
Я понимаю, что мой код плохой, но решить как-то по-другому я не смог
Ну для этого форумы и существуют, что бы общаться и делится опытом. Я в тему влез не повыё повыпендриваться, а предложить свой вариант. :-)

Добавлено через 2 минуты
Цитата Сообщение от analogov net Посмотреть сообщение
например:
А где #include <string>?
0
 Аватар для analogov net
2523 / 1122 / 493
Регистрация: 17.11.2018
Сообщений: 2,830
09.10.2024, 11:32
Цитата Сообщение от Dimon0401 Посмотреть сообщение
А где #include <string>?
Кликните здесь для просмотра всего текста
0
Заблокирован
09.10.2024, 12:11
Цитата Сообщение от analogov net Посмотреть сообщение
Видишь суслика?

Вижу, по крайней мере в стороне GNU GCC.
#include <iostream> -> #include <ostream> -> #include <format> -> #include <string>
Но не нужно же расcказывать что так далеко не в каждом компиляторе?
0
 Аватар для analogov net
2523 / 1122 / 493
Регистрация: 17.11.2018
Сообщений: 2,830
09.10.2024, 15:00
Цитата Сообщение от SmallEvil Посмотреть сообщение
так далеко не в каждом компиляторе
Само собой. Но всё же...
0
09.10.2024, 15:18

Не по теме:

Цитата Сообщение от analogov net Посмотреть сообщение
Но всё же...
Суслики XD

Я вот реально встречал что даже тип std::uint64_t без хидера <cstdint> не определялся.
Это было на одной из обучающих онлайн платформ.
Так что, нужно делать все по правилам, если не хотим что бы суслики с белочками прыгали )))

0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
09.10.2024, 16:07
Цитата Сообщение от SmallEvil Посмотреть сообщение
так далеко не в каждом компиляторе
А далеко ходить и не надо.
Я пользуюсь VS-2008.
Так в нем <string> не подгружается
1
09.10.2024, 16:18

Не по теме:

Цитата Сообщение от zss Посмотреть сообщение
VS-2008
Зато при подключении "windows.h" подключается все что не попадя, и стринги и систринги и рандом (srand/rand) майкрософтский, а не из std.
Веселостей хватает ))

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.10.2024, 16:18
Помогаю со студенческими работами здесь

Определить длительность ЛЧМ сигнала
Какая должна быть максимальная длительность ЛЧМ сигнала при заданных : Несущей частоты - f0 Нижней частоты - fн Верхней...

Как определить длительность презентации
Добрый день! Для синхронизации презентации с аудио файлом пытаюсь определить длительность презентации: Private mlngStart As Long ...

Определить длительность wav файла
Такая проблема. Есть некий аудио файл формата .wav надо прочитать его длительность и записать в переменную.

Известны параметры аудиозаписи. Определить длительность записи.
4). Решить задачу - Проводилась одноканальная (моно) звукозапись с частотой дискретизации 16 кГц и 32-битным разрешением. В результате был...

Чёрный экран после загрузки ( пробежки полосочек )
Проблема такая, когда включаю компьютер проходит заставка материнки потом начинает загрузка windows ( когда пробегают полосочки ) и после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru