Графы их использование

Понятие графа, его строение и отличия орентированного вида от мультиграфа. Значение данных математических структур. Особенности использования модулей и процедур. Аспекты функциональной схемы, описание составляющих, листинг и результат работы программы.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык русский
Дата добавления 24.04.2009
Размер файла 98,7 K

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

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

11

16

Содержание

1. Задание

2. Основные сведения о графах

3. Использование модулей в программе

4. Структура данных

5. Функциональная схема

6. Описание программы и подпрограмм

7. Листинг программы

8. Результат работы программы

Задание.

Вариант №23

В файле записаны предложения по обмену жилплощадью в пределах некоторого города. Имеются варианты размена одной квартиры на две других либо наоборот. Требуется по заявке клиента предложить способы обмена. Предусмотреть возможность нахождения циклических обменов, в которых участвуют более двух сторон. Найденные варианты выдать в порядке возрастания числа участвующих в обмене сторон.

2. Основные сведения о графах

Графом называется конечное множество вершин, соединенных ребрами. Если ребра являются направленными, то граф называется ориентированным (орграфом). Направленные ребра часто называют дугами. Каждое ребро соединяет две вершины, причем, в графе две вершины соединяются только одним ребром. В противоположном случае используется понятие мультиграфа (графа с кратными или параллельными ребрами).

Две вершины графа называются смежными, если они соединены ребром. Вершина инцидентна ребру, если ребро соединяет ее с другой какой-то вершиной. Петля - ребро, соединяющее вершину саму с собой. Степень вершины - это число инцидентных ей ребер. Цепью называется последовательность неповторяющихся ребер, соединяющих какие-либо две вершины графа. Замкнутая цепь в графе называется циклом.

Каждая дуга орграфа имеет начало и конец, соответственно, дуга (ребро) выходит из вершины или входит в вершину, и понятие смежности для орграфа не является симметричным. Для каждой вершины определяют полустепень исхода (число выходящих ребер). Для орграфа вместо понятий цикл и цепь используются понятия контур и путь.

Ребра графа могут иметь вес, который может интерпретироваться, например, как длинна ребра.

Графы являются одной из наиболее часто используемых математических структур, так как они удобны для задания связи между объектами.

3. Использование модулей в программе

Модуль Crt содержит процедуры и функции управления тестовым выводом на экран дисплея, и чтения клавиатуры.

Стандартные процедуры (модуля crt)

clrscr - очищает экран и помещает курсор в левый верхний угол.

gotoxy - перемещает курсор по заданным координатам.

textcolor - задает цвет выводимого на экран текста.

readkey- читает символ из буфера клавиатуры.

4. Структура данных

type

ukaz=^uzel;

point=^duga;

t_ukaz=^temp;

uzel=record {структура узла графа}

ishod, konec, name: string[20];

x, y: byte;

pr: char;

next: ukaz; {следующий}

svd: point; {связь с дугой}

pred: ukaz; {предыдущий}

end;

duga=record {структура дуги графа}

name: string[25];

next: point;

svv: ukaz;

{связь с вершиной}

pred_v: ukaz;

end;

temp=record

{структура временных указателей}

s_duga: point;

{связь с дугой}

next: t_ukaz;

end;

var

str, fname, st: string;

top, p, pp, p_p, out_p, in_p: ukaz;

{указатели на узлы графа}

d_p, d_pp: point;

{указатели на дуги графа}

t_top, t_p, t_pp, t_t, t_tt, t_v, t_end: t_ukaz;

{временные указатели}

ch: char;

j, i, k, l, c, y, min, x, shag, kol_cikl: word;

cikl, povtor, ex, exit_s: boolean;

f: text;

spisok: array[1..100] of string;

{файл-список всевозможных обменов}

5. Функциональная схема

11

16

6. Описание программы

Программа написана на языке Borland Pascal 7.1. Программа состоит из главной программы и подпрограмм.

Peshat-

Clear-

Menu-

Zapros-

CreateGraph-

Poisk-

7. Листинг программы

uses crt;

type

ukaz=^uzel;

point=^duga;

t_ukaz=^temp;

uzel=record

{структура узла графа}

ishod, konec, name: string[20];

x, y: byte;

pr: char;

next: ukaz; {следующий}

svd: point; {связь с дугой}

pred: ukaz; {предыдущий}

end;

duga=record {структура дуги графа}

name: string[25];

next: point;

svv: ukaz; {связь с вершиной}

pred_v: ukaz;

end;

temp=record {структура временных указателей}

s_duga: point; {связь с дугой}

next: t_ukaz;

end;

var

str, fname, st: string;

top, p, pp, p_p, out_p, in_p: ukaz; {указатели на узлы графа}

d_p, d_pp: point; {указатели на дуги графа}

t_top, t_p, t_pp, t_t, t_tt, t_v, t_end: t_ukaz; {временные указатели}

ch: char;

j, i, k, l, c, y, min, x, shag, kol_cikl: word;

cikl, povtor, ex, exit_s: boolean;

f: text;

spisok: array[1..100] of string;

procedure clear; {очистка памяти}

begin

if t_top<>nil then

begin

repeat

t_p:=t_top;

if t_top^.next<>nil then t_top:=t_top^.next

else

begin

t_top^.s_duga:=nil;

t_top:=nil;

end;

t_p^.s_duga:=nil;

dispose(t_p);

t_p:=nil;

until t_p=nil;

end;

if top<>nil then

begin

repeat

p:=top;

if p^.svd<>nil then

begin

d_pp:=p^.svd;

repeat

d_p:=d_pp;

if d_p^.next<>nil then d_pp:=d_p^.next;

dispose(d_p);

if d_p=d_pp then d_pp:=nil;

d_p:=nil;

until d_pp=nil;

end;

if p^.next<>nil then

begin

pp:=p^.next;

top:=pp;

end;

dispose(p);

if p=pp then pp:=nil;

until pp=nil;

end;

end;

procedure createGraph; {создание графа из файла}

begin

assign(f,'c:\Spisok.dat');

reset(f);

while not eof(f) do

begin

readln(f,st);

while length(st)=0 do readln(st);

i:=0;

repeat i:=i+1; until (st[i]='(') or (i>length(st));

if st[i]='(' then

begin

new(p);

p^.svd:=nil; p^.next:=nil;

p^.ishod:=''; p^.konec:=''; p^.name:='';

p^.pr:=#0;

if top=nil then top:=p

else pp^.next:=p;

pp:=p;

i:=i+1;

repeat

p^.name:=p^.name+st[i];

i:=i+1;

until st[i]=')';

repeat i:=i+1; until (st[i]='(') or (i>length(st));

repeat

p^.ishod:=p^.ishod+st[i];

i:=i+1;

until st[i-1]=')';

end;

repeat i:=i+1; until (st[i]='(') or (i>length(st));

if st[i]='(' then

begin

repeat

p^.konec:=p^.konec+st[i];

i:=i+1;

until st[i-1]=')';

end;

end;

pp:=top;

while pp<>nil do

begin

p:=top;

while p<>nil do

begin

if p^.ishod=pp^.konec then

begin

new(d_p);

d_p^.pred_v:=pp;

if pp^.svd=nil then pp^.svd:=d_p

else d_pp^.next:=d_p;

d_pp:=d_p;

d_p^.svv:=p;

d_p^.next:=nil;

end;

p:=p^.next;

end;

pp:=pp^.next;

end;

end;

procedure poisk(kvar1, kvar2: string); {поиск циклов}

begin

p:=top;

pp:=top;

kol_cikl:=1;

repeat

cikl:=true;

p_p:=top;

while p_p<>nil do

begin

p_p^.pr:=#0;

p_p:=p_p^.next;

end;

while (pp^.ishod<>kvar2) and (pp^.next<>nil) do pp:=pp^.next;

if pp^.ishod=kvar2 then

begin

p_p:=pp;

if pp^.konec=kvar1 then

begin

spisok[kol_cikl]:=pp^.name;

kol_cikl:=kol_cikl+1;

end;

repeat

repeat

d_pp:=pp^.svd;

p:=pp;

while (d_pp^.svv^.pr='z') and (d_pp<>nil) do d_pp:=d_pp^.next;

if d_pp<>nil then

begin

pp^.pr:='z';

new(t_p);

t_p^.s_duga:=nil; t_p^.next:=nil;

if t_top=nil then t_top:=t_p

else t_pp^.next:=t_p;

t_pp:=t_p;

t_p^.s_duga:=d_pp;

t_p^.s_duga^.pred_v:=pp;

end

else

repeat

cikl:=true;

while t_pp^.s_duga^.next=nil do

begin

if t_pp<>t_top then

begin

t_p:=t_top;

while t_p^.next<>t_pp do t_p:=t_p^.next;

dispose(t_pp);

t_p^.next:=nil;

t_pp:=t_p;

t_p^.s_duga^.svv^.pr:=#0;

end

else

begin

cikl:=false;

break;

end;

end;

if (not cikl) or (t_top=nil) then break;

t_pp^.s_duga:=t_pp^.s_duga^.next;

d_pp:=t_pp^.s_duga;

while (d_pp^.svv^.pr='z') and (d_pp<>nil) do d_pp:=d_pp^.next;

until d_pp<>nil;

if (not cikl) or (t_top=nil) then break;

pp:=d_pp^.svv;

cikl:=true;

until (pp^.konec=kvar1);

if (not cikl) or (t_top=nil) then break;

if pp^.konec=kvar1 then

begin

cikl:=true;

t_p:=t_top;

writeln;

spisok[kol_cikl]:='';

repeat

spisok[kol_cikl]:=spisok[kol_cikl]+t_p^.s_duga^.pred_v^.name+' -> ';

t_pp:=t_p;

t_p:=t_p^.next;

until t_p=nil;

spisok[kol_cikl]:=spisok[kol_cikl]+pp^.name;

writeln(spisok[kol_cikl]);

kol_cikl:=kol_cikl+1;

repeat

while t_pp^.s_duga^.next=nil do

begin

if t_pp<>t_top then

begin

t_p:=t_top;

while t_p^.next<>t_pp do t_p:=t_p^.next;

dispose(t_pp);

t_p^.next:=nil;

t_pp:=t_p;

t_p^.s_duga^.svv^.pr:=#0;

cikl:=true;

end

else

begin

cikl:=false;

break;

end;

end;

if not cikl then break;

t_pp^.s_duga:=t_pp^.s_duga^.next;

d_pp:=t_pp^.s_duga;

while (d_pp^.svv^.pr='z') and (d_pp<>nil) do d_pp:=d_pp^.next;

until d_pp<>nil;

if not cikl then break;

end;

pp:=d_pp^.svv;

until not cikl;

if not cikl then

begin

dispose(t_pp);

t_top:=nil;

end;

pp:=p_p^.next;

end

else break;

until pp=nil;

end;

procedure zapros; {ввод запроса}

var

zap, kvar1, kvar2, text: string;

ok: boolean;

i, temp, pos: byte;

cod: integer;

begin

writeln('ВНИМАНИЕ: исходный файл должен быть: C:\SPISOK.DAT',#10);

pos:=0;

repeat

pos:=pos+1;

if pos=1 then writeln('МЕНЯЕМ: ');

if pos=2 then writeln(#10,'HA: ');

repeat

write (' Количество квартир: ');

readln(zap);

val(zap, temp, cod);

until cod=0;

kvar2:='('+zap+'/{';

for i:=1 to temp do

begin

repeat

write(' Количество комнат в ',i,'-й квартире: ');

readln(zap);

val(zap, temp, cod);

until cod=0;

kvar2:=kvar2+zap+' ';

end;

kvar2[length(kvar2)]:='}';

kvar2:=kvar2+')';

if pos=1 then kvar1:=kvar2;

until pos=2;

poisk(kvar1,kvar2);

end;

procedure menu;

begin

clrscr;

createGraph;

zapros;

end;

procedure pechat; {печать результатов}

begin

repeat

exit_s:=true;

for i:=1 to kol_cikl-1 do

if length(spisok[i])>length(spisok[i+1]) then

begin

st:=spisok[i];

spisok[i]:=spisok[i+1];

spisok[i+1]:=st;

exit_s:=false;

end;

until exit_s;

clrscr;

assign(f,'c:\out.dat');

rewrite(f);

for i:=1 to kol_cikl do writeln(f,spisok[i]);

close(f);

writeln('По запросу найдено ',kol_cikl-1,' вариантов обмена');

writeln(#10,'Результат смотрите в файле: OUT.DAT');

end;

BEGIN

menu;

clear;

if kol_cikl>1 then pechat

else writeln(#10,'ПО ДАННОМУ ЗАПРОСУ НИЧЕГО НЕ НАЙДЕНО');

readln;

END.

8. Результат работы программы

Обход вершин графа, строящегося при работе программы, имеет вид:


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

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

    курсовая работа [219,9 K], добавлен 25.11.2009

  • Характеристика программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит результаты на экран. Описание переменных в программе, ее блок-схема и алгоритм работы. Листинг программы. Описание входных данных и результат вычислений.

    курсовая работа [721,4 K], добавлен 10.11.2010

  • Разработка функциональной и принципиальной схемы. Выбор управляющего контроллера. Описание МК PIC16F626, МК AVR, МК 51. Выбор элементной базы. Разработка управляющей программы. Описание алгоритма работы программы. Схема устройства, листинг программы.

    курсовая работа [492,9 K], добавлен 28.12.2012

  • Разработка программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит на экран заданную информацию. Типы блок-схем и их использование при написании программы. Описание входных данных и результат вычислений, листинг программы.

    курсовая работа [680,3 K], добавлен 03.08.2009

  • Особенности работы с процедурами и двумерными массивами, последовательность вызова процедур. Способы описания и использования многомерных массивов, назначение процедур, их описание и обращение к ним. Набор программы, ее отладка и тестирование данных.

    лабораторная работа [112,1 K], добавлен 03.10.2010

  • Создание базы данных и СУБД. Структура простейшей базы данных. Особенности языка программирования Турбо Паскаль. Описание типов, констант, переменных, процедур и функций. Описание алгоритма базы данных (для сотрудников ГИБДД), листинг программы.

    курсовая работа [26,3 K], добавлен 26.01.2012

  • Разработка блок-схемы и программы обработки одномерного массива с доступом к элементам с помощью индексов и с помощью указателей. Словесное описание алгоритма и пользовательского интерфейса, листинг программы обработки матрицы и результат её выполнения.

    курсовая работа [391,1 K], добавлен 30.09.2013

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

    контрольная работа [290,6 K], добавлен 17.07.2012

  • Описание алгоритма решения задачи графическим способом. Вывод элементов массива. Описание блоков укрупненной схемы алгоритма на языке Pascal. Листинг программы, а также ее тестирование. Результат выполнения c помощью ввода различных входных данных.

    контрольная работа [150,4 K], добавлен 03.05.2014

  • Создание на языке C базы данных "Стадионы города", требования к программе. Осуществление загрузки базы данных в массив и вывод главного меню в основной программе. Алгоритм работы программы в виде блок-схемы. Описание функций программы и ее листинг.

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

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