Рішення задач за допомогою процедур.
Розглянемо приклад програми, в якій використовуються процедури створені користувачем.
Приклад 1. Дано матриці дійсних чисел A, B, C, D розміром ЗхЗ. Обчислити вираз:
Z=(A+B)*C-A*B.
program example_1;
type
matr=array [1..3, 1..3] of real;
var
A, B, C, D, Z, M1, M2, M3 : matr;
I, J : byte;
procedure mkmatr(C : char; var A : matr); {процедура створення матриці} begin
for I := 1 to 3 do
for J := 1 to 3 do
begin
write(C,'[', I, ‘,’, J, ']=');
readln(A[I, J])
end
end;
procedure printmatr(C : char; A : matr);
{процедура виведення результуючої матриці}
begin
for I := 1 to 3 do
for I := 1 to 3 do
writeln(' C, '[', I, ‘,’, J, ']=', A[I, J]:7:3);
end;
procedure sum(A, B matr; var C :matr);
{процедура знаходження суми двох матриць}
begin
for I := 1 to 3 do
for J := 1 to 3 do
C[I, J] := A[ I, J] + B[ I, J];
end;
procedure product(A, B matr; var C :matr);
{процедура знаходження добутку двох матриць}
begin
for I := Ml to N1 do
for J := M2 to N2 do
begin
C[I, J ] :=0;
for K := M2 to N2 do
C[I, J] := C[ I, J] + A[ I, K] * B[ K, J]
end
end;
procedure negativ(A, B matr; var C :matr);
{процедура знаходження різниці двох матриць}
begin
for I := 1 to 3 do
for J :-= 1 to 3 do
C[ I, J] := A[ I, J] - B[ I, J];
end;
begin
mkmatr('A',A);
mkmatr('B', B);
mkmatr('C', C);
mkmatr('D', D);
sum(A, B, Ml);
product(M1, C, M2);
product(A, B, M3);
negativ(M2, M3, Z);
printmatr('Z', Z);
readln
end.
Приклад 2
Створити підпрограму, яка б із тексту S вилучала вказаний символ х і обчислювала кількість вилучень. У програмі організувати виклик цієї підпрограми.
Підпрограма, яка виконує дану задачу, повинна мати три формальних параметри. Позначимо їх наступним чином:
S - заданий текст (змінна рядкового типу string);
x - символ, що підлягає вилученню (змінна символьного типу char);
count - кількість вилучень (числова змінна цілого типу, наприклад byte).
Параметр x повинен бути параметром-значенням (вхідний параметр), а параметри S та count параметрами-змінними (вихідні параметри). Рядок S фактично являється і вхідним, і вихідним, тому що за умовою задачі саме в ньому необхідно здійснити вилучення заданих символів.
Для виконання поставленої задачі, на наш погляд, зручніше використовувати цикл з передумовою, тому що після вилучення символів з рядку він змінює свою довжину і використання циклу з параметром (for) може привести до помилки. Крім того, зверніть увагу на те, що зміна індексу і (номер поточної позиції рядка) виконується тільки у випадку, якщо шуканий символ не знайдено. Це пов'язано з тим, що рядок може містити цей символ у сусідніх позиціях і після вилучення поточного символу на ту саму позицію попадає знов шуканий символ.
Оформлення основної програми, на наш погляд, не повинно викликати сумнівів. Зазначимо лише, що відповідні фактичні параметри у запропонованій програмі будуть називатися А (заданий текст), ch (символ, що підлягає вилученню), N (кількість вилучень).
Програма, що виконує запропонований алгоритм, має наступний вигляд:
Program Example_2;
Uses crt; {Підключення бібліотеки}
Procedure Solution (x:char; var S:string;
var count:byte);
var i:byte; {локальна змінна для організаціїциклу}
Begin
count:=0; i:=1;
while i<=length(S) do
begin
if S[i]=x
then
begin
count:=count+1;
delete(S,i,1);
end
else i:=i+1;
end;
End;
Var A:string; ch:char; N:byte;
Begin
clrscr;
writeln ('Введіть текст: ');
readln(A);
write ('Введіть шуканий символ: ');
readln (ch);
Solution(ch,A,N);
writeln ('Результуючий текст: ',A);
writeln ('Кількість виконаних вилучень: ',N);
readkey;
End.
