Программирование на Pascal / Delphi / Методичка - Borland Pascal 7.0 / Met_1_5
.pdfЛабораторная работа №
Реализация программ, использующих процедуры и функции пользователя
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 |
+ |
(1−t) |
× |
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