[ M R C G @ 30.01.2007. 22:05 ] @
Imam problem vezan za grafove.
Dat mi je fajl u kojem pise:
1 2 15
1 3 16
2 3 20
i takom redom. Prve dve vrednosti u ulaznom fajlu predstavlja cvorove grafa a treca rastojanja izmedju njih.
Pri tom znam tacan broj cvorova. U ovom slucaju bi bio 4 (pocinje od nule).Meni je potreban Perl kod koji ce da napravi matricu koja bi izgledala
0 0 0 0
0 0 15 16
0 15 0 20
0 16 20 0
Hvala!
[ VRider @ 30.01.2007. 23:47 ] @
Skript je jako jednostavan. 'Ajde, probaj, pa cu ti pomoci ako zapnes. Hocu da vidim da se i ti nesto trudis.
[ M R C G @ 31.01.2007. 14:12 ] @
Moram reci da sam potpuno nov u perlu.Pokusao sam nesto da uradim, ali naravno, nije dobro.Nemam predstavu kako dalje.Any help?
Moja (ne bas najbolja) Ideja je:

#!/usr/bin/perl
$q=5 ;
$n = 5;
if($q) {
$n = 10;
for($i=1; $i<=$n; $i++){
for($j=$i; $j<=$n; $j++){
if((($i + 1 == $j) && ($i % $q != 0)) || ($i + $q == $j)) {
$c[$i-1][$j-1] = 0;
$c[$j-1][$i-1] = $c[$i-1][$j-1]
} else {
$c[$i-1][$j-1] = 0;
$c[$j-1][$i-1] = $c[$i-1][$j-1];
}
};
};
open(IFILE, $ifile);
while(<IFILE>) {
chop;
@pom = (@pom, split);
}
close(IFILE);

for($i=0; $i<$n; $i++) {
for($j=1; $j<$n+1; $j++) {
for($z=2;$z<$n+2;$z++){
$prvi=$pom[$i];
$drugi=$pom[$j];
$vrednost=$pom[$z];
$c[$prvi][$drugi] = $vrednost;
}
}
}
print "Graf:\n";
for($i=0; $i<$n; $i++){
for($j=0; $j<$n; $j++){
print $c[$i][$j], " ";
};
print "\n";
};
}
[ VRider @ 31.01.2007. 16:29 ] @
Wow... Ne znam da li je zbog piva ili je nesto drugo u pitanju, ali, ne uspevam da ispratim tvoj kod. Moze li neki komentar uz sve ovo? I stavi kod izmedju code tagova, kako bi se zadrzao indent. Ne moras da dajes kompletan kod, mozes samo da mi recima opises svoju ideju.

P.S. Da li je u fajlu dato rastojanje izmedju svih cvorova, ili ti treba da implementiras neki algoritam za pronalazenje rastojanja izmedju svih cvorova?
[ M R C G @ 31.01.2007. 18:04 ] @
Hvala sto se trudis da mi pomognes. Nisam bas dobar u perl, tj.znam tek nesto sto sam naucio za dva dana.
U ulaznom fajlu mi je dato : cvor X, cvor Y, rastojanje izmedju nijh. Za ona rastojanja koja nisu u ulaznom fajlu rastojanje je 0. tj. ako mi je dato:
1 2 15
1 3 16
2 3 20
Imam 0,1,2,3 cvorove. Rastojanje izmedju 1 i 2 je 15, 1 i 3 16, 2 i 3 rastojanje je 20.Sva ostala rastojanja su 0(na primer izmedju 0 i 1, 0 i 2 itd.)
Ono sto sam ja pisao verovatno nije ni priblizno dobro.Ne znam da li da komentarisem jer sam nesto sam smisljao i mislim da ne moze tako. Hvala jos jednom
[ VRider @ 31.01.2007. 20:56 ] @
'Ajde ovako... Citas red po red. Uvek procitas 3 podatka. Prvi index, drugi index i rastojanje. Rastojanje izmedju a[1][2] je isto kao i rastojanje a[2][1]. Dakle, svaki put kad procitas jedan red (dva indexa i vrednost) odmah mozes da definises i drugu vrednost u matrici.

Kada popunis sve, samo izbrojis koliko imas redova (dodelis niz u skalar $duzina = @niz), i onda odstampas matricu. Napisi kod za prvi deo, pa cemo onda da predjemo na drugi. Ok?
[ M R C G @ 01.02.2007. 01:40 ] @
Znam da tako nesto treba, ali ne znam da realizujem. Uspeo sam da napisem kod koji cita matricu iz jednog fajla i upisuje u drugi.
Sada ne znam kako da dodelim vrednosti elementima matrice. Kako da napisem for petlju da mi cita svaki treci broj?Uf, nemam pojma ni da li sam na pravom putu. Koliko sam razumeo logiku kada mi program procita matricu, njene vrednosti smesta u npr. @pom. Kako dalje te vrednosti da prebacim u novu matricu, a da one grane koje nisu u ulaznom fajlu budu 0??Gubim se....Sorry za smaranje
[ VRider @ 01.02.2007. 10:43 ] @
Code:

#!/usr/bin/perl

open (ULAZ, "matrica.txt"); #otvaram fajl

while (<ULAZ>){ #dok ima fajla, radim sledecu stvar
        chomp; # pogledaj dokumentaciju koja je razlika izmedju chop i chomp
        ($i,$j,$v) = split(/ /); # u promeljive i, j i v sam stavio tri procitane vrednosti (pogledaj dokumetaciju za split)
        $a[$i][$j] = $v; #u matricu stavljam vrednost za prvi-drugi cvor
        $a[$j][$i] = $v; #to isto za drugi-prvi
}

$d = @a; #prebrojim koliko ima cvorova

for ($i = 0; $i < $d; $i++){
        for ($j = 0; $j< $d; $j++){ #dvostruka petlja da prodje kroz celu matricu
                if (defined $a[$i][$j]){ #ako je neki element matrice definisan, onda ga ispisemo
                        print $a[$i][$j];
                }
                else { #ako nije definisan, onda je tu 0
                        print "0";
                }
                print "\t"; #nakon svakog ispisanog elementa stavimo jedan tab, da lepse izgleda
        }
        print "\n"; #nakon svakog reda, jedan novi red
}


Eto ti kod sa sve komentarima. Krajnje jednostavno. Jedino mozda malo zbunjujuce je ovo sa defined, mada, to mozes da izbegnes ako pre nego krenes da popunjavas matricu, prvo celu matricu popunis nulama jos jednom dvostrukom petljom. Sve ostalo su osnove.

Mogao bi da kazes i koju knjigu koristis za ucenje perla, ili sta vec koristis.
[ M R C G @ 01.02.2007. 15:55 ] @
Hvala puno. Na kraju si me naterao i sam sam uspeo nesto da uradim sinoc i jako je slicno ovom tvom kodu. Hvala jos jednom!
[ VRider @ 01.02.2007. 16:49 ] @
Ako treba ja da te teram, onda jebiga... Gde je elan, mladost, poletnost...
Ja u tvojim godinama nisam pitao sta treba da se rusi a sta ne. Kod mene be ovaj zid pao za frtalj sata. - SMF
[ M R C G @ 02.02.2007. 00:22 ] @
Ma nisi me ti naterao, nego sam mislio da necu znati da uradim.Samo, ako nije previse, da te pitam kako da ovu matricu sacuvam u fajl?Hvala ti
[ VRider @ 02.02.2007. 02:28 ] @
Otvoris jos jedan fajl za pisanje (pogledaj kako se to radi u knjizi), i izmenis print komande u petlji tako da pisu u fajl. Dodas po jednu rec. Koristi knjigu!