СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
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 Все материалы защищены законодательством РФ.
|