Бесконечный цикл for, но рабочий while.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Столкнулся с проблемой, когда 2 одинаковых цикла дают разный результат.
Функция, которая подсчитывает разницу между 2 значениями в минутах.
Проблема в цикле с подсчетом минут, а точнее:

Код: Выделить всё

//Входящие данные:
//minutes_in_interval = 0;
//minute = 0;
//a_previous_time.minute = 59;

    if(minute != a_previous_time.minute)
    {
        //Бесконечный цикл
        /*for(int i = a_previous_time.minute; i != minute; i++)
        {
            minutes_in_interval++;
            if(i == 60)
            {
                i = 0;
            }
        }*/

        //Рабочий цикл
        int m = a_previous_time.minute;
        while(m != minute)
        {
            minutes_in_interval++;
            m++;
            if(m == 60)
            {
                m = 0;
            }
        }
    }
В цикле for дебаггер показывает, что когда i = 60, ему присваивается значение 0, затем он пропускает проверку на неравенство и далее срабатывает i++. Из-за чего собственно весь сыр-бор.

Ломаю голову, почему идентичный циклу while, цикл for не работает. Или это тот случай, когда for бессилен?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Дело в том, что for сначала увеличивает счётчик, а потом делает проверку, а в while сначала делает проверку, а потом увеличивает счётчик.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Romeo писал(а):Дело в том, что for сначала увеличивает счётчик, а потом делает проверку, а в while сначала делает проверку, а потом увеличивает счётчик.
Ясно. Значит это тот случай, когда for бессилен. Точнее более громоздким выйдет, нежели while :)
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

Можно проще:

Код: Выделить всё

for (i=a.prevois.time.minute; i<61; ++i)
{
 ++minutes_in_interval;
}
.
Или я тебя не правильно понял?
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

atavin-ta писал(а):Можно проще:

Код: Выделить всё

for (i=a.prevois.time.minute; i<61; ++i)
{
 ++minutes_in_interval;
}
.
Или я тебя не правильно понял?
Наверное неправильно понял.
Когда значение минуты доходит до 60, то оно должно меняться на 0 - следующий час пошел. Т.е. скажем первое значение 1:55, а второе 2:15 - какова разница между двумя этими значениями и вычисляется приведенным кодом (кусочком кода).
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

Ну и нафига цикл? Просто вычти и не мучайся.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

return (end.hour-start.hour)*60+end.minute-start.minute;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Хыиуду писал(а):return (end.hour-start.hour)*60+end.minute-start.minute;
Пример такого плана:
начало 22.40, конец 02.20.
Исходя из вашей формулы получится:
(2 - 22) * 60 + 20 - 40 = -1220.
Можно провести еще ряд преобразований, поизвращаться, но мой цикл (тут представлен проблемный кусочек, касающийся непосредственно цикла for) сразу высчитывает минуты и часы, вне зависимости от того какие были входные данные. И по циклу выйдет: 3 часа 40 минут :)
Или я не так понял предложенный вариант :)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Вообще-то вопрос был поставлен почему for и while работают по-разному. Остальное уже оффтоп. Хотя если автору темы это интересно, то вот поправленная формула Хыиуду для случая пересечения границы полночи:

Код: Выделить всё

   
if (end.hour < start.hour) end.hour += 24;
return (end.hour-start.hour)*60+end.minute-start.minute;
Цикл действительно не нужен.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Romeo писал(а):Вообще-то вопрос был поставлен почему for и while работают по-разному. Остальное уже оффтоп. Хотя если автору темы это интересно, то вот поправленная формула Хыиуду для случая пересечения границы полночи:

Код: Выделить всё

   
if (end.hour < start.hour) end.hour += 24;
return (end.hour-start.hour)*60+end.minute-start.minute;
Цикл действительно не нужен.
Да, вариант лучше, чем с циклом.
Сказывается маленький опыт.
Ответить