АЯиП отчеты по лабам (кроме 24) (отчет19)

Посмотреть архив целиком

Лабораторная работа 19.

Программирование с использованием метаклассов. Создание контейнеров. Использование исключений при программировании в среде Delphi.



Задача: Моделировать очередь, в качестве элементов которой могут использоваться числа и слова. Операции: добавление элемента, удаление элемента, печать элементов очереди. Создать класс - потомок, который содержит процедуру определения слова максимальной длины. Тестировать полученную модель.

В отчете представить структуру использованных классов и обосновать выбранную структуру представления данных.



Объектная декомпозиция:


1


Главное окно приложения







1 1 1



Определение слова максимальной длины

Добавление

Удаление





1 – Активизировать



Граф состояния интерфейса:


Главное

окно приложения

Определение слова максимальной длины

Удаление


5 1 - Нажатие кнопки «Добавить»

2 - Нажатие кнопки «Удалить»

3 - Нажатие кнопки «Длиннейшее слово»

4 – Завершение обработки

5 - Нажатие кнопки «Выход»




1 4 3 4

2 4

Добавление





Диаграмма классов:




Текст программы:


unit Main;


interface


uses

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, Menus;


type

TMainForm = class(TForm)

AddButton: TButton;

DelButton: TButton;

SumButton: TButton;

IOEdit: TEdit;

IOLabel: TLabel;

ExitButton: TButton;

ListLabel: TLabel;

ListBox1: TListBox;

procedure SumButtonClick(Sender: TObject);

procedure AddButtonClick(Sender: TObject);

procedure IOEditKeyPress(Sender: TObject; var Key: Char);

procedure DelButtonClick(Sender: TObject);

procedure FormActivate(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure ExitButtonClick(Sender: TObject);

procedure IOEditChange(Sender: TObject);

end;


var

MainForm: TMainForm;


implementation

Uses MySpisok,Spisok;

Var S:TMySpisok;

{$R *.DFM}

procedure TMainForm.FormActivate(Sender: TObject);

begin

IOLabel.Visible:=false;

IOEdit.Visible:=false;

end;


procedure TMainForm.AddButtonClick(Sender: TObject);

begin

addButton.Enabled:=false;

IOLabel.Visible:=true;

IOEdit.Visible:=true;

IOEdit.SetFocus;

end;


procedure TMainForm.IOEditChange(Sender: TObject);

begin

addButton.Enabled:=false;

end;


procedure TMainForm.IOEditKeyPress(Sender: TObject; var Key: Char);

var I, Code: Integer; v:TElement;

begin

addButton.Enabled:=true;

if Key=#13 then

begin

Key:=#0;

Val(IOEdit.Text, I, Code);

Listbox1.Items.Add(IOEdit.Text);

if Code = 0 then v:=TNumber.Create(I)else v:=TStr.Create(IOEdit.Text);

S.Add(v);

AddButton.SetFocus;

IOLabel.Visible:=false;

IOEdit.Visible:=false;

end;

end;


procedure TMainForm.DelButtonClick(Sender: TObject);

var v:TElement;

begin

IOLabel.Visible:=true;

IOEdit.Visible:=true;

v:=S.Del;

if v<>nil then

begin

ListBox1.Items.Delete(0);

if v is TNumber {или v.ClassType = TNumber} then

IOEdit.Text:=inttoStr((v as TNumber).MyNum)

else IOEdit.Text:=(v as TStr).MyString;

v.Free;

end

else IOEdit.Text:='Список пуст.';

end;


procedure TMainForm.SumButtonClick(Sender: TObject);

begin

IOLabel.Visible:=false;

IOEdit.Visible:=false;

Application.MessageBox(Pchar(S.Summa),'Самое длинное слово:',MB_OK);

end;


procedure TMainForm.FormCreate(Sender: TObject);

begin

close;

end;

procedure TMainForm.N2Click(Sender: TObject);

begin

close;

end;

procedure TMainForm.ExitButtonClick(Sender: TObject);

begin

close;

end;

initialization S:=TMySpisok.Create;

finalization S.Destroy;


end.

Unit Spisok;


Interface

Var a:integer;

Type TElement=class(TObject)

public

pre,suc:TElement;

end;


TSpisok=class(TObject)

private

first,last,cur:TElement;

public

destructor Destroy;override;

procedure Add(e:TElement);

function Del:TElement;

function IFirst:TElement;

function INext:TElement;

end;



Implementation

var n:integer;


Destructor TSpisok.Destroy;

var v:TElement;

Begin

v:=Del;

while v<>nil do

begin

v.Destroy;

v:=Del;

end;

inherited Destroy;

End;


Procedure TSpisok.Add;

Var n:integer;

Begin

if first=nil then begin

first:=e;

last:=e;

end

else begin

e.suc:=first;

first.pre:=e;

first:=e;

a:=a+1;

end;

n:=(n+1);

End;


Function TSpisok.Del;

Begin

Del:=last;

if last<>nil then

begin

last:=last.pre;

if last<>nil then last.suc:=nil;

end;

if last=nil then first:=nil;

End;


Function TSpisok.IFirst;

begin

cur:=first;

Result:=cur;

end;


Function TSpisok.INext;

begin

cur:=cur.suc;

Result:=cur;

end;


End.




unit MySpisok;


interface

Uses Spisok;

Type TNumber=class(TElement)

private FMyNum:integer;

public

constructor Create(aMyNum:integer);

property MyNum:integer read FMyNum write FMyNum;

end;


TStr=class(TElement)

private FMyString:string;

public

constructor Create(aMyString:string);

property MyString:string read FMyString Write FMyString;

end;


TMySpisok=class(TSpisok)

function Summa:string;

end;


implementation

Var n:integer; r:integer;


Constructor TNumber.Create;

begin

inherited Create;

FMyNum:=aMyNum;

end;


Constructor TStr.Create;

begin

inherited Create;

FMyString:=aMyString;

end;


Function TMySpisok.Summa;

Var c:TElement;

h:integer;

t1,t2:integer;

Begin

Result:='Вы не ввели никакой информации';

h:=0;

c:=IFirst;

if (c is TStr) then

begin

val ((c as Tstr).MyString,t1,t2);

if t2<>0 then begin

h:=length((c as Tstr).MyString);

Result:=(c as Tstr).MyString;

end;

end;


while c<>nil do

begin

if (c is TStr) then val ((c as Tstr).MyString,t1,t2);

if (c is TStr) and (t2<>0) and (length ((c as Tstr).MyString)>h)

then begin

h:=length((c as tstr).MyString);

Result:=(c as Tstr).MyString;

c:=INext;

end

else c:=INext;

end;

end;


end.




Случайные файлы

Файл
referat.doc
115873.rtf
145082.doc
18896.rtf
74820-1.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.