Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы программирование.doc
Скачиваний:
68
Добавлен:
18.03.2015
Размер:
1.19 Mб
Скачать

10.3.1. Параметры-значения

Параметры-значения передаются основной программой в подпрограмму через стек в виде их

копий и, следовательно, собственный (т.е. фактический) параметр программы подпрограммой

измениться не может.

Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие -

типом. Тип параметра-значения может быть любым за исключением файлового.

Если параметров-значений одного типа несколько, их можно объединить в одну группу,

перечислив их имена через запятую, а затем уже указать общий тип. Как отмечалось выше,

отдельные группы параметров отделяются друг от друга точкой с запятой.

Пример.

procedure Inp(Max, Min: Real; N: Word);

function Mult(X, Y: Integer): Real;

В качестве фактического параметра на месте параметра-значения при вызове подпрограммы

может выступать любое выражение совместимого для присваивания типа (см. п. 9.3), не

содержащее файловую компоненту, например:

Inp(Abs(Z), -Abs(T), 2 * К);

M:=Mult(X + Y, X - Y);

MA:=Max(B, 5);

Пример. Функция вычисления максимального элемента в массиве.

Пусть в основной программе определен тип-массив, массив этого типа и переменная целого

типа

type

tArr = array[l..100] of Integer;

var

Massiv: tArr;

Maxim: Integer;

Функция в этом случае может иметь вид:

function Max(Mas: tArr; N: Byte): Integer;

var Ma: Integer;

i: Byte;

begin

Ma := Mas[1];

for i := 2 to N do

if Ma < Mas[i] then

Ma := Mas[i];

Max := Ma

end;

Теперь, например, для определения максимального числа из первых пяти чисел массива Massiv

и записи его в переменную Maxim можно записать оператор:

Maxim := Max(Massiv,5);

Следует иметь в виду, что подпрограмма может работать только с массивами типа tArr. Для

массивов другого типа придется создавать другую аналогичную подпрограмму. Кроме того, при

работе подпрограммы в стеке будет создана копия исходного массива, что приводит к

уменьшению быстродействия и заполнению стека излишней информацией.

10.3.2. Параметры-переменные

При передаче параметров-переменных в подпрограмму фактически через стек передаются их

адреса в порядке, объявленном в заголовке подпрограммы. Следовательно, подпрограмма имеет

доступ к этим параметрам и может их изменять.

Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но

только перед именем параметра записывается зарезервированное слово var. Действие слова var

распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.

Пример.

procedure MaxMin(A: tArr; var Max, Min: Real; N: Word);

Здесь Max, Min - параметры-переменные, А и N - параметры-значения.

Тип параметров-переменных может быть любым, включая и файловый.

При вызове подпрограммы на месте параметра-переменной в качестве фактического параметра

должна использоваться переменная идентичного типа (см. п. 9.1). Так, если формальный

параметр имеет тип, определенный следующим образом:

type tArr = array[l..100] of Integer;

то и фактический параметр должен быть переменной или типизированной константой типа tArr.

Пример. Функция вычисления максимального элемента в массиве.

Модифицируем подпрограмму примера п. 10.3.1, используя в качестве первого параметра

параметр-переменную:

function Max(var Mas: tArr; N: Byte): Integer;

var Ma: Integer;

i: Byte;

begin

Ma := Mas[1];

for i := 2 to N do

if Ma < Mas[i] then

Ma := Mas[i];

Max := Ma

end;

Этот вариант лучше предыдущего тем, что в данном случае в стеке не создается копия

исходного массива, что улучшает быстродействие и экономит память. Однако при такой

передаче параметра возможно его нежелательное изменение (такой вариант передачи параметра

допустим только в таких небольших подпрограммах, как в данном примере, когда программист

может проконтролировать отсутствие несанкционированного изменения параметра). Недостаток

же, связанный с тем, что подпрограмма может работать только с одним типом массивов,

остается.

  1. Оператор ветвления в краткой и полной форме. Оператор множественного выбора.

Условный оператор используется в тех случаях, когда вычисления могут пойти по различным путям, в зависимости от выполнения или невыполнения определенных условий.

Пример: Вычислить арифметическое выражение  y = x+1,  если x <  0, либо  y=2x, если x      0.

Здесь сначала проверяется условие: будет ли аргумент x  положительным или отрицательным. В зависимости от этого условия вычисляется только одно значение: либо y = x +1, либо y = 2x. В языке Паскаль для таких вычислений предусмотрен условный оператор, который имеет две формы  –  полную и краткую.

Полная форма условного оператора имеет вид

IF  логическое выражение  THEN  оператор 1

ELSE  оператор 2

Здесь IF (если), THEN (тогда), ELSE  (иначе)  - служебные слова,   оператор 1,   оператор 2 - простые или составные операторы. Если логическое выражение истинно, тогда выполняется оператор 1, иначе (если логическое выражение ложно) - оператор 2. В качестве оператора 1 и 2 могут быть также условные операторы. Условный оператор относится к сложным, так как в его состав входят другие операторы.  Для нашего примера условный оператор имеет вид:

IF  X< 0  THEN  Y:=X+1  ELSE  Y:= 2*X

  Здесь значение  X  должно быть определено до выполнения  оператора  IF.

Условие, управляющее разветвлением вычислений, не обязательно должно иметь форму операции отношения. Оно может принимать вид любого логического выражения в частности логической переменной.

Если в нашем примере описать B как логическою переменную и описать ее значение отдельно: B:=X<0  то условный оператор будет иметь вид

IF   B   THEN     Y:=X+1

ELSE    Y:=2*X

Пример.   Вычислить A=N+40,  если значение больше 15, но меньше 25. При всех других значениях вычислить B=M+1. Условный оператор имеет вид

IF    ( N > 15)   AND  ( N <25)    THEN   A:= N+40

ELSE   B:= M+1

Обратите внимание на логическое выражение: когда выполняются одновременно оба условия  N<15  и  N<25  только тогда вычисляется значение  A=N+40. Значение переменных N  и  M  определяют до выполнения оператора.

Правила написания программы позволяет записывать ее в свободной форме. Однако  для удобства восприятия программы, особенно большой и сильно разветвленной, рекомендуется слово ELSE писать под тем IF, к которому оно относится, например:    

          IF    A = B      THEN

         IF   C < D    THEN  X:=1

           ELSE  X:=2

          ELSE  X:=3

Этот пример соответствует следующей алгебраической схеме:

           1, если  A=B  и  C<D                                        

X=      2, если  A=B  и  C>=D

            3, если  A<>B.

Иногда используют другую запись условного оператора:

IF  логическое выражение

        THEN  оператор_1

         ELSE  оператор_2

На первый взгляд она более целесообразна, но, как показал опыт, предыдущая форма записи более наглядна в сложной логической структуре, а вторая - в простой.

Действия условного оператора можно расширить путем использования составного оператора. В этом случае после слов  THEN  и  ELSE  могут быть составные операторы:

IF   логическое выражение    THEN  

      BEGIN 

           оператор_1;

           оператор_2;

          . . .

          оператор_n-1;

         оператор_n

     END

ELSE

    BEGIN

           оператор_1;

           оператор_2;

           . . .

          оператор_n-1;

         оператор_n

    END

Перед служебным словом  ELSE  не ставится знак точки с запятой.

Внутри составных операторов могут быть также условные операторы. Глубина вложенности может быть ограничена в различных версиях языка .

Например, если  A>B, то нужно вычислить три оператора:

                                                 Y1=7,   Y2=A,   Y3=A+B.

Если  A<=B, то нужно вычислить  T1=2A и  T2=A-B.

Условный оператор имеет вид

                                   IF  A>B  THEN

                                            BEGIN

                                               Y1:=7;

                                               Y2:=A;

                                               Y3:=A+B

                                            END

                                   ELSE

                                             BEGIN

                                                     T1:=2*A;

                                                 T2:=A-B       

                                             END

Здесь используется два составных оператора. Возможны случаи когда используется один составной оператор, а другой простой. Начинающие программисты часто допускают такую ошибку: после служебного слова THEN  или  ELSE  имеют в виду составной оператор, а операторные скобки  BEGIN - END  ставить забывают. В этом случае выдается сообщение о неправильной конструкции условного оператора.

В языке  Паскаль  допускается и краткая форма условного оператора :

            IF  логическое  условие  THEN  оператор_1

Если логическое условие истинно, то выполняется оператор 1; иначе (если логическое выражение ложно) выполняется оператор расположенный в программе после условного оператора  IF.  Например,        IF   A>15   THEN   Y:=X-7;

                                                                             Z:=SUM+1;

В этом фрагменте представлено два независимых оператора. Один из них условный, другой - оператор присваивания. Если условие  A>15  истинно, то вычисляется значение  Y. Если условие A>15  ложно, т.е. A<=15, то сразу выполняется оператор присваивания  Z:=SUM+1.                

Краткой формой условного оператора нужно пользоваться осторожно, так как может нарушиться вся структура при вложенных условных операторах. Вместо краткой формы рекомендуется использовать всегда полную форму, но после слова  ELSE  ничего  не ставить ( говорят, указывается пустой оператор). Так, для рассмотренного примера лучше составить следующую конструкцию:

                                   IF   A>15   THEN   Y:=X-7

                                   ELSE;

                                   Z:=SUM+1;

Допускается использование пустого оператора и после слова  THEN. Этот же пример можно записать и так:                                   IF   A<=15   THEN

                                                                                   ELSE   Y:=X-7;

                                                                                   Z:=SUM+1;

Здесь в логическом выражении знак операции отношения  “ > ” сменился на противоположный  “ <=  “. В соответствии с этим поменялись местами операторы, расположенные после слов  THEN и  ELSE  ( пустой оператор и оператор  Y:=X-7 ).

Пример.     Определить,  попадает ли точка  а  с координатами Xа  и  Yа

 внутрь круга с радиусом   R . Центр круга совпадает с началом координат. 

Очевидно, что точка  а  находится внутри круга, если ее расстояние от начала координат                         будет меньше радиуса окружности R , т.е. Если

 

                                                                    или

 Программа   решения этой задачи может быть такой:

               PROGRAM    PR5;

                          VAR   XA, YA, R, L:REAL;

               BEGIN

                  WRITE (‘введите значения   XA, YA, R’);

                  READ ( XA, YA, R);

                  L:=SQR(XA)+SQR(YA);

                  IF   L <  SQR( R )  

                                   THEN   WRITELN (‘Точка находится внутри круга ‘)

                                   ELSE    WRITELN (‘Точка находится вне круга’)

             END.

Здесь условный оператор сравнивает расстояние  L точки  А от  начала координат с радиусом круга   R. Если оно меньше радиуса  R, то выполняется группа  THEN, т.е. печатается cообщение ТОЧКА НАХОДИТСЯ ВНУТРИ КРУГА. В противном случае выполняется сообщение  ТОЧКА НАХОДИТСЯ ВНЕ КРУГА.

Оператор множественного выбора выполняется следующим образом. Значение<переменной> последовательно сравнивается со <значениями>, указанными в теле оператора и при равенстве выполняется соответствующий <оператор>. Если все сравнения прошли безуспешно и существует Else часть оператора, то выполняется ей принадлежащий оператор.

Case <переменная> Of

<значение1>: <оператор1>; [<значениеN>: <операторN<;]

[Else

<оператор>;]

End;

  1. Операторы цикла: с предусловием, постусловием, цикла с параметром.

Циклы

Цикл – это многократное повторение одного и того же действия. Действия, которые повторяются, называются шагом цикла. Условие, в течение которого действие выполняется, называется условием выполнения цикла.

Существуют три вида циклов:

  1. Цикл с предусловием – условие выполнения проверяется до шага цикла.

While <условие выполнения> Do <оператор>;

Пример:

Program test1;

Var z:Integer;

Begin

z:=10;

Whilez>0 Do

z:=x-3;

WriteLn(z);

End.

  1. Цикл с постусловием – условие выполнения проверяется после шага цикла.

Repeat

<оператор>;

<оператор>;

<оператор>;

Until <условие завершения>;

Пример:

Program test2;

Var b:Real;

Begin

b:=100;

Repeat b:=b/2;

Until b<10;

Writeln(b:0:2);

End.

 

  1. Цикл с параметром – выполняется определенное заранее известное количество раз.

For <имя переменной>:=<нач. значение> To <кон. значение> Do <оператор>;

Пример:

Program test3;

Var j:Integer;

Begin

For j:=1 to 5 Do

WriteLn(‘*’);

WriteLn;

 

 

  1. Цикл с предусловием выполняется до тех пор, пока условие выполнения не станет ложным, и продолжается, если условие истинно.

  2. Цикл с постусловием выполняется до тех пор, пока условие не станет истинно, если условие ложно, цикл продолжается.

  3. Цикл с параметром используется переменная, называемая параметром цикла. Перед выполнением цикла параметру устанавливается начальное значение. После выполнения шага цикла значение параметра увеличивается на единицу. Цикл продолжается до тех пор пока параметр не достигнет своего конечного значения.

  1. Указатели и динамические переменные. Работа с динамической памятью.