Учебное пособие Омск Издательство Омгту 2010 удк 004. 4 (075) ббк 32. 973018я73 ч 49 Рецензенты
Скачать 1.07 Mb.
|
LABEL 1, 400, M1, EPS;Если метка описана в этом блоке, но в программе не встретилась, то выдается сообщение об ошибке. Метки не должны повторяться. Блок меток может находиться в любом месте, их может быть несколько, но все метки должны быть определены до начала основной программы. При отсутствии меток блок исключается. Блок CONST описывает константы двух видов: CONST <имя1> = <константа1>; <имя2> = <константа2>; . . . или CONST <имяК>: <тип> = <константаK>; <имяR>: <тип> = <константаR>; . . . Например: CONST NI = 100; f = -NI; d: real = 7.65432; Блок TYPE содержит определения вводимых программистом нестандартных типов в следующих формах: TYPE <идентификатор> = (<список_компонентов>); или TYPE <идентификатор> = <описание_типа>; Пример: TYPE FAMILY = (FATHER, MOTHER); Когда в Паскале используются только стандартные типы (например: INTEGER, REAL), этот блок опускается. Блок VAR описывает имена переменных, а также имена массивов: VAR A1, A2, ..., An: <тип1>; B1, B2, ..., Bn: <типК>; ... <имя массива>: ARRAY[диапазон] OF <тип>; где буквами Ai, Bj указаны имена переменных, а <тип1>, <типК> – типы соответствующих переменных, [диапазон] указывает начальное и конечное значения индексов массива, <тип> задает тип элементов массива. Пример: VAR A, B, C: INTEGER; {объявлены три переменные целого типа} D, M: REAL; {объявлены две вещественные переменные} MASS1: ARRAY[1..10] OF REAL; {массив из 10 чисел} MASS2: ARRAY[-2..2] OF CHAR; {массив из пяти символов} В качестве значений диапазона могут использоваться идентификаторы любого порядкового типа, если их значения определены выше в разделе CONST. 7.2. Подпрограммы. Процедуры и функции Относительно самостоятельные фрагменты программы, оформленные определенным образом и снабженные заголовком, называются подпрограммами. С помощью подпрограмм любая программа может быть разбита на ряд формально независимых друг от друга частей. Подпрограммы делятся на два вида: процедуры и функции. Результатом исполнения операторов, образующих тело функции, всегда является единственное значение, поэтому ее имя может быть использовано в выражениях наряду с переменными и константами. Если в программе используются процедуры или функции, то их описание должно предшествовать основному блоку программы. Описание состоит из заголовка и тела процедуры (функции), которое обычно следует за заголовком. Заголовок процедуры с параметрами описывается строкой PROCEDURE <имя> (<список формальных параметров> ); Список формальных параметров записывается в скобках и содержит перечень параметров с указанием их типов. Перед выходными параметрами, которые возвращают результат в основную программу, указывается ключевое слово VAR, например: PROCEDURE SUMMA(A1,A2:REAL; B1,B2:INTEGER; VAR S1,S2:REAL); Допускаются также процедуры без параметров: PROCEDURE <имя >; Они предполагают использование в подпрограмме только глобальных переменных, определенных в разделе описаний основной программы. За заголовком процедуры следует раздел описаний подпрограммы (меток, констант, типов, переменных, а также описаний вложенных процедур и функций) и блок операторов. Структура описания заголовка подпрограммы-функции имеет вид: FUNCTION <имя> (<список формальных параметров> ): <тип>; Формальные параметры записываются с указанием их типа, кроме того, указывается тип самой функции. За заголовком функции следует раздел описаний и блок выполняемых операторов. Пример FUNCTION STEP(x, y : REAL) : REAL; VAR a, b : real; BEGIN ... ... END; После описания блока процедуры или функции следует оператор END, за которым ставится точка с запятой. Отличие функции от процедуры состоит в том, что функция может возвращать одно значение в основную программу через свое имя, а процедура возвращает несколько значений через список параметров. Поэтому в разделе операторов функции должен быть оператор, который имени функции присваивает значение вида <имя функции> := <выражение>; например: STEP := <выражение вещественного типа>. Вызов подпрограмм производится указанием имени или имени со списком фактических параметров. Фактические параметры не указываются, если в подпрограмме используются только глобальные переменные и в заголовке программы отсутствует список формальных параметров. Если заголовок подпрограммы содержит формальные параметры, то при обращении к подпрограмме должен обязательно присутствовать список фактических параметров, которые записываются через запятую. Количество, тип и порядок перечисления фактических параметров должен обязательно соответствовать количеству, типу и порядку перечисления формальных параметров в описании подпрограммы. 7.3. Структура подпрограммы-функции Описание блока подпрограммы-функции в общем виде имеет следующую структуру: FUNCTION <имя> ( <формальные параметры> ) : <тип>; { раздел описаний: переменные, типы, метки} BEGIN { операторы функции } <имя> := <выражение> {имени функции присваивается значение} END; Функция передает в вызывающую программу единственное значение, которое хранится под ее именем. В качестве переменных могут использоваться параметры-переменные и параметры-значения. <Тип> функции должен соответствовать значению, которое вычисляется в данной подпрограмме (типу результата). В вызывающую подпрограмму передается значение функции данного типа. Вызов функции в программе производится не обособленно, как в процедуре, а в выражении указывается имя функции со списком параметров. 7.4. Примеры и задания с подпрограммой-функцией Пример 1. Вычислить вторую и N-ю степени числа Х. PROGRAM FUNC; VAR X: REAL; N: INTEGER; FUNCTION STEPEN(M: INTEGER; A: REAL): REAL; VAR P: REAL; I: INTEGER; BEGIN P := 1; FOR I :=1 TO M DO P := P*A; STEPEN := P; END; BEGIN READ(X,N); WRITELN(' X=', X, ' квадрат', STEPEN(2,X)); WRITELN(' X=', X, ' степень', STEPEN(N,X)); END. Пример 2. Даны три массива A (5), B (5), C (5). Найти среднее арифметическое значение наименьших элементов массивов. До написания программы разрабатывается СА главной программы (рис. 14, а) и СА для подпрограммы нахождения наименьшего элемента в любом массиве (рис. 14, б). Отлаженная программа решения задачи имеет следующий вид: Program lr8; type mass = array[1..5] of integer; const a: mass = ( 5,2,7,1,8 ); {заданы массивы констант} b: mass = ( 3,4,5,6,6 ); c: mass = ( 3,8,5,2,6 ); var n: integer; sr: real; FUNCTION minim(d:mass) : integer; {заголовок функции} var i, min: integer; begin {начало блока операторов функции} min:=d[1]; for i:=2 to 5 do if d[i] writeln('минимальный элемент равен ',min); minim := min {имени функции присваивается значение} end; {конец блока функции} BEGIN {блок основной программы} sr: = (minim(a) + minim(b) + minim(c)) /3; {три обращения к функции} writeln(' sr = ', sr:5:2); END. Рис. 14 Задания для самостоятельного выполнения Задание 1 Написать и отладить программы для задач из пп. 3.7 и 6.4 с применением подпрограммы-функции с параметрами. Вычисление функции (или обработку массива) выполнить в подпрограмме, а ввод исходных данных и вывод результатов в основной программе. Предусмотреть, по крайней мере, два обращения к функции с различными фактическими параметрами. Для отладки программ использовать средства системы Pascal ABC: пошаговое исполнение программы (трассировку) с контролем значений переменных в окне отладчика. Задание 2 1. По заданным вещественным массивам A [1..6], B [1..6] и C [1..6] вычислить (max B)/max A + (max C)/max(B+C) при min A < max B, max(B+C) + max C в противном случае. 2. Даны два двумерных массива целых чисел А [1…5], B [1…5]. Напечатать квадрат того из них, в котором наименьший след (сумма диагональных элементов), считая, что такой массив один. 3. Определить координаты центра тяжести трех материальных точек с массами m1, m2, m3 и координатами (x1,y1), (x2,y2), (x3,y3) по формулам xc = (m1x1+m2x2+m3x3)/(m1+m2+m3), yc = (m1y1+m2y2+m3y3)/(m1+m2+m3). Вычисление координаты оформить функцией с параметрами. 4. Вычислить все медианы для каждого из трех треугольников по заданным в массивах A, B, C сторонам: ma = 0.5, mb = 0.5, mc = 0.5. Вычисление медианы оформить функцией. 5. Даны три одномерных массива вещественных чисел A [1..6], B [1..8] и С [1..7]. Найти общую сумму положительных элементов в массивах. Нахождение суммы элементов в массиве оформить функцией. 6. Даны два двумерных массива целых чисел с размерами (4х5) элементов. Подсчитать количество отрицательных элементов в каждом из них. 7. Даны два одномерных массива целых чисел A [1..8] и B [1..8]. Найти сумму их максимальных элементов. Для нахождения максимального элемента в массиве использовать функцию. 8. Даны два двумерных массива целых чисел по (5х5) элементов каждый. Подсчитать произведение элементов главных диагоналей в каждом из них. 9. Даны три одномерных массива вещественных чисел A [1..6], B [1..8] и С [1..7]. Найти среднее геометрическое значение положительных элементов для каждого. 10. Даны две матрицы целых чисел M [1..3,0..1], К [1..3,0..2]. Найти среднее арифметическое значение для каждой из них. 11. Даны три одномерных массива целых чисел A [1..6], B [1..8] и С [1..7]. Подсчитать количество неотрицательных элементов в каждом. 12. Даны две матрицы целых чисел S [1..3,0..2], К [1..3,0..2], в каждой из которых имеется по два одинаковых числа. Распечатать их значения. 13. Даны два одномерных массива целых чисел A [1..6] и B [1..8]. Вычислить значение Z = (min A[i] + min B[j]) / min (A[i]+B[j]). i j i, j 14. По заданным целым массивам X[0..7] и Y[8..15] вычислить xi2 при xi yi+8 > 0, yi2 в противном случае. 15. Дана матрица целых чисел D [1..6,1..5]. Найти наименьшую из сумм неотрицательных элементов строк матрицы. Для вычисления суммы использовать подпрограмму (функцию). 16. Дана матрица целых чисел E [1..3,1..5]. Используя функцию, найти среднее геометрическое значение для каждого столбца матрицы. 17. Дана матрица целых чисел F [1..4,1..5]. Найти наименьшие значения элементов в каждой из строк матрицы с помощью функции. 18. Даны две квадратные вещественные матрицы шестого порядка. Напечатать квадрат той из них, в которой наименьший след (сумма диагональных элементов), считая, что такая матрица одна. 19. Сформировать двумерный массив: 1 2 3 4 5 1 4 9 16 25 1 8 27 64 125 ... … Найти правило и оформить функцией вычисление любой строки. 20. Даны две матрицы целых чисел V [1..2,1..3], W [1..3,1..2]. Найти суммы элементов строк и столбцов в этих матрицах. 7.5. Структура подпрограммы-процедуры Структура подпрограммы-процедуры с параметрами имеет вид 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 параметры-переменные. Передачу результатов можно проводить и через глобальные переменные. Однако злоупотребление глобальными переменными делает программу запутанной и сложной в отладке. В связи с этим рекомендуется там, где это возможно передавать результаты с помощью параметров-переменных. С другой стороны, нежелательно описание всех формальных параметров параметрами-переменными. Чем меньше параметров объявлено параметрами-переменными и чем меньше используется глобальных переменных, тем меньше возможность получения непредвиденных программистом побочных эффектов в программе. При наличии одноименных переменных в программе и подпрограмме в подпрограмме будут доступны только локальные переменные. 7.6. Передача в подпрограмму массивов и строк Передача одиночных элементов массивов при вызове подпрограммы не отличается от передачи в неё простых переменных. При передаче всего массива рекомендуется предварительно определить его тип, поскольку он не является стандартным. Например: 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; 7.7. Рекурсия в программе Рекурсия это способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения своих операторов обращается сама к себе. Пример. Пусть задано целое положительное число, выведите на экран дисплея цифры числа в обратном порядке. 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. Теперь из процедуры А можно обращаться к процедуре В. Например: |