Главная страница

Учебное пособие Омск Издательство Омгту 2010 удк 004. 4 (075) ббк 32. 973018я73 ч 49 Рецензенты


Скачать 1.07 Mb.
НазваниеУчебное пособие Омск Издательство Омгту 2010 удк 004. 4 (075) ббк 32. 973018я73 ч 49 Рецензенты
АнкорABC_Pascal.doc
Дата15.02.2017
Размер1.07 Mb.
Формат файлаdoc
Имя файлаABC_Pascal.doc
ТипУчебное пособие
#2721
страница5 из 8
1   2   3   4   5   6   7   8

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. Теперь из процедуры А можно обращаться к процедуре В. Например:
1   2   3   4   5   6   7   8


написать администратору сайта