Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_Delphi_1.doc
Скачиваний:
15
Добавлен:
18.09.2019
Размер:
1.64 Mб
Скачать

9.Подпрограммы

Подготовка к работе

1. По рекомендованной литературе изучить:

  • правила объявления подпрограмм,

  • связь формальных и фактических параметров,

  • способы передачи фактических параметров в подпрограмму,

  • обращение к процедурам и функциям.

2. Разработать алгоритмы и программы решения задач.

Контрольные вопросы

  1. Что такое подпрограмма? Ее назначение.

  2. Правила объявления процедур в программе.

  3. Правила объявления функций в программе.

  4. Правила обращения к процедуре в программе.

  5. Правила обращения к функции в программе.

  6. Формальные и фактические параметры.

  7. Передача параметров в процедуру с помощью параметров-значений.

  8. Передача параметров в процедуру с помощью параметров-переменных. Использование слова var.

  9. Передача параметров в процедуру с помощью параметров-констант. Использование слова const.

  10. Использование слова out.

Задания к работе

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

  2. Создать программу, использующую подпрограмму-процедуру. В этом задании подпрограмма должна возвратить и следы матриц. Проект – консольное приложение.

табл. 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.

Выводы

  1. Для упрощения программ используются подпрограммы. При их многократном использовании код вводится один раз.

  2. Доступны два вида подпрограмм – функции и процедуры. Функция возвращает одно значение, процедура – ни одного или несколько.

  3. Процедура вызывается по имени (со списком фактических параметров) в строке кода программы.

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

  5. В подпрограмму могут передаваться параметры-значения, параметры-переменные (со словом var, это адреса с возможностью чтения/записи), параметры-константы (со словом const, это адреса с возможностью только чтения), параметры-выходные (со словом out, это адреса с возможностью только записи).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]