Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Как определить последнюю итерацию цикла for?

#циклы


Часто бывает нужно определить последнюю итерацию цикла. Как это лучше сделать?
    


Ответы

Ответ 1



Вычисление каждый раз for (i = 0; i < m_i; last = ((++i + 1) === m_i)) { abc(); if (last) efg(); xyz(); } Вычисление один раз last = false; for (i = 0; (i < m_i - 1) || (last = !last); i++) { abc(); if (last) efg(); xyz(); } Разнесённая обработка for (i = 0; i < m_i - 1; i++) { abc(); xyz(); } if (i < m_i) { abc(); efg(); xyz(); } Редкий, но идеальный случай: for (i = m_i - 1; i >= 0; --i) { abc(); if (!i) efg(); xyz(); }

Ответ 2



В общем случае - никак. Цикл for управляется предикатом, который теоретически может иметь любую внутреннюю логику. Однако если для переменной цикла возможно объявить функцию next(), которая будет возвращать следующее значение, то возможно сделать такой трюк (C++): #include #include using namespace std; string::iterator next(string::iterator i) { return ++i; } main() { string nums = "12345"; for (string::iterator i = nums.begin(); i != nums.end(); ++i) { if (next(i) != nums.end()) cout << *i << endl; else cout << *i << " (это последняя)" << endl; } }

Ответ 3



Вычислить условие в самом теле. for(инициализация; условие; инкремент) { if (!условие) (выйти из цикла) } А еще можно сделать цикл бесконечным и выходить из него через if #define ever ;; for(ever) { if (условие выхода) (выйти из цикла) }

Ответ 4



А если не пытаться определять последнюю итерацию цикла, а сознательно "прыгнуть" в нее? int i; for(i=0; i < n; i++) { System.out.println("For cycle iteration="+i); } //сознательно прыгаем в последнюю итерацию цикла i--; //после завершения цикла i=n System.out.println("Last iteration again"+i);

Ответ 5



Во многих языках принцип одинаков: for() содержит три выражения, первое из которых выполняется в начале, второе выполняется перед итерацией, если возвращает TRUE, третье - после итерации. Можно прямо в этих выражениях узнавать, последняя ли итерация грядёт. Напр. на PHP: for( $i=0; $i<=10; $last = $i++ == 10) { if( $last) { // последний раунд } // обычные действия }

Комментариев нет:

Отправить комментарий