- •Основные этапы проектирования программ
- •Тема: Числовые типы данных. Выражения. Стандартные функции. Решение задач линейной структуры Числовые типы
- •Выражения и операторы действия
- •Ввод и вывод данных
- •Лабораторная работа №1 Тема: Числовые типы данных. Стандартные функции. Задачи линейной структуры Задание 1
- •Задание 2
- •Указание к выполнению: перед составлением программы необходимо выполнить следующие этапы:
- •Образец выполнения задания
- •Writeln(‘значение искомого выражения равно’, y:8:4); {вывод результата на экран}
- •Образец выполнения задания
- •Тема: Логические выражения. Логический тип. Условный оператор. Оператор выбора. Программирование разветвляющихся алгоритмов
- •Логический тип
- •Условный оператор
- •Оператор выбора
- •Лабораторная работа №2 Тема: Логические выражения. Логический тип. Условный оператор. Оператор выбора. Программирование разветвляющихся алгоритмов
- •Задание 2
- •Образец выполнения задания
- •Текст программы
- •Тема: Циклические структуры. Программирование циклических алгоритмов. Циклы
- •Простой арифметический цикл (цикл с параметром)
- •Арифметический цикл с произвольным шагом
- •Итерационные циклы
- •Оператор цикла с постусловием
- •Оператор цикла с предусловием
- •Лабораторная работа №3 Тема: Циклические структуры. Программирование циклических алгоритмов. Задание 1
- •Текст программы
- •Приложение: работа в среде программирования Паскаль
- •Работа с окнами
- •Редактирование текста программы
- •Пошаговое выполнение программы
- •Как посмотреть результат выполнения программы?
- •Литература
- •Содержание
Тема: Циклические структуры. Программирование циклических алгоритмов. Циклы
При решении подавляющего большинства задач (в том числе и весьма несложных) в программе практически невозможно задать в явном виде все операции, которые необходимо выполнить. В самом деле, пусть необходимо вычислить сумму первых n членов гармонического ряда:
Y= 1+ 1/2+ 1/3 + …+ 1/n
Очевидно, что с использованием только рассмотренных выше типов операторов можно составить программу лишь для фиксированного значения n. Например, при n=5 требуемые вычисления можно задать с помощью оператора присваивания вида:
Y:= 1+1/2+1/3+1/4+1/5
Если же значение n не фиксируется, а является исходным данным, вводимым в процессе выполнения программы (и даже константой, описанной в программе), то аналогичный оператор присваивания записать невозможно. Ибо запись вида Y:= 1+1/2+1/3+…+1/n в языках программирования недопустима.
Для устранения возникающих трудностей служат операторы цикла. Они позволяют повторять выполнение отдельных частей программы. Можно выделить четыре цикла, присутствующих в том или ином виде во всех языках программирования: простой арифметический цикл (цикл с параметром с шагом 1), сложный арифметический цикл (цикл с параметром с произвольным шагом), итерационный цикл с предусловием, итерационный цикл с постусловием.
Простой арифметический цикл (цикл с параметром)
Вернемся к рассмотренной выше задаче вычисления суммы первых n членов гармонического ряда, правила которой невозможно задать в виде арифметического выражения, если значение n заранее не фиксировано.
На самом деле вычисление этой суммы можно осуществить по очень простому и компактному алгоритму: предварительно положим y=0 (с помощью оператора присваивания y:=0), а затем выполним оператор присваивания y:= y+1/i для последовательных значений i= 1,2,…,n. При каждом очередном выполнении этого оператора к текущему значению y будет прибавляться очередное слагаемое. Как видно, в этом случае процесс вычислений будет носить циклический характер: оператор y:= y+1/i должен выполняться многократно, т.е. циклически, при различных значениях i.
Этот пример циклического вычислительного процесса является весьма типичным; его характерные особенности состоят в том, что
число повторений цикла известно к началу его выполнения (в данном случае оно равно значению n, которое предполагается заданным к этому времени);
управление циклом осуществляется с помощью переменной порядкового типа, которая в этом циклическом процессе принимает последовательные значения от заданного начального до заданного конечного значений (в нашем случае – это целочисленная переменная i, принимающая последовательные значения от 1 до n).
Для компактного задания подобного рода вычислительных процессов и служит оператор цикла с параметром. Чаще всего используется следующий вид этого оператора:
For V:= E1 to E2 do S,
где for (для), to (увеличиваясь к) и do (выполнять, делать) – служебные слова, V – переменная порядкового типа, называемая параметром цикла, Е1 и Е2 – выражения того же типа, что и параметр цикла, S – оператор, который и выполняется многократно в цикле, называемый телом цикла. Заметим, что в Паскале после do должен стоять один оператор, если необходимо выполнить несколько действий, то они должны быть объединены в один составной оператор путем заключения в операторные скобки.
Этот оператор цикла предусматривает присваивание параметру цикла V последовательных значений от начального значения, равного значению выражения Е1, до конечного значения, равного значению выражения Е2, т.е. при каждом повторении выполняется оператор присваивания V:= succ(V), и выполнение оператора S при каждом значении параметра цикла V. При этом значения выражений Е1 и Е2 вычисляются один раз, при входе в оператор цикла, а значение параметра цикла V не должно изменяться в результате выполнения оператора S. Если заданное конечное значение меньше начального значения (что допустимо), то оператор S не выполняется ни разу.
В Паскале считается, что при нормальном завершении выполнения оператора цикла значение параметра цикла не определено.
С использованием оператора цикла с параметром алгоритм вычисления суммы первых n членов гармонического ряда может быть задан следующим образом:
Readln(n);
Y:= 0;
For i:= 1 to n do y:= y+1/i;
В некоторых случаях бывает удобно, чтобы параметр цикла принимал последовательные, но не возрастающие, а убывающие значения. Для таких случаев в Паскале предусмотрен оператор цикла с параметром следующего вида:
For V:= E1 downto E2 do S,
где downto (уменьшаясь к) – служебное слово, а все остальные слова и выражения имеют прежний смысл. Изменение параметра цикла от большего значения к меньшему происходит при выполнении присваивания V:= pred(V). Заметим, что начальное значение может быть меньше конечного значения. В этом случае оператор S не выполнится ни разу. Значение параметра цикла по завершении выполнения такого цикла так же считается неопределенным.
Следует запомнить и то, что для обоих вариантов записи цикла с параметром справедливо: если начальное и конечное значения равны, то тело цикла (оператор S) выполнится один раз.
Заметим так же, что параметр цикла может и не использоваться в теле цикла, так что основное его назначение – это управление числом повторений цикла. Например, значение y=xn, где n>=0 – целое, можно вычислить по следующему алгоритму: предварительно положить y=1, а затем n раз домножить это значение на x:
Readln(n);
Readln(x);
Y:= 1;
For i:= 1 to n do y:= y*x;
Как видно, здесь параметр цикла i служит лишь для того, чтобы тело цикла (оператор y:=y*x) выполнилось нужное число раз.
