Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

Правила использования и особенности оператора while

  • Значения всех переменных, входящих в выражение, должны быть определены до выполнения оператора while. Для этого их можно ввести (переменная to), задать в виде константы (RES), вычислить с помощью выражения, обращения к функции или задать другими способами. В противном случае переменная принимает случайное значение и результат непредсказуем. В нашем примере такая ошибка будет иметь место, если, например, забыть ввести переменную to или не записать RES=1.

  • Выражение вычисляется и анализируется в начале перед выполнением тела цикла. Поэтому тело цикла может ни разу не выполнится, если в самом начале на первом шаге выражение ложно. Например, это произойдёт в нашем примере, если ввести в качестве переменной to отрицательное число.

  • Одна или несколько переменных выражения должны меняться в операторах тела цикла. При этом изменение должно быть таким, чтобы на некотором шаге выражение стало ложным. В противном случае эта часть программы зациклится, то есть будет повторяться бесконечное количество раз. Прекратить выполнение программы (в том числе и в случае зацикливания) можно с помощью клавиш Ctrl+F2. Такая ситуация будет иметь место, например, если записать

RES=1;

while (RES< to)

R*=mult;

и ввести в качестве переменной to значение, большее 1. Здесь ни RES, ни to не меняются.

  • Как и в случае с if, в выражении после while можно использовать операцию присваивания. Эта особенность делает программу компактнее, “красивее”, но в то же время усложняет её. Поэтому для начинающих эту возможность можно не использовать и программировать в более простом стиле. Например:

int main()

{ cout<<" h SUM ";

// профессиональный стиль

float h=3, SUM=0;

while ((h –= 0.5)>0)

{ SUM+=h;

printf("\n %5.1f %6.2f",h,SUM);

}

// или более простой вариант в стиле Pascal

h=3; h –= 0.5; // или h=2.5

SUM=0;

cout<<"\n----Pascal---";

while (h>0)

{ SUM+=h;

printf("\n %5.1f %6.2f",h,SUM);

h –= 0.5;

}

getch(); return 0;

}

Второй, более простой, вариант помогает понять, как работает цикл, если используется присваивание в выражении для while.

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

char ch; while ((ch=getchar()) != ‘.’);

вводит с клавиатуры символы, пока не введём символ “.” (точку). Внутренние скобки нужны, так как операция присваивания имеет меньший приоритет, чем сравнение.

П р и м е р. Ввести координаты последовательности точек плоскости, то есть последовательность пар чисел x, y, каждая из которых определяет точку плоскости. Ввод и обработка прекращается, если введём x=0 и y=0. Найти K1 — количество точек первой четверти и K2 — количество точек 3-й четверти.

1–й вариант программы:

float x,y; int K1=0, K3=0;

cin>>x>>y; // Ввод координат первой точки вне цикла

while (!(x==0 && y==0))

{ if (x>=0 && y>=0) K1++;

else if (x<=0 && y<=0) K3++;

cin>>x>>y; // Ввод координат точек внутри цикла

}

cout<<"K1="<<K1<<" K3="<<K3;

Во 2м варианте используется так называемый вечный цикл, выход из которого осуществляется с помощью оператора break.

K1=0, K3=0;

while (1)

{ cin>>x>>y;

if(x==0 && y==0)

break; // Выход из цикла,

// то есть управление передаётся на cout

if (x>=0 && y>=0) K1++;

else if (x<=0 && y<=0) K3++;

}

cout<<"K1="<<K1<<" K3="<<K3;