Форум программистов, компьютерный форум CyberForum.ru

Решение задач Р. Лафоре, структуры - C++

Восстановить пароль Регистрация
 
Bonaqus
2 / 2 / 0
Регистрация: 10.01.2013
Сообщений: 15
26.01.2013, 17:59     Решение задач Р. Лафоре, структуры #1
Никак не могу понять в чем проблема.

Условие задачи: используя структуру time с полями типа int (часы, минуты, секунды) написать программу, которая получает от пользователя два значения времени в формате 12:59:59, сохраняет из в переменных типа struct time, затем переводит оба значения в секунды, складывает их, и переводит сумму в исходный формат на экран в формате 12:59:59.

Описание проблемы:
Откомпилил, решил прогнать на критические параметры: время t1=12:59:59 ; t2=0:0:0 и наоборот,
t1=0:0:0; t2=12:59:59.
в результате у меня вылезли 2 (если не больше) ошибки. (скриншоты приведены)


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
#include<iostream>
using namespace std;
 
struct time
{
    int hours;
    int minutes;
    int seconds;
};
 
int main()
{
    char ch;    // для хранения символа ':'
    time t1,t2,t3;              //переменные типа time
    float temp1,temp2,temp3,dec;           //переменные для времени в секундах
        
    cout<<"1st time [HH:MM:SS]: ";                       //получаем значения полей переменных t1, t2 структур типа time
    cin>>t1.hours>>ch>>t1.minutes>>ch>>t1.seconds;
    cout<<"2nd time [HH:MM:SS]: ";
    cin>>t2.hours>>ch>>t2.minutes>>ch>>t2.seconds;
 
        temp1=t1.hours*3600+t1.minutes*60+t1.seconds;  //переводим все время в секунды
    temp2=t2.hours*3600+t2.minutes*60+t2.seconds;
    temp3=temp1+temp2;                            //и складываем
 
    t3.hours=static_cast<int>(temp3/3600);                //получаем часы
/*ЗДЕСЬ ПЕРВАЯ ОШИБКА! если t1 = 0:0:0 , следующий оператор не выполняется*/
/*при вводе t2 = 0:0:0 выполняется корректно*/
    dec=temp3/3600-t1.hours;                                  //находим остаток минут(dec форма)
        t3.minutes=static_cast<int>(dec*60);                   //находим минуты
/*Вторая ошибка здесь: секудны получают отрицательные значения и уже выводятся правильно*/  
/*и их по идее нужно бы умножать на 60, но нет, компилятор решает что он все понял*/
/* и выводит значение "-58.0003"  (не ясно, почему минус...)*/  
        dec=dec-t3.minutes;                                          //получаем остаток секунд(ec форма)
    t3.seconds=static_cast<int>(dec*60)+1;               //находим секунды и прибавляем +1,
                                                                              //так как на калькуляторе глотало 1 секунду
    
    cout<<"3rd time [HH:MM:SS]: "<<t3.hours<<ch<<t3.minutes<<ch<<t3.seconds<<endl;
 
    system("pause");
    return 0;
}

С уважением, Bonaqus.

P.S. Возможно я дурак или чего то не заметил...прошу строго не судить.
Миниатюры
Решение задач Р. Лафоре, структуры  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2013, 17:59     Решение задач Р. Лафоре, структуры
Посмотрите здесь:

Решение задач С++ C++
C++ решение задач С++
Решение задач С++ C++
C++ Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"
C++ Решение задач C++ Р. Лафоре
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bonaqus
2 / 2 / 0
Регистрация: 10.01.2013
Сообщений: 15
26.01.2013, 18:01  [ТС]     Решение задач Р. Лафоре, структуры #2
Задача должна была быть выполнена только этим путем, ветвления и займы минут и часов не предлагать.
Bonaqus
2 / 2 / 0
Регистрация: 10.01.2013
Сообщений: 15
28.01.2013, 17:52  [ТС]     Решение задач Р. Лафоре, структуры #3
Вот, сел на свежую голову, решил за пару минут)))
Теперь работает без ошибок, если правильно ввести время.

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
#include<iostream>
using namespace std;
 
struct time
{
    int hours;
    int minutes;
    int seconds;
};
 
int main()
{
    char ch;
    time t1,t2,t3;
    int temp; //здесь -1 переменная, так как не нужно хранить дробные части как в предыдущем
            
    cout<<"1st time [HH:MM:SS]: ";
    cin>>t1.hours>>ch>>t1.minutes>>ch>>t1.seconds; [12:59:56] 
    cout<<"2nd time [HH:MM:SS]: ";
    cin>>t2.hours>>ch>>t2.minutes>>ch>>t2.seconds; [0:0:0] 
 
    temp=t1.hours*3600+t1.minutes*60+t1.seconds+t2.hours*3600+t2.minutes*60+t2.seconds; /*==46796*/
 
    /*поскольку в минуте 60 секунд, и соответственно любое время в виде [HH:MM:00] делится на 60 без остатка, 
то в случае если секунды !=0 мы получим остаток секунд (например  [HH:MM:56] 
остаток =56*, и т.д. Возможно, не слишком доходчиво, но думаю, разберетесь =) */
 
    t3.seconds=temp%60;   /*[12:59:56]==(46796), 46796%60 == 56 -секунд*/
    t3.minutes=(temp%3600-temp%60)/60;   /*(46796%3600-59)==3540; 3540/60==59*int* -минут*/
    t3.hours=(temp-temp%3600)/3600;  /*(46796-3596)/3600 == 43200/3600 == 12*int* -часов*/
        
    cout<<"3rd time [HH:MM:SS]: "<<t3.hours<<ch<<t3.minutes<<ch<<t3.seconds<<endl;
 
    system("pause");
    return 0;
}
BORSHEVIK
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 29
28.01.2013, 17:53     Решение задач Р. Лафоре, структуры #4
вот и поговорил сам с собой))Я тоже решал эту задачу,но не совсем как ты,попроще было,а вообще,верно мыслил,и ещё тебе совет,не удаляй все те задания,которые сделал,дальше код понадобится,и задания про доллары в банке тоже не удаляй,будут часто использоваться,и именно про доллары,и ещё с шилингами тоже не удаляй
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
28.01.2013, 19:38     Решение задач Р. Лафоре, структуры #5
Цитата Сообщение от Bonaqus Посмотреть сообщение
C++
1
2
t3.minutes=(temp%3600-temp%60)/60; /*(46796%3600-59)==3540; 3540/60==59*int* -минут*/
 t3.hours=(temp-temp%3600)/3600; /*(46796-3596)/3600 == 43200/3600 == 12*int* -часов*/
можно упростить:
C++
1
2
t3.minutes=(temp%3600)/60; 
t3.hours=temp/3600;
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
28.01.2013, 20:00     Решение задач Р. Лафоре, структуры #6
C++
1
2
3
    t3.seconds = temp % 60;
    t3.minutes = (temp/60) % 60;
    t3.hours = (temp/3600) % 24;
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
28.01.2013, 20:16     Решение задач Р. Лафоре, структуры #7
Цитата Сообщение от Bonaqus Посмотреть сообщение
t3.hours=static_cast<int>(temp3/3600); * * * * * * * *//получаем часы
/*ЗДЕСЬ ПЕРВАЯ ОШИБКА! если t1 = 0:0:0 , следующий оператор не выполняется*/
/*при вводе t2 = 0:0:0 выполняется корректно*/
* * dec=temp3/3600-!!!!!!!t1!!!!!!!!!.hours; * * * * * * * * * * * * * * * * *//находим остаток минут(dec форма)
* * * * t3.minutes=static_cast<int>(dec*60); * * * * * * * * * //находим минуты
/*Вторая ошибка здесь: секудны получают отрицательные значения и уже выводятся правильно*/*
/*и их по идее нужно бы умножать на 60, но нет, компилятор решает что он все понял*/
/* и выводит значение "-58.0003" *(не ясно, почему минус...)*/ *
* * * * dec=dec-t3.minutes; * * * * * * * * * * * * * * * * * * * * *//получаем о
Заменить dec=temp3/3600-t1.hours; на dec=temp3/3600-t3.hours; как минимум
Bonaqus
2 / 2 / 0
Регистрация: 10.01.2013
Сообщений: 15
29.01.2013, 12:16  [ТС]     Решение задач Р. Лафоре, структуры #8
Цитата Сообщение от valeriikozlov Посмотреть сообщение
можно упростить:
C++
1
2
t3.minutes=(temp%3600)/60; 
t3.hours=temp/3600;
Здесь будет неявное преобразование как бы(или нет?), компилятор обрабатывает правильно, но для наглядности сделал с отсечением лишних минут и секунд.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2014, 02:05     Решение задач Р. Лафоре, структуры
Еще ссылки по теме:

Решение задачи Р.Лафоре, объекты и классы C++
Решение задач C++
Решение задач C++

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

Или воспользуйтесь поиском по форуму:
Lars
1 / 1 / 0
Регистрация: 16.09.2014
Сообщений: 34
28.12.2014, 02:05     Решение задач Р. Лафоре, структуры #9
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>
using namespace std;
struct time
{
    int hours;
    int minutes;
    int seconds;
};
int main()
{
    setlocale(LC_ALL,"Russian");
    time t1,t2,t3,t4;
    unsigned long totalsecs1;
    unsigned long totalsecs2;
    unsigned long totalsecs3;
    cout<<"Введите часы.минуты.секунды:";
    cin>>t1.hours>>t1.minutes>>t1.seconds;
    totalsecs1=t1.hours*3600+t1.minutes*60+t1.seconds;
    cout<<"Введите часы.минуты.секунды :";
    cin>>t2.hours>>t2.minutes>>t2.seconds;
    totalsecs2=t2.hours*3600+t2.minutes*60+t2.seconds;
 
    totalsecs3=totalsecs1+totalsecs2;//Сумма всех секунд
 
    t3.hours=totalsecs1/3600;
    t3.minutes=(totalsecs1-(t1.hours*3600))/60;
    t3.seconds=(totalsecs1-(t1.hours*3600))-t1.minutes*60;
 
 
    t4.hours=totalsecs2/3600;
    t4.minutes=(totalsecs2-(t2.hours*3600))/60;
    t4.seconds=(totalsecs2-(t2.hours*3600))-t2.minutes*60;
    
    
 
    cout<<totalsecs1<<endl;
    cout<<totalsecs2<<endl;
    
    cout<<"Сумма всех секунд:"<<totalsecs3<<endl;
    cout<<"Перое время:"<<t3.hours<<":"<<t3.minutes<<":"<<t3.seconds<<endl;
    cout<<"Второе время:"<<t4.hours<<":"<<t4.minutes<<":"<<t4.seconds<<endl;
    
 
    cout<<t3.hours+t4.hours<<":"<<t3.minutes+t4.minutes<<":"<<t3.seconds+t4.seconds;
    
        
    return 0;
}
Мой вариант.
Yandex
Объявления
28.12.2014, 02:05     Решение задач Р. Лафоре, структуры
Ответ Создать тему
Опции темы

Текущее время: 14:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru