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

Время - C++

Восстановить пароль Регистрация
 
 
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
09.06.2014, 17:09     Время #1
Здравствуйте недавно начал изучать C++ смотрю примеры в книги, а на те примеры которые в учебнике нет ответов сверяюсь с их решение у вас на сайте в теме Решение всех упражнений из книги Р. Лафоре "Объектно-ориентированное программирование в С++"


И возникает вот такой вопрос приведу пример

Допустим у нас есть часы, минуты, секунды

C++
1
2
3
int hours;
int minutes;
int seconds;
Я хочу сделать проверку, как известно всего минут может быть 60, а значит если у меня в программе их 80 то должен прибавиться час а в минутах сохраниться число 20.


Вот как такую проверку делают в книги, а также на сайте в решенных примерах(h-hours, m-minutes, s-seconds)

C++
1
2
3
4
5
6
7
8
9
   if(m>=60) 
          {
              h++; m-=60;
          }
 
          if(s>=60) 
         {
             m++; s-=60;
         }

Неужели это правильно???
Ведь если я допустим запишу вот так:

C++
1
2
3
4
5
6
7
int minutes=320;
 
if(minutes>=60)
{
   hours++;
   minutes-=60;
}
То у меня переменная hours повысится всего лишь на 1 час, а в переменной minutes все равно останется значение 260. Или я что то не так понимаю???


Просто я когда этот пример писал я делал таким образом

C++
1
2
3
4
5
if(minutes>=60)
{
   hours=minutes/60;
   minutes%=60;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2014, 17:09     Время
Посмотрите здесь:

Время. C++
время C++
C++ Функция: Написать функцию next(t, t1, d), которая присваивает параметру t1 время на d секунд больше, чем время t.
C++ Написать программу вычисления величины дохода по вкладу. Процентная ставка (% годовых) и время хранения (дней) задаются во время работы программы
C++ Записи. Дано время t1 и время t2. Определить, сколько времени пройдет от t1 до t2
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tehnar5
31 / 31 / 12
Регистрация: 03.05.2011
Сообщений: 84
09.06.2014, 17:15     Время #2
Все понимаете правильно. Либо надо делать цикл
C++
1
while (minutes >= 60)
Либо делать как Вы, Ваш способ даже лучше, так как работает быстрее
Kverter
 Аватар для Kverter
35 / 35 / 16
Регистрация: 30.10.2013
Сообщений: 211
09.06.2014, 17:20     Время #3
C++
1
2
3
4
5
if (minutes>=60)
{
h=h+minutes/60;
minutes = minutes-minutes/60*60;
}
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
09.06.2014, 17:22  [ТС]     Время #4
tehnar5, спасибо за ответ, а то я думал что это я что-то не так понимаю.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
09.06.2014, 17:25     Время #5
Цитата Сообщение от tehnar5 Посмотреть сообщение
Ваш способ даже лучше, так как работает быстрее
сумлеваюсь я
проверять нужно
ибо / % не самые быстрые операции
Kverter
 Аватар для Kverter
35 / 35 / 16
Регистрация: 30.10.2013
Сообщений: 211
09.06.2014, 17:25     Время #6
dicros, можно и без цикла,как я написал,так проще,ты выделяешь целую часть,то есть допустим у тебя 249 мин minute/60 будет равняться 4 (так как у тебя инт)
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
09.06.2014, 17:30     Время #7
Цитата Сообщение от dicros Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
if(m>=60) 
          {
              h++; m-=60;
          }
 
          if(s>=60) 
         {
             m++; s-=60;
         }
алгоритмическая ошибка
сначала надо секунды проверять
иначе 2ч 59м 60сек превратятся в 2ч 60м 00сек
а насчет того что
Цитата Сообщение от dicros Посмотреть сообщение
То у меня переменная hours повысится всего лишь на 1 час, а в переменной minutes все равно останется значение 260.
этот вариант хорош когда прибавляешь по одной минуте/секунде
например работает счетчик( таймер)
а если вводить то не подходит
если написать 3600 секунд никак в один час не превратятся
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
09.06.2014, 17:32  [ТС]     Время #8
Kverter, я конечно не математик и не особо еще разбираюсь в C++, но мне кажется у вас в строке

C++
1
minutes = minutes-minutes/60*60;
Написано не совсем правильно, ведь насколько я знаю сначала выполняются * и /, а только после этого выполняется + и -. А значит ваш пример

minutes-minutes/60*60

не имеет смысла ведь там всегда будет 0, при любом значении minutes.
Kverter
 Аватар для Kverter
35 / 35 / 16
Регистрация: 30.10.2013
Сообщений: 211
09.06.2014, 17:35     Время #9
C++
1
2
3
4
5
6
7
8
9
10
11
if (sec>=60)
{
    minutes=minutes+sec/60;
    sec=sec-sec/60*60;
    if (minutes>=60)
    {
    
    h=h+minutes/60;
    minutes = minutes-minutes/60*60;
    }
}
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
09.06.2014, 17:36     Время #10
вообще время лучше хранить в секундах( десятых/сотых)
тогда таких вопросов не возникнет и работать будет быстрее
а при выводе подгонять под человеческий вид
например
C++
1
2
3
int sec=36065;
 
printf(" h=%d m=%d s=%d",sec/3600,(sec%3600)/60,sec%60);
Kverter
 Аватар для Kverter
35 / 35 / 16
Регистрация: 30.10.2013
Сообщений: 211
09.06.2014, 17:38     Время #11
dicros, ни как нет
У тебя значения все типа int,допустим у тебя 249 минут...
249/60=4,15 , но у тебя все переменные типа инт значит это будет равно 4 а 4,15, дальше 249-4*60=9
Закомпиль и проверь
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
09.06.2014, 17:39     Время #12
Цитата Сообщение от dicros Посмотреть сообщение
minutes-minutes/60*60
не имеет смысла ведь там всегда будет 0, при любом значении minutes.
не совсем
это пример как по другому сделать остаток от деления
например 119 минут
119/60 =1 ( целочисленное деление, дробная часть выбрасывается)
1*60=60
119-60=59
Kverter
 Аватар для Kverter
35 / 35 / 16
Регистрация: 30.10.2013
Сообщений: 211
09.06.2014, 17:40     Время #13
а так полностью согласен с ValeryS что так делать не логично, просто легче организовать вывод
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
09.06.2014, 17:43  [ТС]     Время #14
Цитата Сообщение от ValeryS Посмотреть сообщение
если написать 3600 секунд никак в один час не превратятся
а так

C++
1
2
3
4
5
6
7
8
9
10
11
    if (seconds >= 60)
    {
        minutes = seconds / 60;
 
        if (minutes >= 60)
        {
            hours = minutes / 60;
            minutes %= 60;
        }
        seconds %= 60;
    }
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
09.06.2014, 17:45     Время #15
Kverter,
ошибка у тебя в другом
Цитата Сообщение от Kverter Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
if (sec>=60)
{
    minutes=minutes+sec/60;
    sec=sec-sec/60*60;
    if (minutes>=60)
    {
    
    h=h+minutes/60;
    minutes = minutes-minutes/60*60;
    }
}
как поведет себя время 2ч 120мин 5 сек???

Добавлено через 1 минуту
Цитата Сообщение от dicros Посмотреть сообщение
а так
та же ошибка что и у Kverter,
Kverter
 Аватар для Kverter
35 / 35 / 16
Регистрация: 30.10.2013
Сообщений: 211
09.06.2014, 17:49     Время #16
ValeryS, Ой,сори скобка не там =)
C++
1
2
3
4
5
6
7
8
9
10
if ((sec>=60))
       {
    minutes=minutes+sec/60;
    sec=sec-sec/60*60;
         }
    if (minutes>=60)
    {
    h=h+minutes/60;
    minutes = minutes-minutes/60*60;
    }
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
09.06.2014, 17:55  [ТС]     Время #17
Цитата Сообщение от ValeryS Посмотреть сообщение
как поведет себя время 2ч 120мин 5 сек???
будет 4 часа 0 минут и 5 секунд. В чем тут ошибка?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
09.06.2014, 17:59     Время #18
Kverter,
у тебя два раза проводится одно и тоже деление

Цитата Сообщение от Kverter Посмотреть сообщение
minutes=minutes+sec/60;
sec=sec-sec/60*60;
можно оптимизировать
C++
1
2
3
int tmp=sec/60;
minutes=minutes+tmp;
sec=sec-tmp*60;
тоже самое и с минутами

Добавлено через 2 минуты
Цитата Сообщение от dicros Посмотреть сообщение
будет 4 часа 0 минут и 5 секунд. В чем тут ошибка?
по шагам пройди
C++
1
2
3
4
5
6
7
8
9
10
11
if (seconds >= 60)
    {
        minutes = seconds / 60;
 
        if (minutes >= 60)
        {
            hours = minutes / 60;
            minutes %= 60;
        }
        seconds %= 60;
    }
время 2ч 120мин 5 сек
первым делом проверяется if (seconds >= 60)
нет не больше
все в ветку не входим следовательно до if (minutes >= 60) дело не дойдет
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
09.06.2014, 18:02  [ТС]     Время #19
Цитата Сообщение от ValeryS Посмотреть сообщение
по шагам пройди
Код C++
1
2
3
4
5
6
7
8
9
10
11
if (seconds >= 60)
* * {
* * * * minutes = seconds / 60;
if (minutes >= 60)
* * * * {
* * * * * * hours = minutes / 60;
* * * * * * minutes %= 60;
* * * * }
* * * * seconds %= 60;
* * }
время 2ч 120мин 5 сек
первым делом проверяется if (seconds >= 60)
нет не больше
все в ветку не входим следовательно до if (minutes >= 60) дело не дойдет

Так это ясно , я этот пример привел лишь для случая если я ввожу только секунды и причем больше 60 )))

C++
1
2
3
4
5
6
7
8
9
int hours=0;
int minutes=0;
int seconds=0;
 
cout << "Input seconds: "; cin >> seconds;
 
проверка...
 
cout << hours << ":" << minutes << ":" << seconds << endl;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2014, 18:44     Время
Еще ссылки по теме:

Определить общее число и общее время удалений за время матча C++
Выводить текущее время в определенные позиции консоли во время работы C++
C++ Ввести время и от него отнять системное время

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
09.06.2014, 18:44     Время #20
Цитата Сообщение от dicros Посмотреть сообщение
я ввожу только секунды и причем больше 60 )))
тогда вообще все проще
C++
1
2
3
4
5
6
7
8
9
int hours=0;
int minutes=0;
int seconds=0;
 
cout << "Input seconds: "; cin >> seconds;
hours=seconds/3600;
minutes=(seconds%3600)/60;
seconds=seconds%60;
cout << hours << ":" << minutes << ":" << seconds << endl;
Yandex
Объявления
09.06.2014, 18:44     Время
Ответ Создать тему
Опции темы

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