Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Структура подпрограммы-процедуры
Структура подпрограммы-процедуры с параметрами имеет вид 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 STANDART CODE FOR INFORMATION INTERCHANGE - Американский стандартный код для обмена информацией). Код ASCII имеет 7 бит, которые позволяют кодировать в стандарте основные 128 символов, включающие латинские пpописные и стpочные буквы, цифpы, pазделители и pяд служебных символов В Pascal ABC применяется восьмибитовый код, содержащий 256 символов. Кодировка символов с номерами [128..255] зависит от типа ПК и включает буквы русского алфавита, а также графические символы [3–5]. К символам типа char применимы операции присваивания и все операции логических отношений: <, >, < =, > =, =, < >. Примеры 'A' = 'A' (TRUE); 'A' < > 'a' (TRUE); 'A' < 'a' (TRUE); Таблица 7 Служебные символы
Символьный тип имеет следующие встроенные функции: 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; Нарушение авторского права страницы