Методичка

Организация циклов в языке 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 = anx/(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:=xx;  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.