Название: организация программ с использованием подпрорамм
ЦЕЛЬ ЗАДАНИЯ:
1. Получение навыков в написании программ с использованием подпрограмм-процедур и подпрограмм-функций.
2. Изучение механизма передачи параметров по значению и ссылке.
ПОСТАНОВКА ЗАДАЧИ:
Дано несколько массивов чисел. Длины массивов заданы в варианте. Требуется в каждом массиве найти наибольший и наименьший элементы и напечатать их. Вычисление максимальной и минимальной величин оформить в виде процедуры, глобальные параметры в процедуре не использовать.
СОДЕРЖАНИЕ ОТЧЕТА:
1. Постановка задачи для конкретного варианта
2. Блок-схему алгоритма.
3. Текст программы.
4. Результаты счета.
МЕТОДИЧЕСКИЕ УКАЗАНИЯ:
1. Если в качестве исходной информации в процедуру передается массив, то его следует передавать по ссылке для экономии памяти, так как в этом случае при вызове процедуры не образуется локальный массив.
2. Несмотря на то, что обрабатываемые массивы имеют разную длину, они описываются в программе как массивы одного и того же типа, так как при обращении к процедуре типы соответствующих формальных и фактических параметров должны совпадать.
3. Конкретные длины массивов должны быть описаны в разделе констант.
4. Приведенная ниже программа упорядочивает по не убыванию три массива разной длины (10, 5, 8) и выводит их на печать.
ПРОГРАММА:
PROGRAM MAS;
TYPE
A=ARRAY[1..20] OF REAL;
VAR
X,Y,Z:A; I,N: INTEGER;
D:TEXT;
(* ПРОЦЕДУРА ВВОДА *)
PROCEDURE WWOD(K:INTEGER; VAR M:A);
VAR J: INTEGER;
BEGIN
WRITELN('ВВЕДИТЕ',K:3,' ЭЛЕМЕНТОВ МАССИВА');
FOR J:=1 TO K DO READ(M[J]);
READLN
END;
(* ПРОЦЕДУРА СОРТИРОВКИ МАССИВОВ *)
PROCEDURE UP(K:INTEGER;VAR M:A);
VAR I,J:INTEGER; C: REAL;
BEGIN
FOR J:=K DOWNTO 2 DO
FOR I:=1 TO J-1 DO
IF M[I]>M[I+1] THEN
BEGIN
C:=M[I+1]; M[I+1]:=M[I]; M[I]:=C
END
END;
(* ПРОЦЕДУРА ВЫВОДА *)
PROCEDURE WUWOD(K:INTEGER;VAR M:A;L:BOOLEAN);
VAR J:INTEGER;
BEGIN
FOR J:=1 TO K DO
begin
IF L THEN WRITE(M[J]:6:2);
WRITE(D,M[J]:6:2)
END;
WRITELN;
WRITELN(D)
END;
BEGIN
ASSIGN(D,'LAB11.DAT');
REWRITE(D);
WWOD(10,X); WWOD(5,Y); WWOD(8,Z);
WRITELN(D,'ИСХОДНЫЕ МАССИВЫ');
WRITELN(D);
WRITELN(D,'МАССИВ X'); WUWOD(10,X,FALSE);
WRITELN(D,'МАССИВ Y'); WUWOD(5,Y,FALSE);
WRITELN(D,'МАССИВ Z'); WUWOD(8,Z,FALSE);
WRITELN(D);
UP(10,X); UP(5,Y); UP(8,Z);
WRITELN('МАССИВЫ ПОСЛЕ ПЕРЕСТАНОВКИ ');
WRITELN;
WRITELN(D,'МАССИВЫ ПОСЛЕ ПЕРЕСТАНОВКИ ');
WRITELN(D);
WRITELN(D,'МАССИВ X');WRITELN('МАССИВ X'); WUWOD(10,X,TRUE);
WRITELN(D,'МАССИВ Y');WRITELN('МАССИВ Y'); WUWOD(5,Y,TRUE);
WRITELN(D,'МАССИВ Z');WRITELN('МАССИВ Z'); WUWOD(8,Z,TRUE);
WRITELN(D,'РАБОТУ ВЫПОЛНИЛ ИВАНОВ И.И.');
CLOSE(D)
END.
Результаты работы программы
ИСХОДНЫЕ МАССИВЫ
МАССИВ X
5.00 9.00 8.00 7.00 2.00 0.00 2.00 6.00 5.00 9.00
МАССИВ Y
8.00 3.00 0.00 1.00 6.00
МАССИВ Z
9.00 4.00 0.00 6.00 2.00 4.00 6.00 7.00
МАССИВЫ ПОСЛЕ ПЕРЕСТАНОВКИ
МАССИВ X
0.00 2.00 2.00 5.00 5.00 6.00 7.00 8.00 9.00 9.00
МАССИВ Y
0.00 1.00 3.00 6.00 8.00
МАССИВ Z
0.00 2.00 4.00 4.00 6.00 6.00 7.00 9.00
РАБОТУ ВЫПОЛНИЛ ИВАНОВ И.И.
Контрольные вопросы:
1. Чем отличается подпрограмма функция от подпрограммы процедуры?
2. Что называется фактическим и формальным параметром?
3. В чем разница передачи данных по ссылке и по значению?
ЛАБОРАТОРНАЯ РАБОТА №11
НАЗВАНИЕ: ОРГАНИЗАЦИЯ ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ МОДУЛЕЙ
ЦЕЛЬ ЗАДАНИЯ:
Получение практических навыков в написании программ с использованием МОДУЛЕЙ
ПОСТАНОВКА ЗАДАЧИ:
Дано два одномерных массива. Требуется вычислить функцию
,
где S1 и K1 - сумма и число положительных элементов первого массива,
S2 и K2 - сумма и число отрицательных элементов второго массива.
Для вычисления суммы и числа положительных или отрицательных элементов массива использовать одну и ту же процедуру, размещенную в модуле. Процедура должна позволять решать задачи при числе элементов массива N <= 100.
СОДЕРЖАНИЕ ОТЧЕТА:
1. Постановка задачи для конкретного варианта.
2. Исходный текст модуля и программы, блок - схему алгоритма.
3. Результаты выполнения программы.
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
1. МОДУЛЬ - это автономно компилируемая программная единица, включающая в себе различные компоненты раздела описаний (типы, константы, переменные, процедуры и функции). Модуль сам по себе не является выполняемой программой - его объекты используются другими программными единицами.
Все программные ресурсы модуля можно разбить на две части: объекты, прямо предназначенные для использования другими программами или модулями, и объекты рабочего характера. В соответствии с этим модуль, кроме заголовка, имеет две основные части, называемые интерфейсом и реализацией.
Заголовок модуля составляется из служебного слова UNIT и следующего за ним имени модуля. Заголовок завершается символом ";" (точка с запятой). Для правильной работы среды ТУРБО-ПАСКАЛЯ это имя должно совпадать с именем дискового файла, в котором помещается исходный текст модуля. Если, например, имеем заголовок UNIT GLOBAL; то исходный текст соответствующего модуля должен размещаться в дисковом файле GLOBAL.PAS.
Интерфейсная часть начинается со служебного слова INTERFACE, за которым следует совокупность обычных описаний. Часть реализации начинается служебным словом IMPLEMENTATION и содержит описание подпрограмм, объявленных в интерфейсной части. В ней могут объявляться локальные для модуля объекты, вспомогательные типы, константы и переменные. Завершает модуль, как и программу, служебное слово END и символ точка.
Описанию подпрограммы, объявленной в интерфейсной части модуля, в исполняемой части должен предшествовать заголовок, в котором можно опускать список формальных параметров (и тип результата для функции), так как они уже описаны в интерфейсной части. Но если заголовок подпрограммы приводится в полном виде, т.е. со списком формальных параметров и объявлением результата, он должен совпадать с заголовком, объявленным в интерфейсной части, например:
unit cmplx;
interface
type complex=record re,im: real end;
procedure addс(x,y:complex; var z:complex);
implementation
procedure addс;
begin
z.re:=x.re+y.re;
z.im:=x.im+y.im
end
end.
В этом модуле описан тип complex и процедура addс сложения комплексных чисел. Модуль компилируется точно таким же образом, как и обычные подпрограммы. Но так как модуль не является непосредственно выполняемой единицей, то в результате его компиляции образуется дисковый файл с расширением .TPU, при этом имя файла берется из имени файла с исходным текстом модуля.
Для того чтобы получить доступ к интерфейсным объектам модуля необходимо указать в программе имя нужного TPU - файла. Соответствующая конструкция называется спецификацией используемых модулей и имеет следующий вид:
USES U1,U2,U3;
где USES- служебное слово, U1,U2,U3- имена используемых модулей.
Эта спецификация должна идти непосредственно после заголовка программы. При наличии спецификации используемых модулей в данной программе считаются известными все описания из интерфейсных частей подключенных модулей. К интерфейсным объектам модуля можно обращаться в программе точно так же, как если бы они были описаны в самой этой программе.
2. Правильность работы программы проверить на следующих тестовых задачах:
А) 1-ый массив N=10.
элементы с 1-го по 5-ый равны 4
элементы с 6-го по 10-ый равны -2
2-ой массив N=5
все элементы массива равны -3
ОТВЕТ: Z=1.75
Б) 1-ый массив N=5
все элементы массива равны 5
2-ой массив N=3
все элементы массива равны 2
ОТВЕТ: Z ВЫЧИСЛИТЬ НЕВОЗМОЖНО
Контрольные вопросы:
1. Что называется модулем?
2. Какова структура модуля?
3. На какие части разбиты программные ресурса модуля?
4. В чем отличие локальных и глобальных переменных?
5. Как обеспечить доступ к интерфейсным объектам модуля?