Процедуры и функции в языке Паскаль

Лабораторная работа №5





Тема: Процедуры и функции в языке Паскаль





Цель работы: изучить работу процедуры и функции и	обрести навык написания   

                        программ с применением процедур и функций. 









Основные понятия.



	      Широко распространена в программах форма повторяемости, когда одна и та же последовательность действий должна выполняться на различных этапах информации. В программах такого рода в различных местах встречаются фрагменты, одинаковые по выполняемым действиям и различающиеся только в значениях исходных данных. При составлении программы приходиться задавать одну и ту же группу операторов, соответствующую каждому из повторяющихся фрагментов. Для более эффективного программирования подобных повторений в языке введено понятие подпрограммы. Повторяющаяся группа операторов оформляется в виде самостоятельной единицы – подпрограммы, записывается однократно, а в соответствующих местах программы обеспечивает лишь обращение к ней. Использование аппарата подпрограммы позволяет сократить объем и улучшить структуру программы с точки зрения наглядности и читаемости. Подпрограмма может быть рассмотрена как самостоятельная программа (со своими входными и выходными данными).

В языке Паскаль подпрограммы реализуются в виде процедур и функций, которые вводятся в программу с помощью своего описания.









                                             1.1 Описание процедуры.



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

      Любая процедура состоит, аналогично программе, из заголовка процедуры и блока. 



Заголовок процедуры представляет собой:



PROCEDURE <ИМЯ> (<СПИСОК ПАРАМЕТРОВ>);



Где PROCEDURE – служебное слово, 

       ИМЯ – имя процедуры, 

        СПИСОК ПАРАМЕТРОВ  - перечень имен для обозначения исходных данных и результатов работы процедуры с указанием их типов. Параметры, перечисленные в списке, называются формальными. Допускается описание процедуры, несодержащей формальных параметров:

PROCEDURE <ИМЯ>;



      Содержательная часть процедуры представляет собой блок и состоит, следовательно, из раздела описаний (меток, констант, типов, переменных, процедур, и функций) и раздела операторов, представляющего собой составной оператор   BEGIN – END. Заканчивается блок процедуры точкой с запятой.



      Пример:



       Оформить в виде процедуры алгоритм вычисления степени y=xn c натуральным показателем n.



PROCEDURE  STEP1 (N:INTEGER;X:REAL;VAR Y:REAL;)

VAR  I:INTEGER;

BEGIN

Y:=1;

FOR I:=1 TO N DO

          Y:=Y*X;

 END;



      В заголовке процедуры с именем STEP1 перечислены параметры X, N, определяющие исходные данные процедуры, и параметр Y, обозначающий значение исходной степени – результат выполнения процедуры. Указан также тип всех формальных параметров. 

      Если в заголовке процедуры параметры указаны без слова  VAR, то это параметры-значения. Параметры-значения могут изменяться внутри процедуры, но для внешней программы это изменение окажется незамеченным.

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



Тело процедуры состоит:

		Из описательной части, где определена переменная I, необходимая и имеющая смысл только внутри данной процедуры и называемая локальной переменной (значение локальной переменной недоступно в основной программе);

		Из составного оператора BEGIN-END, реализующего алгоритм вычисления степени действительного числа с натуральным показателем.



      Это то же вычисление оформим в виде процедуры без параметров:



PROCEDURE STEP2;

VAR I:INTEGER;

BEGIN

       Y:=1;

       FOR I:=1 TON DO Y:=Y*X;

END;



      В этом случае процедура STEP2 не содержит списка формальных параметров и работает с локальной переменной I, описанной в блоке процедуры, и переменными X, N, Y  называются глобальными по отношению к процедуре STEP2. Значение глобальных переменных доступны и могут быть использованы в любой точке основной программы (в частности, внутри данной процедуры).









                                      1.2 Функция.



      Функция – это подпрограмма, результат выполнения которой есть единственное скалярное значение, присваиваемое имени этой функции. Следовательно, функции являются частным случаем процедур и принципиально отличаются от них тем, что, во-первых, результат выполнения функции – одно значение, а процедуры – одно или несколько; во-вторых, результат выполнения функции передается в основную программу, как значение имени этой функции, а результаты выполнения процедуры – как значения ее параметров.

      Описание функции аналогично описанию процедуры и состоит из заголовка и блока. Заголовок функции имеет вид:



FUNCTION <ИМЯ> (<СПИСОК ПАРАМЕТРОВ>):<ТИП>;



Где   FUNCTION – служебное слово,

         ИМЯ – имя функции,  

         СПИСОК ПАРАМЕТРОВ –  перечень формальных параметров (исходных              

                                                         данных) с указанием их типов, 

         ТИП – тип результата: значение, которое должно приобретать имя функции. 



  Допускается описание функции без параметров:



                                         FUNCTION <ИМЯ>: <ТИП>;



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



      Пример: 



      Оформить в виде функции алгоритм вычисления степени Y=Xn :



            FUNCTION  STEP3 (N:INTEGER; X:REAL) : REAL;

            VAR  I:INTEGER;

                     Y:REAL;

            BEGIN

            Y:=1;

            FOR I:=1 TO N DO

            Y:=Y*X;

            STEP3:=Y

            END;



      В заголовке функции с именем  STEP3 перечислены параметры N,X, определяющие  ее исходные данные. Результат выполнения функции (значение локальной переменной Y) присваивается ее имени STEP3. Тип результата (тип функции) – REAL, который указывается в заголовке функции при ее описании. Введение локальной переменной Y не обязательно, но придает описанию функции более наглядный вид.









                     1.3 Обращение к подпрограммам.



      Описание процедуры (или функции), расположенное в разделе описаний, само по себе никакого действия не вызывает. Чтобы исполнить процедуру (или функцию), необходимо в нужном месте программы поместить обращение к ней. Обращение к процедуре производится с помощью оператора процедуры, имеющего вид:



<ИМЯ> (<СПИСОК АРГУМЕНТОВ>);



Где  ИМЯ – имя процедуры, к которой происходит обращение,  

       СПИСОК АРГУМЕНТОВ – перечень конкретных значений (выражений) и имен, подставляемых на место формальных параметров процедуры при ее выполнении.



      При вызове процедуры формальные параметры, указанные в заголовке, заменяются аргументами в порядке их следования: первому слева параметру в списке ставится в соответствие первый аргумент, второму – второй и т.д. Аргументы, перечисленные в операторе процедуры, называются также фактическими параметрами. Число, тип и порядок следования формальных и фактических параметров должно совпадать. Структура программы, содержащей процедуру, имеет вид:   













      Пример: 



      Cоставить программу вычисления степени Z=An, где n – целое число и A<>0. Степень с целым показателем определяется следующим образом:







      Учитывая, что 1/An = (1/A)n  и используя процедуру STEP1, описанную в пункте 1.1, составим алгоритм рис.1 а), б) и программу. 



{ Определение степени с целым показателем }



PROGRAM STEP4;

VAR  M:INTEGER;

         A,Z:REAL;



{ Вычисление степени с натуральным показателем }



     PROCEDURE  STEP1 (N:INTEGER;X:REAL;VAR Y:REAL);

     VAR   I:INTEGER;

     BEGIN

     Y:=1;

     FOR I:=1 TO N DO

     Y:=Y*X;

     END;       {STEP1}



BEGIN    

READ (A,M);

IF M=0 THEN    Z:=1

ELSE   IF M>0 THEN   STEP1(M,A,Z)             {Вызов процедуры}

 ELSE  STEP1(M,1/A,Z);                                   {Вызов процедуры}

WRITELN(A:8:3,’В степени  ’,M:3,’   равно  ’,Z)

END.   






ВХОД

(n,x)

I:=1, n         



начало

                  	                                                              



Y:=1



Ввод

(а,m)











Y:=Y*X



m = 0





Выход (Y)





Z:=1



Z > 0                        			                                     б)  

					нет                       да	         	                     

		 		



STEP1

(m,1/a,z)



STEP1

(m,a,z)











Вывод

(z)











конец







                            а)                                 

                                                                     Рис. 1 





      В программе оператор процедуры использован дважды, и каждый раз он вызывает из описательной части программы процедуру STEP1. В теле процедуры произойдет замена формальных параметров N,X,Y на фактические M,A,Z первый раз и на M,1/A,Z второй раз. Затем выполняется совокупность действий, предусмотренных операторами процедуры, и в программу будет возвращен результат Z. Возврат осуществляется к оператору программы STEP4, следующему за оператором вызова процедуры. Очень важно понимать суть и механизм замены формальных параметров фактическими. 



      Формальные параметры – это переменные, фиктивно (формально) присутствующие в процедуре и определяющие тип и место подстановки фактических параметров.

      Фактические параметры – это реальные объекты (программы, заменяющие в теле процедуры при ее вызове формальные параметры). Над этими объектами и производятся действия, предусмотренные операторами тела процедуры.

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

      Обращение к функции осуществляется аналогично обращению к стандартным функциям (sin, cos, tan и т.д.) и является разновидностью операнда в выражениях в отличие от вызова процедуры, являющегося разновидностью оператора. В этом месте выражения, где это необходимо, записывается имя функции, вслед за которым в скобках перечисляются фактические параметры. Если вызывается функция без параметров, то указывается только ее имя.



      Пример:  



      Составить программу вычисления



, 

используя функцию STEP3, описанную в п. 1.2., (A – действительное, n - целое).



{ Пример вычисления функции }



PROGRAM STEP6;

VAR  M: INTEGER;

         A, Z, R: REAL; 



{ Функция вычисления степени } 



FUNCTION STEP3(N: INTEGER; X: REAL): REAL;

VAR  M: INTEGER;

          Y: REAL;

BEGIN       {STEP3}

Y:=1;

FOR I:=1 TO N DO

Y:=Y*N;

SYEP3:=Y

END;      {STEP3}



BEGIN   

READ (A,M);

WRITELN (‘A=’, A, ‘M=’, M);

Z:=STEP3(5,A)+STEP3(5, 1/A);

IF M=0 THEN R:=1

ELSE IF M>0 THEN R:=STEP3(M,A)

 ELSE R:=STEP3(M,1/A);

 Z:=Z/(2*R);

 WRITELN(‘Z=’, Z)

 END.    





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

      Процедуры могут работать не только с простыми переменными, но и с массивами. В качестве примера рассмотрим следующую задачу. 

      

      Даны два вектора: А, состоящий из трех элементов, и В, состоящий из четырех элементов. Возвести каждый элемент вектора в квадрат и найти сумму элементов. Действия над векторами оформить в виде процедуры. 

                                             

PROGRAM SUMMA;

TYPE MAX=ARRAY[1..4] OF REAL;

VAR  S1, S2: REAL;I: INTEGER;

          A,B: MAX;



PROCEDURE PR(N: INTEGER;VAR S: REAL;VAR C: MAX );

VAR I: INTEGER;

BEGIN

 S:=0;

 FOR I:=1 TO N DO

    BEGIN

    C[I]:=SQR(C[I]);

    S:=S+C[I]

    END;



BEGIN

FOR I:=1 TO 3 DO

READLN(A[I]);

 FOR I:=1 TO 4 DO

 PR(3,S1,A);

 PR(4,S2,B);

WRITELN(S1,S);

FOR I:=1 TO 3 DO 

 WRITE(A[I]);

 FOR I:=1 TO 3 DO 

      WRITE(B[I]);

END.

		







2. Задание



2.1  Из таблицы 1. По номеру компьютера взять задание и составить программу,    

       иcпользуя  подпрограмму- процедуру.

2.2  Из таблицы 2 по номеру компьютера  взять задание и составить программу, ис 

       пользуя подпрограмму FUNCTION.

2.3  Из таблицы 3 по номеру компьютера  взять задание и составить программу, ис 

       пользуя подпрограмму FUNCTION.

2.4  Из таблицы 4. По номеру компьютера взять задание и составить программу, ис

       пользуя подпрограмму- процедуру









3. Содержание Отчёта





       ОТЧЁТ ДОЛЖЕН СОДЕРЖАТЬ:



1) Задание к работе;

2) Программу;

3) Блок- схему алгоритма;

4) Результаты расчётов;









4. Контрольные вопросы:





		Заголовок процедуры и функции.

		Что входит в тело процедуры?

		 Отличия процедуры и функции.

		 Понятия локальной и глобальной переменной.

		 Обращение к подпрограммам.

		 Какие параметры являются фактическими, какие формальными?

		Параметры процедур и функций.

		 Соответствие между формальными и фактическими параметрами.











5. Литература

Новичков В.С. ПАСКАЛЬ – В.С. Новичков, Н.И. Парфилов, А.Н. Пылькин - М.: Высш. школа, 1990г. 223 стр.

Савельев А.Я. ЯЗЫКИ ПРОГРАММИРОВАНИЯ (Паскаль, ПЛ/М). – М.:Высш. школа. 1987г. –143 стр.

Боон К. ПАСКАЛЬ ДЛЯ ВСЕХ. – М.- Энергоатомиздат, 1988г.- 190 стр.











Здесь использованы следующие процедуры:







GoToXY (X, Y:Byte) - перемещает курсор к элементу экрана с заданными координатами, учитывая, что размер экрана в текстовом режиме 25 строк по 80 символов.



TextBackGround (Color : Byte) – задает цвет фона.

TextColor (Color : Byte) – задает цвет символов.



uses crt;

var s1,s2,s3:string;

    c1,c2,c3:byte;



procedure pr(s:string;x,y,c:byte);

begin

textcolor(c);

gotoxy(x,y);writeln(s);

end;



begin

writeln('введите оценку по математике');readln(s1);

writeln('введите оценку по физике');readln(s2);

writeln('введите оценку по истории');readln(s3);

clrscr;

pr('матемаитка'+s1,1,1,5);{на первом месте текст, столбец, строка, цвет печати}

pr('физика'+s2,40,10,8); {физика+ оценка, столбец 40, строка 10, цвет 8(серый)}

pr('история'+s3,70,23,12); {история+, столбец 70, строка 23, цвет 12(св крас)}

repeat until keypressed;

end.







                                      





                                     Таблица 1







N вар.

Содержание задания

1.

Процедура запрашивает три фамилии и выводит текст в заданном месте экрана.(использовать модуль crt)

2.

Процедура запрашивает имена трёх человек и выводит  их разным цветом.(использовать модуль crt) красный синий голубой)

3.

Процедура запрашивает оценки по  трём предметам и цвет и выводит  данным  цветом.(использовать модуль crt)(красный синий голубой)

4.

Процедура запрашивает частоту обновления  трёх марок мониторов и выводит  их мерцающим цветом. (использовать модуль crt)

5.

Процедура запрашивает частоту трёх марок процессора и выводит  их по главной  диагонали. (использовать модуль crt)

6.

Процедура запрашивает три объёма памяти различных марок видео карт и выводит  их по побочной  диагонали. (использовать модуль crt)

7.

Процедура запрашивает частоты  трёх марок материнских плат процессора и выводит  их сверху, посередине, внизу средней части экрана. (использовать модуль crt)

8.

Процедура запрашивает скорость трёх марок машин и выводит  их в центре экрана в начале в середине и в конце строки. (использовать модуль crt)

9.

Процедура запрашивает массу подъёмную трёх марок грузовых авто и выводит  их в конце строки в на 1 , посередине, в конце строки. (использовать модуль crt)

10.

Процедура запрашивает количество мест  трёх марок автобуса  и выводит  красным цветом в нижней строке экрана по очереди. (использовать модуль crt)











                                                         Таблица 2



			

N вар.

Содержание задания



1.

  при а=4,5; b=0,7; c=6,2; А x  принимает значения 0,2; 0,56; 0,83

2.

, при a=0,8; b=0,16; c=0,4; 

                                                     a=0,6; b=0,4; c=1,2;

                                                     a=0,47; b=0,1; c=0,5.

3

, при a=0,15;  b=1,5;

                                  a=1,7;  b=0,1.

4.

, при x=1,4; y=0,8;

                                         x=0,9; y=0,6;

x=2,9; y=0,4;  a d=5,3, при всех значениях x,y.

5.

, при x=0,4; y=1,2;

                                                            x=0,25; y=1,3;

a=0,54; b=1 при всех значениях x, y

6.

, при a=10,7; b=6,3; y=0,35; a x  принимает значения 0,6; 0,51; 0,42.

7.

, при x=3; y=4;

                                        x=1,6; y=5,8;

                                         x=4,5; y=2,7; a=7,1; b=2,4 при всех значениях x, y



8.

, при x=0,1; y=0,7;

                                       x=0,4; y=0,6

                                       x=0,5; y=0,2; a=2; b=0,1 при всех значениях x, y

9.

, при a=9,7; b=2,7, a x принимает значения 4,8;  9,6; 0,44.

10.

, при x=0,35; y=0,1;

                                                         x=0,82; y=0,12;

                                                         x=0,67; y=0,3, a=0,24;

b=4,9 при всех значениях x, y.

                                                   









 Программа, содержащая описание функции выбора меньшего из двух аргументов.



uses crt;



function Min(a, b: integer): integer;

Begin

If a<b then Min:=a

else Min:=b

End;



Var    x, y, z: integer;



BEGIN

write (‘Первое число- ’);

readln (x);

write (‘Второе число- ’);

readln (y);

z:=Min(x, y);

writeln (‘Меньшее из двух чисел- ’,z);

END. 





      

Программа, содержащая описание процедуры удвоения  аргументов.





Uses crt;



Procedure Double (var x, y: integer);

Begin

x:=x+x;

y:=y+y;

End;



Var   a, b: integer;



BEGIN

write (‘Введите исходные данные’)’

readln (a);

readln (b);

double (a, b);

wrteln (‘Полученные данные- ’,a ,b);

END.







Таблица 3





Опишите функцию нахождения наибольшего из трёх чисел..

Опишите функцию нахождения гипотенузы по двум катетам.

Опишите функцию нахождения катета по его гипотенузе и второго катета

Опишите функцию разность косинусов  двух углов.

Опишите функцию сумму синусов двух углов.

Опишите функцию вычисления куба числа.

Опишите функцию суммы квадратов двух чисел.

Опишите функцию разности квадратов двух чисел.

Опишите  функцию определения среднего значения из  трёх введенных

Опишите функцию нахождения наименьшего из трёх чисел.





Таблица 4



1.Опишите процедуру, которая  находит квадрат разности двух чисел.

2.Опишите процедуру, которая вычисляет площадь прямоугольного треугольника.

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

4.Опишите процедуру, которая переводит угол из градусов в радианы.

5.Опишите  процедуру, которая вычисляет сумму по модулю двух чисел

6.Опишите  процедуру, которая вычисляет разность  по модулю двух чисел

7.Опишите  процедуру, которая вычисляет произведение   по модулю двух чисел

8.Опишите  процедуру, которая вычисляет сумму кубов двух  чисел.

9.Опишите  процедуру, которая вычисляет разность  кубов двух  чисел.

10.Опишите  процедуру, которая вычисляет произведение кубов двух  чисел.