Сделай Сам Свою Работу на 5

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ





 

1. ГОСТ 19.701-90. Единая система программной документации. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения. – Введ. 01.01.1992. – М.: Изд-во стандартов, 1991.

2. Глухова, Л. А. Основы алгоритмизации и программирования: Лаб. практикум для студ. спец. «Программное обеспечение информационных технологий» дневной формы обуч. В 4 ч. Ч 1 / Л. А. Глухова, Е. П. Фадеева, Е. Е. Фадеева, С. В. Болтак. – Минск: БГУИР, 2004 г. – 41 с.

3. Глухова, Л. А. Основы алгоритмизации и программирования: Лаб. практикум для студ. спец. I-40 01 01 «Программное обеспечение информационных технологий» дневной формы обуч. В 4 ч. Ч 2 / Л. А. Глухова, Е. П. Фадеева, Е. Е. Фадеева. – Минск: БГУИР, 2005. – 52 с.

4. Глухова Л. А.Основы алгоритмизации и программирования: Процедуры и функции языка Pascal: Лаб. практикум для студ. спец. I-40 01 01 «Программное обеспечение информационных технологий» дневной формы обуч. В 4 ч.: Ч 3 / Л. А. Глухова, Е. П. Фадеева, Е. Е. Фадеева. – Мн: БГУИР, 2007. – 51 с.

5. Фаронов, В. В. DELPHI. Программирование на языке высокого уровня: Учебник для вузов / В. В. Фаронов. – СПб.: Питер, 2010. – 640 с.

6. Кнут Д.Э. Искусство программирования: в 3 т. / Д. Э. Кнут. – 3-изд. – М., Изд. Дом «Вильямс», 2006. – Т. 1 : Основные алгоритмы. – 720 c.




 

ПРИЛОЖЕНИЕ A

ИСХОДНЫЙ КОД ПРОГРАММЫ

unit ElementListUnit;

 

interface

uses SimpleElements, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

 

type

pt= ^ListElem;

 

ListElem = record

Value:TElement;

Next:pt;

end;

 

//Список элементов

TElList = class

private

first:pt; //Указатель на начало списка

now:pt; //Текущее положение указателя

public

constructor Create;

procedure Reset;

function Next : TElement;

function Get : TElement;

function Last : Boolean;

procedure Add(val:TElement);

function Save:string;

constructor Load(var f:TStrings; out rez:Integer);

end;

 

implementation

uses

CycleBorderUnit,CycleUnit,SolveUnit;

 

{===================================================}

{==================== TElList ======================}

{===================================================}

constructor TElList.Create;

begin

New(first);

first^.Value:=nil;

first^.Next:=nil;

 

now:=first;

end;

 

//Сброс положения указателя продвижения по списку

procedure TElList.Reset;

begin

now:=first;

end;

 

//Значение, на которое указатель прожвижения указывает в данный момент

function TElList.Get : TElement;

begin

if now <> nil then

Result:=now^.Value

else

raise EOverflow.Create('Закончились элементы в списке');



end;

 

//Переход к сл. элементу списка и получение его значения

function TElList.Next:TElement;

begin

if now <> nil then

begin

now:=now^.Next;

Result:=now^.Value;

end

else

raise EOverflow.Create('Закончились элементы в списке');

end;

 

//True - текущмй лемент - последний в списке

function TElList.Last : Boolean;

begin

result := (now^.Next = nil);

end;

 

//Добавить элемент в список

procedure TElList.Add(val : TElement);

var

x,y:pt;

begin

if val <> nil then

begin

//Определяем место вставки

x:=first;

while x^.Next<>nil do

x:=x^.Next;

 

//Создаём элемент для вставки

New(y);

y^.Value:=val;

y^.Next:=nil;

 

//Вставляем

x^.Next:=y;

end;

end;

 

function TElList.Save : string;

var

x:pt;

rez:string;

count:Integer;

begin

Result := 'ElList' + #10;

count:=0; //Считаем число элементов

rez:='';

 

//Запоминаем каждый элемент

x:= first^.Next;

while x <> nil do

begin

rez:=rez+x^.Value.Save;

count:=count+1;

x:=x^.Next;

end;

 

//Записываем всё в строку

Result:=Result + IntToStr(count) + #10;

Result:=Result + rez;

end;

 

//Считывание из файла

constructor TElList.Load(var f:TStrings;out rez:integer);

var

count,i:Integer;

name:string;

Elem:TElement;

begin

Create;

rez:=0;

Elem:=nil; //Заглушка на случай ошибки

 

count:=StrToInt(f[0]); //Считываем число элементов

f.Delete(0);

 

for i:=1 to count do

begin

//В списке не достаточно элементов - выход

if f.Count < 1 then

begin

rez:=1;

Exit;

end;

 

name:=f[0]; //Название сл. элемента

f.Delete(0);

//Определяем элемент

if name = 'Simple' then

Elem:=TElSimple.Load(f,rez)

else if name = 'Terminator' then

Elem:=TElTerminater.Load(f,rez)

else if name = 'Solve' then

Elem:=TElSolve.Load(f,rez)

else if name = 'CylceBorderOpen' then

Elem:=TElOpenCycleBorder.Load(f,rez)

else if name = 'CylceBorderClose' then

Elem:=TElCloseCycleBorder.Load(f,rez)

else if name = 'Cycle' then

Elem:=TElCycle.Load(f,rez)

else if name = 'If' then

Elem:=TElIf.Load(f,rez)

else if name = 'Case' then

Elem:=TElCase.Load(f,rez)

else if name = 'Input' then

Elem:=TElInput.Load(f,rez)



else

begin //Неизвестный элемент - ошибка

rez:=1;

Exit;

end;

 

Add(Elem);

end;

end;

end.

 

unit SchemeUnit;

 

interface

 

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls,ElementListUnit,SimpleElements;

type

//Схема (последовательность блоков)

TScheme = class

private

Elements: TElList;

Prog:Boolean;

_Name:string;

public

constructor Create(_prog:Boolean;subname:string); overload;

constructor Create(ElList:TElList;_prog:Boolean;subname:string); overload;

procedure Add( el:TElement);

function Draw(): TBitmap;

function Save:string;

 

function GetName:string;

procedure SetName(val:string);

property Name:string read GetName write SetName;

 

//Конструктор чтения из файла

constructor Load (var f:TStrings;out rez:integer);

end;

implementation

{===================================================}

{==================== TScheme ======================}

{===================================================}

 

//Простой конструктор. prog - указывает яляется ли схема программой и нуждается ли в терминаторах

constructor TScheme.Create(_prog:Boolean;subname:string);

begin

Elements:=TElList.Create;

//Для программы добавим терминатор начало

if _prog then

Elements.Add(TElTerminater.Create(subname,True));

 

Prog:=_prog;

 

_Name:=subname;

end;

 

//Конструктор аналогичный верхнему но, на базе готового списка элементов

constructor TScheme.Create(ElList:TElList;_prog:Boolean;subname:string);

begin

Elements:=TElList.Create;

//Для программы добавим терминатор начало

if _prog then

Elements.Add(TElTerminater.Create(subname,True));

 

//Добавляем элементы из списка к схеме

ElList.Reset;

while Not ElList.Last do

Elements.Add(ElList.Next);

 

_Name:=subname;

Prog:=_prog;

end;

 

//Свойство Name - имя программы

function TScheme.GetName : string;

begin

Result:=_Name;

end;

 

procedure TScheme.SetName(val : string);

begin

_Name:=val;

end;

 

//Добавление блока в схему

procedure TScheme.Add(el:TElement);

begin

Elements.Add(el);

end;

 

//Получение графического представления схемы

function TScheme.Draw():TBitmap;

var

ElBmp:TBitmap;

DrawY:Integer;

begin

result:=TBitmap.Create;

result.Canvas.Brush.Color := BackColor;

Elements.Reset; //Сброс параметров списка

DrawY:=0; //Расстояние от верха, до нового блока

 

//Для каждого элемента списка Elements;

while Not Elements.Last do

begin

ElBmp:=Elements.Next.Draw;

 

//Увеличиваем длинну и ширину, чтобы влез новый блок

Result.Height:=Result.Height+ElBmp.Height;

if Result.Width < ElBmp.Width then

Result.Width:=ElBmp.Width;

 

//Рисуем и меняем координату для сл. блока

Result.Canvas.Draw(0,DrawY,ElBmp);

DrawY:=DrawY+ElBmp.Height;

end;

 

//Для программы также необходим заклчительный терминатор

if Prog then

begin

Result.Height:=Result.Height+ElHeight+LineLen;

Result.Canvas.Draw(0,DrawY,TElTerminater.Create('',false).Draw );

end;

end;

 

//Получение текстового представления

function TScheme.Save : string;

begin

Result := 'Scheme' + #10;

Result:=Result + IntToStr(Integer(Prog)) + #10;

Result:=Result + _Name + #10;

Result := Result + Elements.Save;

end;

 

//Чтние из файла

constructor TScheme.Load (var f:TStrings;out rez:integer);

begin

try

Prog:=Boolean(StrToInt(f[0])); //Считываем тип

f.Delete(0); //Удаляем обработанную строку

_Name:=f[0]; //Считываем имя

f.Delete(0); //Удаляем обработанную строку

if f[0] = 'ElList' then //Блоки

begin

f.Delete(0); //Удаляем прочитаное

Elements:=TElList.Load(f,rez);

end

else //Не список - ошибка

begin

rez:=1;

Exit;

end;

except

rez:=1; //Любая ошибка - выход

Exit;

end;

end;

end.

 

unit SimpleElements;

 

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

 

var

ElWidth:Integer = 176; //Ширина одного блока

PenColor:TColor = clBlack; //Цвет линий на схеме

BrushColor:TColor = clGreen; //Цвет закышенных областей на схеме

BackColor:TColor = clWhite; //Цвет фона схемы

ElHeight:Integer = 50; //Высота элемента

LineLen:Integer = 20; //Длина соединительной линии

 

type

//Абстрактный класс - блок

TElement = class

public

function Draw : TBitmap; virtual; abstract;

function Save:string; virtual; abstract;

protected

procedure DrawLine(var bmp:TBitmap);

procedure Prepear (var bmp:TBitmap);

procedure DrawBitmap(var bmp:TBitmap; drawing:TBitmap);

procedure DrawText(var bmp:TBitmap; Rect:TRect; text:string);

end;

 

//Простой блок действия

TElSimple = class (TElement)

private

text : string;

public

//Получение графического представленя блока

function Draw : TBitmap; override;

 

//Свойство Operation - текст хранимый в блоке

function GetOperation : string;

procedure SetOpetarion(val:string);

property Operation : string read GetOperation write SetOpetarion;

 

//Простой конструктор по тексту внутри блока

constructor Create (oper:string);

 

//Текстовое представление для сохранения

function Save:string; override;

//Конструктор чтения из файла

constructor Load (var f:TStrings;out rez:integer);

end;

 

//Блок терминатор (начало/конец)

TElTerminater = class(TElement)

private

name:string;

start:Boolean;

public

//Получение графического представленя блока

function Draw : TBitmap; override;

 

//Простой конструктор по имени подпрограммы и типу блока (начало/конец)

constructor Create (SubName:string;_start : Boolean);

 

//Текстовое представление для сохранения

function Save:string; override;

//Конструктор чтения из файла

constructor Load (var f:TStrings;out rez:integer);

end;

 

//Блок решение (просто ромб, не конструкция if)

TElSolve = class(TElement)

private

condition : string; //Условие записанное в блоке

public

constructor Create (_Condition:string);

function Draw : TBitmap; override;

//Текстовое представление для сохранения

function Save:string; override;

//Конструктор чтения из файла

constructor Load (var f:TStrings;out rez:integer);

end;

 

//Блок ввод/вывод

TElInput = class (TElement)

private

text : string;

public

//Получение графического представленя блока

function Draw : TBitmap; override;

 

//Простой конструктор по тексту внутри блока

constructor Create (oper:string);

 

//Текстовое представление для сохранения

function Save:string; override;

//Конструктор чтения из файла

constructor Load (var f:TStrings;out rez:integer);

end;

 

implementation

{======================================}

{============== TElement ==============}

{======================================}

//Подготовка к изображению стандартоного блока

procedure TElement.Prepear(var bmp:TBitmap);

 

begin

bmp := TBitmap.Create();

//Задаём размер изображения

bmp.Canvas.Brush.Color := BackColor;

bmp.Width := ElWidth;

bmp.Height := ElHeight+LineLen;

end;

 

//Прорисовка предшествующей блоку линии

procedure TElement.DrawLine(var bmp : TBitmap);

var

DrawX : integer;

begin

//Рисуем линию

DrawX := round(bmp.Width/2);

bmp.Canvas.Pen.Color := PenColor;

bmp.Canvas.MoveTo(DrawX,0);

bmp.Canvas.LineTo(DrawX,LineLen);

end;

 

//Увеличение размеров и изображение TBitmap Drawin на bmp

procedure TElement.DrawBitmap(var bmp:TBitmap; drawing:TBitmap);

var

DrawY:Integer;

begin

//Сохраняем точку для рисования

DrawY:=bmp.Height;

 

//Увеличиваем длинну и ширину, чтобы влез новый блок

bmp.Height:=bmp.Height+drawing.Height;

if bmp.Width < drawing.Width then

bmp.Width:=drawing.Width;

 

//Рисуем

bmp.Canvas.Draw(0,DrawY,drawing);

end;

 

//Вывод текста отцентрованного в Rect

procedure TElement.DrawText(var bmp:TBitmap; Rect:TRect; text:string);

var

i,parts,PrevI:Integer;

st:string;

y:Integer;

begin

with bmp.Canvas do

with Rect do

begin

parts:= TextWidth(text) div (Right - Left) + 1; //число строк

PrevI:=0; //Последний выведенный символ

y:=Top + (Bottom - Top) div 2 - (TextHeight(text)+1)*parts div 2; //координата y вывода

if y<Top then y:=Top; //Если не помещаетя в поле вывода - вывод с начала поля

 

//Выводим каждую строку

for i:=1 to parts do

begin

//Определяем что выводить

st:=Copy(text,PrevI+1,Length(text) div parts +1);

PrevI:=PrevI+Length(text) div parts +1;

//Некоторые символы стараемся не отрывать

if (PrevI < Length(text)) and (text[PrevI+1] in [')',',',';']) then

begin

PrevI:=PrevI+1;

st:=st + text[PrevI+1];

end

else if (i<>parts) and (text[PrevI] = '(') then

begin

PrevI:=PrevI-1;

Delete(st,Length(st) ,1);

end;

 

//Вывод

TextOut(Left + (Right - Left) div 2 - TextWidth(st) div 2,y,st) ;

y:=y+TextHeight(st)+2;

end;

end;

end;

 

 

{======================================}

{============== TElSimple ==============}

{======================================}

 

constructor TElSimple.Create(oper:string);

begin

Operation:=oper;

end;

 

function TElSimple.GetOperation : string;

begin

Result := text;

end;

 

procedure TElSimple.SetOpetarion(val:string);

begin

text:=val;

end;

 

//Возвращает графическое предсталение блока

function TElSimple.Draw : TBitmap;

var

bmp:TBitmap;

Rect:TRect;

begin

Prepear(bmp);

DrawLine(bmp);

Rect:= Bounds(0, LineLen, ElWidth, ElHeight);

 

with bmp.Canvas do

begin

//Строим сам блок

Brush.Color := BrushColor;

FillRect(Rect);

Rectangle(Rect);

 

//Пишем текст

DrawText(bmp,Rect,text);

end;

 

result:=bmp;

end;

 

function TElSimple.Save:string;

begin

Result:='Simple' + #10 + text+ #10;

end;

 

constructor TElSimple.Load (var f:TStrings;out rez:integer);

begin

try

rez:=0;

Operation:=f[0]; //Считываем операцию

f.Delete(0); //Удаляем обработанную строку

except

rez:=1; //Любая ошибка - выход

Exit;

end;

end;

{==========================================}

{=============== TElTerminate =============}

{==========================================}

 

constructor TElTerminater.Create(SubName : string; _start : Boolean);

begin

name:=SubName;

start:=_start;

end;

 

//Возвращает графическое предсталение блока

function TElTerminater.Draw : TBitmap;

var

bmp:TBitmap;

begin

Prepear(bmp);

if not start then //Предшествующая линия нужна только заключительному блоку

DrawLine(bmp);

 

//Строим сам блок

bmp.Canvas.Brush.Color := BrushColor;

bmp.Canvas.RoundRect(0,LineLen,ElWidth ,ElHeight+LineLen,ElWidth div 5,ElHeight*2);

bmp.Canvas.FloodFill(2,lineLen+Round(ElHeight/2),PenColor ,fsBorder);

 

//Пишем текст

if start then

begin

DrawText(bmp,Bounds(10,LineLen + bmp.Canvas.TextHeight('Начало') + 2,

ElWidth - 20,ElHeight - bmp.Canvas.TextHeight('Начало') + 2),name);

DrawText(bmp,Bounds(10,LineLen +1,ElWidth -20,bmp.Canvas.TextHeight('Начало')),'Начало');

end

else

DrawText(bmp,Bounds(10,LineLen +1,ElWidth -20,ElHeight -2),'Конец');

 

result:=bmp;

end;

 

function TElTerminater.Save:string;

begin

Result:='Terminator' + #10;

Result :=Result + name + #10;

Result:=Result + IntToStr(Integer(start))+ #10;

end;

 

constructor TElTerminater.Load (var f:TStrings;out rez:integer);

begin

try

rez:=0;

name:=f[0]; //Считываем название

f.Delete(0); //Удаляем обработанную строку

start:=Boolean(StrToInt(f[0])); //Считываем start

f.Delete(0);

except

rez:=1; //Любая ошибка - выход

Exit;

end;

end;

 

{======================================}

{============== TElSolve ==============}

{======================================}

constructor TElSolve.Create(_Condition:string);

begin

Condition:=_Condition;

end;

 

//Получение графического представления блока

function TElSolve.Draw : TBitmap;

var

bmp:TBitmap;

begin

//Готовим и рисуем линию

Prepear(bmp);

DrawLine(bmp);

 

//Строим сам блок

bmp.Canvas.Brush.Color := BrushColor;

bmp.Canvas.MoveTo(ElWidth div 2,LineLen);

bmp.Canvas.LineTo(ElWidth,LineLen + ElHeight div 2);

bmp.Canvas.LineTo(ElWidth div 2,LineLen + ElHeight-1);

bmp.Canvas.LineTo(0,LineLen + ElHeight div 2);

bmp.Canvas.LineTo(ElWidth div 2,LineLen);

bmp.Canvas.FloodFill(ElWidth div 2 ,lineLen+ElHeight div 2,PenColor ,fsBorder);

 

//Пишем текст

DrawText(bmp,Bounds(0, LineLen, ElWidth, ElHeight),condition);

 

result:=bmp;

end;

 

function TElSolve.Save:string;

begin

Result:='Solve' + #10;

Result :=Result + condition+ #10;

end;

 

constructor TElSolve.Load (var f:TStrings;out rez:integer);

begin

try

rez:=0;

condition:=f[0]; //Считываем условие

f.Delete(0); //Удаляем обработанную строку

except

rez:=1; //Любая ошибка - выход

Exit;

end;

end;

 

{======================================}

{============== TElInput ==============}

{======================================}

 

constructor TElInput.Create(oper:string);

begin

text:=oper;

end;

 

//Возвращает графическое предсталение блока

function TElInput.Draw : TBitmap;

var

bmp:TBitmap;

Rect:TRect;

begin

Prepear(bmp);

DrawLine(bmp);

Rect:= Bounds(ElWidth div 4, LineLen, ElWidth div 2, ElHeight);

 

with bmp.Canvas do

begin

//Строим сам блок

Brush.Color := BrushColor;

Pen.Color:=PenColor;

MoveTo(ElWidth div 4,LineLen);

LineTo(ElWidth,LineLen);

LineTo(3*ElWidth div 4,LineLen + ElHeight-1);

LineTo(0,LineLen + ElHeight-1);

LineTo(ElWidth div 4,LineLen);

FloodFill(ElWidth div 2, LineLen + ElHeight div 2, PenColor ,fsBorder);

 

//Пишем текст

DrawText(bmp,Rect,text);

end;

 

result:=bmp;

end;

 

function TElInput.Save:string;

begin

Result:='Input' + #10 + text+ #10;

end;

 

constructor TElInput.Load (var f:TStrings;out rez:integer);

begin

try

rez:=0;

text:=f[0]; //Считываем операцию

f.Delete(0); //Удаляем обработанную строку

except

rez:=1; //Любая ошибка - выход

Exit;

end;

end;

end.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.