Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

10.6. Бесконечные циклы

Одна из самых неприятных особенностей операторов цикла заключается в возможности образования бесконечного цикла (в зацикливании программы) там, где программист этого не ожидает. Причина зацикливания – условие выполнения цикла никогда не станет ложным из-за ошибок в программе.

void main(){

int x = 1, s = 0;

while (x < 11); // !!!!!!!!!!

{

s += x;

x++;

}

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

}

В этом примере причина зацикливания – незаметная точка с запятой после while. Компилятор считает, что в цикле повторяется не составной оператор в {}, а пустой оператор. А так как в цикле x никогда не изменится, то и условие никогда не станет ложным. Но это не значит, что не может быть в цикле пустого оператора. Далее приведен пример правильного цикла с пустым оператором цикла.

void main(){

int x, s;

for (s = 0, x = 1; x < 11; s+= x, x++);

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

}

Если все же вам в программе потребуется бесконечный цикл (а это иногда бывает нужно сделать), вы можете написать цикл, который никогда не кончается, опустив все три выражения в операторе for.

for (;;)

printf(“Бесконечный цикл\n”);

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

while (1)

printf(“Бесконечный цикл\n”);

10.7. Другие управляющие средства языка с

Бывают ситуации, когда необходимо прервать выполнение блока операторов независимо от каких-либо условий. Язык С предусматривает для этих целей четыре оператора: break, continue и return. Это так называемые операторы безусловной передачи управления.

Оператор break прекращает выполнение оператора цикла while, do…while, for и switch, в котором он непосредственно находится. Для выхода из группы вложенных циклов, надо использовать несколько операторов break.

int x;

while (1) {

printf(“Введите положительное число\n”);

scanf(“%d”, &x);

if (x > 0) break;

}

printf(“x = %d\n”, x);

Оператор continue можно использовать только внутри тела цикла. Данный оператор возвращает управление к началу цикла, пропуская оставшуюся его часть. В результате его выполнения управление переносится:

1) для цикла for на секцию выражения_3;

2) для циклов while и do…while на вычисление выражения и определения необходимости завершения цикла.

Задача. Найти сумму четных чисел из диапазона от 1 до 10.

int x = 2, s = 0;

while (x < 11) {

s += x;

x += 2;

}

printf(“s = %d\n”, s);

============================================

int x = 1, s = 0;

while (x < 11) {

if (x%2 == 1) {

x++;

continue;

}

s += x;

x++;

}

printf(“s = %d\n”, s);

============================================

int x, s = 0;

for (x = 2; x < 11; x+=2)

s += x;

printf(“s = %d\n”, s);

============================================

int x, s = 0;

for (x = 1; x < 11; x++) {

if (x%2 == 1) continue;

s += x;

}

printf(“s = %d\n”, s);

Оператор return переносит управление из текущей функции в точку ее вызова, т.е. прерывает выполнение функции. Его мы рассмотрим позднее.

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

Задача. Вычислить значение функции на интервале [a;b] в n равноудаленных точках. Обеспечить контроль введенных и полученных данных.

#include <stdio.h>

#include <math.h>

void main(){

int n, err;

float a, b, u, x, f, h;

printf(“Введите a, b, u, n\n”);

scanf("%f%f%f%d", &a, &b, &u, &n);

if(n < 2) n = 10;

if(a == b) { a -= 0.5; b += 0.5; }

else

if(a > b) { x = a; a = b; b = x; }

h = (b-a) / (n-1);

for(x = a; x < b+0.5*h; x += h){

err=0;

if (x < 2) {

if (x == 0)

err = 1;

else

f = cos(M_PI*x)+(7-pow(x,2))/fabs(x); // M_PI x*x

}

else {

if (u == 0 || x-u <= 0)

err = 1;

else

f = log(x-u)-pow(x,0.5)/u; // sqrt(x)

}

printf("|%10.4f |", x);

if(err)

printf(" не определена! |\n");

else

printf("%16.4f |\n", f);

}

}