Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подпрограммы.doc
Скачиваний:
0
Добавлен:
29.11.2019
Размер:
171.52 Кб
Скачать

Задания для самостоятельной работы

  1. Разработать процедуру обработки целочисленной матрицы. В матрице есть ровно столько одинаковых элементов, сколько у нее строк. Каждый такой элемент находится на своей строке. Процедура должна сформировать массив, в который занесены номера столбцов этих элементов. Использовать процедуру для обработки двух прямоугольных матриц.

  2. Составить процедуру, преобразовывающую одномерный массив, состоящий из n*n элементов, в двумерный массив размера n*n.

  3. Разработать процедуру обработки трех целочисленных массивов. Процедура должна находить элементы, которые есть в первом массиве и отсутствуют во втором и третьем массивах.

  4. Разработать процедуру обработки квадратной матрицы вещественных чисел, с помощью которой найти минимальный элемент, расположенный под побочной диагональю, и максимальный элемент над побочной диагональю.

  5. Разработать процедуру для нахождения множества символов, образующих слово. Используя процедуру, в 3 словах найти символы, которые встречаются во всех словах, только в 1- м слове, только во 2-м и 3-м словах.

  6. В массиве записей содержатся сведения: наименование товара, страна производитель, объем поставляемой партии в валюте. Составить процедуру для формирования массива записей, содержащего сведения о странах: страна, суммарный объем поставок в валюте.

  7. Составить процедуру, которая построчно сравнивает два текстовых файла и формирует массив различающихся строк вместе с их номерами.

Программирование с использованием функций

Структура функции имеет вид:

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.