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

Разработка граф-схемы алгоритма раскраски на языке Object Pascal. Формат файла для хранения графов. Выбор удобочитаемых идентификаторов. Переменные, константы, типы, компоненты, процедуры и функции модулей uMain, uInputk, uFiling, uColoring, uHelp.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.11.2013
Размер файла 1,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

begin

if VCount > 0 then SaveRequest;

if OpenDialog.Execute then

begin

InitUndo;

if not DoReadFile(OpenDialog.FileName,VCount,AdMatrix) then

MessageDlg('Ошибка при открытии или чтении файла!', mtError, [mbOk], 0)

else

begin

// Очистка и переформат таблицы sgMatrix

sgMatrix.Visible:=True;

for i:=0 to sgMatrix.RowCount - 1 do sgMatrix.Rows[i].Clear;

sgMatrix.RowCount:=VCount+1;

sgMatrix.ColCount:=VCount+1;

sgMatrix.FixedRows:=1;

sgMatrix.FixedCols:=1;

for i:=1 to sgMatrix.RowCount - 1 do sgMatrix.Cells[0,i]:=IntToStr(i);

for j:=1 to sgMatrix.ColCount - 1 do sgMatrix.Cells[j,0]:=IntToStr(j);

// Отображение матрицы смежности на sgMatrix

for i:=1 to VCount do

for j:=1 to VCount do

begin

if AdMatrix[i-1,j-1] > 0 then sgMatrix.Cells[j,i]:='1'

else sgMatrix.Cells[j,i]:='';

end;

// Задание координат центров вершин графа случайным образом

SetLength(VCenter,VCount);

l:=0;

repeat

repeat

Overlap:=False;

x:=round(RandG(PaintAreaWidth div 2, PaintAreaWidth div 6));

y:=round(RandG(PaintAreaHeight div 2, PaintAreaHeight div 6));

// Проверка выхода координат за пределы области построения

if (x < VRadius+PaintAreaXMin) or (y < VRadius+PaintAreaYMin) or

(x > PaintAreaWidth - (VRadius + 5)) or

(y > PaintAreaHeight - (VRadius + 5)) then

begin

Overlap:=True; // За пределами - нужны новые координаты

continue

end;

if l = 0 then continue;

for i:=0 to l - 1 do // Проверка наложения на предыдущие вершины

if (abs(VCenter[i].X - x) <= VRadius + 3) and

(abs(VCenter[i].Y - y) <= VRadius + 3) then

begin

Overlap:=True; // Накладываются - нужны новые координаты

Break

end;

until not Overlap;

VCenter[l].X:=x; // Задание координат

VCenter[l].Y:=y;

inc(l);

until l = VCount;

// Обнуление цветов

SetLength(VColor,VCount);

for i:=0 to VCount - 1 do VColor[i]:=-1;

SaveDialog.FileName:=OpenDialog.FileName;

PrintGraphPath;

MainMenu.Items[0].Items[0].Enabled:=True; // Новый

btnNew.Enabled:=True;

btnColoring.Enabled:=True;

GraphChanged:=False;

MainMenu.Items[0].Items[2].Enabled:=False; // Сохранить

MainMenu.Items[0].Items[3].Enabled:=True; // Сохранить как

MainMenu.Items[1].Items[3].Enabled:=True; // Добавить вершину

MainMenu.Items[1].Items[4].Enabled:=True; // Удалить вершину

self.repaint;

end;

end;

end;

// Выбор пункта меню для сохранения файла

procedure TfmMain.iFSaveClick(Sender: TObject);

begin

if (SaveDialog.FileName <> '') or SaveDialog.Execute then

begin

InitUndo;

FillAdMatrix(AdMatrix);

if not DoSaveFile(SaveDialog.FileName,AdMatrix) then

MessageDlg('Ошибка при сохранении файла!', mtError, [mbOk], 0)

else

begin

GraphChanged:=False;

MainMenu.Items[0].Items[2].Enabled:=False; // Сохранить

end;

end;

end;

// Выбор пункта меню для сохранения графа в другом файле

procedure TfmMain.iFSaveAsClick(Sender: TObject);

begin

if SaveDialog.Execute then

begin

InitUndo;

FillAdMatrix(AdMatrix);

if not DoSaveFile(SaveDialog.FileName,AdMatrix) then

MessageDlg('Ошибка при сохранении файла!', mtError, [mbOk], 0)

else

begin

PrintGraphPath;

GraphChanged:=False;

MainMenu.Items[0].Items[2].Enabled:=False; // Сохранить

end;

end;

end;

// Отображение пути к файлу с графом в заголовке

procedure TfmMain.PrintGraphPath;

var Path: string;

PathWidth,HeaderWidth: Integer;

i: Word;

begin

Path:=''; i:=Length(SaveDialog.FileName);

self.Font:=stGraph.Font;

PathWidth:=self.Canvas.TextWidth(Path);

HeaderWidth:=self.Canvas.TextWidth('Исходный граф +++: ');

while PathWidth < PaintAreaWidth - HeaderWidth do

begin // Отсечение начальных символов полного имени файла

Path:=' ' + Path;

Path[1]:=SaveDialog.FileName[i];

PathWidth:=self.Canvas.TextWidth(Path);

dec(i);

if i = 0 then Break;

end;

if i > 0 then stGraph.Caption:='Исходный граф: ...' + Path

else stGraph.Caption:='Исходный граф: ' + Path;

end;

// Выбор пункта меню для выхода из программы

procedure TfmMain.iFExitClick(Sender: TObject);

begin

btnExitClick(Sender)

end;

// Нажатие кнопки выхода из программы

procedure TfmMain.btnExitClick(Sender: TObject);

begin

if VCount > 0 then SaveRequest;

Application.Terminate;

end;

// Подменю РЕДАКТИРОВАНИЕ

// Выбор пункта меню для добавления вершины

procedure TfmMain.iEAddVClick(Sender: TObject);

var x,y: Integer;

i: Byte;

Overlap,Colored: bool;

begin

if VCount >= MaxVCount then

begin

MessageDlg('Число вершин графа не должно превышать ' +

IntToStr(MaxVCount) + '!', mtWarning, [mbOk], 0);

Exit

end; // Добавление вершины

InitUndo;

inc(VCount);

SetLength(VCenter,VCount);

SetLength(VColor,VCount);

SetLength(AdMatrix,VCount,VCount);

Colored:=ResetColoring(VCount,VColor); // Сброс цветов

sgMatrix.Visible:=True; // Изменение матрицы смежности

sgMatrix.RowCount:=VCount+1;

sgMatrix.Rows[VCount].Clear;

sgMatrix.ColCount:=VCount+1;

sgMatrix.Cols[VCount].Clear;

sgMatrix.FixedCols:=1;

sgMatrix.FixedRows:=1;

sgMatrix.Cells[VCount,0]:=IntToStr(VCount);

sgMatrix.Cells[0,VCount]:=IntToStr(VCount);

repeat // Определение координат новой вершины

Overlap:=False;

x:=round(RandG(PaintAreaWidth div 2, PaintAreaWidth div 6));

y:=round(RandG(PaintAreaHeight div 2, PaintAreaHeight div 6));

// Проверка выхода координат за пределы области построения

if (x < VRadius + PaintAreaXMin) or (y < VRadius + PaintAreaYMin) or

(x > PaintAreaWidth - (VRadius + 5)) or

(y > PaintAreaHeight - (VRadius + 5)) then

begin

Overlap:=True; // За пределами - нужны новые координаты

continue

end;

for i:=0 to VCount-2 do // Проверка наложения вершин

if (abs(VCenter[i].X - x) <= VRadius + 3) and

(abs(VCenter[i].Y - y) <= VRadius + 3) then

begin

Overlap:=True; // Накладываются - нужны новые координаты

Break

end;

until not Overlap;

VCenter[VCount-1].X:=x; // Задание координат

VCenter[VCount-1].Y:=y;

if Colored then RepaintAllVertices // Перерисовка вершин

else RepaintVertex(x,y);

MainMenu.Items[0].Items[0].Enabled:=True; // Новый

btnNew.Enabled:=True;

btnColoring.Enabled:=True;

MainMenu.Items[0].Items[2].Enabled:=True; // Сохранить

MainMenu.Items[1].Items[4].Enabled:=True; // Удалить вершину

GraphChanged:=True; // Граф следует сохранить

end;

// Выбор пункта меню для удаления вершины

procedure TfmMain.iEDelVClick(Sender: TObject);

var i,j,VNo: Byte;

x,y: Integer;

RemVrx: TVertices;

begin

fmInputk.Caption:='Выбор вершины для удаления';

fmInputk.StaticText.Caption:='Выберите удаляемую вершину из списка:';

fmInputk.btnSet.Caption:='Удалить';

fmInputk.ComboBox.Items.Clear;

for i:=1 to VCount do

fmInputk.ComboBox.Items.Add(IntToStr(i));

fmInputk.Tag:=VCount;

if fmInputk.ShowModal = mrOk then

begin

VNo:=StrToInt(fmInputk.ComboBox.Text);

x:=VCenter[VNo-1].X; // Удаление вершины

y:=VCenter[VNo-1].Y;

ResetColoring(VCount,VColor); // Сброс цветов

FillUndoDelVrx(VNo); // Сохранение информации для отмены удаления

MainMenu.Items[1].Items[0].Enabled:=True; // Undo

MainMenu.Items[1].Items[1].Enabled:=False; // Redo

RemoveVertex(VNo,VCount,RemVrx);

if RemVrx <> Nil then

for j:=0 to High(RemVrx) do // Перерисовка удаленных ребер

RepaintEdge(x,y,RemVrx[j].X,RemVrx[j].Y);

RepaintVertex(x,y); // Перерисовка удаленной вершины

//if RemVrx <> Nil then

RepaintAllVertices; // Перерисовка вершин после перенумерации

RemVrx:=Nil;

if VCount = 0 then

begin // Все вершины были удалены

MainMenu.Items[0].Items[0].Enabled:=False; // Новый

btnNew.Enabled:=False;

btnColoring.Enabled:=False;

MainMenu.Items[0].Items[2].Enabled:=False; // Сохранить

MainMenu.Items[0].Items[3].Enabled:=False; // Сохранить как

MainMenu.Items[1].Items[4].Enabled:=False; // Удалить вершину

end

else

begin

GraphChanged:=True; // Граф надо сохранить

MainMenu.Items[0].Items[2].Enabled:=True; // Сохранить

end;

end;

end;

// Выбор пункта меню для добавления ребра

procedure TfmMain.iEAddEClick(Sender: TObject);

begin

// Резерв

end;

// Выбор пункта меню для удаления ребра

procedure TfmMain.iEDelEClick(Sender: TObject);

begin

// Резерв

end;

// Выбор пункта меню для отмены последнего действия

procedure TfmMain.iEUndoClick(Sender: TObject);

var i,j: Byte;

begin

MainMenu.Items[1].Items[0].Enabled:=False; // Undo

MainMenu.Items[1].Items[1].Enabled:=True; // Redo

if UndoItem[0].VPoint.X = -1 then

begin // Отмена удаления ребра

sgMatrix.Cells[UndoItem[0].VNo,UndoItem[1].VNo]:='1';

sgMatrix.Cells[UndoItem[1].VNo,UndoItem[0].VNo]:='1';

sgMatrix.Update; // Прорисовка восстановленного ребра

RepaintEdge(VCenter[UndoItem[0].VNo-1].X,VCenter[UndoItem[0].VNo-1].Y,

VCenter[UndoItem[1].VNo-1].X,VCenter[UndoItem[1].VNo-1].Y);

end

else

begin // Отмена удаления вершины вместе со смежными ребрами

inc(VCount);

SetLength(VCenter,VCount); // Восстановление массива координат вершин

if VCount > 1 then

for i:=VCount - 1 downto UndoItem[0].VNo do VCenter[i]:=VCenter[i-1];

VCenter[UndoItem[0].VNo-1]:=UndoItem[0].VPoint;

SetLength(AdMatrix,VCount,VCount); // Изменение матрицы смежности

if VCount > 1 then

begin

for j:=VCount - 1 downto UndoItem[0].VNo do // Вставка столбца

for i:=0 to VCount - 1 do

AdMatrix[i,j]:=AdMatrix[i,j-1];

for i:=0 to VCount - 1 do AdMatrix[i,UndoItem[0].VNo-1]:=0;

for i:=VCount - 1 downto UndoItem[0].VNo do // Вставка строки

for j:=0 to VCount - 1 do

AdMatrix[i,j]:=AdMatrix[i-1,j];

for j:=0 to VCount - 1 do AdMatrix[UndoItem[0].VNo-1,j]:=0;

for i:=1 to High(UndoItem) do

begin // Восстановление связей удаленной вершины

AdMatrix[UndoItem[0].VNo-1,UndoItem[i].VNo-1]:=1;

AdMatrix[UndoItem[i].VNo-1,UndoItem[0].VNo-1]:=1;

end;

end;

sgMatrix.Visible:=True; // Изменение матрицы смежности на форме

sgMatrix.RowCount:=VCount+1;

sgMatrix.ColCount:=VCount+1;

sgMatrix.FixedCols:=1;

sgMatrix.FixedRows:=1;

for i:=1 to VCount do sgMatrix.Cells[0,i]:=IntToStr(i);

for j:=1 to VCount do sgMatrix.Cells[j,0]:=IntToStr(j);

for i:=1 to VCount - 1 do

for j:=i+1 to VCount do

if AdMatrix[i-1,j-1] > 0 then

begin

sgMatrix.Cells[i,j]:='1';

sgMatrix.Cells[j,i]:='1';

end

else

begin

sgMatrix.Cells[i,j]:='';

sgMatrix.Cells[j,i]:='';

end;

SetLength(VColor,VCount);

MainMenu.Items[0].Items[0].Enabled:=True; // Новый

btnNew.Enabled:=True;

btnColoring.Enabled:=True;

sgMatrix.Update;

self.Repaint;

end;

end;

// Выбор пункта меню для выполнения отмененного действия

procedure TfmMain.iERedoClick(Sender: TObject);

var x,y,j: Integer;

RemVrx: TVertices;

begin

MainMenu.Items[1].Items[0].Enabled:=True; // Undo

MainMenu.Items[1].Items[1].Enabled:=False; // Redo

if UndoItem[0].VPoint.X = -1 then

begin // Повторное удаление ребра

sgMatrix.Cells[UndoItem[0].VNo,UndoItem[1].VNo]:='';

sgMatrix.Cells[UndoItem[1].VNo,UndoItem[0].VNo]:='';

sgMatrix.Update; // Прорисовка удаленного ребра

RepaintEdge(VCenter[UndoItem[0].VNo-1].X,VCenter[UndoItem[0].VNo-1].Y,

VCenter[UndoItem[1].VNo-1].X,VCenter[UndoItem[1].VNo-1].Y);

end

else

begin // Повторное удаление вершины со смежными ребрами

x:=VCenter[UndoItem[0].VNo-1].X;

y:=VCenter[UndoItem[0].VNo-1].Y;

MainMenu.Items[1].Items[0].Enabled:=True; // Undo

MainMenu.Items[1].Items[1].Enabled:=False; // Redo

RemoveVertex(UndoItem[0].VNo,VCount,RemVrx);

if RemVrx <> Nil then

for j:=0 to High(RemVrx) do // Перерисовка удаленных ребер

RepaintEdge(x,y,RemVrx[j].X,RemVrx[j].Y);

RepaintVertex(x,y); // Перерисовка удаленной вершины

if RemVrx <> Nil then

RepaintAllVertices; // Перерисовка вершин после перенумерации

RemVrx:=Nil;

if VCount = 0 then

begin // Все вершины были повторно удалены

MainMenu.Items[0].Items[0].Enabled:=False; // Новый

btnNew.Enabled:=False;

btnColoring.Enabled:=False;

MainMenu.Items[0].Items[2].Enabled:=False; // Сохранить

MainMenu.Items[0].Items[3].Enabled:=False; // Сохранить как

MainMenu.Items[1].Items[3].Enabled:=True; // Добавить вершину

MainMenu.Items[1].Items[4].Enabled:=False; // Удалить вершину

end

else

begin

GraphChanged:=True; // Граф надо сохранить

MainMenu.Items[0].Items[2].Enabled:=True; // Сохранить

end;

end;

end;

// Заполнение структуры данных для отмены удаления вершины

procedure TfmMain.FillUndoDelVrx(DelVNo: Cardinal);

var VDeg: Word;

i,p: Byte;

begin

VDeg:=0; // Вычисление локальной степени удаляемой вершины

for i:=1 to VCount do

if sgMatrix.Cells[i,DelVNo] <> '' then inc(VDeg);

SetLength(UndoItem,VDeg+1);

p:=0; // Заполнение структуры для отмены удаления

UndoItem[p].VNo:=DelVNo;

UndoItem[p].VPoint:=VCenter[DelVNo-1];

for i:=1 to VCount do

if sgMatrix.Cells[i,DelVNo] <> '' then

begin

inc(p);

UndoItem[p].VNo:=i; // Сохранение данных о смежной вершине

UndoItem[p].VPoint:=VCenter[i-1];

end;

end;

// Подменю СПРАВКА

// Вызов помощи

procedure TfmMain.iHHelpClick(Sender: TObject);

begin

fmHelp.Tag:=1;

self.WindowState:=wsMinimized;

fmHelp.ShowModal;

self.WindowState:=wsNormal;

end;

// О программе

procedure TfmMain.iHAboutClick(Sender: TObject);

begin

fmHelp.Tag:=2;

self.WindowState:=wsMinimized;

fmHelp.ShowModal;

self.WindowState:=wsNormal;

end;

// -------------------- ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕДУРЫ ----------------------

// Запуск процесса раскраски графа

procedure TfmMain.btnColoringClick(Sender: TObject);

var ColorCount,i: Byte;

begin

StatusBar.SimpleText:='Раскраска...';

FillAdMatrix(AdMatrix);

fmInputk.Caption:='Выбор числа цветов k';

fmInputk.StaticText.Caption:='Выберите нужное число цветов из списка:';

fmInputk.btnSet.Caption:='Задать';

fmInputk.ComboBox.Items.Clear;

for i:=1 to VCount do

fmInputk.ComboBox.Items.Add(IntToStr(i));

fmInputk.Tag:=VCount;

if fmInputk.ShowModal = mrOk then

begin

InitUndo;

k:=StrToInt(fmInputk.ComboBox.Text);

// Минимальная раскраска (определение хроматического числа графа)

ColorCount:=DoMinColoring(AdMatrix,VCount,VColor);

if k < ColorCount then

MessageDlg('Раскраска вершин текущего графа ' + IntToStr(k) +

' цветом(ами) невозможна!' + #13 + 'Необходимо не менее ' +

IntToStr(ColorCount) + ' цветов.', mtWarning, [mbOk], 0)

else // Неминимальная раскраска k цветами

DoNonminColoring(VCount,VColor,ColorCount,k);

RepaintAllVertices; // Перерисовка вершин

end;

StatusBar.SimpleText:='Готово';

end;

// Построение матрицы смежности по содержимому sgMatrix

procedure TfmMain.FillAdMatrix(A: TAdMatrix);

var i,j: Byte;

begin

for i:=1 to sgMatrix.RowCount-1 do

for j:=1 to sgMatrix.ColCount-1 do

A[i-1,j-1]:=StrToIntDef(sgMatrix.Cells[j,i],0);

end;

// ---------------- ПРОЦЕДУРЫ ОТОБРАЖЕНИЯ И РЕДАКТИРОВАНИЯ -------------------

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

procedure TfmMain.FormPaint(Sender: TObject);

var i,j: Byte;

VNo: String[3];

VNoWidth,VNoHeight: Word;

begin

Canvas.Pen.Color:=clBlack;

Canvas.Pen.Width:=1;

// Отображение границ области построения графа

Canvas.Brush.Color:=clBtnFace;

Canvas.Brush.Style:=bsSolid;

Canvas.Rectangle(PaintAreaXMin,PaintAreaYMin,

PaintAreaXMin + PaintAreaWidth,PaintAreaYMin + PaintAreaHeight);

Canvas.Pen.Color:=clBlue;

Canvas.Pen.Width:=1;

if MouseIsHeld and not RepaintOldEdge then

begin

// Прорисовка нового ребра, создаваемого перетаскиванием

Canvas.MoveTo(DrawnEdge.src.X,DrawnEdge.src.Y);

Canvas.LineTo(DrawnEdge.dst.X,DrawnEdge.dst.Y);

end;

// Прорисовка ребер графа

Canvas.Pen.Width:=2;

for i:=1 to VCount - 1 do

for j:=i+1 to VCount do

if sgMatrix.Cells[j,i] <> '' then

begin

Canvas.MoveTo(VCenter[i-1].X,VCenter[i-1].Y);

Canvas.LineTo(VCenter[j-1].X,VCenter[j-1].Y);

end;

// Прорисовка вершин графа с учетом назначенных цветов

Canvas.Pen.Color:=clBlack;

Canvas.Pen.Width:=1;

Canvas.Brush.Style:=bsSolid;

for i:=1 to VCount do

begin

Canvas.Ellipse( // Окружность i-й вершины

VCenter[i-1].X - VRadius,VCenter[i-1].Y - VRadius,

VCenter[i-1].X + VRadius,VCenter[i-1].Y + VRadius);

if VColor[i-1] <= 0 then Canvas.Brush.Color:=clWhite

else Canvas.Brush.Color:=RealColors[VColor[i-1]-1];

Canvas.FloodFill( // Закраска окружности

VCenter[i-1].X,VCenter[i-1].Y,Canvas.Pen.Color,fsBorder);

VNo:=IntToStr(i); // Вывод номера вершины

VNoWidth:=Canvas.TextWidth(VNo);

VNoHeight:=Canvas.TextHeight(VNo);

Canvas.TextOut(

VCenter[i-1].X - VNoWidth div 2,VCenter[i-1].Y - VNoHeight div 2,VNo);

end;

end;

// Редактирование матрицы смежности вершин графа

procedure TfmMain.sgMatrixSelectCell(

Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);

var Colored: Boolean;

begin

CanSelect:=True;

if ACol = ARow then Exit;

InitUndo;

if sgMatrix.Cells[ACol,ARow] = '' then

begin // Добавление ребра

sgMatrix.Cells[ACol,ARow]:='1';

sgMatrix.Cells[ARow,ACol]:='1';

end

else

begin // Удаление ребра

sgMatrix.Cells[ACol,ARow]:='';

sgMatrix.Cells[ARow,ACol]:='';

UndoItem[0].VNo:=ARow; // Заполнение структуры для отмены удаления

UndoItem[1].VNo:=ACol;

UndoItem[0].VPoint.X:=-1; // Признак одного удаленного ребра

MainMenu.Items[1].Items[0].Enabled:=True; // Undo

MainMenu.Items[1].Items[1].Enabled:=False; // Redo

end;

RepaintEdge(VCenter[ARow-1].X,VCenter[ARow-1].Y,

VCenter[ACol-1].X,VCenter[ACol-1].Y);

Colored:=ResetColoring(VCount,VColor); // Сброс цветов

if Colored then RepaintAllVertices; // Перерисовка вершин

GraphChanged:=True; // Граф нужно сохранить

MainMenu.Items[0].Items[2].Enabled:=True; // Сохранить

end;

// Добавление или удаление вершины графа мышью

procedure TfmMain.FormMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var i,j: Byte;

RemVrx: TVertices;

Colored,AddVrx: Boolean;

x0,y0: Integer;

begin

if (Button = mbLeft) and (Shift = []) then

begin

if (X < VRadius + PaintAreaXMin) or (Y < VRadius + PaintAreaYMin) or

(X > PaintAreaWidth - (VRadius + 5)) or

(Y > PaintAreaHeight - (VRadius + 5)) then

begin // За пределами области построения графа

Beep;

MouseIsHeld:=false; // Левая клавиша отпущена

MouseHeldVNo:=0;

Repaint;

Exit

end;

if MouseIsHeld then AddVrx:=False else AddVrx:=True;

i:=1;

while i <= VCount do // Проверка наложения вершин

begin

if (abs(VCenter[i-1].X - X) <= VRadius) and

(abs(VCenter[i-1].Y - Y) <= VRadius) then

begin

Colored:=ResetColoring(VCount,VColor); // Сброс цветов

if MouseHeldVNo = i then

begin // Удаление вершины с номером i

MouseHeldVNo:=0;

MouseIsHeld:=false;

x0:=VCenter[i-1].X;

y0:=VCenter[i-1].Y;

FillUndoDelVrx(i); // Сохранение информации для отмены удаления

MainMenu.Items[1].Items[0].Enabled:=True; // Undo

MainMenu.Items[1].Items[1].Enabled:=False; // Redo

RemoveVertex(i,VCount,RemVrx);

if RemVrx <> Nil then

for j:=0 to High(RemVrx) do // Перерисовка удаленных ребер

RepaintEdge(x,y,RemVrx[j].X,RemVrx[j].Y);

RepaintVertex(x0,y0); // Перерисовка удаленной вершины

//if RemVrx <> Nil then

RepaintAllVertices; // Перерисовка вершин после перенумерации

RemVrx:=Nil;

if VCount = 0 then

begin

MainMenu.Items[0].Items[0].Enabled:=False; // Новый

btnNew.Enabled:=False;

btnColoring.Enabled:=False;

MainMenu.Items[0].Items[2].Enabled:=False; // Сохранить

MainMenu.Items[0].Items[3].Enabled:=False; // Сохранить как

MainMenu.Items[1].Items[4].Enabled:=False; // Удалить вершину

end

else

begin

GraphChanged:=True; // Граф нужно сохранить

MainMenu.Items[0].Items[2].Enabled:=True; // Сохранить

end;

end

else

begin // Добавление ребра между вершинами i и MouseHeldVNo

if sgMatrix.Cells[MouseHeldVNo,i] = '' then

begin

InitUndo;

sgMatrix.Cells[MouseHeldVNo,i]:='1';// Добавление ребра в матрицу

sgMatrix.Cells[i,MouseHeldVNo]:='1';

RepaintEdge(VCenter[i-1].X,VCenter[i-1].Y, // Прорисовка ребра

VCenter[MouseHeldVNo-1].X,VCenter[MouseHeldVNo-1].Y);

if Colored then RepaintAllVertices; // Перерисовка вершин

end;

MouseHeldVNo:=0;

MouseIsHeld:=false;

GraphChanged:=True; // Граф нужно сохранить

MainMenu.Items[0].Items[2].Enabled:=True; // Сохранить

end;

Exit

end;

inc(i);

end;

if VCount >= MaxVCount then

begin

MessageDlg('Число вершин графа не должно превышать ' +

IntToStr(MaxVCount) + '!', mtWarning, [mbOk], 0);

Exit

end;

if not AddVrx then

begin // Удерживалась клавиша мыши - вершину не добавляем

MouseIsHeld:=False;

MouseHeldVNo:=0;

RepaintEdge(DrawnEdge.src.X,DrawnEdge.src.Y, // Прорисовка области

DrawnEdge.dst.X,DrawnEdge.dst.Y);

Exit;

end;

InitUndo;

inc(VCount); // Добавление вершины

SetLength(VCenter,VCount);

SetLength(VColor,VCount);

SetLength(AdMatrix,VCount,VCount);

Colored:=ResetColoring(VCount,VColor); // Сброс цветов

sgMatrix.Visible:=True; // Изменение матрицы смежности

sgMatrix.RowCount:=VCount+1;

sgMatrix.Rows[VCount].Clear;

sgMatrix.ColCount:=VCount+1;

sgMatrix.Cols[VCount].Clear;

sgMatrix.FixedCols:=1;

sgMatrix.FixedRows:=1;

sgMatrix.Cells[VCount,0]:=IntToStr(VCount);

sgMatrix.Cells[0,VCount]:=IntToStr(VCount);

VCenter[VCount-1].X:=X; // Задание координат

VCenter[VCount-1].Y:=Y;

if Colored then RepaintAllVertices // Перерисовка вершин

else RepaintVertex(X,Y);

MainMenu.Items[0].Items[0].Enabled:=True; // Новый

btnNew.Enabled:=True;

btnColoring.Enabled:=True;

GraphChanged:=True; // Граф нужно сохранить

MainMenu.Items[0].Items[2].Enabled:=True; // Сохранить

MainMenu.Items[1].Items[4].Enabled:=True; // Удалить вершину

end;

end;

// Захват вершины левой кнопкой мыши

procedure TfmMain.FormMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var i: Byte;

begin

if (Button = mbLeft) and (Shift = [ssLeft]) then

begin

i:=1;

while i <= VCount do // Проверка нажатия на вершине

begin

if (abs(VCenter[i-1].X - X) <= VRadius) and

(abs(VCenter[i-1].Y - Y) <= VRadius) then

begin

MouseIsHeld:=true;

MouseHeldVNo:=i; // Номер выбранной вершины

Exit

end;

inc(i)

end;

end;

end;

// Соединение вершин перетаскиванием

procedure TfmMain.FormMouseMove(

Sender: TObject; Shift: TShiftState; X,Y: Integer);

var Rect: TRect;

begin

if MouseIsHeld then

begin

if (X < PaintAreaXMin) or (Y < PaintAreaYMin) or

(X > PaintAreaWidth) or (Y > PaintAreaHeight) then

// За пределами области построения графа

Exit;

// Очистка области, где ребро было на предыдущем шаге

Rect.Left:=min(DrawnEdge.src.X,DrawnEdge.dst.X)-3;

Rect.Right:=max(DrawnEdge.src.X,DrawnEdge.dst.X)+3;

Rect.Top:=min(DrawnEdge.src.Y,DrawnEdge.dst.Y)-3;

Rect.Bottom:=max(DrawnEdge.src.Y,DrawnEdge.dst.Y)+3;

RepaintOldEdge:=True;

InvalidateRect(Handle,@Rect,true);

Update;

DrawnEdge.src.X:=X; // Прорисовка нового ребра в следующей позиции

DrawnEdge.src.Y:=Y;

DrawnEdge.dst.X:=VCenter[MouseHeldVNo-1].X;

DrawnEdge.dst.Y:=VCenter[MouseHeldVNo-1].Y;

Rect.Left:=min(DrawnEdge.src.X,DrawnEdge.dst.X)-3;

Rect.Right:=max(DrawnEdge.src.X,DrawnEdge.dst.X)+3;

Rect.Top:=min(DrawnEdge.src.Y,DrawnEdge.dst.Y)-3;

Rect.Bottom:=max(DrawnEdge.src.Y,DrawnEdge.dst.Y)+3;

RepaintOldEdge:=False;

InvalidateRect(Handle,@Rect,true);

Update;

end;

end;

procedure TfmMain.RemoveVertex( // Удаление выбранной вершины

VNo: Cardinal; var VCount: byte; var RemVrx: TVertices);

var i,j,RemVCount: Byte;

begin

if VCount = 0 then Exit;

FillAdMatrix(AdMatrix); // Перезапись sgMatrix в матрицу смежности

RemVCount:=0; // Формирование массива координат центров

for i:=1 to VCount do // вершин, смежных с удаляемой

if AdMatrix[VNo-1,i-1] > 0 then

begin

inc(RemVCount);

Setlength(RemVrx,RemVCount);

RemVrx[RemVCount-1].X:=VCenter[i-1].X;

RemVrx[RemVCount-1].Y:=VCenter[i-1].Y;

end;

for i:=VNo to VCount - 1 do // Перенумерация матрицы смежности

begin // и сдвиг массива координат центров вершин

VCenter[i-1]:=VCenter[i];

sgMatrix.Cells[i,0]:=IntToStr(i);

sgMatrix.Cells[0,i]:=IntToStr(i);

end;

j:=VNo-1; // Удаление столбца VNo

while j < VCount - 1 do

begin

for i:=0 to VCount - 1 do AdMatrix[i,j]:=AdMatrix[i,j+1];

inc(j)

end;

i:=VNo-1; // Удаление строки VNo

while i < VCount - 1 do

begin

for j:=0 to VCount - 1 do AdMatrix[i,j]:=AdMatrix[i+1,j];

inc(i)

end;

dec(VCount); // Изменение размеров структур данных

SetLength(VCenter,VCount);

SetLength(VColor,VCount);

SetLength(AdMatrix,VCount,VCount);

if VCount = 0 then begin

InitForm; // Все вершины удалены

Exit

end;

sgMatrix.RowCount:=VCount+1; // Вершины еще остались

sgMatrix.ColCount:=VCount+1;

for i:=1 to VCount do // Восстановление измененной матрицы смежности

for j:=1 to VCount do

if AdMatrix[i-1,j-1]>0 then

begin

sgMatrix.Cells[i,j]:='1';

sgMatrix.Cells[j,i]:='1';

end

else

begin

sgMatrix.Cells[i,j]:='';

sgMatrix.Cells[j,i]:='';

end;

end;

// Перерисовка вершины на форме

procedure TfmMain.RepaintVertex(x,y: Integer; ForceUpdate: Boolean);

var Rect: TRect;

begin

Rect.Left:=x-VRadius;

Rect.Right:=x+VRadius;

Rect.Top:=y-VRadius;

Rect.Bottom:=y+VRadius;

InvalidateRect(Handle,@Rect,true);

if ForceUpdate then Update;

end;

// Перерисовка всех вершин на форме

procedure TfmMain.RepaintAllVertices;

var i: Byte;

begin

if VCount = 0 then Exit;

for i:=0 to VCount - 1 do

RepaintVertex(VCenter[i].X,VCenter[i].Y,false);

Update;

end;

// Перерисовка ребра на форме

procedure TfmMain.RepaintEdge(x1,y1,x2,y2: Integer);

var Rect: TRect;

begin

Rect.Left:=min(x1,x2)-2;

Rect.Right:=max(x1,x2)+2;

Rect.Top:=min(y1,y2)-2;

Rect.Bottom:=max(y1,y2)+2;

InvalidateRect(Handle,@Rect,true);

Update;

end;

// ------------------------ ИНИЦИАЛИЗАЦИЯ -----------------------------

// Приведение вида формы к исходному состоянию

procedure TfmMain.InitForm(Repaint: Boolean);

begin

VCount:=0;

sgMatrix.Visible:=False;

sgMatrix.RowCount:=1;

sgMatrix.ColCount:=1;

stGraph.Caption:='Исходный граф: ';

if Repaint then fmMain.Repaint;

end;

// Инициализация глобальных и компонентных данных модуля

procedure TfmMain.FormActivate(Sender: TObject);

begin

InitForm(False);

InitUndo;

Randomize;

PaintAreaXMin:=stGraph.Left;

PaintAreaYMin:=stGraph.Top + stGraph.Height;

PaintAreaWidth:=sgMatrix.Left - PaintAreaXMin;

PaintAreaHeight:=StatusBar.Top - PaintAreaYMin;

MouseIsHeld:=False;

MouseHeldVNo:=0;

RepaintOldEdge:=False;

GraphChanged:=False;

MainMenu.Items[0].Items[0].Enabled:=False; // Новый

MainMenu.Items[0].Items[2].Enabled:=False; // Сохранить

MainMenu.Items[0].Items[3].Enabled:=False; // Сохранить как

MainMenu.Items[1].Items[4].Enabled:=False; // Удалить вершину

btnNew.Enabled:=False;

btnColoring.Enabled:=False;

StatusBar.SimpleText:='Готово';

end;

// Завершающие действия

procedure TfmMain.FormDeactivate(Sender: TObject);

begin

AdMatrix:=Nil;

VCenter:=Nil;

VColor:=Nil;

UndoItem:=Nil;

end;

// Запрос на закрытие формы

procedure TfmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

btnExitClick(Sender);

CanClose:=True;

end;

// Инициализация структуры данных об отмененном действии

procedure TfmMain.InitUndo;

begin

SetLength(UndoItem,2);

UndoItem[0].VNo:=0;

UndoItem[1].VNo:=0; // Блокировка пунктов меню

MainMenu.Items[1].Items[0].Enabled:=False; // Undo

MainMenu.Items[1].Items[1].Enabled:=False; // Redo

end;

end.

unit uData;

interface

uses Types, Graphics;

const MaxVCount = 30; // Максимальное число вершин графа

type // Глобально используемые типы

TAdMatrix = array of array of Byte; // Матрица смежности графа

TColoring = array of ShortInt; // Вектор цветов вершин

TRealColors = array[0..MaxVCount-1] of TColor; // Системные имена цветов

TVertices = array of TPoint; // Координаты центров вершин

TGraphFile = file of Byte; // Файл графа

implementation

end.

unit uFiling;

interface

uses uData;

// Функция сохранения графа в файле по матрице смежности

function DoSaveFile(const FileName: string; const AdMatrix: TAdMatrix): Boolean;

// Функция чтения графа из файла в матрицу смежности

function DoReadFile(const FileName: string;

var VCount: Byte; var AdMatrix: TAdMatrix): Boolean;

implementation

uses Math;

var GraphFile: TGraphFile; // Файл для сохранения графа

// Функция сохранения графа в файле по матрице смежности

function DoSaveFile(const FileName: string; const AdMatrix: TAdMatrix): Boolean;

var VCount,FileSize: Word;

FileImage: array of Byte;

i,j,Bit,m,u: Byte;

begin

result:=False;

if (FileName='') or (AdMatrix=Nil) then Exit;

AssignFile(GraphFile,FileName);

try // Открытие файла на запись

Rewrite(GraphFile);

except

Exit

end;

VCount:=High(AdMatrix)+1; // Создание массива для образа файла

FileSize:=Ceil(VCount*(VCount-1)/16);

SetLength(FileImage,FileSize+1);

FileImage[0]:=VCount;

Write(GraphFile,FileImage[0]);

m:=1; u:=0; Bit:=0;

for i:=0 to VCount - 2 do

for j:=i+1 to VCount - 1 do

begin // Перезапись матрицы смежности в массив

if Bit > 0 then u:=u shl 1;

inc(Bit);

if AdMatrix[i,j] > 0 then u:=u or $1;

if Bit >= 8 then

begin

Bit:=0;

FileImage[m]:=u;

Write(GraphFile,FileImage[m]);

inc(m);

u:=0;

end;

end;

if Bit > 0 then // Дозапись последнего байта

begin

FileImage[m]:=u;

Write(GraphFile,FileImage[m]);

end;

CloseFile(GraphFile);

FileImage:=Nil;

result:=True;

end;

// Функция чтения графа из файла в матрицу смежности

function DoReadFile(const FileName: string;

var VCount: Byte; var AdMatrix: TAdMatrix): Boolean;

var OldVCount,FileSize: Word;

FileImage: array of Byte;

i,j,k,mask,q: Byte;

begin

result:=True;

if FileName='' then Exit;

AssignFile(GraphFile,FileName);

try // Открытие файла на чтение

Reset(GraphFile);

except

result:=False;

Exit

end;

OldVCount:=VCount;

Read(GraphFile,VCount); // Чтение числа вершин графа

if VCount > MaxVCount then begin

VCount:=OldVCount; // Некорректное число вершин

result:=False;

end

else

begin // Считывание матрицы смежности в массив

FileSize:=Ceil(VCount*(VCount-1)/16);

SetLength(FileImage,FileSize);

k:=0;

while not eof(GraphFile) do

begin

Read(GraphFile,FileImage[k]);

inc(k);

end;

if k = 0 then result:=False

else

begin

// Преобразование массива в матрицу смежности графа

SetLength(AdMatrix,VCount,VCount);

i:=0; j:=1;

for k:=0 to FileSize - 1 do

begin // Преобразование k-го элемента массива

if k = FileSize - 1 then

begin

mask:=1; // Расчет числа значащих бит последнего элемента

q:=(VCount*(VCount-1) div 2) mod 8;

mask:=mask shl (q-1);

end

else mask:=$80;

repeat // Распаковка битового образа элемента массива

if mask and FileImage[k] > 0 then

begin

AdMatrix[i,j]:=1;

AdMatrix[j,i]:=1;

end;

inc(j);

if j = VCount then

begin

inc(i);

j:=i+1;

end;

mask:=mask shr 1;

until mask = 0;

end;

end;

FileImage:=Nil;

end;

CloseFile(GraphFile);

end;

end.

unit uColoring;

interface

uses uData, Graphics;

// Раскраска графа в минимальное число цветов

function DoMinColoring(const AdMatrix: TAdMatrix;

VCount: Cardinal; VColor: TColoring): Word;

// Раскраска графа в NewColorCount цветов по найденной минимальной раскраске

procedure DoNonminColoring(VCount: Cardinal; VColor: TColoring;

MinColorCount, NewColorCount: Byte);

// Обнуление массива цветов вершин графа

function ResetColoring(VCount: Cardinal; VColor: TColoring): boolean;

var RealColors: TRealColors; // Фактические цвета раскраски вершин

implementation

uses uInputk;

var VDegree: array of ShortInt; // Массив относительных локальных степеней

VNumber: array of Byte; // Отсортированный массив номеров вершин

Uncolored: set of Byte; // Множество не раскрашенных вершин

// Процедура сортировки массива локальных степеней методом вставки

procedure InsertionSort(var A: array of ShortInt;

var V: array of Byte; size: SmallInt);

var i1, i2, i2sav: SmallInt;

tmpA: ShortInt;

tmpV: Byte;

begin

i2 := 1; // номер сортируемого элемента

while i2 < size do // перебор всех элементов до крайнего справа

begin

i1 := i2 - 1; // номер элемента левой части

i2sav := i2; // запоминаем начало неотсортированной части

while i1 >= 0 do // пока не дошли до левой границы

begin

if A[i1] < A[i2] then // нужна перестановка

begin

tmpA := A[i1]; // перестановка

A[i1] := A[i2];

A[i2] := tmpA;

tmpV := V[i1];

V[i1] := V[i2];

V[i2] := tmpV

end else break; // место для элемента нашли

dec(i1); // идем влево

dec(i2);

end;

i2 := i2sav + 1; // на следующий элемент

end;

end;

// Раскраска графа в минимальное число цветов

function DoMinColoring(const AdMatrix: TAdMatrix;

VCount: Cardinal; VColor: TColoring): Word;

var i,j: Byte; // Индексы для перебора вершин

CurColor: ShortInt; // Текущий цвет

VCur: Byte; // Номер текущей раскрашиваемой вершины

Colorable: Boolean; // Признак отсутствия вершин, которые

// можно раскрасить в цвет CurColor

label ColFound;

begin

result:=0;

SetLength(VDegree,VCount);

SetLength(VNumber,VCount);

Uncolored:=[]; // Считаем все вершины нераскрашенными

for i:=1 to VCount do

begin

include(Uncolored,i);

VColor[i-1]:=-1;

end;

CurColor:=1; // Начинаем с первого цвета

repeat // Цикл раскраски

for i:=1 to VCount do // Расчет относительных локальных степеней

begin

VNumber[i-1]:=i;

if VColor[i-1] < 0 then

begin

VDegree[i-1]:=0;

for j:=1 to VCount do

if VColor[j-1] < 0 then

VDegree[i-1]:=VDegree[i-1] + AdMatrix[i-1,j-1];

end

else VDegree[i-1]:=-1;

end;

// Сортировка относительных локальных степеней по неубыванию

InsertionSort(VDegree,VNumber,VCount);

Colorable:=True; // Поиск и раскраска очередной вершины

VCur:=1;

while VCur <= VCount do

begin

if VDegree[VCur-1] < 0 then break;

i:=1;

while i <= VCount do

begin

if VColor[i-1] = CurColor then

if AdMatrix[i-1,VNumber[VCur-1]-1] > 0 then

begin

inc(VCur);

break;

end;

inc(i);

end;

if i > VCount then goto ColFound;

end;

Colorable:=False; // Вершин для раскраски цветом CurColor больше нет

ColFound:

if Colorable then

begin // Пометка найденной вершины цветом CurColor

VColor[VNumber[VCur-1]-1]:=CurColor;

exclude(Uncolored,VNumber[VCur-1]);

result:=CurColor;

end

// В текущий цвет вершины раскрасить нельзя, берем следующий

else inc(CurColor);

until Uncolored=[];

VDegree:=Nil;

VNumber:=Nil

end;

// Раскраска графа в NewColorCount цветов по найденной минимальной раскраске

procedure DoNonminColoring(VCount: Cardinal; VColor: TColoring;

MinColorCount, NewColorCount: Byte);

var i,j: Byte;

begin

if MinColorCount >= NewColorCount then Exit;

for i:=1 to VCount - 1 do

for j:=i+1 to VCount do

if VColor[j-1] = VColor[i-1] then

begin

inc(MinColorCount);

VColor[j-1]:=MinColorCount;

if MinColorCount >= NewColorCount then Exit;

end;

end;

// Обнуление массива цветов вершин графа

function ResetColoring(VCount: Cardinal; VColor: TColoring): boolean;

var i: Byte;

begin

result:=false;

if VCount = 0 then Exit;

for i:=0 to VCount - 1 do

if VColor[i] > 0 then

begin

result:=true;

VColor[i]:=-1;

end;

end;

begin

// Установка цветов для раскраски вершин графа на форме

RealColors[0]:=clYellow;

RealColors[1]:=clAqua;

RealColors[2]:=clMaroon;

RealColors[3]:=clRed;

RealColors[4]:=clSkyBlue;

RealColors[5]:=clGreen;

RealColors[6]:=clPurple;

RealColors[7]:=clTeal;

RealColors[8]:=clSilver;

RealColors[9]:=clOlive;

RealColors[10]:=clNavy;

RealColors[11]:=clltGray;

RealColors[12]:=clLime;

RealColors[13]:=clFuchsia;

RealColors[14]:=clMedGray;

RealColors[15]:=clMoneyGreen;

RealColors[16]:=clBlue;

RealColors[17]:=clCream;

RealColors[18]:=clWhite;

//...

end.

unit uInputk;

interface

uses

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

Dialogs, StdCtrls, Buttons;

type

TfmInputk = class(TForm)

ComboBox: TComboBox;

StaticText: TStaticText;

btnSet: TBitBtn;

btnCancel: TBitBtn;

procedure btnSetClick(Sender: TObject);

procedure btnCancelClick(Sender: TObject);

procedure ComboBoxChange(Sender: TObject);

procedure FormActivate(Sender: TObject);

private

public

end;

var

fmInputk: TfmInputk;

implementation

{$R *.dfm}

procedure TfmInputk.btnSetClick(Sender: TObject); // Установить значение

begin

if ComboBox.Text = '' then ModalResult:=mrNone

else ModalResult:=mrOk;

end;

procedure TfmInputk.btnCancelClick(Sender: TObject); // Игнорировать ввод

begin

ModalResult:=mrCancel;

end;

procedure TfmInputk.ComboBoxChange(Sender: TObject); // Проверка по числу

// вершин

var i: Integer;

begin

i:=StrToIntDef(ComboBox.Text,0);

if (i < 1) or (i > ComboBox.Tag) then

ComboBox.Text:='';

end;

procedure TfmInputk.FormActivate(Sender: TObject); // Обнуление поля ввода

begin

ComboBox.Text:='';

end;

end.

unit uHelp;

interface

uses

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

Dialogs, ExtCtrls, StdCtrls, ComCtrls;

type

TfmHelp = class(TForm)

Panel: TPanel;

RichEdit: TRichEdit;

procedure FormActivate(Sender: TObject);

procedure FormDeactivate(Sender: TObject);

private

public

end;

var

fmHelp: TfmHelp;

implementation

{$R *.dfm}

const HelpFileName: string = 'coloring.hlp'; // Имя файла справки

procedure TfmHelp.FormActivate(Sender: TObject);

begin

if Tag = 1 then // Окно используется в режиме помощи

try

self.Caption:='Помощь';

RichEdit.Font.Size:=9;

RichEdit.Font.Color:=clBlack;

Panel.Height:=round(Panel.Width * 1.3);

self.Position:=poMainFormCenter;

RichEdit.ScrollBars:=ssVertical;

RichEdit.Lines.LoadFromFile(HelpFileName);

except

MessageDlg('Ошибка при открытии или чтении файла справки!', mtError,

[mbOk], 0);

Exit

end

else

begin // Окно используется в режиме "о программе"

self.Caption:='О программе';

Panel.Height:=Panel.Width div 5;

self.Position:=poMainFormCenter;

RichEdit.Lines.Clear;

RichEdit.ScrollBars:=ssNone;

RichEdit.Font.Size:=10;

RichEdit.Font.Color:=clBlue;

RichEdit.Lines.Append('Курсовая работа по дисциплине Программирование на

языке высокого уровня.');

RichEdit.Lines.Append('');

RichEdit.Lines.Append('Тема работы: Прикладная программа. Раскраска

графа.');

RichEdit.Lines.Append('');

RichEdit.Lines.Append('Выполнила слушатель гр.___________________');

RichEdit.Lines.Append('Руководитель работы: _____________________');

end;

end;

procedure TfmHelp.FormDeactivate(Sender: TObject);

begin

RichEdit.Font.Size:=8;

RichEdit.Font.Color:=clBlack;

end;

end.

Размещено на Allbest.ru


Подобные документы

  • Этапы нахождения хроматического числа произвольного графа. Анализ примеров раскраски графа. Характеристика трудоемкости алгоритма раскраски вершин графа Мейниеля. Особенности графов, удовлетворяющих структуру графов Мейниеля, основные классы графов.

    курсовая работа [1,1 M], добавлен 26.06.2012

  • Математические графы, области их применения. Способы раскраски вершин и ребер графов, задачи на их применение. Разработка алгоритма, работающего на основе операций с матрицей смежности. Описание логической структуры программы. Пример зарисовки графа.

    курсовая работа [145,5 K], добавлен 27.01.2013

  • Элементы языка Object Pascal: идентификаторы, константы, переменные, выражения. Структура проекта Delphi. Операторы и метки. Типы данных языка OPascal. Статические и динамические массивы. Записи с вариантными полями. Совместимость и преобразование типов.

    курс лекций [385,4 K], добавлен 18.02.2012

  • Основные понятия и определения теории графов: теоремы и способы задания графа, сильная связность графов. Построение блок-схем алгоритма, тестирование разработанного программного обеспечения, подбор тестовых данных, анализ и исправление ошибок программы.

    курсовая работа [525,6 K], добавлен 14.07.2012

  • История и термины теории графов. Описание алгоритма Дейкстры. Математическое решение проблемы определения кратчайшего расстояния от одной из вершин графа до всех остальных. Разработка программы на объектно-ориентированном языке программирования Delphi 7.

    контрольная работа [646,9 K], добавлен 19.01.2016

  • Способы построения остовного дерева (алгоритма поиска в глубину и поиска в ширину). Вид неориентированного графа. Понятие и алгоритмы нахождения минимальных остовных деревьев. Последовательность построения дерева графов по алгоритмам Крускала и Прима.

    презентация [22,8 K], добавлен 16.09.2013

  • Работа с файлами на языке Pascal. Типы файлов: типизированные, текстовые, нетипизированные. Сущность процедуры и функции. Использование процедуры Read и Write для операций чтения и записи в типизированном файле. Листинг программы и экранные формы.

    лабораторная работа [38,4 K], добавлен 13.02.2009

  • Написание игры "Lines" на языке Object Pascal в среде Delphi. Алгоритм работы программы. Описание метода генерации поля. Используемые константы и переменные. Форма приложения после старта игрового процесса. Основные элементы формы и обработки событий.

    курсовая работа [225,0 K], добавлен 12.04.2012

  • Характеристика вычислительной системы и инструментов разработки. Программирование на языке Pascal в среде Turbo Pascal и на языке Object Pascal в среде Delphi. Использование процедур, функций, массивов, бинарного поиска. Создание базы данных в виде файла.

    отчет по практике [2,1 M], добавлен 02.05.2014

  • Элементы и переменные, используемые для составления записи в Паскале. Основные числовые типы языка Turbo Pascal. Составление блок-схемы приложения, программирование по ней программы для вычисления функции. Последовательность выполнения алгоритма.

    лабораторная работа [256,9 K], добавлен 10.11.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.