Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






While и do-while






Эти операторы также используются для создания циклов. Первый оператор – while – оператор с предусловием, второй – do-while – оператор с постусловием.

while ( условие ) { операторы; }

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

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

do {операторы; } while ( условие );

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

Вначале выполняется последовательность операторов, затем вычисляется и проверяется условие. Если условие ложно, то оператор завершается - и управление передается следующему оператору в программе. Если условие истинно (не равно нулю), то тело оператора выполняется снова и опять проверяется условие. Выполнение тела оператора продолжается до тех пор, пока условие не станет ложным.

Оператор цикла вида for (выражение1; выражение2; выражение3 ) оператор; может быть заменен оператором while следующим образом:

выражение1;

while ( выражение2 )

{ операторы;

выражениеЗ; }

Так же как и при выполнении оператора for, в операторе while вначале происходит проверка условия. Поэтому оператор while удобно использовать в ситуациях, когда операторы тела цикла не всегда нужно выполнять.

Так, цикл for из предыдущей задачи табулирования с использованием оператора цикла while может выглядеть следующим образом (код программы после объявления всех переменных):

x = A;

while (x < = B + 0.1 * h)

{y = pow(cos(pow(fabs (x), 1./ 3)), 2);

Memo1-> Lines-> Add(FormatFloat(" 0.00", x) + " " + FormatFloat(" 0.0000", y));

Series1-> AddXY(x, y, " ", clRed);

x += h; }

Тот же цикл с использованием оператора do-while будет выглядеть как

x = A;

do { y = pow(cos(pow(fabs (x), 1./ 3)), 2);

Memo1-> Lines-> Add(FormatFloat(" 0.00", x) + " " + FormatFloat(" 0.0000", y));

Series1-> AddXY(x, y, " ", clRed);

x += h; }

while (x < = B + 0.1 * h);

В обоих случаях начальное значение x=A присваивается до цикла, а в цикле необходимо предусмотреть оператор x+=h для изменения значения х, иначе условие выхода из цикла никогда не будет выполнено и произойдет зацикливание.

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

Пример 1. Вычислить сумму знакопеременного ряда двумя вариантами, используя while и do-while.

Здесь (-1) при нечетных значениях i (1, 3, 5,...) равняется -1, а при четных значениях i (2, 4, 6,...) - 1, т. е. рассматривается знакочередующийся ряд. Поэтому в программе надо предусмотреть проверку на четность (i % 2 == 0). Схемы алгоритмов приведены ниже на рис. 1.

а) б)

Рисунок 1 – Схемы алгоритмов для программы с while (а) и do-while (б)

Код программы

void___fastcall TForm1:: Button2Click(TObject *Sender) // while

{ int i=1, f, k;

float S = 0, x = StrToFloat(Edit1-> Text);

while (i < = 5)

{ f = 1;

for (k=1; k< =i; k++)

{f *= k; }

if (i % 2 == 0)

{S += pow(x, i + 1) / f; }

else {S -= pow(x, i + 1) / f; }

i++; }

Memo1-> Lines-> Add(FloatToStr(S)); }

 

void___fastcall TForm1:: Button3Click(TObject *Sender) // do-while

{ int i = 1, f, k;

float S = 0, x = StrToFloat(Edit1 -> Text);

do { f = 1;

for (k=1; k< =i; k++)

{f *= k; }

if (i % 2 == 0)

{S += pow(x, i+1) / f; }

else {S -= pow(x, i+1) / f; }

i++; }

while (i < = 5);

Memo1-> Lines-> Add(FloatToStr(S)); }

Пример 2. Вычислить сумму ряда , суммируя члены (слагаемые) ряда, значения которых по модулю больше заданной точности = 10-4. Определить количество слагаемых.

При разработке программы для решения данной задачи неуместно использовать оператор цикла с параметром for, посколь­ку заранее неизвестно количество повторений такого цикла.

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

Схема алгоритма приведена на рис. 2.

Код программы

void___fastcall TForm1:: Button1Click(TObject *Sender)

{float x, a, S = 0; // Объявление переменных

int f, i, k = 1; // и установка их начальных значений

x = StrToFloat(Edit1-> Text); // Ввод значения х

do // Объявляем цикл с постусловием

{ f=1; // Задаем переменной под факториал значение 1 непосредственно перед циклом

for (i=1; i< =2*k-1; i++) // Цикл для расчета факториала

{f *= i; } // Вычисление факториала

a=pow(x, 2*k+1) / f; // Вычисление k-го слагаемого

S += a; // Суммирование слагаемых

k++; } // Увеличиваем число слагаемых для продолжения цикла

while (fabs(a) > = 1e-4); // Проверяем слагаемое на условие

Memo1-> Lines-> Add(FloatToStr(S)); // Вывод полученной суммы

Edit2-> Text = IntToStr(k-1); // и количества слагаемых

}

Примечание: Мы выводим число слагаемых не k, а k-1 из-за того, что на момент проверки слагаемого, меньше ли оно заданной точности, k будет иметь на единицу больше слагаемых, чем есть на самом деле (в виду того, что предполагается следующий шаг цикла).

Рисунок 2 – Схема алгоритма решения задачи


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.009 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал