Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа № 5.
Программирование алгоритмов циклической структуры
с известным числом повторений.
При выполнении работы необходимо знать:
Теоретический минимум:
Алгоритмы циклической структуры бывают нескольких видов.
Если заранее известно число повторений, то такая структура называется цикл с известным числом повторений и организуется при помощи специальной переменной счетчика. Счетчик имеет начальное значение, которое задается до цикла, конечное значение и шаг (закон изменения счетчика).
На каждом проходе цикла к счетчику добавляется некоторое число (шаг). В начале каждого прохода цикла проверяется, не превысило ли значение счетчика конечное значение. Таким образом, счетчик подсчитывает количество повторений и цикл прекращается при превышении счетчиком конечного значения.
Структура цикла с известным числом повторений:
Если же число повторений цикла заранее не известно, то цикл необходимо заканчивать при достижении некоторых условий. Поэтому циклы с неизвестным числом повторений называют еще циклы с условием.
Условие окончания цикла можно проверять в начале или в конце каждого прохода цикла. Различают поэтому циклы с предусловием и циклы с постусловием. Вид алгоритма у циклов с предусловием и циклов с постусловием отличается тем, где располагается проверка условия выхода из цикла в начале или в конце каждой итерации цикла.
Оператор цикла FOR.
Для многократного повторения одних и тех же действий в Turbo Pascal предусмотрены три оператора цикла. Если число повторений цикла (или итераций) заранее не известно, но известно условие завершения цикла, в таких случаях применяются операторы REPEAT и WHILE. Если число повторений известно, то используется оператор FOR.
Оператор цикла FOR, известный как оператор цикла с параметром, выглядит так:
for i=a to b do s;
При выполнении этого оператора сначала вычисляется некоторое начальное значение а, которое присваивается переменной i, называемой параметром цикла. Затем вычисляется конечное значение b и проверяется, имеет ли место равенство i=b. Если равенства нет, выполняется оператор s, который может быть составным, и переменная i увеличивается на единицу. После этого проверка, не равен ли параметр конечному значению, а также выполнение оператора s и увеличение переменной i на единицу выполняются циклически до тех пор, пока не будет получено равенство i=b.
Параметр цикла i, а также начальное и конечное значения (а и b) могут принадлежать любому порядковому типу (например, Integer или Char). (Но при этом все они должны быть одного типа.) Если начальное значение превышает конечное значение или равно ему с самого начала, оператор s не выполнится ни разу.
Оператор цикла FOR имеет такие особенности:
Возможна и другая форма оператора цикла с параметром:
for i=a downto b do s;
Здесь, чтобы выполнялся оператор s, начальное значение а должно превышать конечное значение b. Кроме того, в этом случае параметр i с каждым циклом уменьшается на единицу, пока не становится равным конечному значению b.
Оператор цикла с параметром следует использовать тогда, когда заранее точно известно, сколько раз должно быть выполнено тело цикла.
Оператор цикла WHILE, известный так же как оператор цикла с предусловием, имеет следующий вид.
while p do s;
Работа оператора определяется следующей схемой:
При выполнении этого оператора сначала вычисляется некоторое логическое выражение р (условие), принадлежащее типу Boolean, в случае истинности которого выполняется оператор s (являющийся, как правило, составным). После этого вычисление условия, его проверка и выполнение оператора s повторяются до тех пор, пока выражение р не становится равным FALSE. Затем управление передается следующему (после WHILE) оператору программы.
Если условие р равно FALSE с самого начала, оператор s, который называется телом цикла, не выполнится ни разу. Если условие р тождественно TRUE (while true do s), цикл будет бесконечным. Очевидно, для того чтобы тело цикла выполнилось всего несколько раз (чтобы количество итераций было больше нуля, но меньше бесконечности), значение условия должно каждый раз преобразовываться в теле цикла.
Для того чтобы понять разницу между операторами цикла WHILE и FOR, рассмотрим соответствующие фрагменты программ, выводящие на экран строки звездочек.
Цикл WHILE Цикл FOR
Line:=l; for Line=l to n do
while Line<n do WriteLn(**********);
begin
WriteLn(**********);
Line:= Line+1
end;
Если переменная Line объявлена (в разделе описания переменных) как принадлежащая типу Integer, оператор FOR выведет на экран п строк звездочек. Реализация задачи с помощью оператора FOR выглядит проще, поскольку здесь нет нужды в операторе присваивания Line : =1 и Line : = Line+1.
Оператор цикла REPEAT, известный как оператор цикла с постусловием, имеет такой вид:
repeat S until P;
Работа оператора определяется следующей схемой:
При выполнении этого оператора сначала выполняется тело цикла (S), затем вычисляется некоторое логическое выражение P (условие), принадлежащее типу Boolean, в случае ложности которого вновь выполняется тело цикла. Затем выполнение тела цикла, вычисление условия P и его проверка повторяются до тех пор, пока выражение P не становится равным TRUE. После этого управление передаётся следующему (за REPEAT) оператору в программе.
Оператор REPEAT отличается от оператора WHILE, во-первых, тем, что здесь условие проверяется после выполнения тела цикла. Иными словами, гарантируется хотя бы однократное его выполнение. Во-вторых, оператор REPEAT выполняется до тех пор, пока условие равно FALSE, и управление передается следующему (за REPEAT) оператору, когда условие становится равным TRUE (для оператора WHILE имеет место обратная зависимость).
Даже если условие р равно TRUE с самого начала, тело цикла выполнится хотя бы раз. Если условие р тождественно FALSE (repeat s until false), цикл будет бесконечным.
Для того чтобы понять разницу между операторами цикла WHILE и REPEAT, рассмотрим соответствующие фрагменты программ, вычисляющих степени числа 3 в диапазоне между 1 и 300.
Цикл WHILE Цикл REPEAT
a:=3: a:=3;
while a<300 do repeat
begin WritteLn (a);
WritteLn (a); a:=a*3
a:=a*3 until a>=300;
end;
Прежде всего бросается в глаза, что условия повторения цикла для двух случаев противоположны. Это объясняется тем, что в операторе WHILE цикл выполняется, пока условие не примет значение FALSE, а в операторе REPEAT пока условие не примет значение TRUE.
Так же следует обратить внимание на то, что тело цикла REPEAT не требуется заключать в операторные скобки BEGIN… END. Если в операторе WHILE после ключевого слова DO выполняется единственный оператор (и если требуется циклически выполнять несколько действий, приходится несколько операторов объединять в составной оператор), то в операторе REPEAT между ключевыми словами REPEAT и UNTIL можно ввести любое количество операторов, без необходимости заключать их в операторные скобки.
Наконец в операторе REPEAT после последнего оператора в теле цикла нет точки с запятой. Это ещё одна особенность оператора REPEATперед ключевым словом UNTIL точка с запятой необязательна.
В программах на Turbo Pascal возможно использование вложенных циклов. Это подразумевает, что существует внешний цикл и один или несколько внутренних циклов. Каждое повторение внешнего цикла означает завершение всех внутренних циклов; при этом всем выражениям, которые управляют внутренними циклами, вновь присваиваются начальные значения.
Оператор перехода имеет вид:
goto p;
где p метка, которой помечен некоторый иной оператор в программе. В данном случае речь идет о переходе на метку, указанную после оператора.
Оператор перехода предназначен для передачи управления в другую точку программы (т.е. для нарушения естественного порядка выполнения операторов).
Например:
goto 11;
...
11: WriteLn (a) ;
В Turbo Pascal допускается использовать в качестве меток как числа (от 1 до 9999), так и идентификаторы.
После оператора GOTO должна быть указана единственная метка, и такой же меткой обязательно должен быть помечен один (и только один) из операторов программы. Однако один и тот же оператор может помечаться несколькими метками. Иными словами, каждый оператор перехода передает управление в одну (и только в одну) точку программы, однако возможна передача управления из разных точек программы в одну.
Все метки, используемые в программе, должны быть объявлены. Раздел описания меток обозначается зарезервированным словом LABEL и находится между заголовком и телом программы. Вот как может выглядеть раздел описания меток, в котором объявлены три метки.
label 1, 2, new;
Злоупотреблять использованием операторов GOTO не рекомендуется, поскольку в результате получаются малопонятные программы. Тем более что без оператора GOTO, как правило, можно обойтись, применив другие средства Turbo Pascal.
В заключение заметим, что если метка должна использоваться внутри процедуры или функции, она должна быть в ней описана. Иными словами, передача управления снаружи внутрь процедуры или функции с помощью оператора перехода невозможна.
Задача 5.
Найти сумму ряда:
Математическая формулировка задачи:
Сумму ряда можно определить при помощи цикла. Для этого обозначим знаменатели дробей переменной i. Эта переменная будет счетчиком цикла. Она имеет начальное значение 2 и конечное значение 100 (так как знаменатель первой дроби равен 2, а последней дроби равен 100). В цикле значение переменной i будет увеличиваться на 1 на каждом проходе. При помощи переменной i на каждом проходе цикла получаем очередной элемент ряда el:=1/i. Будем добавлять текущий элемент каждый раз к предыдущей сумме, то есть на каждом проходе цикла сумма станет увеличиваться на очередное значение el. Так постепенно накопится вся сумма.
Текст программы:
Program Ex_5;
Uses Crt;
Var
S: real; { сумма }
El: real; { элемент ряда }
i: integer; { знаменатели дробей }
Begin
ClrScr;
S:=0;
For i:=2 to 100 do
begin
el:=1/i;
S:=S+el;
End;
Writeln(S=,S);
Readln;
End.
PAGE 52