Страница 1 из 2

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

Добавлено: 02 ноя 2009, 13:06
Dragon
Столкнулся с проблемой, когда 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 бессилен?

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

Добавлено: 02 ноя 2009, 14:04
Romeo
Дело в том, что for сначала увеличивает счётчик, а потом делает проверку, а в while сначала делает проверку, а потом увеличивает счётчик.

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

Добавлено: 02 ноя 2009, 14:41
Dragon
Romeo писал(а):Дело в том, что for сначала увеличивает счётчик, а потом делает проверку, а в while сначала делает проверку, а потом увеличивает счётчик.
Ясно. Значит это тот случай, когда for бессилен. Точнее более громоздким выйдет, нежели while :)

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

Добавлено: 05 ноя 2009, 05:56
atavin-ta
Можно проще:

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

for (i=a.prevois.time.minute; i<61; ++i)
{
 ++minutes_in_interval;
}
.
Или я тебя не правильно понял?

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

Добавлено: 05 ноя 2009, 12:35
Dragon
atavin-ta писал(а):Можно проще:

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

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

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

Добавлено: 05 ноя 2009, 12:38
atavin-ta
Ну и нафига цикл? Просто вычти и не мучайся.

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

Добавлено: 05 ноя 2009, 14:10
Хыиуду
return (end.hour-start.hour)*60+end.minute-start.minute;

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

Добавлено: 07 ноя 2009, 20:37
Dragon
Хыиуду писал(а):return (end.hour-start.hour)*60+end.minute-start.minute;
Пример такого плана:
начало 22.40, конец 02.20.
Исходя из вашей формулы получится:
(2 - 22) * 60 + 20 - 40 = -1220.
Можно провести еще ряд преобразований, поизвращаться, но мой цикл (тут представлен проблемный кусочек, касающийся непосредственно цикла for) сразу высчитывает минуты и часы, вне зависимости от того какие были входные данные. И по циклу выйдет: 3 часа 40 минут :)
Или я не так понял предложенный вариант :)

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

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

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

   
if (end.hour < start.hour) end.hour += 24;
return (end.hour-start.hour)*60+end.minute-start.minute;
Цикл действительно не нужен.

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

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

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

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