Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

1.10. Операторы циклов

Иногда одну и туже операцию необходимо проделать несколько раз. Например, в рассмотренной программе о нахождении корней квадратного уравнения было бы неплохо иметь возможность повторно ввести другие коэффициенты и вычислить новые значения корней. В описанном выше примере это можно сделать, заново запустив программу. Конечно это неудобно, и естественно, что в языке С++ предусмотрена возможность повторов выполнения участков программы. Размер этого участка не ограничен, и, поэтому, это может быть практически вся программа, следующая после слова main. .

Часть программы выполняемая повторно до тех пор пока не будет выполнено заранее заданное условие называется циклом. В С++ циклы можно задавать несколькими способами. Для каждого способа существует свой оператор. Оператор цикла и цикл это два разных понятия, хотя и очень близких.

В С++ имеется не один, а три оператора цикла, хотя они практически позволяют делать одно и тоже.

Оператор цикла while. Слово while по-русски это означает пока. Записывается он так

while(условие в круглых скобках)

{Тело цикла}

Тело цикла – это операторы, которые выполняются до тех пор, пока справедливо условие в круглых скобках. Точнее говоря, когда значение в круглых скобках равно true. Это значит, что возможны случаи, когда цикл не выполнится ни разу.

В качестве примера рассмотрим простую программу нахождения наименьшего числа типа double, которое может быть записано в компьютере, которое часто называют машинным эпсилон.

//Программа нахождения машинного эпсилон

#include <cmath>

#include <iostream>

using namespace std;

main(){

double epsilon, alfa=1;

while (alfa>0.0){

epsilon=alfa;

alfa=epsilon/2;

}

cout << “epsilon=” << epsilon;

}

В результате получается

epsilon=4.94066e-324

хотя для данной программы результат зависит от типа компьютера.

Иногда в программе требуется сделать бесконечный цикл. Примером такой программы может являться программа-калькулятор. Калькулятор все время ждет ввода. После получения данных он производит вычисления, выводит результаты на экран и вновь возвращается к ожиданию ввода. Сделать бесконечный цикл очень просто. Для этого нужно в качестве условия поставить логическое выражение результатом которого заведомо всегда равен true. Например,

while (5>3) {тело цикла}

или

while (5!=3)

Наконец можно создать такой цикл

while (true) {тело цикла}

Часто бывает наоборот - программа зацикливается по вине программиста, неверно определившего результат логического выражения, т.е. сделавшего логическую ошибку. Поэтому при записи цикла нужно быть особенно внимательным.

Наряду с циклом while часто используется его модификация do-while.

Оператор цикла do-while. В отличие от оператора цикла while, который может не выполняться вообще, цикл do-while выполняется хотя бы один раз, после чего проверяются условие цикла. Если оно имеет значение true, цикл повторяется. Иначе говоря, цикл выглядит так

do {тело цикла}

while(условие в круглых скобках)

Рассмотрим пример применения оператора do-while. Найдем значение денежной суммы, которую выдаст банк через несколько месяцев, при условии начисления ежемесячно процентов по вкладу. Формула вычисления денежной суммы легко получается из следующих соображений. Если положить в банк сумму S0, то через один месяц она возрастет до S1=S0(1+r/100), где r ежемесячный процент по вкладу. Замете, что сумма через месяц возросла в (1+r/100) раз. Рассматривая величину S1 как первоначальный взнос, можно не сомневаться, что через месяц она вырастет в такое же число раз, и станет равной S2= S1(1+r/100)=S0(1+r/100)2. Еще через месяц она возрастет до S3=S0(1+r/100)3, и т.д. Очевидно, что через n месяцев она будет вычисляться по формуле Sn=S0(1+r/100)n. Теперь учтем, что ежемесячный процент рассчитывается как годовая процентная ставка-q, т.е. q=s/12. Поэтому формулу для вычисления суммы вклады находящегося в банке можно рассчитать как Sn=S0(1+q/(12*100))n .

Для составления программы определения суммы вклада воспользуемся формулой Sn=S0*K, где К –коэффициентом показывающий прирост вклада через n месяцев.Величина K=(1+q/(12*100))n

//Программа вычисления суммы денежного вклада.

#include <cmath>

#include <iostream>

using namespace std;

main(){

double summa, sumVklada, procent, coefficient;

int count, namberManth; // Количество месяцев

count=1; ..//вспомогательная переменная - счетчик

coefficient=1.0;

cout << "summa="; // Ввод первоначальной суммы

cin >> summa;

cout << "procent =";

cin >> procent; //Ввод процента годовых

cout << "namberManth ="; //Ввод числа месяцев в течение которых

// начислялся процент по вкладу

cin >> namberManth;

do { //Начало цикла do-while для вычисления степени

coefficient = coefficient*(1+ procent/1200.0);

count ++;

}

while(count<= namberManth); //Конец цикла

sumVklada=summa* coefficient;

cout.setf(ios::fixed);

cout.setf(ios::showpoint);

cout.precision(2);

cout <<"Summa Vklada=" << sumVklada << "\n";

}

При вводе следующих данных

summa=100

procent =18

namberManth =12

программа дает такой результат:

Summa Vklada=119.56

хотя на самом деле эта величина должна быть равна 119.562. Разница как будто небольшая, но в некоторых программах ошибка может накапливаться, что порой приводит к критическим ситуациям. Так, что иногда стоит задуматься над применением ограничений на количество цифр выводимых после запятой.

Рассмотрим еще один вид оператора предназначенного для организации цикла.

Оператор цикла for. Вообще говоря, для программирования циклических программ достаточно даже одного оператора while. Оператор do-while это уже некоторое излишество. Но язык С++, представляет возможность реализации третьего оператора цикла, так называемого оператора for. Этот оператор использует вспомогательную переменную – счетчик, который определяет сколько раз должен выполняться оператор, и логическое выражение по значению которого определяется необходимость дальнейшего выполнения цикла. Цикл с использованием оператора for выглядит так:

for (Начальное значение счетчика; Логическое выражение; Оператор обновления) {тело цикла};

Например,

int n;

for (n=1; n<=100;n++){тело цикла};

Программа выполняется следующим образом. Сначала переменной n присваивается значение равное единице и происходит проверка значения логического условия. Если оно имеет значение true, то выполняется тело цикла, после чего величина n изменяется, в данном случае увеличивается на единицу. Происходят операции тела цикла. Вновь проверяется значение логического выражения, и если оно равно true, процесс повторяется до тех пор пока оно не станет равным false. После окончания выполнения оператора цикла программа переходит к следующему оператору.

Поясним применение этого оператора на примере возведения числа x в целую степени n.

//Программа вычисления числа в целой степени n.

#include <iostream>

using namespace std;

main(){

int n;

double x, result;

result=1; //Следовало бы записать 1.0, но преобразование типа

// выполнится автоматически

cout<<"x="; //Ввод x

cin>>x;

cout<<"n="; //Ввод n

cin>>n;

for (int count=1; count<=n; count++) //Объявление происходит в

// операторе цикла

result=result*x;

cout<<"resul="<<result<<"\n";

}

Если вместо целого числа счетчика объявить дробь, то программа закончится так называемым аварийным завершением. Можете это попробовать.

Обратите внимание, что определение величины count происходит прямо в операторе цикла. Это вполне естественно, поскольку мы уже говорили, что объявление в программе возможно там, где может стоять пробел. Другое дело будет ли это правильным. Так если определить какую-нибудь переменную в теле цикла, то это не будет воспринято как ошибка, хотя возможно, что программа будет несколько раз резервировать место для этой переменной. Впрочем, это замечание не относится к рассматриваемому типу объявлений в цикле for.

Вообще оператор for имеет много особенностей. Например, можно не наращивать значение счетчика, а уменьшать. Вместе с определением начального значения счетчика, можно объявить, а при необходимости и инициализировать другие переменные того же типа.

#include <iostream>

using namespace std;

main(){

for(int i=10, j=i+1;i>0;i--){

cout<<"i="<<i<<" "<<"j="<<j<<endl;

}

}