Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет_ИниСП_Лаб_№1.docx
Скачиваний:
1
Добавлен:
18.08.2019
Размер:
988.71 Кб
Скачать

УО «Белорусский государственный университет информатики и радиоэлектроники»

Кафедра Информатики

Отчёт

по лабораторной работе №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;