Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прошу помочь с кусочком программы! 
:(
    Опции темы
LoveMeCozImBLONDE
Дата 28.5.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.5.2009

Репутация: нет
Всего: нет



Начну с начала.
Работа курсовой заключается в Разукрашивании вершин произвольного графа.
Ету процедуру я написал, всё отлично работает.
теперь хочется сделать етакое:
-вывести граф на екран, заданый матрицей смежности(M[1..N,1..N], где N-число вершин.
Строки и столбцы-номера вершин,на пересечении вес ребра соединяющегоэти вершины или бесконечность (машинная) если ребра нет. (нули по диагонали)

причем количество вершин вводит пользователь.
Была у меня идея, разместить вершины на окружности некоего круга, но до её реализации дело не дошло.
естественно ето всё в графическом режиме.

з.ы. Подкиньте хотя бы идею как ето сделать.
       Осуществить может и сам смогу.

Это сообщение отредактировал(а) LoveMeCozImBLONDE - 28.5.2009, 00:07
PM MAIL   Вверх
volvo877
Дата 29.5.2009, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(LoveMeCozImBLONDE @  28.5.2009,  00:02 Найти цитируемый пост)
Была у меня идея, разместить вершины на окружности некоего круга, но до её реализации дело не дошло.
Чего ж не дошло? Нормальная идея, вот так примерно:
Код

uses graph;
const
  size  =   5;
  R     = 150;
  E     =  30;
  angle = 2 * Pi / size;

var
  vertex: array[0 .. pred(size)] of PointType;
const
  adj_mx: array[0 .. pred(size), 0 .. pred(size)] of integer =
  (
    (0, 0, 1, 1, 0),
    (0, 0, 0, 1, 1),
    (1, 0, 0, 0, 1),
    (1, 1, 0, 0, 0),
    (0, 1, 1, 0, 0)
  );

function inttostr(X: integer): string;
var s: string;
begin
  str(X, s); inttostr := s;
end;

var
  g_driver, g_mode, errcode: integer;
  i, j, center_x, center_y: integer;

begin
  g_driver := detect;
  initgraph(g_driver, g_mode, '');
  errcode := graphresult;
  if errcode <> grok then begin
    writeln('graphics error: ', grapherrormsg(errcode));
    readln; halt(101);
  end;

  center_x := getmaxx div 2;
  center_y := getmaxy div 2;
  for i := 0 to pred(size) do begin
    vertex[i].x := center_x + trunc(R * cos(Pi/2 + i * angle));
    vertex[i].y := center_y - trunc(R * sin(Pi/2 + i * angle));
  end;

  for i := 0 to pred(size) do begin
    for j := 0 to pred(size) do begin
      if adj_mx[i, j] <> 0 then begin
        moveto(vertex[i].x, vertex[i].y);
        lineto(vertex[j].x, vertex[j].y);
      end
    end
  end;

  setfillstyle(solidfill, lightred);
  settextjustify(centertext, centertext);

  for i := 0 to pred(size) do begin
    fillellipse(vertex[i].x, vertex[i].y, E, E);
    circle(vertex[i].x, vertex[i].y, E);
    outtextxy(vertex[i].x, vertex[i].y, inttostr(i));
  end;
  readln;
  closegraph;
end.
(не проверял, Паскаля под рукой нет, набирал в редакторе... Не будет работать - говори, подправлю)
PM MAIL   Вверх
LoveMeCozImBLONDE
Дата 29.5.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.5.2009

Репутация: нет
Всего: нет



я так понял что Pointtype=record
                           x,y:word;
                           end;

всё работает, доработаю интерфейс выложу сюда.
вдруг кому понадобится.
PM MAIL   Вверх
volvo877
Дата 29.5.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(LoveMeCozImBLONDE @  29.5.2009,  19:46 Найти цитируемый пост)
я так понял что Pointtype=record
                           x,y:word;
                           end;

Да, только незачем описывать этот тип самостоятельно, он и так описан в модуле Graph...
PM MAIL   Вверх
LoveMeCozImBLONDE
Дата 7.6.2009, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 27.5.2009

Репутация: нет
Всего: нет



ето модуль
Код

unit menu;
interface
uses crt;
type men=array[1..8] of string[20];

procedure ramka(x1,y1,m,n,ct,cf:byte);
procedure form_men(me:men;x1,y1,n,ct,cf:byte);
function mov_men(me:men;x1,y1,n,ct,cf:byte):byte;
procedure readfile(path:string);
procedure form_m_gor(m:men;x2,y2,n,k,ct,cf:byte);
function mov_m_gor(m:men;x2,y2,n,k,ct,cf:byte):byte;

implementation
 procedure form_m_gor;
var i:byte; {n-kilkist punktiv menu}
begin
  window(x2,y2,lo(windmax),k);
textbackground(cf);
textcolor(ct);
  clrscr;
  gotoxy(2,2);
  highvideo;
   write(m[1]);
  lowvideo;
  for i:=2 to n do begin
  gotoxy(wherex+15,2);
  write(m[i]);
end;
gotoxy(2,2);
end;

function mov_m_gor;
var i,j:byte; c1,c2:char;
begin

  form_m_gor(m,x2,y2,n,k,ct,cf);
    i:=2;
    j:=1;
    repeat
    c1:=readkey; c2:=#0;
    if c1=#0 then c2:=readkey;
    case c2 of
     #77:{right} begin
               lowvideo;
               write(m[j],#13);
               if j=n then begin j:=1;
                i:=2;
                end
                else begin i:=i+15+length(m[j]);
                                 j:=j+1;
                                 end;

                 highvideo;
                gotoxy(i,2);
                write(m[j]);
                gotoxy(i,2);
               end;
     #75:begin
               lowvideo;
               write(m[j],#13);
               if j=1 then
               begin
               i:=2;
               for j:=1 to n-1 do begin
               i:=i+wherex+14+length(m[j]);
                end;
               j:=n;
                end
                else begin
                i:=i-15-length(m[j-1]);
               j:=j-1;
               end;
                highvideo;
                gotoxy(i,2);
                write(m[j]);
                gotoxy(i,2);
               end;
               end;
  until (c1=#13)or(c1=#27);
  if c1=#13 then mov_m_gor:=j else mov_m_Gor:=0;
end;

procedure readfile;
var f:text;
s:string;
begin
  assign(f,path);
            reset(f);
            gotoxy(2,2);
            while not eof(f) do begin
            readln(f,s);
            write(s);
            gotoxy(2,wherey+1);
            end;
            close(f);
            end;

procedure ramka;
var i:byte;
begin
  window(x1,y1,x1+m-1,y1+n-1);
  textcolor(ct); textbackground(cf);
  clrscr;
  gotoxy(1,n);
  write(#200);
   for i:=1 to m-2 do write(#205);
   write(#188);
   gotoxy(1,1);
   insline; {vstavili pustii piadok}
   write(#201);
   for i:=1 to m-2 do write(#205);
   write(#187);
   for i:=2 to n-1 do begin
   gotoxy(1,i);
   write(#186);
   gotoxy(m,i);
   write(#186);
   end;
   gotoxy(2,2);
end;

procedure form_men;
var j,i:byte; {n-kilkist punktiv menu}
max:integer;
begin
  max:=0;
  for i:=1 to n do begin
  if length(me[i])> max then begin
  max:=length(me[i]);
  j:=i;
  end;
  end;
  ramka(x1,y1,sizeof(me[j])-6,n+2,ct,cf);
  gotoxy(2,2);
  highvideo;
  write(me[1]);
  lowvideo;
  for i:=2 to n do begin
  gotoxy(2,i+1);
  write(me[i]);
end;
gotoxy(2,2);
end;

function mov_men;
var i:byte; c1,c2:char;
begin
  form_men(me,x1,y1,n,ct,cf);
    i:=1;
    repeat
    c1:=readkey; c2:=#0;
    if c1=#0 then c2:=readkey;
    case c2 of
     #72: {up} begin
               lowvideo;
               write(me[i]);
               if i=1 then i:=n else i:=i-1;
               gotoxy(2,i+1);
               highvideo;
               write(me[i]);
               gotoxy(2,i+1);
               end;
     #80:      begin
               lowvideo;
               write(me[i]);
               if i=n then i:=1 else i:=i+1;
               gotoxy(2,i+1);
               highvideo;
               write(me[i]);
               gotoxy(2,i+1);
               end;
               end;
  until (c1=#13)or(c1=#27);
  if c1=#13 then mov_men:=i else mov_men:=0;
end;
End.


ето сама прога, мб кому понадобится... да и вобще интересно позапускать=)
Код

program renev;
uses crt,menu,graph;
const glav:men=(' Program',' About',' Exit','','','','','');
      vekt:men=(' Start',' Help','','','','','','');  r=150;
    e=30;
type
    pointtype=record
x,y:word;
end;
    pMyVector = ^myVector;
    myVector = array[1..1] of shortInt;
    myArrayPtr = ^myArray;
    myArray = array[1..1] of pMyVector;
Var maxx,maxy,x1,y1,sizex,sizey:byte;
    t:boolean;
    c:char;
    angle:real;
    vertex: array[0 .. 10{pred(size)}] of pointType;
  adj_mx: array[0 .. 10{pred(size)}, 0 ..10 {pred(size)}] of integer;
    countTop : shortInt;
g_driver, g_mode, errcode: integer;
  i, j, center_x, center_y,n: integer;
    matrixArc : myArrayPtr;
    color : pMyVector;
    procedure getMemVector;
var
    i : byte;
begin
    getMem(color, countTop * sizeOf(pMyVector));
end;
{===============================================================}
procedure getMemory(var x : myArrayPtr);
var
    i : byte;
begin
    getMem(x, countTop * sizeOf(pMyVector));
    for i := 1 to countTop do
    begin
        getMem(x^[i], countTop * sizeOf(shortInt));
    end;
end;
{===============================================================}
procedure inputValueOfArc;
var
    i, j : byte;
begin                      gotoxy(wherex+1,wherey);
    writeln('Esli vershini ne soedeneni vvedite 0');
    gotoxy(wherex+1,wherey);
    writeln('esli soedeneni to vvedite 1');
    gotoxy(wherex+1,wherey);
    writeln('Drugie zna4eniya ne dopestimi');
    gotoxy(wherex+1,wherey);
    for i := 1 to countTop do
    begin
        for j := 1 to countTop do
        begin
            if(i <> j) then
            begin
                if(i <= j) then
                begin
                    gotoxy(wherex+1,wherey);
                    write('Rassmatrivaem vershini s nomerom ', i, ' I vershinu ', j, ': ');
                    gotoxy(wherex,wherey);
                    {$I-}
                    readln(matrixArc^[i]^[j]);
                    matrixArc^[j]^[i] := matrixArc^[i]^[j];
                    {$I+}
                    if(IOResult <> 0) then
                    begin    gotoxy(wherex+1,wherey);
                        writeln('Error. Znachenie prinyato kak 0');
                        gotoxy(wherex+1,wherey);
                        matrixArc^[i]^[j] := 0;
                        matrixArc^[j]^[i] := 0;
                    end;
                    if((matrixArc^[i]^[j] < 0) or (matrixArc^[i]^[j] > 1)) then
                    begin
                        writeln('Vvedeno chislo ne ravnoe 1 ili 0. Po ymolchaniyu 0');
                        gotoxy(wherex+1,wherey);
                        matrixArc^[i]^[j] := 0;
                        matrixArc^[j]^[i] := 0;
                    end;
                end;
            end
            else
            begin
                matrixArc^[i]^[j] := 0;
            end;
        end;
    end;
end;
function inttostr(X: integer): string;
var s: string;
begin
  str(X, s); inttostr := s;
end;
{===============================================================}
procedure printWeightArc(x : myArrayPtr; comment : string);
var
    i, j : byte;
begin
    writeln;
    writeln('Etot graf, sostoyachiy iz ', countTop, comment);
    gotoxy(wherex+1,wherey);
    for i := 1 to countTop do
    begin
        for j := 1 to countTop do
        begin
            write(x^[i]^[j]:3, ' ');
        end;
        writeln;
    end;
end;
{===============================================================}
procedure paintGraf(m : integer);
var
    i, j : byte;
    cont : boolean;
begin
    if(m > countTop) then
    begin
        writeln('РPolycheni resultati ');
        gotoxy(wherex+1,wherey);
    end
    else
    begin
        for i := 1 to countTop do
        begin
            color^[m] := i;
            cont := true;
            for j := 1 to countTop do
            begin
                if((matrixArc^[j]^[m] = 1) and (color^[j] = i)) then
                begin
                    cont := false;
                end;
            end;

            if(cont) then
            begin
                paintGraf(m + 1);
                exit;
            end;
        end;
    end;
end;
{===============================================================}

Begin
  maxx:=lo(windmax)+1;
  maxy:=hi(windmax)+1;
  repeat
  textattr:=blue*8*white;
  clrscr;
   {meny}
  n:=3;
  x1:=(maxx-sizeof(glav[1]))div 2 -1;
  y1:=(maxy-n)div 2-1;
  i:=mov_men(glav,x1,y1,n,blue,cyan);
  clrscr;
  case i of
1: begin
       n:=3;
       x1:=(maxx-sizeof(vekt[3]))div 2 -1;
       y1:=(maxy-n)div 2-1;
       j:=mov_men(vekt,x1,y1,n,blue,cyan);
       case j of

       1: begin
          window(1,1,maxx,maxy);
          sizex:=50; sizey:=20;
          x1:=(maxx-sizex)div 2;
          y1:=(maxy-sizey)div 2;
          ramka(x1,y1,maxx,maxy,blue,cyan);
         textcolor(lightblue);
       writeln('Number of vershin grafa');
       gotoxy(wherex+1,wherey);
    writeln('Bolshe 5 lychshe ne vvodit,');
    gotoxy(wherex+1,wherey);
        readln(countTop);
   angle:=2*pi/counttop;
    if(countTop <= 0) then
    begin
        writeln('otrizatelnoe kol-vo grafov. po ymolchaniy 4');
        gotoxy(wherex+1,wherey);
        countTop := 4;
    end;

    getMemory(matrixArc);
    getMemVector;
    inputValueOfArc;
    printWeightArc(matrixArc, ' Vershina imeet cledyuchie haracteristiki');

    paintGraf(1);
    for i := 1 to countTop do
    begin
        writeln('Vershina s nomerom ', i, ' imeet cvet ', color^[i]);
        gotoxy(wherex+1,wherey);
    end;
    for i:=1 to counttop do begin
    for j:=1 to counttop do begin
    adj_mx[i,j]:=matrixarc^[i]^[j];
    end;end; normvideo;
  g_driver:= detect;
  initgraph(g_driver, g_mode, '');
  errcode:= graphresult;
  if errcode <> grok then begin
    writeln('graphics error: ', grapherrormsg(errcode));
    readln; halt(101);
  end;
center_x := getmaxx div 2;
  center_y := getmaxy div 2;
  for i := 0 to counttop do begin
    vertex[i].x :=center_x+trunc(R*cos(Pi/2+i*angle));
    vertex[i].y :=center_y-trunc(R*sin(Pi/2+i*angle));
  end;

  for i := 0 to counttop do begin
    for j := 0 to counttop do begin
      if adj_mx[i, j] <> 0 then begin
        moveto(vertex[i].x, vertex[i].y);
        lineto(vertex[j].x, vertex[j].y);
      end
    end
  end;

  setfillstyle(solidfill, lightred);
  settextjustify(centertext, centertext);

  for i := 1 to counttop do begin
  setfillstyle(solidfill,color^[i]);
    fillellipse(vertex[i].x, vertex[i].y, E, E);
    circle(vertex[i].x, vertex[i].y, E);      outtextxy(vertex[i].x, vertex[i].y, inttostr(i));

  end;
  readln;
    closegraph;

          repeat until keypressed;
          end;
       2:begin


       window(1,1,maxx,maxy);
       sizex:=40;
       sizey:=10;
       x1:=(maxx-sizex)div 2;
       y1:=(maxy-sizey)div 2;
       ramka(x1,y1,sizex,sizey,Blue,cyan);
       x1:=(sizex)div 2;
       y1:=sizey div 2;
       gotoxy(x1-15,y1-1);
       writeln('The program has developed');
       gotoxy(x1-15,y1);
       writeln('For Zada4i -  razukraski grafa');
       gotoxy(x1-15,y1+1);
       writeln('Ny i ona ego razukrashivaet');
       gotoxy(x1-15,y1+2);
       writeln('V obshem eta proga o4en gyd');
       gotoxy(x1-5,y1+4);
       writeln('Press Enter');

       repeat until keypressed;
       end;
       end;
       end;
2:begin

       window(1,1,maxx,maxy);
       sizex:=40;
       sizey:=10;
       x1:=(maxx-sizex)div 2;
       y1:=(maxy-sizey)div 2;
       ramka(x1,y1,sizex,sizey,blue,cyan);
       x1:=(sizex)div 2;
       y1:=sizey div 2;
       gotoxy(x1-15,y1-1);
       writeln('The program has developed');
       gotoxy(x1-15,y1);
       writeln('student of group KA-84');
       gotoxy(x1-15,y1+1);
       writeln('IASA');
       gotoxy(x1-15,y1+2);
       writeln('Renyov Olexey');
       gotoxy(x1-5,y1+4);
       writeln('Press Enter');

       repeat until keypressed;
       end;

      3:halt;
      end;

      until keypressed;
      if keypressed then c:=readkey;
      window (1,1,maxx,maxy);

      readln;
      end.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0838 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.