ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Оператор цикла WHILEОператор цикла WHILE организует выполнение одного оператора неизвестное заранее число раз, если истинно логическое выражение S. Выход из цикла осуществляется, если логическое выражение S окажется ложным. Так как истинность логического выражения проверяется в начале каждой итерации, тело цикла может не выполниться ни разу. Структура оператора цикла WHILE имеет вид: while s do Instruction; В этой структуре: S – логическое выражение, истинность которого проверяется в начале каждой итерации; Instruction – выполняемый оператор цикла, который может быть составным. Алгоритм работы оператора WHILE: 1 – вычисляется значение условия S; 2 – проверяется условие, если результат равен True, тело цикла выполняется и происходит переход к п. 1; если результат равен False, происходят выход из цикла и переход к первому после while оператору (рисунок 4.2).
Рисунок 4.2 – Схема работы цикла While ‑ do
Пример. Найти все делители целого положительного числа (кроме 1 и самого числа). program EXAMPLE; var Х: Integer; Half: Integer; Divider: Integer; i: Integer; begin repeat Write('Введите число больше нуля: '); ReadLn(X); if X<=0 then WriteLn('Неправильный ввод') until X > 0; Half:= X div 2; Divider:= 2; i: = 0; While Divider <= Half do begin if X mod Divider = 0 then begin inc(i); {увеличение счетчика на единицу} WriteLn(i, '-й делитель равен:' Divider) end; inc(Divider) {увеличение делителя на единицу} end; if i=0 then WriteLn('Делителей нет'); WriteLn('Конец решения') end. Некоторые возможные способы использования циклов в решении задач можно пояснить на приведенных ниже примерах. Пример 1. Организация цикла без операторов цикла. Найти сумму ста первых элементов натурального ряда чисел. Решение. Блок-схема алгоритма показана на рисунке 4.3.
Текст программы может выглядеть следующим образом: Program pr_1; Label M; Var s,i: integer; Begin S:=0; i:=1; M: s:=s+i: i:=i+1: if i<= 100 then goto M; Writeln(‘Сумма=’,s:4);End. Пример 2. Оператор цикла с параметром (с известным числом повторений). Условие – предыдущий пример. Решение. Блок-схема алгоритма показана на рисунке 4.4.
Текст программы может выглядеть следующим образом: Program pr_2; Var s,i: integer; Begin S:=0; for i:=1 to 100 do s:=s+i; Writeln(‘Сумма=’,s:4); End. Пример 3. Оператор цикла с предусловием (цикл while). Условие – предыдущий пример. Решение. Блок-схема алгоритма показана на рисунке 4.5.
Текст программы может выглядеть следующим образом: Program pr_3; Var s,i: integer; Begin S:=0; i:=1; While i<=100 do begin s:=s+i: i:=i+1; end; Writeln(‘Сумма=’,s:4); End. Пример 4. Оператор цикла с постусловием (цикл repeat). Условие – предыдущий пример (рисунок 4.6).
Текст программы может выглядеть следующим образом: Program pr_4; Var s,i: integer; Begin S:=0; i:=1; Repeat s:=s+i: i:=i+1; until i>100; Writeln(‘Сумма=’,s:4); End. Итерационные циклы. Итерационные циклы широко используются в приближенных вычислениях, являющихся основой использования вычислительной мощности ЭВМ. Как известно, далеко не всякое уравнение может быть решено точно. В первую очередь, это относится к большинству трансцендентных уравнений. Доказано также, что нельзя построить формулу, по которой можно было бы решать произвольные алгебраические уравнения степени, выше четвертой. Однако точное решение уравнения не всегда является необходимым. Задачу отыскания корней уравнения можно считать практически решенной, если мы сумели определить корни с нужной степенью точности и указать пределы возможной погрешности. Численные методы позволяют свести решение любых математических задач к выполнению четырех арифметических действий. Отличительными чертами итерационных способов вычислений являются: • наличие стереотипных вычислений, связанных с переходом от одного приближения к следующему; • зависимость числа вычисленных шагов от требуемой точности. Для организации итерационных циклов используются два вида операторов цикла: 1) оператор цикла с предусловием WHILE-DO; 2) оператор цикла с постусловием REPEAT-UNTIL. При составлении программ с использованием итерационных циклов: • используют общую формулу для подсчета суммы в цикле: S:=S+{тeкyщee слагаемое}, где S – значение суммы, полученное в предыдущем шаге; • используют общую формулу для подсчета произведения в цикле: P:=P* {множитель}, где P – значение произведения, полученное в предыдущем шаге; • заменяют операцию возведения в степень операцией умножения в цикле; • увеличивают в каждом шаге цикла управляющую переменную n на заданное значение (в общем случае – на единицу), т.е. n = n +1; • используют рекуррентную формулу для получения следующего члена ряда, для чего, зная формулу общего члена ряда, вычисляют коэффициент k – отношение текущего члена ряда (при n) к предыдущему (при n- 1) или отношение следующего члена ряда (при n +1) к текущему (при n): или ; • принимают начальные условия: значение управляющей переменной n; значение текущего члена ряда A (при n); значение суммы членов ряда при начальном приближении S:=A; • используют дополнительную переменную S 1, сохраняющую значение предыдущего приближения (значение суммы ряда в предыдущем шаге); • используют функцию определения абсолютного значения abs для определения условия выхода из цикла: abs(S-S1) < (для цикла с постусловием REPEAT-UNTIL) или abs(S-S1) > (для цикла с предусловием WHILE-DO). Рассмотрим пример на составление программы приближённых вычислений с использованием итерационного цикла с постусловием REPEAT-UNTIL. Пример 5. Рассчитать с заданной точностью . Решение: 1) Определим начальные условия: • значение управляющей переменной n=0; • значение текущего члена ряда А (при n=0): ; • значение суммы членов ряда при начальном приближении (при n=0) S:=A. 2) Составим рекуррентную формулу для определения текущего члена ряда. При составлении рекуррентной формулы, зная формулу общего члена ряда , необходимо вычислить коэффициент k – отношение следующего члена ряда (при n +1) к текущему (при n): Запишем рекуррентную формулу для вычисления в цикле текущего члена ряда А (заменив операцию возведения в степень умножением):
Обратим внимание, что полученная функция – знакопеременная, т.к. имеется множитель (–1). 3) Запишем выражение для вычисления в цикле значения функции S (суммирование в цикле): S:=S+А. Обратим внимание, что значение управляющей переменной n увеличивается в каждом шаге цикла на единицу (от начального значения), т.е. n: = n +1. 4) Введём дополнительную переменную S 1, сохраняющую в цикле значение предыдущего приближения (значение суммы ряда в предыдущем шаге): . 5) Запишем условие выхода из цикла, используя функцию определения абсолютного значения abs: abs(S-S1) < (для цикла с постусловием).
Текст программы может выглядеть следующим образом: program prim5; Var n:integer; s,s1,a,eps:Real; BEGIN Write('Vvedite eps='); Read(eps); n:=0; a:=1; s:=a; repeat s1:=s; a:=(-1)*a*(1+n*n*n)/(1+(n+1)*(n+1)*(n+1)); s:=s+a; n:=n+1; WriteLn('s=',s:8:4); until abs(s-s1)<eps; ReadLn; ReadLn END.
Варианты заданий Таблица 4.1
Содержание отчета (см. лабораторную работу 1). Контрольные вопросы 1. Каково назначение условных операторов повтора (циклов)? 2. Какие требования предъявляются к выражениям, управляющим повторениями? 3. В чем отличия операторов повтора while и repeat? 4. В каких случаях предпочтительнее использовать для организации циклов оператор повтора for? Что записывается в заголовке этого оператора? 5. Что такое вложенные циклы? Какие дополнительные условия необходимо соблюдать при организации вложенных циклов? Не нашли, что искали? Воспользуйтесь поиском:
|