Структура подпрограммы-процедуры
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Структура подпрограммы-процедуры с параметрами имеет вид

 PROCEDURE <имя> (<формальные параметры>);

{ раздел описания (метки, константы, типы, переменные ) }

BEGIN

{ операторы подпрограммы }

END;

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

Пример программы для вычисления второй и четвертой степеней числа:

PROGRAM PROS;

VAR X, Y, A, A2, A4: INTEGER; {A – исходная переменная,

A2 - A2, A4 - A4 ,  глобальные переменные}

PROCEDURE STEP24;    {процедура без параметров}

BEGIN

     A2:=A*A;

     A4:=A2*A2;

     WRITELN(A:5, A2:5, A4:6);

END;

BEGIN                    {основная программа}

     READ(Y, X);

     WRITELN('Число; квадрат; куб');

      A := X;

     STEP24;       {вызов подпрограммы}

     A := Y;

     STEP24;       {вызов подпрограммы}

END.

Любой из формальных параметров процедуры может быть либо парамет­ром-значением, либо параметром-переменной. Формальному параметру-зна­чению (обычно для задания исходных данных) может соответствовать фактический параметр - константа, переменная или выражение. Параметру­ переменной может соответствовать только переменная. Обычно параметры-­переменные используются для передачи результатов в вызывающую програм­му. Параметрам-переменным в заголовке функции должно предшествовать слово VAR.


Пример:  PROCEDURE P(Y, X: REAL; VAR Z1, Z2: REAL);

где Y, X - параметры-значения, Z1, Z2 - параметры-переменные.

Передачу результатов можно проводить и через глобальные пере­менные. Однако злоупотребление глобальными переменными делает программу запутанной и сложной в отладке. В связи с этим рекомендуется там, где это возможно передавать результаты с помощью параметров-переменных. С дру­гой стороны, нежелательно описание всех формальных парамет­ров параметрами-перемен­ными.

Чем меньше параметров объявлено параметрами-переменными и чем меньше используется глобальных переменных, тем меньше возможность по­лучения непредвиденных программистом побочных эффектов в программе.

При наличии одноименных переменных в программе и подпрограмме в подпрограмме будут доступны только локальные переменные.


Передача в подпрограмму массивов и строк

Передача одиночных элементов массивов при вызове подпрограммы не отличает­ся от передачи в неё простых переменных. При передаче всего массива рекомендуется пред­варительно определить его тип, поскольку он не является стандартным. Например:

 TYPE ATYPE = ARRAY[1..10] OF REAL;

 PROCEDURE R(A: ATYPE);

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

Однако объявить процедуру можно и следующим образом:

PROCEDURE R(A: ARRAY[1..10] OF REAL);

Пере­дача в подпрограмму строки осуществляется аналогичным образом, поскольку строка является фактически массивом из её символов.

Пример описания и передачи строковых переменных:

 TYPE  INTYPE = STRING[10];

ONTYPE = STRING[30];

 FUNCTION R(A: INTYPE): ONTYPE;

Рекурсия в программе

Рекурсия - это способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения своих операторов обращается сама к себе.

Пример. Пусть задано целое положительное число, выведите на экран дисплея цифры числа в обратном порядке.

PROGRAM REKURS;

VAR    N: INTEGER;

PROCEDURE REVERS(M: INTEGER);

BEGIN

       WRITE(M MOD 10);

       IF (M DIV 10)<>0 THEN REVERS(M DIV 10);

END;

BEGIN

  READ(N);

  REVERS(N);

END.

В ходе выполнения программы процедура рекурсивно обращается сама к себе и выводит на экран при каждом обращении очередную цифру.

Рекурсия может быть прямой или косвенной. В первом случае модуль подпрограммы содержит оператор вызова этой же подпрограммы. Во втором случае один модуль (например, А) вызывается из другого модуля (напри­мер, В), а модуль В – из А. Поскольку по правилам языка каждый иденти­фикатор перед объявлением должен быть описан, то необходимо выполнить опережающее описание подпрограммы В. Для этого объявляется заголовок процедуры В, за которым следует служебные слово FORWARD. Теперь из процедуры А можно обращаться к процедуре В. Например:

PROCEDURE B(I:BYTE); FORWARD;

PROCEDURE A(J:BYTE);

BEGIN

. . .

B(J);

END;

PROCEDURE B(I:BYTE) ;   

BEGIN

 . . .

A(I);

 END;

Вложенные подпрограммы

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

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

Переменные, описанные в разделе описания основной программы, на­зываются глобальными. Область действия глобальных переменных - основ­ная программа и ее подпрограммы.

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

Все имена в пределах подпрограммы должны быть уникальными и не могут совпадать с именем самой подпрограммы. При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней име­на, но и сохраняется доступ ко всем именам внешних уровней.

Рекомендуется описывать имена в том блоке, где они используются, если это возможно. Если один и тот же объект (переменная или констан­та) используется в двух и более блоках, то их описание необходимо сде­лать в самом верхнем блоке, который содержит все остальные. Если переменная, используемая в подпрограмме должна сохранять свое значение до следующего вызова этой подпрограммы, то она описывается во внешнем блоке, содержащем данную подпрограмму.

Процедуры EXIT и HALT

Процедура EXIT; осуществляет выход из программного модуля - под­программы или основной программы. Из подпрограммы управление передает­ся этой процедурой в вызывающую программу к следующему за ее вызовом оператору. В программе EXIT приводит к завершению ее работы.

 Процедура HALT(Cod); прекращает выполнение программы, вызывает в случае необходимости подпрограмму завершения и осуществляет выход в операционную систему. Cod - необязательный параметр, определяющий код завершения программы.

7.10. Пример и задания с подпрограммой-процедурой

Пример. Ввести два массива A [1..3], B [1..4] с помощью процедуры "ввод". Вычислить средние арифметическое и геометрическое значения элементов каждого из них, используя подпрограмму-процедуру.

Для решения задачи pазpаботана СА (pис. 15), состоящая из ос­новной программы (а) и двух процедур: одной - для ввода элементов массива (б), другой – для определения средних арифметического и геометрического значений в массиве (в), а также написана пpогpамма для реализации алгоритма:

 Program lr7;

 type

mass = array[1..5] of integer;

 var 

   ka, kb: byte;

Sr, Sg: real;

a, b: mass;

PROCEDURE VVOD ( Var d: mass; Var k: byte ); {заголовок процедуры ввода}

Var

i: integer;

Begin                                                   {тело процедуры}

writeln(' введите число элементов');

read(k);

writeln(' введите массив из ', k,' элементов');

FOR i:=1 to k do read(d[i]);

 

end;                                                 {конец процедуры VVOD}

PROCEDURE SARR (k:byte; f:mass; var s,p:real);  {заголовок процедуры}

    var   

i: byte;

    begin

           s:=0 ;

           p:=1;                             

           for i:=1 to k do begin

                                          s := s+f [i]; p:=p*f[i]

                                    end ;

            s := s/k ;

             p := EXP(Ln(p)/k)

End ;                                 {конец тела процедуры SARR}

BEGIN                             {Блок основной программы}

VVOD(a,ka);             { ввод элементов массива А и его размера}

SARR(ka,a,Sr,Sg);   {вызов процедуры для обработки массива А}           

writeln( ‘ SrA= ’ , Sr:5:2 ,  ‘ SgA= ’ , Sg :5:2);                

VVOD(b,kb);

SARR(kb,b,Sr,Sg);       {вызов процедуры для обработки массива B}           

writeln( ‘ SrB= ’ , Sr :5:2,  ‘ SgB= ’ , Sg :5:2);                       

 END .

Задания для самостоятельного выполнения


Задание 1

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

Задание 2

1. Даны массивы A [1..6], B [1..6], C [1..6]. Получить A*B, B*С, A*C. Вычисление произведения массивов оформить процедурой.

2. Даны массивы A [1..5], B [1..6]. Получить новые массивы путем сдвига элементов в массиве А на один разряд, а в массиве В - на два разряда вправо, освободившиеся слева элементы обнулить. Сдвиг элементов в массиве оформить подпрограммой.

3. Даны два одномерных массива А [1..6] и C [1..6]. Получить A2, С2, А*С. Перемножение массивов выполнить в подпрограмме.

4. Даны две матрицы целых чисел S [1..3,0..2], K [1..3,0..2], в которых имеется по два одинаковых числа. Найти и распечатать их значение и индексы.

5. Вычислить значение функции Z = x1+ex2, где x1, x2 – корни уравнения Aix2+Bix + Ci = 0, i = 1,2,..,N. Коэффициенты уравнения заданы в массивах A [1..N], B [1..N], C [1..N]. Для вычисления корней использовать процедуру.

6. Составить процедуру для перемножения двух квадратных матриц, с помощью которой вычислить вторую, третью и четвертую степени матрицы M [1..5,1..5].

7. Даны массивы A [1..6], B [1..6], C [1..6]. Преобразовать их, каждому элементу массива присваивая значение соседнего с ним справа. Последнему элементу присвоить значение первого.

8. По заданным вещественным массивам A [1..6], B [1..6] и С [1..6] вычислить (minAi)/maxAi + (maxCi)/min(Ci) + max(B+C)i /min(B+C)i.

9. Даны массивы A [1..6], B [1..8]. Выбрать из них положительные элементы и записать соответственно в массивы A1 [1..k] и B1 [1..n], где k < 6, n < 8; из отрицательных элементов сформировать массивы A2 [1..6-k], B2 [1..8-n].

10. Даны массивы A [1..6], B [1..6], C [1..6]. Переставить элементы в них таким образом, чтобы слева подряд были записаны отрицательные, а справа положительные элементы.

11. Даны две целые квадратные матрицы четного порядка. Элементы массивов с четными номерами строки и столбца заменить нулем (стереть). Напечатать полученные массивы.

12. Даны одномерные массивы A [1..6], B [1..8], C [1..10]. Записать их в виде матриц AA [1..3,1..2], BB [1..2,2..4], CC [1..5,1..2].

13. Даны две целые квадратные матрицы шестого порядка. Распечатать элементы главных диагоналей каждой из них и определить симметричность каждой матрицы относительно главной диагонали.

14. По заданным 10 элементам вещественных массивов A, B и С вычислить

 

15. Даны две матрицы целых чисел V (-1..2,0..3) W [1..3,0..2]. Сформировать из них одномерные массивы VV и WW, записывая элементы построчно.

16. Дана матрица чисел H [1..5,1..6]. Переставить столбцы матрицы таким образом, чтобы элементы первой строки матрицы были расположены в порядке возрастания их модулей. Перестановку двух столбцов матрицы реализовать процедурой.

17. Дана матрица чисел G [1..4,1..6]. Переставить элементы в матрице так, чтобы элементы каждого столбца матрицы были расположены в порядке возрастания их модулей. Перестановку элементов в столбце реализовать процедурой.

18. Даны массивы A [1..6], B [1..6], C [1..6]. Упорядочить элементы в них в порядке убывания их модулей.

19. Даны две матрицы целых чисел V [1..2,1..3], W [1..3,1..2]. Найти общие суммы элементов строк и столбцов, результаты сформировать в виде двух массивов.

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

 

ОБРАБОТКА СИМВОЛЬНЫХ ДАННЫХ

Символьный тип

Символьный тип - это тип данных, состоящих из одного символа (знака, буквы, цифры). Традиционная запись символьного значения предс­тавляет собой символ, заключенный в апострофы ('ж'). В Pascal ABC имеются аль­тернативные способы представления символов [1]. Значениями символьного типа является множество всех символов компьютера. Каждому символу приписывается целое число в диапазоне 0..255, которое служит кодом его внутреннего представления. Связь между символом и кодом устанавливается функцией ORD:

<Код > = ORD ( <символ> ) .

Переменные символьного типа объявляются в блоке VAR ключе­вым словом CHAR.                                                                                                            Пример .

                   VAR   

C1, C2, C3: CHAR;                                              

BEGIN                                                                                       C1 := 'A' ; C2 := 'B' ; C3 := chr(43);                                                                 

                END.

Для кодирования символов используется код ASCII (AMERICAN STAN­DART CODE FOR INFORMATION INTERCHANGE - Американский стандартный код для обмена информацией). Код ASCII имеет 7 бит, которые поз­воляют кодировать в стандарте основные 128 символов, включающие латинские пpописные и стpочные буквы, цифpы, pазделители и pяд служебных символов
(с кодами 0..31). Служебные символы в тексте считаются пробельными и в операциях ввода-вывода имеют самостоятельное значение (табл. 7).

В Pascal ABC применяется восьмибитовый код, содержащий 256 символов. Ко­дировка символов с номерами [128..255] зависит от типа ПК и включает буквы русского алфавита, а также графические символы [3–5].

К символам типа char применимы операции присваивания и все операции логических отношений: <, >, <=, >=, =, <>.

Примеры  'A' = 'A' (TRUE);

 'A' <> 'a' (TRUE);

 'A' < 'a' (TRUE);

 Таблица 7

Служебные символы

Символ Код Назначение
BEL HT LT VT FF CR SUB ESC 7 9 10 11 12 13 26 27 Звонок Табуляция горизонтальная Перевод строки с сохранением текущей позиции Табуляция вертикальная Прогон страницы Возврат каретки Конец файла Конец работы

 

Символьный тип имеет следующие встроенные функции:

ORD(С ) - возвращает код типа byte для символа С:char;

CHR( b) - возвращает символ по коду аргумента b:byte;

UPCASE( c ) - переводит в верхний регистр только букву латинс­кого алфавита, оставляя любой другой символ без изменения, и возвращает символ c :char;

PRED(C) - возвращает символ, предшествующий С:char в таблице ко­дов;

SUCC(C) - возвращает символ, следующий за С:char в таблице кодов.

Пример. Напечатать прописными только латинские буквы из двух заданных. Зададим буквы константами и применим функцию UpCase:

Var   

     c1, c2:char;

Begin

     c1:= UPCASE( 'f' );

     c2:= UPCASE( 'ф' );

     writeln(c1, ' ' , c2, #7 )          {строка вывода: F ф }

End.                                       {Вывод сопровождается звуковым сигналом}

Символы также можно описывать указанием в функции CHR кода симво­ла или с признаком # перед кодом. Например, считаются эквивалентными следующие записи:

'A' à CHR(65) à #65.


Задания для символьных данных

1. Дана строка из 20 символов. Вывести из нее на печать только строчные буквы латинского алфавита.

2. Вывести на печать все строчные, а затем все прописные буквы русского и латинского алфавитов.

3. В заданной строке подсчитать частоту появления букв «a», «b».

4. Дан текст из 60 литер. Напечатать только строчные русские буквы, входящие в этот текст.

5. Дана последовательность символов, содержащая символ «я». Определить порядковый номер символа «я» в последовательности.

6. Дана последовательность символов. Определить в ней символ, который по алфавиту предшествует другим.

7. Напечатать в алфавитном порядке все различные строчные буквы, входящие в заданный текст из 100 литер.

8. Определить, является ли заданная последовательность символов в строке симметричной: читается одинаково слева направо и справа налево.

9. Напечатать текст, образованный символами с порядковыми номерами 56, 89, 84 и 69, и текст с изменением регистра.

10. Даны две строки с1 и с2, содержащие до 5 цифр каждая. Преобразовать их к данным целого типа, используя процедуру VAL, вычислить арифметическое выражение с3 = (с1-с2)/(с1+с2).

11. Вычислить суммы кодов всех букв, входящих в слова SUM и ALFA. Сравнить слова и определить, какое из них больше.

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

13. Имеется символьная переменная d, присвоить логической переменной T значение true, если значение d – цифра, и значение false в противном случае.

14. Если в заданный текст входит каждая из букв слова key, тогда напечатать «yes» , иначе – «no».

15. Написать программу, которая предварительно запрашивает ваше имя, а затем приветствует вас по имени.

16. Ввести вещественное число, преобразовать его в строку. Подсчитать количество разрядов в целой и дробной частях. Найти представление числа в виде мантиссы (по модулю меньшее единицы) и порядка.

17. Ввести строку, состоящую из нулей, единиц и десятичной точки. Преобразовать ее в десятичное число.

ОБРАБОТКА СТРОК ТЕКСТА

Строковый тип

Строковый тип (String) используется для обработки текстовой информации. Строка-константа - это произвольная последовательность символов, заключённая в апострофы. Отдельный символ совместим по типу с элементом типа CHAR.

Для обработки текстовой ин­формации используется тип динамических строк. Строка представляет собой цепочку символов. В программе строковая переменная может быть описана в блоках Type или Var. Напри­мер:

CONST N=16;                           {N£255}

TYPE stroka: string[100];

VAR st: string;       {строка может содержать не более 255 символов}

str: string[10];      {строка может содержать не более 10 символов}                             st1: string[N];                {строка может содержать не более N =16 символов} st2: stroka;                     {строка может содержать не более 100 символов}

Максимальная длина строки - 255 символов. Строка имеет структуру, подобную одномерному массиву. Поэтому строка st1 трактуется как

st1: array[0..N] of char.

Отличие между строкой типа string и массивом состоит в том, что строка имеет переменную длину (количество символов) и нулевой элемент строки st[0] содержит информацию о длине строки. Длина строки может быть изменена путем заполнения строки новым элементом или путем изме­нения ее нулевого элемента. Текущая длина строки может быть определена значением ORD(st[0]).

Строки можно присваивать и сравнивать. Операции отношения >, <, =, >=, <=, <> для строк выполняются посимвольно слева направо с учетом внутренней кодировки символов. Строки считаются одинаковыми, если они имеют одинаковую дли­ну и одинаковые символы. Например:

'abcd' = ‘abcd'

'abcd' <> 'abcde'

'abcd' > ' abc'

'abcd' < ' ABC'.

К строкам применима операция сцепления (+) или конкатенации, например:

st := 'AB' + 'BC';

st := st + 'CD';           {st содержит 'ABBCCD'}

Если количество символов превышает максимально допустимую длину, то "лишние" символы справа отбрасываются.

Отдельный элемент строки совместим с типом char.

Пример :

Var

stt: string[2]; c: char;

Begin

stt := '123'; c := 'a';

writeln(stt);             {stt = '12' , излишек отсекается }

stt[2] := c ;                    {stt = '1a' }

End.

Дата: 2019-02-02, просмотров: 291.