
- •Программирование с использованием подпрограмм
- •Структура программы с использованием подпрограмм
- •Классификация параметров подпрограмм
- •Программирование с использованием процедур
- •Задания для самостоятельной работы
- •Программирование с использованием функций
- •Задания для самостоятельной работы
- •Процедурные типы
- •Примеры решения задач с использованием процедурных типов
- •Задания для самостоятельной работы
Задания для самостоятельной работы
Разработать процедуру обработки целочисленной матрицы. В матрице есть ровно столько одинаковых элементов, сколько у нее строк. Каждый такой элемент находится на своей строке. Процедура должна сформировать массив, в который занесены номера столбцов этих элементов. Использовать процедуру для обработки двух прямоугольных матриц.
Составить процедуру, преобразовывающую одномерный массив, состоящий из n*n элементов, в двумерный массив размера n*n.
Разработать процедуру обработки трех целочисленных массивов. Процедура должна находить элементы, которые есть в первом массиве и отсутствуют во втором и третьем массивах.
Разработать процедуру обработки квадратной матрицы вещественных чисел, с помощью которой найти минимальный элемент, расположенный под побочной диагональю, и максимальный элемент над побочной диагональю.
Разработать процедуру для нахождения множества символов, образующих слово. Используя процедуру, в 3 словах найти символы, которые встречаются во всех словах, только в 1- м слове, только во 2-м и 3-м словах.
В массиве записей содержатся сведения: наименование товара, страна производитель, объем поставляемой партии в валюте. Составить процедуру для формирования массива записей, содержащего сведения о странах: страна, суммарный объем поставок в валюте.
Составить процедуру, которая построчно сравнивает два текстовых файла и формирует массив различающихся строк вместе с их номерами.
Программирование с использованием функций
Структура функции имеет вид:
Function <имя функции>(<список формальных параметров>):<тип результата>;
Const // описание локальных констант
Type // описание локальных типов данных
Var // описание локальных переменных
Procedure // описание локальных процедур
Function// описание локальных функций
Begin
// тело функции
<имя функции>:=<результат>; или RESULT:=<результат>;
End;
Список формальных параметров функции обычно содержит только входные параметры.
Тип результата может быть любой, кроме файлового типа. Результат обработки должен быть связан с именем функции или с переменной Result.
При использовании имени функции в теле функции должен быть хотя бы один оператор присваивания, в котором имени функции присваивается окончательный результат.
Переменная Result по умолчанию есть своя в каждой функции. Тип ее тот же, что тип результата. Она может использоваться так же, как любая переменная этого типа. Но при выходе из функции ей так же, как при использовании имени функции, должен быть присвоен окончательный результат.
Вызвать функцию можно в выражении, где допустим операнд такого же типа, как у функции. Вызов функции имеет следующий вид:
<имя_функции >(< список фактических параметров> )
Количество, порядок следования и тип формальных и фактических параметров должны совпадать.
Примеры решения задач с использованием функций
Пример 1.Разработать 2 функции: 1 – с результатом логического типа, которая проверяет, все ли элементы главной диагонали квадратной матрицы одинаковы? 2 – с результатом целого типа, которая определяет максимальный злемент главной диагонали квадратной матрицы. Найти сумму максимальных элементов матриц A и B, если в обеих матрицах элементы диагоналей разные.
Program DIAGONAL;
$APPTYPE CONSOLE}
Uses SysUtils;
Сonst nmax=30;
Type Tmatr=array[1..nmax,1..nmax] of integer;
Function Proverka(Const x:Tmatr;nx:integer):boolean;
// Проверка, все ли элементы главной диагонали равны?
// C использованием переменной Result
Var i:integer;
begin
Result:=true;
for i:=2 to nx do
if x[1,1]<>x[i,i] then Result:=false;
end;
//
Function MaxDiag(Const x:Tmatr;nx:integer):integer;
// Поиск максимального элемента главной диагонали
// C использованием переменной Result
Var i:integer;
begin
Result:=x[1,1];
for i:=2 to nx do
if x[i,i]>Result then Result:=x[i,i];
end;
//
{
Function MaxDiag(Const x:Tmatr;nx:integer):integer;
// Поиск максимального элемента главной диагонали
// С использованием имени функции
// Необходимо описание дополнительной локальной переменной max
Var i:integer;
max:integer; // дополнительная переменная
begin
max:=x[1,1];
for i:=2 to nx do
if x[i,i]>max then max:=x[i,i];
MaxDiag:=max; // Присвоение результата имени функции
end;
}
//
Procedure VvodMatr(Var x:Tmatr; Var nx:integer);
// Ввод матрицы
Var i,j:integer;
begin
writeln(’Введите размер матрицы’);
readln(nx);
writeln(’Введите матрицу’);
for i:=1 to nx do
begin
for j:=1 to nx do read(x[i,j];
readln;
end;
end;
//
var // объявление глобальных параметров
a,b:Tmatr;
na,nb,i:integer;
Begin
writeln('введите матрицу А:');
VvodMatr(a,na);
writeln('введите матрицу B:');
VvodMatr(b,nb);
If (Proverka(a,na)=true) and (Proverka(b,nb)=true) then
begin
summa:=MaxDiag(a,na)+MaxDiag(b,nb);
writeln(’Сумма максимальных =’,summa:6);
end
else writeln(’Элементы одинаковы ’);
readln;
End.
Пример 2. Разработать функцию, которая формирует множество цифр, входящих в строку произвольной длины. Найти цифры, которые входят в каждую строку массива строк.
Program CIFRI;
$APPTYPE CONSOLE}
Uses SysUtils;
Сonst nmax=30;
Type Tmas=array[1..nmax] of string;
Tset=set of '0'..'9';
Function FormMn(s:string):Tset;
// Формирование множества цифр, входящих в строку
// C использованием переменной Result
Var
i:integer;
begin
Result:=[]; // пустое множество
for i:=1 to length(s) do
if s[i] in [’0’..’9’] then Result:=Result+[s[i]];
end;
//
var // объявление глобальных параметров
a:Tmas;
na,i:integer;
mnvezde:Tset; // результат-множество цифр, которые есть в каждой строке
Begin
writeln('введите количество строк:');
readln(na);
writeln(’Введите строки’);
for i:=1 to na do readln(a[i]);
mnvezde:=[’0’..’9’];
for i:=1 to na do mnvezde:=mnvezde*FormMn(A[i]); // пересечение множеств
if mnezde=[] then writeln(’Нет цифр, входящих в каждую строку’)
else
begin
writeln(’Цифры, входящие в каждую строку’);
for ch:=’0’ to ’9’ do
if ch in mnvezde then write(ch:2);
writeln;
end;
readln;
end.
Пример 3. Разработать функцию, которая определяет победителя среди пловцов, данные о которых содержатся в массиве записей с полями: фамилия, имя, результат. Найти победителей на дистанциях 100 и 200 метров. Результаты спортсменов занесены в два массива: отдельно на 100 м и на 200 м. Победителям выдаются призы. Если победителем на обеих дистанциях является один и тот же спортсмен, приз ему увеличивается в 4 раза.
Program PLOVEC;
{$APPTYPE CONSOLE}
Uses SysUtils;
Const nmax=40;
Type Tsport=record
fam:string[10];
name:string[8];
rez:real;
end;
Tmas=array[1..nmax] of Tsport;
Procedure Vvod(Var a:Tmas; Var na:integer);
// Ввод массива записей
Var i:integer;
begin
writeln('введите количество спортсменов : ');
readln(na);
for i:=1 to na do
begin
writeln(’введите фамилию:’); readln(a[i].fam);
writeln('введите имя:'); readln(a[i].name);
writeln('введите результат:'); readln(a[i].rez);
end;
end;
//
Function PobSor(Const a:Tmas; na:integer):Tsport;
// Поиск победителя в массиве
Var i:integer;
begin
Result:=a[1];
For i:=2 to na do
If a[i].rez<Resalt.rez then Result:=a[i];
end;
//
var // объявление глобальных параметров
a100,a200:Tmas;
na100,na200,i:integer;
p100,p200:Tsport;
Begin
Writeln(’Введите результаты на 100 м’);
Vvod(a100,na100);
Writeln(’Введите результаты на 200 м’);
Vvod(a200,na200);
p100:=PobSor(a100,na100); // победитель на 100 м
p200:=PobSor(a200,na200); // победитель на 200 м
if p100=p200 then
begin
writeln(’Победитель на обеих дистанциях:’);
writeln(p100.fam:12,’ ’:4,p100.name:10, ’ ’:4,p100.rez:8:3);
writeln(’Приз – 4000 евро’);
end
else
begin
writeln(’Победитель на дистанции 100 м:’);
writeln(p100.fam:12, ’ ’:4,p100.name:10, ’ ’:4,p100.rez:8:3);
writeln(’Приз – 1000 евро’);
writeln(’Победитель на дистанции 200 м:’);
writeln(p200.fam:12, ’ ’:4,p200.name:10, ’ ’:4,p200.rez:8:3);
writeln(’Приз – 1000 евро’);
end;
readln;
end.