Лабораторная работа 8
Сложные циклы. Обработка массивов. Создание и использование Unit-ов и библиотек DLL Цель работы: формирование умений и навыков в разработке сложных циклических алгоритмов обработки массивов с использованием процедур и функций пользователя, находящихся в отдельном модуле; использование текстовых файлов для ввода-вывода.
Что нужно знать для выполнения работы
1. Структуру вложенного цикла. 2. Метод пошаговой детализации (последовательного уточнения) разработки алгоритмов. 3. Особенности использования массивов в качестве параметров в процедурах и функциях. 4. Объявление и использование текстовых файлов. 5. Структуру Unit-а. 6. Структуру динамически подключаемой библиотеки.
Примеры выполнения задания лабораторной работы
Пример 1. Составьте программу перемножения матриц Am × n и Bn × l. В результате должна получиться матрица Cm × l. Процедуры ввода матрицы, вывода матрицы, перемножения матриц поместите в модуль Matr. В головной программе введите имена входного текстового файла, в котором находятся исходные матрицы, и выходного файла, в который будут выведены исходные матрицы и матрица произведения.
Текст головной программы
program lr8_1_1; {Нахождение произведения матрицы Amxn на матрицу Bnxl, получая матрицу Cmxl. Использование Unit-a} {$APPTYPE CONSOLE}
Uses SysUtils, Unit1;
Type matr = array [1..10, 1..10] of real; stroka =string[30]; }//эти типы описаны в Unit-е
Var a, b, c: matr; {исходные матрицы и матрица результата} l, m, n: integer; namefilein, namefileout: stroka; Begin write('Vvedite imja vchodnogo fayla '); readln(namefilein); write('Vvedite imja vichodnogo fayla '); readln(namefileout); vvodmatr(a, namefilein, m, n, true, false); vvodmatr(b, namefilein, n, l, false, true); vivodmatr(namefileout, a, m, n, 'Matrica A', true); vivodmatr(namefileout, b, n, l, 'Matrica B', false); multmatr(a, b, c, m, n, l); vivodmatr(namefileout, c, m, l, 'Matrica C=A*B', false); end.
Текст Unit-а Unit1.pas
unit unit1; {Процедуры ввода, вывода матриц, нахождения произведения матрицы Amxn на матрицу Bnxl, получая матрицу Cmxl} Interface Type matr = array [1..10, 1..10] of real; stroka =string[30];
{Ввод матрицы} procedure vvodmatr(var a: matr; namefile: stroka; var m, n: integer; flag1, flag2: boolean); {Вывод матрицы} procedure vivodmatr(namefile: stroka; a: matr; m, n: integer; zag: stroka; flag: boolean); {Нахождение произведения матрицы} procedure multmatr(a, b: matr; var c: matr; m, n, l: integer);
Implementation
procedure vvodmatr(var a: matr; namefile: stroka; var m, n: integer; flag1, flag2: boolean); {Ввод матрицы} Var i, j: integer; fin: text; Begin if flag1 then {Открывать файл? } Begin assign(fin, namefile); reset(fin); end; readln(fin, m, n); for i: =1 to m do for j: =1 to n do read(fin, a[i, j]); if flag2 then {Закрывать файл? } close(fin); end;
procedure vivodmatr(namefile: stroka; a: matr; m, n: integer; zag: stroka; flag: boolean); {Вывод матрицы} v a r i, j: integer; fout: text; Begin assign(fout, namefile); if flag th e n rewrite(fout) Else append(fout); writeln(fout, zag); for i: =1 to m do Begin for j: =1 to n do write(fout, a[i, j]: 8: 2); writeln(fout); end; close(fout); end;
procedure multmatr(a, b: matr; var c: matr; m, n, l: integer); {Нахождение произведения матрицы} Var i, j, k: integer; s: real; Begin for i: =1 to m do for j: =1 to l do Begin s: =0; for k: =1 to n do s: =s+a[i, k]*b[k, j]; c[i, j]: =s; end; end;
end.
Решим данную задачу с использованием внешнего файла Unit1.pas вместо Unit-а.
|