Общий принцип работы цикла do-while такой же, как у цикла с предусловием, но в отличие от while, выражение-условие проверяется не перед выполнением тела цикла, а после него. Тело цикла do-while выполняется до тех пор, пока значение выражения-условия равно true.
Для оператора do-while, как и для while, параметр цикла инициализируется до входа в цикл. Тело цикла do-while также состоит как бы из двух частей: собственно тела и блока «модификации» значений параметра цикла. Отсутствие модификации переменных цикла также приведет к неправильной работе цикла (зацикливанию).
С помощью do-while можно организовать бесконечный цикл: do…..while (true).
-----------------------------------------------------------------------------------------
Цикл со счетчиком (параметрический цикл) for
Общую структуру цикла for можно представить так:
for (инициализация; выражение-условие; модификации) тело цикла;
Инициализация используется для определения и инициализации параметра цикла и выполняется один раз в начале выполнения цикла. Операция «последовательное выполнение» позволяет записать в этой части несколько операторов, разделенных запятой:
for (int i=0, j=2; …..)
int k, m;
for (k=1, m=0; ……..)
Областью действия переменных, объявленных в части цикла « инициализация », является цикл.
Выражение-условие определяет условие выполнения цикла: если его результат, приведенный к типу bool, равен true, то цикл выполняется.
Модификации выполняются после каждой итерации цикла и служат обычно для изменения значения параметра цикла. В части модификаций можно записать несколько операторов через запятую.
Любая из частей оператора цикла for может быть опущена (но точки с запятой надо оставлять на своих местах). Цикл со счетчиком for реализован как цикл с предусловием, поэтому любой цикл while может быть приведен к эквивалентному ему циклу for, и наоборот, по следующей схеме:
for (b1; b2; b3) оператор à b1;
while (b2) {
оператор;
b3;
}
Возможности цикла for
Цикл for позволяет:
· использовать в качестве параметра цикла переменные целого, вещественного, символьного, перечислимого, булевского типа:
for (unsigned i = 0; i < 100; i += 5) cout <<i<< endl;
for (unsigned s1 = 127; s1 <= 255; s1++)
cout << s1 << " " << char(s1) << endl;
for (double delta = 0.1, x = 1.; x <(30.+delta/2); x += delta)
cout << x<< endl;
for (char s ='0'; s <= '9'; ++s) cout << s << " " << int(s) << endl;
for (char s ='A'; s <= 'Z'; ++s) cout << s << " " << int(s) << endl;
for (char s ='a'; s <= 'z'; ++s) cout << s << " " << int(s) << endl;
enum den {pon, vt, sr, chet, pjat, sub, voskr};
for (den d = vt; d <= sub; d = den(int(d)+1))
cout << int(d) <<endl;
for (bool b = false; b < true; ++b)
cout << b <<endl;
НО!!!
for (bool b = false; b <= true; ++b)
cout << b <<endl;
дает бесконечный цикл, почему???
· организовать вычисления в порядке убывания значения параметра цикла:
unsigned n; for(ci >> n; n; --n) cout <<n << endl; //для n=5: 5 4 3 2 1
unsigned n; for(cin >> n; --n;) cout <<n << endl; //для n=5: 4 3 2 1
unsigned n; for(cin >> n; n--;) cout <<n << endl; //для n=5: 4 3 2 1 0
· позволяет включать в спецификацию цикла несколько инициализирующих и модифицирующих выражений, используя операцию запятая:
for (unsigned i = 0, j = 2; …..)…
unsigned k, m; for (k = 1, m = 0; …)…
· использовать приращение параметра цикла, отличное от 1 (организовать счет двойками, тройками, десятками и т.д.):
for (unsigned i = 0; i < 100; i += 5)…
· изменять значение параметра цикла в геометрической прогрессии:
for (double k = 100; k < 185; k *= 1.1) cout << k << endl;
· для вычисления значения параметра цикла использовать выражения:
for(unsigned k = 1, z = 0; z <= 96; z = 5 * k + 23, k = k + 2)
cout << z <<endl;
//0 28 38 48 58 68 78 88
· включать в спецификацию цикла проверку любых других условий, отличных от подсчета числа итераций;
· использовать в спецификации цикла неполный список выражений;
unsigned n; cin >> n; for (; n; --n) cout << n << endl;
unsigned n; cin >> n; for (; --n;) cout << n << endl; // !!!
unsigned n; cin >> n; for (; n--;) cout << n << endl; // !!!
· включать прямо в спецификацию цикла ввод начального значения параметра:
unsigned n,m; for (cout << "input m:", cin >> m; m < 10; ++m)
{n = m; cout <<n << " " << m << endl;}
· изменять в теле цикла переменные, входящие в выражение спецификации цикла:
for (double delta = 0.1, x = 1.; x < 30.; x += delta)
{delta += 0.5;
cout <<setw(5)<< x << " " << setw(5) << delta << endl;
}
Результат выполнения:
1 0.6
1.6 1.1
2.7 1.6
4.3 2.1
6.4 2.6
9 3.1
12.1 3.6
15.7 4.1
19.8 4.6
24.4 5.1
29.5 5.6
· организовать задержку выполнения программы:
for (double i = 0.0; i < 200000000; i++);
// или
for (unsigned int t_beg = time(NULL); time(NULL)- t_beg!= 10;);// #include <time.h> time(NULL) – возвращает текущее время
// или
const int DELAY =100000000;
int main ()
{ long i; int n;
cout << "sec=?\n";
for (cin >> n; n; n--) //задержка
for (i = 0; i < DELAY; i++);
_getch();
return 0;
}
· организовать цикл for без тела ( но это плохой стиль ):
float x =1;
cout << "Enter value of x: "; cin >> x;
for ( float d = 1, r = 1e-5f, y = 0; d > r; y=cos(x), d=abs(y-x), x=y );
cout << x << endl;
· организовать бесконечный цикл:
for (;;)…;
-----------------------------------------------------------------------------------------