
10 Лекция 20
Лекция 20 циклы. Массивы. Указатели.
Рекомендации по выбору циклов
Возникает вопрос: циклом какого типа лучше всего воспользоваться?
Сначала надо решить, нужен ли цикл с предусловием или с постусловием. Чаще всего необходим цикл с предусловием. По оценкам специалистов, в среднем циклы с постусловием (do-while) составляют 5% от общего числа циклов.
Циклы с предусловием предпочтительнее по двум причинам: первая - чтобы тело цикла выполнялось только при выполнении условия и полностью игнорировалось, если условие не выполняется и вторая - то, что программа более понятна, когда проверяемое условие находится в начале, а не в конце циклического участка.
В случае выбора цикла с предусловием возникает второй вопрос: что лучше, for или while?
В принципе все, что можно сделать с помощью одного цикла, можно сделать и с помощью другого. Исходя из соображений правильного стиля программирования, цикл for более удобен, когда в цикле используется инициализация и коррекция управляющей переменной. А цикл while удобнее применять, когда этого не требуется.
Цикл for в языке С++ являtтся более гибкими, за счет трех выражений в скобках после for.
Рассмотрим некоторые возможности применения циклов типа for.
Пример 1. Счет в порядке убывания.
Требуется вычислить у5. Возможное решение имеет вид:
...
int r,i,y
fоr(i=5,r=1;i>=1;i- -) r=r*y;
cout << ”yв пятой степени = ” << r;
...
Пример 2. Приращение счетчика, отличное от 1.
...
int n;
for(n=5;n<61;n+=15) cout << n;
...
Пример З. Использование символов в качестве счетчика.
Требуется напечатать алфавит. Возможное решение имеет вид:
...
char ch;
for(ch=’А’; ch<=’z’;ch++) cout << ch;
...
Пример 4. Проверка условия, отличного от подсчета числа итераций.
Управляющая переменная инициализируется перед циклом.
...
int a=2,n;
for(n=3;a<=162;)a=a*n;
...
Здесь n всегда =3. а будет меняться 6, 18, 54, 162. Цикл выполнится 4 раза.
Пример 5. Изменение счетчика в геометрической прогрессии.
Требуется подсчитать долг + 10%. Возможное решение имеет вид:
...
float k;
for(k=100.0;k<185.0;k*=1.1) cout << ”Долг + проценты ”<<k;
...
Пример 6. Использование выражения в качестве счетчика.
...
int k,z;
for(k=1;z<196; z=5*k+++23 )cout << z;
...
Пример 7. Неполный список выражений в заголовке цикла.
Можно пропускать одно или несколько выражений. (При этом нельзя пропускать символы «точка с запятой».)
...
int p,n,k;
fоr(р=202; р>=2;) р=р--+n/k;
...
Пример 8. Произвольное первое выражение в заголовке цикла.
Первое выражение не обязательно должно инициализировать переменные, оно может быть любым.
...
fоr(cout << ”Вводите числа.”; р<=30;) cin >> p;
...
Пример 9. Изменение шага приращения счетчика в теле цикла.
...
float delta=0.1, S=0.0, k;
fоr (k=1; k<500; k+=delta)
{
S=S+k*k/150.0;
if (S>200) delta=0.5;
}
...
Пример 10. Использование операции «запятая» в спецификации цикла.
Использование операции «запятая» в спецификации цикла позволяет включать несколько инициализирующих и корректирующих выражений.
...
int i,r,y=2;
fоr(i=1, r=1;i<=10; i++,r*=у);
cout << ”y в степени “<<i-1<<” равно: “r;
...
Большая свобода выбора вида выражений, управляющих работой цикла for, позволяет с помощью этого оператора делать гораздо больше дополнительных действий, чем выполнять просто фиксированное число итераций.
Нельзя ставить точку с запятой после заголовка цикла. Если поставить точуку с запятой, то тело цикла будет состоять из одного пустого оператора «;».
Управляющие операторы в циклах
Кроме условных операторов и операторов циклов существуют еще три оператора, предназначенные для управления порядком выполнения программы: break, continue, goto.
Они применяются реже, поскольку частое их использование ухудшает наглядность программы и увеличивает вероятность ошибок.
Оператор break является наиболее важным из этих трех операторов и уже встречался при рассмотрении оператора выбора switch.
Он может использоваться в циклах всех трех типов. Выполнение оператора break приводит к выходу из цикла, в котором он содержится, и переходу к следующему за циклом оператору.
Если оператор break находится внутри вложенных циклов, то его действие распространяется только на тот цикл, непосредственно в котором он находится.
Пример 11. Использование оператора break. Требуется угадать задуманное число с 10 попыток.
...
int i=1,rez;
while(i++<=10)
{
cout << ”\nУгадайте число”;
cin>>rez;
if(rеz = =15)break;
cout << ”\nПопытка неудачная.”;
}
if(i!=12) cout << ”\nВы угадали число.”;
else cout << ”\nВсе попытки исчерпаны”;
...
При угадывании числа происходит прекращение выполнения цикла с помощью оператора break.
Оператор continue может использоваться только среди операторов тела цикла. Этот оператор вызывает пропуск оставшейся части итерации внутри цикла и переход к следующей итерации.
Пример 12. Использование оператора continue.
Вводятся календарные числа месяца для обработки. Необходимо проверить правильность ввода. Число 31 обозначает конец обработки.
...
while(day!=31)
{
cout << ”\nЗадайте календарное число”;
cin >> day;
if(day<1||day>31) continue;
{...} // Блок операторов по обработке календарного числа day
}
...
Здесь ввод неправильного значения приводит к пропуску части итерации, предназначенной для обработки этого значения.
Можно изменить условие if(day<1||day>31) на обратное if(day>0 && day<32), что позволяет исключить continue.
С другой стороны, с помощью continue иногда можно сократить некоторые программы, особенно если они включают в себя вложенные операторы if else.
Оператор goto (переход на заданную метку).
Форма записи: goto метка ... метка: ОПЕРАТОР; |
Например: char ch; top: cout << ”\nУгадайте символ”;cin>> ch; if(ch!=’*’) goto top; cout << ”\n Вы угадали”;
|
В языке С++ оператор goto является плохим средством. Его использование значительно усложняет логику программы и идет вразрез с правильным стилем программирования. Существует лишь один случай, когда программисты профессионалы допускают использование goto, — это выход из вложенного набора циклов при обнаружении ошибок , так как break дает возможность выхода лишь из одного цикла.