Скачиваний:
51
Добавлен:
02.05.2014
Размер:
356.2 Кб
Скачать

Лабораторная работа №

Реализация программ, использующих процедуры и функции пользователя

1. Цель работы

В процессе выполнения лабораторной работы студент должен приобрести навыки по подготовке, редактированию, компиляции и выполнению Pascalпрограмм, использующих процедуры Procedure и функции Function пользователя:

-разработать алгоритм поставленной задачи (блок-схема);

-составить и отредактировать программу на языке Pascal;

-выполнить программу и обработать полученные результаты.

2. Краткие сведения из теории

2.1 Глобальные, локальные блоки и объекты

Как известно, синтаксически Pascal программа состоит из необязательного заголовка и блока. Блоки могут быть: глобальные и локальные.

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

2.2 Понятие процедур и функций

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

-сократить объем и улучшить структуру программы;

-уменьшить вероятность ошибок и облегчить процесс отладки программы;

-дает возможность выполнить разработку программы разным программистам.

2.3 Описание процедур и функций

На языке Pascal процедуры и функции записываются зарезервированными словами Procedure и Function соответственно. Описание процедур и функций осуществляется в разделе описаний данных.

Описание процедуры

Procedure <идентификатор процедуры>[<(список формальных параметров с объявлением типа)>]; [<раздел описаний>] {локальные данные}

begin {начало локального блока}

1

<раздел операторов>

end; {конец локального блока} Допускается описание процедур без параметров.

Описание функции

Function <идентификатор функции>[<(список формальных параметров с объявлением типа)>]: <тип функции-результата>; [<раздел описаний>] {локальные данные}

begin {начало локального блока} <раздел операторов>

end; {конец локального блока}

В разделе операторов должен находиться оператор присваивания: <идентификатор функции> : = <значение-ответ>;

2.4 Вызов процедур и функций

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

<идентификатор процедуры>[<(список фактических параметров)>]; Вызов функции осуществляется по имени функции аналогично обращению,

например к математической функции sin x: x:= 0.5;

a:=sin (x);

или

а:=sin (0.5);

Вызов sin x осуществляется оператором присваивания.

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

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

2.5 Формальные параметры процедур и функций

Формальные параметры могут быть заданы как:

-параметры-значения (передача параметров по значению);

-параметры-переменные (передача параметров по ссылке);

Передача параметров по значению обеспечивает сохранность величины передаваемого параметра. Изменение их в процедуре никак не отразится на фактических параметрах.

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

Var.

2

{глобальное описание данных}

3 Примеры Pascal-программ использующих процедуры и функции

3.1 Постановка задачи 1

При известных значениях a, b, c и натуральных n, m вычислить значения функции:

y = a n +b m+1

c10

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

3.1.2 Программы

а) программа с процедурой Procedure program prog1;

var a, b, c, y, y1, y2, y3:real; n, m: byte;

procedure step (x:real; n:byte; var y:real); {процедура вычисления y = x n ;

x, n – параметры значения; y – параметр переменная} var i:byte; {локальное описание данных}

begin {начало локального блока}

y:=1;

for i:=1 to n do; y:=y*x;

end; {конец локального блока}

begin {начало глобального блока}

writeln (‘введите исходные данные a, b, c, n, m’); readln (a, b, c, n, m);

step (a, n, y1); {1-е обращение к процедуре Step} step (b, m+1, y2); {2-е обращение к процедуре Step} step (c, 10, y3); {3-е обращение к процедуре Step}

y:= (y1+y2)/y3; writeln (‘y=’, y);

end. {конец глобального блока}

б) программа с процедурой Function program prog2;

var a, b, c, y, y1, y2, y3:real;

n, m: byte; {глобальное описание данных}

function step (x:real; n:byte; var y:real); {процедура вычисления y = x n ;

x, n – параметры значения; y – параметр переменная} var p:real, i:byte; {локальное описание данных}

begin p:=1;

for i:=1 to n do; p:=p*x;

3

step:=p; {имени функции присваивается значение результата} end; {конец локального блока}

begin {начало глобального блока}

writeln (‘введите исходные данные a, b, c, n, m’); readln (a, b, c, n, m);

y:=(step(a,n)+step(b,m+1))/step(c, 10); writeln (‘y=’, y);

end.

3.2 Постановка задачи 2

При известных значениях a, b, t, r вычислить значение функции:

 

(a

2

+b

2

 

2

 

 

 

r

2

 

y =

 

 

)

 

4

+

 

 

 

 

 

 

 

 

2

 

 

1

+

(1t)

×

25

 

 

 

 

 

 

 

3.2.1 Программа program prog3;

var a, b, t, r, y:real; n, m: byte;

function kv (c, d:real):real; begin

kv:=sqr(c)+sqr(d); {kv:=c*c+d*d:} end;

begin {начало глобального блока}

writeln (‘введите исходные данные a, b, t, r’); readln (a, b, t, r);

y:=sqr(kv(a, b))*kv(2, r/5)/kv(1, 1-t); writeln (‘y=’, y:12:5);

end.

3.3 Постановка задачи 3

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

4

3.3.1

Укрупненная блок схема

 

 

 

 

пуск

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Использование процедур и

 

 

 

 

 

 

 

 

 

 

 

функций пользователя

 

 

 

 

Ввод n, m, h

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Задание исходных данных

 

 

 

 

да

нет

 

 

 

 

для 1-ой матрицы

 

InMatr1

 

 

 

InMatr2

 

 

 

 

 

 

h = ‘1’

 

 

 

 

 

(A, n, m)

 

 

 

 

 

 

(A, n, m)

 

 

 

 

 

 

 

Ввод n, m, h

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Задание исходных данных

 

 

 

 

да

 

нет

 

 

 

 

 

 

для 2-ой матрицы

 

InMatr1

 

 

 

 

 

InMatr2

 

 

 

 

 

 

h = ‘1’

 

 

 

 

 

(B, k, l)

 

 

 

 

 

 

 

(B, k, l)

 

 

 

 

 

 

 

 

 

 

 

 

 

Вычисление среднего арифметического

 

 

 

 

 

 

 

 

 

 

 

Ar двух исходных матриц; Sum – вызов

 

 

 

 

 

 

 

 

 

 

 

функции суммирования положительных

 

 

 

Ar=(Sum(A,n,m)+Sum(B,k,l))/2

 

 

элементов матрицы

 

 

 

 

 

 

 

 

 

 

Формирование результирующей матрицы С

 

 

 

 

 

 

 

 

 

 

NewMatr(A,n,m,C)

Вывод матрицы С

Print(C,n,m)

Формирование результирующей матрицы D

NewMatr(B,k,l,D)

Вывод матрицы D

Print(D,k,l)

конец

Рис. 1

5

{Описание локальных переменных} {Формирование случайной матрицы и ее вывод на экран}

3.3.2 Программа

Program prog4; Uses Crt;

Type TArray=Array[1..10,1..10] of Real;

Var A, B, C, D : TArray; n,m,k,l : Byte; h : Char; Ar : Real;

{описание глобальных переменных; А, В – сформированные исходные матрицы; C,D – результирующие матрицы; n, m – число строк, столбов матрицы А; k, e – числов строк, столбцов матрицы В; h – признак задания исходных матриц; Ar - среднее арифметческое}

Procedure InMatr1(Var x:TArray; row,col:Byte);

{процедура формирования матрицы вводом ее элементов с клавиатуры, х, row, col - формальные параметры; x- параметр-переменная; row, col - параметры-значение}

Var d,i,j:Byte; S,y : String; {Описание локальных переменных}

Begin

{Формирование матрицы вводом ее элементов с клавиатуры}

For i:=1 To row Do

Begin

y:=' ';

d:=WhereY;

 

GotoXY(1,d);

For j:=1 To col Do

Begin

 

Readln(x[i,j]);

{Считываем элемент с клавиатуры}

 

Str(x[i,j]:6:1,S);

{Переводим его в строку S}

 

y:=y+S;

{Сцепляем строку y со строкой S}

та}

GotoXY(Length(y),d); {Перемещаем курсор в позицию ввода очередного элемен-

End;

 

 

 

Writeln;

 

 

End;

 

End;

{--------------------------------------------}

Procedure InMatr2(Var x:TArray; row,col:Byte); {процедура формирования

случайной матрицы и вывод ее элементов на экран}

Var i,j:Byte; Begin Randomize;

For i:=1 to row do Begin For j:=1 to col do Begin

X[i,j]:=Random*50-25; {x[i,j] формируется случайно}

{При формировании матрицы по правилу sin(i+j/2) необходимо записать оператор присваи-

вания x[i,j]:=sin(i+j/2)}

Write(x[i,j]:7:2,'

');

{X[i,j] выводится на экран}

End;

 

 

Writeln;

 

 

End;

 

 

End;

{

--------------------------------------------}

Function Sum(x:TArray; row,col:Byte):Real; {функция нахождения суммы

 

положительных элементов матрицы}

Var S :Real; i,j:Byte; {Описание локальных переменных}

Begin

{Нахождение суммы положительных элементов матрицы}

S:=0;

 

6

For i:=1 to row do

For j:=1 to col do

If

x[i,j]>0

Then S:=S+X[i,j];

Sum:=S;

 

 

End;

 

{--------------------------------------------}

Procedure NewMatr(x:TArray; row,col:Byte; Var y:TArray);

{процедура формирования результирующей матрицы по заданному алгоритму}

Var i,j:Byte; MMax:real;

{Описание локальных переменных}

Function Max(x:TArray; row,col:Byte):Real; {функция нахождения

Var M :Real; i,j:Byte;

максимального элемента матрицы}

{Описание локальных переменных}

Begin

{Нахождение максимального элемента матрицы}

M:=x[1,1];

 

 

For i:=1 to row do

 

For j:=1 to col do IF x[i,j] > M Then M:=X[i,j];

Max:=M;

 

 

End;

 

 

 

Begin

{Формирование новой матрицы по заданному алгоритму}

MMax:=Max(x,row,col);

 

For i:=1 to row do

For j:=1 to col doy[i,j]:=x[i,j]/MMax;

End;

{--------------------------------------------}

Procedure Print(x:TArray; row,col:Byte); {процедура вывода элементов

Var i,j:Byte;

 

 

результирующей матрицы на экран}

 

{Описание локальных переменных}

Begin

{Вывод матрицы на экран}

 

For i:=1 to row do

Begin

 

For j:=1 to col do Begin

 

Write(x[i,j]:7:2,' ');

 

 

Writeln;

End;

 

 

End;

 

 

End;

 

 

 

 

 

BEGIN

{глобальный блок – основная программа}

Write('Введите число строк и столбцов матрицы А (не более 10) '); Readln(n,m);

Writeln('Выберите способ формирования элементов матрицы A'); Write('1 -> ввод с клавиатуры; 2 или любое другое число -> случайный процесс : ');

Readln(h); {вызов процедуры InMatr1 (A, n, m)}

IF h='1' Then InMatr1(A,n,m) Else InMatr2(A,n,m); {вызов процедуры

InMatr2 (A, n, m)}

Write('Введите число строк и столбцов матрицы B (не более 10) '); Readln(k,l);

Writeln('Выберите способ формирования элементов матрицы B'); Write('1 -> ввод с клавиатуры; 2 или любое другое число -> случайный процесс : ');

7

 

Readln(h); {вызов процедуры InMatr1 (B, k, l)}

IF

h='1' Then InMatr1(B,k,l)

Else InMatr2(B,k,l); {вызов процедуры InMatr2

 

 

(B, k, l)}

 

Ar:=(Sum(A,n,m)+Sum(B,k,l))/2; {вызов функции Sum (A, n, m), Sum (B, k, l) }

Writeln('Среднее арифметическое = ',Ar:8:3);

{можно вместо предыдущих операторов записать один оператор Writeln ('Среднее арифметическое = ', Sum (A, n, m)+ Sum (B, k, l))/2;}

NewMatr(A,n,m,C); {вызов процедуры InMatr1 (A, n, m)} Writeln('******* Вывод матрицы С ******');

Print(C,n,m); {вызов процедуры Print (C, n, m)} NewMatr(B,k,l,D); {вызов процедуры InMatr1 (B, k, l, D)}

Writeln('******* Вывод матрицы D ******');

Print(D,k,l); {вызов процедуры Print (D, k, l)}

Readkey; DoneWinCrt; End.

3.3.3 Результат

Рисунок после запуска программы из BorlandPascal для DOS.

Рис. 2

8

3.3.4 Варианты заданий

1.Сформировать две квадратные матрицы (двухмерных массива) {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l), вводом элементов с клавиатуры. Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать функцию, определяющую сумму элементов строк матрицы, если на главной диагонали матрицы располагается отрицательный элемент. Вывести на экран матрицы, сумму матриц и максимальную из них.

2.Сформировать матрицы (двухмерный массив) {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l) , элементы которых определяются случайно из диапазона вещественных чисел от 0 до 1. Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать процедуру, определяющую одномерный массив (вектор), состоящий из сумм каждого столбца матрицы. Причем суммируются элементы 0 a ij 0.5 . Вывести на экран исходные и результирующие массивы.

3.Сформировать матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l), по заданным правилам: (i+j)/2, (i*j)/ 27 . Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы, а также признак выбора заданного правила вводить с клавиатуры. Создать процедуру, определяющую одномерный массив (вектор), состоящий из сумм каждой строки матрицы с четными номерами. Вывести на экран исходные и результирующие массивы.

4.Сформировать матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l), по заданному правилу sin(i+j/2). Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать функцию, определяющую сумму первой строки и последнего столбца матрицы. Вывести на экран исходные массивы и среднее значение сумм.

5.Сформировать две квадратные матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l), вводом элементов с клавиатуры. Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать функцию, определяющую произведение элементов столбцов матрицы, если на главной диагонали матрицы располагается не нулевой элемент. Вывести на экран матрицы, произведение матриц и среднее произведение.

6.Сформировать матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l) , элементы которых определяются случайно из диапазона целых чисел от -3 до 3. Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать процедуру, которая присваивает нулевым элементам матрицы единицы и определяет произведение матрицы. Вывести на экран исходные, результирующие массивы и сумму произведений матриц.

7.Сформировать две квадратные матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l), вводом элементов с клавиатуры. Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать функцию, определяющую сумму элементов строки матрицы, имеющей первый ми-

9

нимальный элемент. Вывести на экран матрицы, сумму матриц и максимальную из них.

8.Сформировать матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l) , элементы которых определяются случайно из диапазона целых чисел от -3 до 3. Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать процедуру, которая определяет последний минимальный элемент в трех средних строках матрицы. Заменить в матрице этот элемент нулем. Вывести на экран: исходные, результирующие массивы.

9.Сформировать матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l) по заданным правилам: sin((i+j)/2), cos(5j-2i). Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы, а также признак выбора заданного правила вводить с клавиатуры. Создать процедуру, заменяющую все отрицательные элементы матрицы на положительные элементы. Вывести на экран исходные и результирующие матрицы.

10.Сформировать две квадратные матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l), вводом элементов с клавиатуры. Фактическое число строк (n,k) и

столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать процедуру, которая заменяет нулевые диагональные элементы единицами. Вывести на экран исходные и результирующие матрицы.

11.Сформировать матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l) , элементы которых определяются случайно из диапазона целых чисел от -3 до 3.

Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать процедуру, которая определяет все максимальные по модулю элементы, если их несколько, в трех последних столбца матрицы и заменяет их суммой элементов соответствующего столбца. Вывести на экран исходные и результирующие массивы.

12.Сформировать квадратные матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l), по заданным правилам: sin(i/5+j), cos(2i+3/2j). Фактическое число строк

(n,k) и столбцов (m,l) каждой матрицы, а также признак выбора заданного правила вводить с клавиатуры. Создать процедуру, заменяющую все положительные элементы, лежащие выше главной диагонали, исходной матрицы нулями. Вывести на экран исходные и результирующие матрицы.

13.Сформировать две квадратные матрицы {aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l), вводом элементов с клавиатуры. Фактическое число строк (n,k) и

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

14.Сформировать матрицы{aij}n,m , {bij}k,l , где i<=(n,k), j<=(m,l) , элементы которых определяются случайно из диапазона целых чисел от -100 до

100. Фактическое число строк (n,k) и столбцов (m,l) каждой матрицы вводить с клавиатуры. Создать функцию, которая меняет местами наибольший и наименьший элемент матрицы. Вывести на экран: исходные, ре-

10

Соседние файлы в папке Методичка - Borland Pascal 7.0