Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



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

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 Звонок Табуляция горизонтальная Перевод строки с сохранением текущей позиции Табуляция вертикальная Прогон страницы Возврат каретки Конец файла Конец работы

 

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

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.


Поделиться:



Последнее изменение этой страницы: 2017-03-16; Просмотров: 675; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.08 с.)
Главная | Случайная страница | Обратная связь