3.15. Oператорът
while
Цикълът while има следния синтаксис:
while ( expression
)statement;
Операторът statement (или съставният оператор) се изпълнява
до тогава, докато условието expression има стойност истина. Прилага се следната
последователност от действия:
1. Изчислява се израза expression.
2.
Изпълнява се оператора statement ако условието е истина. Ако при първото
изчисляване на израза тест той има стойност лъжа, оператора statement никога
няма да бъде изпълнен. Например, алгоритъмът за броене на гласни, описан в
предишния раздел за оператора switch, изисква символите да бъдат четени от
входния поток по един по един докато бъде достигнат края на файла. Цикълът while
е идеалния кандидат за реализиране на това:
char ch;
while ( cin
>> ch )
switch ( ch ){ ...
Понеже switch се счита за един
оператор, не е необходимо той да бъде поставян в съставен оператор.
Цикълът
while е особено подходящ за обработка на низове и други указателни типове.
Например,
ff( const char *st ) {
int len = 0;
const char *tp = st;
// compute length of st
while ( *tp++ ) ++len;// now copy st
char *s = new
char[ len + 1 ];
while ( *s++ = *st++ ); // null statement
// ... rest of
function
}
Упражнение 3-16. Напишете функция, която определя дали два
низа са еквивалентни.
Упражнение 3-17. Напишете функция, която връща броя на
появите на даден символ в даден низ.
Упражнение 3-18. Напишете функция, която
определя дали даден подниз е част от даден низ.
3.16. Операторът
for
Цикълът for най-общо казано се използува за постъпков преглед на
даннови структури с фиксирана дължина, като масиви например. Ние вече сме го
използували многократно. Синтаксисът на оператора for има вида:
for (
init-statement; expression-1; expression-2 ) statement;
init-statement
може да бъде декларация или израз. Най-общо той се използува за инициализиране
или присвояване на стойност на променлива или множество от променливи. Може да
бъде и празен оператор. Ето няколко примера за правилни init-statement
оператори:
for ( int i = 0;
...for ( ; /* null init-statement
*/
...for ( i = 0;
...for ( int lo = 0, hi = max, mid = max/2;
...for (
char *ptr = getStr();
...for ( i =0, ptr = buf, dbl = 0.0;
...
expression-1 служи за управление на цикъла. За толкова операции, за
колкото expression-1 получава стойност истина, се изпълнява оператора statement.
statement може да бъде единичен или съставен оператор. Ако при първато
изчисляване на expression-1 той има стойност лъжа операторът statement никога не
се изпълнява. Следват няколко примера за правилни изрази от този
вид:
(...; index < arraySize; ... )
(...; ptr; ... )
(...;
*st1++ = *st2++; ... )
(...; ch = getNextChar(); ... )
expression-2 се
изчислява след всека итерация на цикъла. Най-общо той се използува за
модификация на променливите, инициализирани чрез init-statement. Ако при първто
изчисляване на expression-1 той има стойност лъжа, expression-2 никога не се
изчислява. Следват няколко примера за правилни изрази от този вид:
( ...;
...; ++i )
( ...; ...; ptr = ptr->next )
( ...; ...; ++i, --j, ++cnt
)
( ...; ...; ) // null instance
Даден е следния цикъл
for:
const int sz = 24;
int ia[ sz ];
for ( int i = 0; i < sz;
++i )
ia[ i ] = i;
който се изпълнява по следния начин:
1.
Пресмята се init-statement еднократно в началото на цикъла. В този случай се
дефинира променливата i и се инициализира със стойност 0.
2. Изчислява се
expression-1. Ако условието има стойност истина, т.е. произволна ненулева
стойност, се изпълнява оператора statement. Ако в началото условието има
стойност лъжа операторът statement никога не се изпълнява.В този пример i се
сравнява с sz. Докато i е по-малко от sz се изпълнява опрератора:
ia[ i ]
= i;
3. Изчислява се expression-2. Обикновено се променя(т)
променливата(те), инициализирани от init-statement. В този пример i се увеличава
с 1.
Така разгледахме една пълна итерация на цикъла for. Сега се повтаря
стъпка 2. Този процес може да бъде моделиран със следния еквивалентен цикъл
while:
init-statement;
while ( expression-1 )
{ statement;
expression-2;}
Упражнение 3-19. Напишете функция, която сравнява два
масива за равенство.
Упражнение 3-20. Напишете функция, която търси дадена
стойност в масив. Ако такава стойност бъде намерена, да връща индекса й в
масива. Какво трябва да прави функцията ако стойността не е
намерена?