ajsi Opublikowano 21 Lutego 2004 Zgłoś Opublikowano 21 Lutego 2004 Mam problem z programem. Ma on za zadanie generowanie f-grafu z parametrów n-liczba wierzchołków, f-maksymalny stopień wierzchołka i rep-liczba powtórzeń. Po generacji program ma zliczać składowe spójnośći (czyli czy graf jest w jednym kawałku czy jest w wilu i w ilu dokładnie). Chodzi o to by można było zrobić statystyka dla zadanych parametrów jaki jest rozkład liczby składowych. Oto kod który do tej pory skleciłem: program fmaksgrafy (input, output); { //uses;} const nmax=10; kmax=nmax*(nmax - 1) div 2; type ind=1..nmax; ind1=1..kmax; r=record a,b:byte; code:Boolean; end; t=array[ind] of integer; t1=array[ind1] of r; t2=array[ind,ind] of Boolean; tx=array[ind] of Boolean; var E:t1; A:t2; n,f,k,total,rep: integer; g,h,i,j,l,v: integer; S:t; { // wariant:integer; } { // h1, m1, s1, ms1:word; } x:tx; procedure czyt(var n, f, rep: integer); begin write('n, f, rep= '); readln(n,f,rep); end; {czyt} procedure init (n:integer; var E:t1; var total: integer); {przygotowanie tablicy E} var i, j, h:integer; begin h:=0; for i:=1 to n-1 do for j:=1 to n do begin h:=h+1; with E[h] do begin a:=i; b:=j end; end; total:=h; end; {init} procedure Gnf (n,f,total:integer; var E:t1; var k:integer); {losowanie maksymalnego grafu z zadanym n, f} var i,h,l,z:integer; x:r; c:t; begin for i:=1 to n do c:=0; for i:=1 to total do E.code:=false; h:=0; for l:=total downto 1 do begin z:=random(l)+1; with E[z] do if (c[a] < f) and (c < f) then begin code:=true; h:=h+1; c[a]:=c[a]+1; c:=c+1; end; x:=E[z]; E[z]:=E[l]; E[l]:=x; end; k:=h; end; {Gnf} procedure transEA (n,total: integer; var E:t1; var A:t2); {tranformacja tablicy E do A} var i,j,l:integer; x: Boolean; begin for i:=1 to n do A[i,i]:=false; for l:=total downto 1 do begin with E[l] do begin i:=a; j:=b; x:=code end; A[i,j]:=x; A[j,i]:=x; end; end; {transEA} procedure skladowa (n,v:integer; var A:t2; var x:tx); {odwiedza kolejnych nie odwiedzonych} {sasiadow i buduje sciezke} var j:integer; begin for j:=1 to n do if A[v,j] and not x[j] then begin x[j]:= true; skladowa (n,j,A,x); end; end;{skladowa} procedure test(n,h:integer; var g:integer; var x:tx); { var h:integer; } begin { for h:=2 to n do } if (x[h]=false) then {jesli wartosc w x jest rowna 1 przechodzi do kolejnego x z tablicy} { h:=h+1 else } begin {jesli w x napotka 0} g:=g+1; {powieksza licznik skladowych spojnosci} skladowa(n,h,A,x); {wywoluje procedure dla wczesniej} { nie odwiedzonego wierzcholka i aktualizuje x} { test(n,g,x);} {ponownie jest sprawdzana tablica x,} { jesli sa same 1 otrzymujemy g-liczbe skladowych grafu,} { jesli jeszcze napotkamy 0 wywolywane jest procedura skladowe} end; end;{test} BEGIN {// repeat } {// writeln('wariant:(1/2)'); } {// readln (wariant); } {// case wariant of } {// 1.begin { wariant 1 buduje tablice s w funkcji n } czyt(n,f,rep); init(n,E,total); for l:=1 to n do s[l]:=0; {zerowanie tablicy z iloscia skladowych} for i:=1 to rep do begin Gnf(n,f,total,E,k); {losuje maksymalny fgraf o zadanym n i f} transEA (n,total,E,A); {transformuje tablice E do A} g:=1; for j:=1 to n do x[j]:=false; {inicjalizuje tablice odwiedzonych wierzcholkow} x[1]:=true; {ustawia 1 jako odwiedzony} skladowa(n,1,A,x); {sprawdza kolejnych sasiadow i aktualizuje x} for h:=1 to n do begin test(n,h,g,x); {sprawdza tablice x } end; {i dla 0 buduje sciezke od tego wierzcholka} { do kolejnych sasiadow po czym aktualizuje x } { i wywoluje siebie sama} s[g]:=s[g]+1; {aktualizuje tablice spojnosci} {tablica zlicza grafy dla odpowiedniej liczby skladowych} end ; for k:=1 to n do writeln('dla s=',k,':',s[k]) ; readln; {end; } { 2.begin wariant 2 bedzie sprawdzal zlorzomosc czasowa} END. Problem polega na tym że program się kompiluje ale nie liczy tego co powinien. Wyniki są błędne ale powtarzalne. To mój pierwszy większy program w pascalu i już nie wiem co jest skopane. Jeśli ktoś miał coś podobnego albo ma pojęcie o pascalu i grafach to bardzo bym prosił o pomoc. Jeśli ktoś ma jakieś pytania albo coś niejasne to niech pisze. Sorki za przydługawy post ale kod wrzuciłem cały:) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
ajsi Opublikowano 23 Lutego 2004 Zgłoś Opublikowano 23 Lutego 2004 Hej, szkoda że nikomu nie chciało się pomóc:( Niemniej błąd znalazłem sam i jak to zwykle bywa nie tam gdzie go szukałem. Niepoprawna jest procedura init, to dla tych co potrzebowali by ściągi z fgrafów, jak ktoś chce szczegóły to na priva:) Moderatorzy mogą zamknąć ten topic. Dziękiuję za uwagę i pozdrowienia dla wszystkich to czytających:) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...