Организация циклов в языке TURBOPASCAL / Документ Microsoft Word (4).doc
Министерство общего и профессионального образования
Российской Федерации
Воронежская государственная технологическая академия
Кафедра математического моделирования технологических систем
ОРГАНИЗАЦИЯ ЦИКЛОВ В ЯЗЫКЕ
TURBOPASCAL
Методические указания к практической работе
по курсу “Информатика”
Для студентов специальностей 270300-270500, 170600
дневной формы обучения
Составители - ст. преподаватель Б.А.Крымов,
доцент, к.т.н. А.О. Мовшин
Воронеж 1997
Цель работы - овладение приемами программирования циклических вычислительных процессов на языке программирования TurboPascal [1-7].
1. Общие положения
Циклическими называют вычислительные процессы, включающие в себя хотя бы одну циклическую структуру [1]. Циклические вычислительные процессы (в дальнейшем, циклы) делятся на две разновидности: итерационные * и арифметические. К арифметическим относят циклы, для которых число их повторений заранее известно или может быть подсчитано. В настоящих методических указаниях рассматривается организация циклических процессов для задач обработки числовой информации.
2. Арифметические циклы
Типичной задачей, которая решается с использованием арифметического цикла, является задача табулирования (получения таблицы) значений некоторой известной функции y=f(x) при различных значениях её аргумента. Аргумент этот можно задать двумя способами:
1) аналитически, т.е. указать строгую закономерность (формулу), позволяющую вычислять очередные значения аргумента, для которых необходимо найти соответствущие им значения функции;
2) таблично, когда все численные значения аргумента заданы заранее и вычислять их в процессе счёта нет необходимости.
Приступая к организации цикла, прежде всего нужно установить:
· какая переменная будет управлять циклическим процессом. Эту переменную называют управляющей или параметром цикла;
· как меняется величина параметра после каждого повторения тела цикла (иными словами, каков закон изменения параметра цикла);
· каково предельное значение параметра, при достижении которого следует прервать выполнение циклической процедуры и выйти из цикла.
В общем случае параметр цикла в процессе счёта задачи может выполнять следующие функции:
· служить счётчиком числа выполненных повторений тела цикла;
· в обращении к элементу массива играть роль индекса этого элемента (величина только целого типа) (см.раздел 2.3.2.);
· участвовать в вычислениях, предусмотренных телом цикла в качестве
неиндексированной переменной. Аналитическое задание аргумента функции
2.1.1. Постановка задачи и её анализ
Пусть задана функция y=f(x). Необходимо вычислить её значения на отрезке [а,b], если аргумент x меняется на этом отрезке по вполне определённому, заранее заданному, закону. В качестве закона изменения аргумента выберем наиболее простой, но в то же время и чаще всего используемый закон
xi+1= xi+x, i=0,1,2,...,
где x -величина, называемая шагом изменения аргумента. Подставляя в предыдущую формулу значения величины i, получим:
x1=x0+x; x2=x1+x; ...,
т.е. каждое следующее значение аргумента x вычисляется путем суммирования его предыдущего значения с шагом x (рис 1.).
Рис. 1.
2.1.2. Разработка алгоритма задачи
В рассматриваемой задаче управляющей переменной (параметром цикла) является аргумент функции, ибо от его текущего значения зависит решение вопроса продолжать ли далее выполнение цикла или закончить вычисления и выйти из него. Если очередное значение аргумента находится в пределах отрезка [а,b], цикл следует повторить, вычислив при этом соответствующее ему значение функции, в противном случае выйти из цикла. Поскольку закон изменения параметра сформулирован в постановке задачи, остается определить то значение параметра, при достижении которого циклический процесс следует прервать. Очевидно, что это значение определяется неравенством xi>b.
Примечание. Если начальным значением аргумента является величина b и шаг его изменения отрицателен, то условием выхода из цикла будет неравенство xi<a.
Составим алгоритм нашей задачи, основываясь на следующем:
· начальное значение аргумента вычисляемой функции известно из условия задачи: x0=a, следовательно, есть возможность сразу же вычислить соответствующее ему значение функции y0;
· очередной шаг - вывод строки таблицы, содержащей значения аргумента и функции;
· далее вычислим очередное значение аргумента, используя при этом закон его изменения на числовой оси xi+1= xi+x ;
· полученное значение аргумента xi сравниваем с его конечным значением b; если оказывается, что xi>b, то закончим счет задачи, если нет - перейдем к вычислению очередного значения функции.
Представим алгоритм задачи в виде схемы (рис.2).
В приведённом алгоритме использована циклическая структура с постусловием (обведена штриховой линией). Этот алгоритм позволяет детально описать процесс решения задачи, т.е. установить, какие вычислительные шаги нужно предпринять для получения искомого результата и в какой последовательности они должны быть выполнены. Однако, уже для задач средней сложности такие схемы становятся громоздкими и теряют своё основное достоинство - наглядность. В таких случаях алгоритм можно изобразить в компактной форме с использованием символа "Граница цикла".
Символ состоит из двух частей, отображающих начало и конец цикла. Обе части символа имеют один и тот же идентификатор. Закон изменения параметра цикла или условие выхода из него помещаются внутри одной из частей символа - либо в начале, либо в конце, в зависимости от того, где расположена операция, проверяющая условие.
Алгоритм решаемой задачи в компактной форме приведём в двух равноценных вариантах (рис.3).
Вариант 1.
Вариант 2.
Рис.3 б
2.2. Операторы цикла
В языке Pascal имеются три оператора цикла - repeat, while и for. Операторы цикла repeat и while используются в тех случаях, когда окончание цикла определяется некоторым логическим условием. При этом количество повторений заранее может быть неизвестно. В тех случаях, когда количество повторений известно заранее удобнее использовать оператор for.
2.2.1. Оператор цикла с постусловием Repeat
Общий вид оператора
repeat
oператор 1;
oператор 2;
...
oператор N
until L;
где repeat - повторить (ключевое слово); until - пока (ключевое слово); L - логическое выражение, называемое условием.
Последовательность выполнения оператора repeat:
1) исполняются операторы, составляющие тело цикла;
2) вычисляется логическое выражение L, результат вычисления анализируется;
3) если результатом вычислений является false, тело цикла выполняется снова, в противном случае (результат вычислений - true) очередного повторения тела не происходит, а осуществляется выход из цикла на следующий оператор. Таким образом, логику действия оператора repeat можно выразить инструкцией "выполнять тело цикла, пока не станет истинным условие ".
| |
|
|
Пример 1.
Вычислить значения функции y=sinx2 на отрезке [1,2], если шаг изменения её аргумента x=0,1.
Схема алгоритма соответствует схемам, приведенным на рис.2 и рис.3.
program sinus1;
var
x,y,dx,a,b: real;
begin
write(`введите a, b, dx - `);
read(a,b,dx); x:=a; {присваивание текущему значению
аргумента его начального значения }
repeat
y:=sin(x*x); {вычисление очередного значения функции }
writeln ('x=',x:10:3,' y=',y:10:3); {печать строки таблицы }
x:=x+dx {вычисление очередного
значения аргумента }
until x>b { проверка условия выхода из цикла }
end.
| |
|
|
Примечание. Операторные скобки begin-end, ограничивающие тело цикла, можно опустить. Здесь их роль сыграют слова repeat и until.
2.2.2. Оператор с предусловием While
Общий вид оператора
while L do P,
где while - пока (ключевое слово), do - делать (ключевое слово), L - логическое выражение, Р - исполняемый оператор (тело цикла).
Оператор while выполняется так:
1) вычисляется логическое выражение L, результат вычисления анализируется;
2) если результат вычислений есть true, выполняется тело цикла P, после чего осуществляется возврат к оператору while; если результат есть false, тело цикла не выполняется, а управление передаётся оператору программы, расположенному непосредственно после тела цикла.
Применяя операторы while и repeat, следует помнить, что значения переменных, входящих в условие окончания цикла должны меняться в теле цикла от повторения к повторению, иначе циклический процесс будет продолжаться бесконечно ("зацикливание" программы).
Если первая проверка условия окончания цикла дала результат false, тело цикла не выполнится ни разу.
Логику действия оператора while можно определить так: "выполнять тело цикла в то время, когда условие истинно".
| |
|
|
Пример 2.
Решить задание примера 1, используя оператор while.
Алгоритм решения задачи приведен на рис.4.
Рис. 4
Компактная схема алгоритма не приводится, т.к. она отличается от схем, приведенных на рис.3, только тем, что условие выхода из цикла или закон изменения параметра записывается в верхней части символа "Граница цикла".
program sinus2;
var
x,y,dx,a,b:real;
begin
write(`введите a, b, dx - `);
read(a,b,dx); x:=a;
while x<=b do {проверка условия выхода из цикла }
begin
y:=sin(x*x); { oператоры, составляющие тело }
writeln('x=',x:10:3,' y=',y:10:3); { цикла, заключены в опера- }
x:=x+dx { торные скобки begin-end }
end
end.
Подчеркнем отличия между операторами repeat и while.
1. В операторе repeat проверка условия выхода из цикла производится в конце, а не в начале цикла, поэтому тело цикла выполняется хотя бы один раз.
2. В операторе repeat условие выхода из цикла удовлетворяется, если логическое выражение L истинно, а в операторе while - если ложно.
3. Тело цикла, организованного с помощью оператора while, может содержать только один оператор (в том числе и составной), в то время как между словами repeat и until их можно разместить несколько.
В приведенных примерах количество повторений можно оценить до выполнения цикла и воспользоваться оператором for. Однако, во многих задачах количество повторений заранее не известно. Операторы repeat и while позволяют организовывать такие циклы. В следующих двух примерах рассмотрим нахождение суммы бесконечного ряда с заданной точностью.
Пример 3.
Найти сумму членов бесконечного ряда с точностью до члена ряда, меньшего ε:
x2 x3 xn
z = 1 + x + --- + --- + ... + --- + ...
2! 3! n!
При нахождении суммы такого ряда не следует вычислять отдельно каждый элемент. Достаточно установить зависимость, по которой из предыдущего элемента ряда образуется следующий. Обозначим через an n-й член ряда, тогда an+1 = anx/(n+1), a0 = 1. Такой подход позволяет сократить число вычислений и уменьшить время счета. Сумму будем накапливать в переменной S, которую предварительно необходимо обнулить.
Схема алгоритма решения этой задачи приведена на рис.5. Условие окончания цикла an < ε.
Рис.5
Ниже приведены две программы. Первая, с постусловием, соответствует этой схеме, для второй - цикл с предусловием, схема не приводится.
Program Summa2;
var
x,s,e,a : real;
begin
write (`введите х и epsilon - `); readln(x, e);
s:=0; n:=0; a:=1; { задание начальных условий }
repeat
s:=s+a;
n:=n+1;
a:=a*x/n
until a<e;
writeln(`сумма ряда = `,s:10:3)
end.
Program Summa1;
begin
x,s,e,a : real;
begin
write (`введите х и epsilon - `); readln(x, e);
s:=0; n:=0; a:=1; { задание начальных условий }
while a>e do
begin
s:=s+a;
n:=n+1;
a:=a*x/n
end;
writeln(`сумма ряда = `,s:10:3)
end.
2.2.3. Оператор цикла с парамером For
Оператор имеет вид
for i:=m1 to m2 do P,
где for - пока (ключевое слово), to - до (ключевое слово), do - делать (ключевое слово), Р - простой или составной оператор (тело цикла).
На параметр цикла (i) в операторе for накладываются следующие ограничения:
1) в качестве параметра может использоваться только целочисленная переменная без индекса;
2) начальное и конечное значения параметра могут быть константами, переменными или выражениями, но должны иметь одинаковый с ним тип;
3) параметр цикла, а также его начальное и конечное значения не могут быть изменены никаким оператором в теле цикла;
4) после завершения цикла значение его параметра становится неопределенным, если только цикл не был прерван оператором перехода.
Выполнение оператора for начинается с присваивания его параметру цикла его начального значения m1; затем:
1) значение параметра (назовём его текущим и обозначим it) сравнивается с его конечным значением m2;
2) если it m2, выполняется тело цикла, после чего присходит возврат к оператору for и увеличение параметра на 1; если it > m2, тело цикла в очередной раз не выполняется, а следует переход на оператор, расположенный за циклом.
| |
|
|
Пример 4.
Решить задачу, приведённую в примере 1, используя оператор for. В этой задаче количество повторений цикла равняется числу точек разбиения на отрезке [a,b] и может быть вычислено до выполнения цикла как целая часть от деления длины отрезка (b-a) на величину шага Δ(x). Ниже приведены детализированная (6а) и компактная (6б) схемы алгоритма.
Рис. 6 а Рис. 6 б
В обеих схемах величина n - это число необходимых повторений тела цикла, а i - его параметр, который выполняет роль счётчика числа повторений.
program sinus3;
var
x,y,dx,a,b : real;
n,i : integer;
begin
n:=trunc((b-a)/dx)+1; { вычисление числа повторений тела цикла;
trunc-функция, округляющая аргумент до
ближайшего меньшего целого }
x:=a;
for i:=1 to n do
begin
y:=xx; writeln('x:=',x:10:3,' y:=',y:10:3); x:=x+dx
end
end.
Разновидностью оператора for является оператор
for i:=m1 downto m2 do P
где downto - спуститься до (ключевое слово).
Он используется в тех случаях, когда m1>m2 , а шаг изменения параметра цикла равен -1.
