Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
konspekt_1_semestr.doc
Скачиваний:
12
Добавлен:
02.08.2019
Размер:
654.34 Кб
Скачать

Оператор цикла while

Стандартный вид оператора while следующий:

while(условие) тело_цикла;

где оператор – это или пустой, или простой, или составной оператор. Условием может быть любое выражение, имеющее в качестве истины ненулевое значение. Цикл выполняется, пока условие истинно. Когда условие становится ложным, выполняется инструкция, следующая за циклом. Если условие при первой проверке ложно, тело_цикла не выполняется ни разу.

На схеме алгоритма оператор while отображается следующим образом:

Следующий пример показывает процедуру, обрабатывающую ввод с клавиатуры, работающую, пока не будет введен символ А:

char ch;

while(ch != ‘A’) ch = getche();

Сначала ch устанавливается в 0. Цикл while начинается с проверки ch на равенство А. Поскольку ch инициализировано нулем, проверка выдаст истину и цикл начнется. При каждом нажатии клавиши на клавиатуре условие проверяется повторно. Если введено А, условие становится ложным и цикл прекращается.

Как и цикл for, цикл while сначала выполняет проверку, то есть тело цикла может вообще не выполняться

В теле цикла может и не быть никаких операторов. Например:

while((ch = getchar()) != ‘A’);

просто зацикливается до тех пор, пока с клавиатуры не введется символ А.

Пример: Написать программу вычисления значения функции cos x (гиперболический косинус) с помощью бесконечного ряда Тейлора с точностью ε по формуле:

Для достижения заданной точности необходимо суммировать члены ряда до тех пор, пока очередной член по модулю не будет меньшим ε.

Воспользуемся рекуррентной формулой для получения последующего члена ряда через предыдущий, т.е.

Сп+1=Сп*Т, где Т некоторый множитель.

Найдем его:

#include <stdio.h>

#include <conio.h>

#include <math.h>

int main(void)

{ const int MaxIter=100; //допустимое число итераций

double x,eps;

double Cn=1,y=Cn;//первый член ряда и нач. значение суммы.

int n=0; // количество итераций.

bool usl=true;

printf("Введите аргумент и точность:");

scanf("%lf%lf",&x,&eps);

while(fabs(Cn)>eps)

{Cn*=-x*x/((2*n+1)*(2*n+2));//очередной член ряда

y+=Cn;//вычисление суммы

n++;

if(n>MaxIter)

{printf("Ряд расходится.");

usl=false;

break;

}

}

if(usl)

{printf("Значение функции: %.3lf, для x=%.3lf при n=%d итераций\n",y,x,n);

printf("(Для проверки cos x=%lf)",cos(x));}

getche();

return 0;

}

Оператор цикла do/while

В противоположность циклам for и while, сначала проверяющим условие, цикл do/while проверяет условие в конце. То есть, цикл do/while всегда выполняется, по крайней мере, один раз. Стандартный вид цикла do/while следующий:

do {

последовательность_операторов;

} while (условие);

Сначала выполняется простой или составной оператор, составляющий тело цикла, а затем вычисляется выражение. Если оно истинно (не равно false), тело цикла выполняется еще раз. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управления.

На схеме алгоритма:

Пример:

Вводить последовательность чисел до тех пор, пока их сумма не превысит заданного числа. Вывести количество введенных чисел.

#include <stdio.h>

#include <conio.h>

int main(void)

{ int n,m,S,sum;

printf("");

scanf("%d",&S);

sum=0;n=0;

do{printf("");

scanf("%d",&m);

sum+=m;

n++;

}while(sum<S);

printf("n=%d",n);

getche();

return 0;

}

Наиболее типичным использованием цикла do/while является процедура выбора пунктов меню. Когда набран корректный ответ, она возвращает значение функции. Неправильный ответ приводит к повторному вводу.

Часто встречающиеся ошибки при программировании циклов — использование в теле цикла неинициализированных переменных и неверная запись условия выхода из цикла.

Чтобы избежать ошибок, рекомендуется:

- проверить, всем ли переменным, встречающимся в правой части операторов присваивания в теле цикла, присвоены до этого начальные значения (а также возможно ли выполнение других операторов);

- проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;

- предусмотреть аварийный выход из цикла по достижению некоторого количества итераций;

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

Операторы цикла взаимозаменяемы, но можно привести некоторые рекомендации по выбору наилучшего в каждом конкретном случае.

Оператор do while обычно используют, когда цикл требуется обязательно выполнить хотя бы раз (например, если в цикле производится ввод данных).

Оператор for предпочтительнее в большинстве остальных случаев (однозначно — для организации циклов со счетчиками).

Оператором while удобнее пользоваться в случаях, когда число итераций заранее не известно, очевидных параметров цикла нет или модификацию параметров удобнее записывать не в конце тела цикла.

Операторы переходов

Оператор break

Этот оператор имеет два назначения. Первое – это окончание работы оператора switch. Второе – это принудительное окончание цикла, минуя стандартную проверку условия. Когда оператор break встречается в теле цикла, цикл немедленно заканчивается и выполнение программы переходит на строку, следующую за циклом.

Оператор break, как правило, используется в циклах, где особые условия могут вызвать немедленное завершение работы. Ниже приведен пример того, как нажатие на клавишу может остановить выполнение цикла:

int main(void)

{

int loc;

loc = 1;

do {

loc ++;

if(kbhit()) break;

} while(loc==1000);

return ; }

Такие функции можно использовать для поиска имени в файле базы данных. Если файл слишком длинный и надоело ждать, то можно нажать на любую клавишу и выйти из функции до окончания работы. Стандартная функция kbhit() возвращает 0, если не было нажатия клавиши. В противном случае она возвращает ненулевое значение.

break вызывает выход из самого внутреннего цикла. Например:

for(t=0; t<100; t++) {

count = 1;

for(;;) {

printf(“%d “, count);

count++;

if(count == 10) break;

}

}

выводит числа от 1 до 10 включительно 100 раз. Каждый раз, когда встречается break, контроль передается внешнему циклу for.

break, используемый в операторе switch, влияет только на данный switch, но не на цикл, в котором может находится данный switch.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]