- •1.Интегрированная среда разработки Delphi
- •2.Структура программы и типы в языке Delphi
- •3.Линейные структуры
- •4.Структуры с ветвлениями
- •5.Циклы с неизвестным числом повторений
- •6.Циклы с заданным числом повторений
- •Задание к работе
- •7.Массивы
- •8.Файлы
- •9.Подпрограммы
- •10.Динамическая память Подготовка к работе
- •Контрольные вопросы
- •Задание к работе
- •Задание 1
- •Задание 2
- •11.Исключения
9.Подпрограммы
Подготовка к работе
1. По рекомендованной литературе изучить:
правила объявления подпрограмм,
связь формальных и фактических параметров,
способы передачи фактических параметров в подпрограмму,
обращение к процедурам и функциям.
2. Разработать алгоритмы и программы решения задач.
Контрольные вопросы
Что такое подпрограмма? Ее назначение.
Правила объявления процедур в программе.
Правила объявления функций в программе.
Правила обращения к процедуре в программе.
Правила обращения к функции в программе.
Формальные и фактические параметры.
Передача параметров в процедуру с помощью параметров-значений.
Передача параметров в процедуру с помощью параметров-переменных. Использование слова var.
Передача параметров в процедуру с помощью параметров-констант. Использование слова const.
Использование слова out.
Задания к работе
Создать программу, использующую подпрограмму-функцию. Функция должна возвращать сумму элементов с заданными свойствами в массивах или матрицах. Варианты заданий приведены в табл. 9 .8. Проект – консольное приложение.
Создать программу, использующую подпрограмму-процедуру. В этом задании подпрограмма должна возвратить и следы матриц. Проект – консольное приложение.
табл. 9.8. Варианты задания 1
№ |
Что искать |
Примечание |
1 |
Суммы ненулевых элементов массивов X(n), Y(m). |
Для массива. |
2 |
Суммы положительных элементов массивов X(n), Y(m). |
Для массива. |
3 |
Суммы отрицательных элементов массивов X(n), Y(m). |
Для массива. |
4 |
Суммы элементов массивов X(n), Y(m). имеющих значения в интервале Min…Max. |
Для массива. |
5 |
Суммы ненулевых элементов матриц X(m,n) и Y(p,q). |
Для матрицы. |
6 |
Суммы положительных элементов матриц X(m,n) и Y(p,q). |
Для матрицы. |
7 |
Суммы отрицательных элементов матриц X(m,n) и Y(p,q). |
Для матрицы. |
8 |
Суммы элементов матриц X(m,n) и Y(p,q), имеющих значения в интервале Min…Max. |
Для матрицы. |
9 |
Суммы ненулевых элементов каждой строки матрицы X(m,n). |
Для строки. |
10 |
Суммы положительных элементов каждой строки матрицы X(m,n). |
Для строки. |
11 |
Суммы отрицательных элементов каждой строки матрицы X(m,n). |
Для строки. |
12 |
Суммы элементов каждой строки матрицы X(m,n), имеющих значения в интервале Min…Max. |
Для строки. |
13 |
Суммы ненулевых элементов каждого столбца матрицы X(m,n). |
Для столбца. |
14 |
Суммы положительных элементов каждого столбца матрицы X(m,n). |
Для столбца. |
15 |
Суммы отрицательных элементов каждого столбца матрицы X(m,n). |
Для столбца. |
16 |
Суммы элементов каждого столбца матрицы X(m,n), имеющих значения в интервале Min…Max. |
Для столбца. |
Пример выполнения
Задание 1
Найти след (сумма элементов главной диагонали) квадратных матрицы A[k,k] и B[n,n], где k, n – размеры матриц. Сделаем это с помощью подпрограммы-функции Sled. В программе пользователь по запросу вводит размеры матриц A и B. Затем матрицы заполняются случайными числами с помощью вложенных циклов и функции Random (возвращает случайные вещественные числа в интервале 0..1). Для контроля ввода матрицы выводятся на экран. Далее последовательно для матриц A и B вызывается функция Sled, и вычисленные значения следов матриц A и B выводятся на экран. Окно работающего приложения показано на рис. 9 .21.
рис. 9.21. Окно приложения задания 1 при исполнении
Листинг программы
program Prg_9_1;
{$APPTYPE CONSOLE}
uses
SysUtils,RusTrans;
const
Max=40; // Максимальный размер матриц
type
Mas=array[1..Max,1..Max] of Real; // Тип для матрицы
var
i,j,k,n:Integer;
A,B:Mas;
Sled1,Sled2:Real;
function Sled(M:Mas; r:Integer):Real; // Функция
var
i:Integer;
s:Real;
begin
s:=0; // Обнуление суммы
for i:=1 to r do s:=s+M[i,i]; // Накопление суммы
Result:=s;
end;
begin
writeln(Rus('Введите размеры матриц не более '),Max);
write(Rus(' Первая k=')); // Первая матрица
ReadLn(k);
write(Rus(' Вторая n=')); // Вторая матрица
readln(n);
writeln;
writeln(Rus('Спасибо. Для продолжения нажмите Enter'));
writeln;
readln;
Randomize;
for i:=1 to k do // Формирование матрицы A
for j:=1 to k do A[i,j]:=0.5-random;
for i:=1 to n do // Формирование матрицы B
for j:=1 to n do B[i,j]:=0.5-random;
writeln(Rus('Матрицы заполнены случайными числами'));
writeln;
for i:=1 to k do // Вывод матрицы A
begin
for j:=1 to k do write(A[i,j]:8:3);
writeln;
end;
writeln;
for i:=1 to n do // Вывод матрицы B
begin
for j:=1 to n do write(B[i,j]:8:3);
writeln;
end;
readln;
Sled1:=Sled(A,k); // Вызов функции для первой матрицы
Sled2:=Sled(B,n); // Вызов функции для второй матрицы
writeln(Rus('Результаты')); // Заголовок ответа
writeln;
writeln('Sled1= ', Sled1:5:2); // Ответы
writeln('Sled2= ', Sled2:5:2);
readln; // Ожидание Enter
end.
Задание 2
Найти сумму всех элементов и след (сумму элементов главной диагонали) квадратных матриц A[k,k] и B[n,n], где k, n – размеры матриц. Сделаем это с помощью подпрограммы-процедуры Sum_Sled. В отличие от задания 1 в подпрограмме вычисляются два значения Sum – сумма и Sled - след. Окно работающего приложения показано на рис. 9 .22.
рис. 9.22. Окно приложения задания 2 при исполнении
Листинг программы:
program Prg_9_2;
{$APPTYPE CONSOLE}
uses
SysUtils, RusTrans;
const
Max=40; // Максимальный размер матриц
type
Mas=array[1..Max,1..Max] of real; // Тип для матрицы
var
i,j,k,n:integer;
A,B:Mas;
Sum1,Sum2,Sled1,Sled2:real;
procedure Sum_Sled(var Sum,Sled:real;M:Mas; r:integer);
var
i,j:integer;
begin
Sum:=0; // Обнуление суммы
Sled:=0; // Обнуление следа
for i:=1 to r do
for j:=1 to r do
begin
Sum:=Sum+M[i,i]; // Накопление суммы
if i=j then Sled:=Sled+M[i,j]; // Накопление следа
end;
end;
begin
writeln(Rus('Введите размеры матриц не более '),Max);
write(Rus(' Первая k=')); // Первая матрица
readLn(k);
write(Rus(' Вторая n=')); // Вторая матрица
readln(n);
writeln;
writeln(Rus('Спасибо. Для продолжения нажмите Enter'));
writeln;
readln;
randomize;
for i:=1 to k do // Формирование матрицы A
for j:=1 to k do A[i,j]:=0.5-random;
for i:=1 to n do // Формирование матрицы B
for j:=1 to n do B[i,j]:=0.5-random;
writeln(Rus('Матрицы заполнены случайными числами'));
writeln;
for i:=1 to k do // Вывод матрицы A
begin
for j:=1 to k do write(A[i,j]:8:3);
writeln;
end;
writeln;
for i:=1 to n do // Вывод матрицы B
begin
for j:=1 to n do write(B[i,j]:8:3);
writeln;
end;
readln;
Sum_Sled(Sum1,Sled1,A,k); // Вызов процедуры для матрицы A
Sum_Sled(Sum2,Sled2,B,n); // Вызов процедуры для матрицы B
writeln(Rus('Результаты')); // Заголовок ответа
writeln;
writeln('Sum1=',Sum1:5:2,' Sled1= ', Sled1:5:2);
writeln('Sum2=',Sum2:5:2,' Sled2= ', Sled2:5:2);
readln; // Ожидание Enter
end.
Выводы
Для упрощения программ используются подпрограммы. При их многократном использовании код вводится один раз.
Доступны два вида подпрограмм – функции и процедуры. Функция возвращает одно значение, процедура – ни одного или несколько.
Процедура вызывается по имени (со списком фактических параметров) в строке кода программы.
Функция вызывается по имени (со списком фактических параметров) в выражениях. При установленной опции расширенного синтаксиса функцию можно вызывать, как процедуру. При этом значение, возвращаемое функцией, игнорируется.
В подпрограмму могут передаваться параметры-значения, параметры-переменные (со словом var, это адреса с возможностью чтения/записи), параметры-константы (со словом const, это адреса с возможностью только чтения), параметры-выходные (со словом out, это адреса с возможностью только записи).