
УО «Белорусский государственный университет информатики и радиоэлектроники»
Кафедра Информатики
Отчёт
по лабораторной работе №1
Тема: «Основные концепции ООП»
Вариант №10
Выполнил:
студент группы 152005
Сагалович Ю.И.
Проверил:
Нестеренков С. Н.
Минск 2012
Цель работы:
Ознакомиться с концепциями ООП в среде программирования Delphi.
Постановка задачи:
Разработать консольное приложение в среде программирования Delphi, используя объектно-ориентированный подход:
1. Предусмотреть необходимый набор классов для описания предметной области.
2. Предусмотреть необходимый набор методов, свойств и полей в проектируемых классах.
3. Предусмотреть возможности тестирования созданных классов.
Описание программы:
При разработке программы был создан набор классов, предназначенных для представления разреженных числовых матриц (т.е. матриц, малая часть элементов которых отлична от нуля). Также были реализованы основные операции над такими матрицами: сложение, умножение и транспонирование.
Скриншоты разработанной программы:
Главное меню:
Выбор операций
для работы с матрицами:
Пример
выполнения операции транспонирования:
Пример
использования редактора введенных
матриц:
Листинг кода лабораторной работы
Файл ‘Lab1.dpr’
program Lab1;
{$APPTYPE CONSOLE}
uses
SysUtils,
StdCtrls,
Windows,
ProgInterface in 'ProgInterface.pas',
Matrix in 'Matrix.pas',
Operations in 'Operations.pas',
CRT32 in 'CRT32.pas';
var
ch: char;
op: boolean;
begin
SetConsoleCp(1251); //Установка кодовых страниц
SetConsoleOutputCP(1251); //для работы с кириллицей
ch := Menu;
while ch <> '3' do //Циклицеский вызов меню программы
begin
case ch of
'1': begin
op := Operat;
while not(op) do
begin
writeln(#13#10'-------------------------------');
write('Выбран недопустимый пункт меню! Нажмите любую кнопку для повтора!');
ReadKey;
op := Operat;
end;
end;
'2': About;
else writeln(#13#10'-----------------------------------');
write('Выбран недопустимый пункт меню! Нажмите любую кнопку для повтора!');
ReadKey;
end;
ch := Menu;
end;
end.
Файл ‘ProgInterface.pas’
unit ProgInterface;
interface
uses SysUtils, Operations, CRT32;
function Menu: char; //Вывод меню программы
procedure About; //Вывод информации о программе
function Operat: boolean; //Вывод меню выбора операций над матрицами
function ReadSizeMas: integer; //Функция для чтения размера массива
implementation
function Menu;
begin
ClrScr;
writeln('______________Лабораторная работа №1_________________');
writeln('_____________________Вариант №10__________________'#13#10'');
writeln('_______________Меню___________________');
writeln('1) Операции над матрицами');
writeln('2) О программе');
writeln('3) Выход');
writeln('____________________________________________');
write('Выберите пункт меню: ');
result := ReadKey;
end;
procedure About;
begin
ClrScr;
writeln('____________Лабораторная работа №1_________________'#13#10'');
writeln('__________________Вариант №10______________'#13#10'');
writeln('_______Разработка класса для представления разреженных числовых матриц______'#13#10'');
writeln('______________Выполнил: Сагалович Юрий___________'#13#10'');
writeln('______________Группа 152005_________________'#13#10'');
writeln('-------------------------------------------');
write('Для возращения в меню нажмите любую кнопку!');
ReadKey;
end;
function Operat;
Var Oper: tLab;
ch: char;
begin
ClrScr;
writeln('____________Лабораторная работа №1__________');
writeln('_________________Вариант №10_______________'#13#10'');
writeln('______________Операции над матрицами________________');
writeln('1) Транспонирование');
writeln('2) Сложение');
writeln('3) Произведение');
writeln('4) Назад');
writeln('__________________________________');
write('Выберите операцию: ');
ch := ReadKey;
case ch of
'1': begin
Oper := Tlab.Create;
Oper.nmas := ReadSizeMas;
Oper.Transp; //Вызов метода для транспонирования
Oper.Free;
result := True;
end;
'2': begin
Oper := Tlab.Create;
Oper.nmas := ReadSizeMas;
Oper.Summ; //Вызов метода для суммирования
Oper.Free;
result := True;
end;
'3': begin
Oper := Tlab.Create;
Oper.nmas := ReadSizeMas;
Oper.Product; //Вызов метода для перемножения
Oper.Free;
result := True;
end;
'4': result := True;
else result := False;
end;
end;
function ReadSizeMas;
var n: integer;
bl: boolean;
begin
bl := False;
while not(bl) do
begin
ClrScr;
writeln('_________Лабораторная работа №1___________');
writeln('____________________Вариант №10_______________'#13#10'');
writeln('_______________________________________');
write('Введите размерность массивов: ');
try
read(n);
if n <= 0 then Abort;
except
on EInOutError do
begin
writeln('----------------------------------------------');
write('Введен недопустимый размер массива! Нажмите любую кнопку для повтора!');
ReadKey;
continue;
end;
on EAbort do
begin
writeln('-----------------------------------');
write('Введен недопустимый размер массива! Нажмите любую кнопку для повтора!');
ReadKey;
continue;
end;
end;
bl := true;
end;
result := n;
end;
end.
Файл ‘Matrix.pas’
unit Matrix;
interface
type
TInf = record //Описание информационного поля элемента стека
a: extended;
j: integer;
end;
PElmas = ^TElmas;
TElmas = record //Описание элемента стека
inf: TInf;
p: PElmas;
end;
TStr = class //Класс для работы со списком (стеком)
private
sp, sp1: PElmas;
protected
procedure AddEl(inf: TInf); //добавление элемента в начало
function ReadEl(j: integer): extended; //Чтение элемента
procedure ChangeEl(inf: TInf); //Замена j-того элемента
procedure DelEl; //Удаление элемента из начала списка
constructor Create;
end;
MasStr = array[1..1] of TStr; //динамический массив списков
TMatrix = class(TStr) //класс для работы с массивом списков
private
mas: ^MasStr;
n: integer;
procedure AddEl(i, j: integer; a: extended); function ReadEl(i, j: integer): extended;
public
constructor Create(m: integer);
destructor Free;
procedure ChangeEl(i, j: integer; a: extended);
property Massiv[i, j: integer]: extended read ReadEl write AddEl; //Свойство-массив для удобства работы с матрицей
end;
implementation
constructor TStr.Create;
begin
inherited Create;
sp := nil;
sp1 := nil;
end;
procedure TStr.AddEl(inf: TInf);
begin
New(sp);
sp^.inf := inf;
sp^.p := sp1;
sp1 := sp;
end;
function TStr.ReadEl(j: integer): extended;
begin
if sp1 <> nil then
begin
sp := sp1;
while (sp^.inf.j > j) and (sp^.p <> nil) do
sp := sp^.p;
if sp^.inf.j = j then
result := sp^.inf.a
else
result := 0;
end
else
result := 0;
end;
procedure TStr.DelEl;
begin
sp := sp1;
sp1 := sp^.p;
Dispose(sp);
end;
procedure TStr.ChangeEl(inf: TInf);
var spt, spk: PElmas;
begin
if sp1 <> nil then
begin
New(sp);
sp^.inf := inf;
spt := sp1;
spk := nil;
while spt^.inf.j > inf.j do
begin
spk := spt;
spt := spt^.p;
end;
if spt^.inf.j = inf.j then
begin
if spk <> nil then
spk^.p := sp
else
sp1 := sp;
sp^.p := spt^.p;
Dispose(spt);
end
else
begin
if spk <> nil then
spk^.p := sp
else
sp1 := sp;
sp^.p := spt;
end;
end
else
AddEl(inf);
end;
constructor TMatrix.Create(m: integer);
var i: integer;
begin
n := m;
GetMem(mas, 4*n);
for i := 1 to n do
begin
mas[i] := TStr.Create;
mas[i].sp1 := nil;
end;
end;
destructor TMatrix.Free;
var i: integer;
begin
for i := 1 to n do
begin
while mas[i].sp1 <> nil do
mas[i].DelEl;
mas[i].Free;
end;
FreeMem(mas, 4*n);
inherited Destroy;
end;
procedure TMatrix.AddEl(i, j: integer; a: extended);
var inf: TInf;
begin
inf.a := a; inf.j := j;
mas[i].AddEl(inf);
end;
function TMatrix.ReadEl(i, j: integer): extended;
begin
result := mas[i].ReadEl(j);
end;
procedure TMatrix.ChangeEl(i, j: integer; a: extended);
var inf: TInf;
begin
inf.a := a; inf.j := j;
mas[i].ChangeEl(inf);
end;
end.
Файл ‘Operations.pas’
unit Operations;
interface
uses
Matrix, CRT32, SysUtils;
type
TLab = class
private
Mas1, Mas2, MasRez: TMatrix;
n: integer;
procedure WriteN(n0: integer);
procedure ReadConsole(var Mas: TMatrix); //Метод чтения матрицы
procedure WriteConsole(var Mas: TMatrix); //Метод вывода матрицы
function Redact(var Mas: TMatrix): boolean; //Метод редактирования
public
property nmas: integer write WriteN; //Регулировка размера матриц
procedure Transp;
procedure Summ;
procedure Product;
end;
implementation
procedure TLab.Transp;
var i, j: integer;
begin
Mas1 := TMatrix.Create(n);
MasRez := TMatrix.Create(n);
writeln(#13#10'____________________________________________ ');
writeln('Транспонирование разреженной матрицы');
readln;
ReadConsole(Mas1);
//----------------------------------------------------------------------
//Алгоритм транспонирования
//----------------------------------------------------------------------
for i := 1 to n do
for j := 1 to n do
MasRez.Massiv[i,j] := Mas1.Massiv[j,i];
//----------------------------------------------------------------------
writeln(#13#10'____________________________________ _______');
writeln('Результат транспонирования: '#13#10);
WriteConsole(MasRez);
MasRez.Free;
Mas1.Free;
writeln(#13#10'----------------------------------------------');
write('Для возращения в меню нажмите любую кнопку!');
ReadKey;
end;
procedure TLab.Summ;