Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
While и do-while ⇐ ПредыдущаяСтр 2 из 2
Эти операторы также используются для создания циклов. Первый оператор – 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 – Схема алгоритма решения задачи
|