komentarze
This commit is contained in:
parent
46dc61e655
commit
93066b3398
@ -2,4 +2,4 @@
|
|||||||
Zadania z ćwiczeń.
|
Zadania z ćwiczeń.
|
||||||
|
|
||||||
## Temat A
|
## Temat A
|
||||||
W trakcie.
|
Zadania rozwiązane.
|
@ -149,18 +149,28 @@ fiber create $liczbaWierz {
|
|||||||
wyslij 0 $id;
|
wyslij 0 $id;
|
||||||
fiber yield;
|
fiber yield;
|
||||||
while {$run} {
|
while {$run} {
|
||||||
|
|
||||||
|
#jesli mamy komunikat
|
||||||
if {$kom(1)!=""} {
|
if {$kom(1)!=""} {
|
||||||
set x $kom(1);
|
set x $kom(1);
|
||||||
|
|
||||||
if {$lider==1} {
|
if {$lider==1} {
|
||||||
|
#jest juz liderem
|
||||||
|
|
||||||
} elseif {$x>$id} {
|
} elseif {$x>$id} {
|
||||||
|
#przesylam wartosc dalej
|
||||||
wyslij 0 $x;
|
wyslij 0 $x;
|
||||||
|
|
||||||
} elseif {$x==0} {
|
} elseif {$x==0} {
|
||||||
|
#nie jest liderem
|
||||||
wyslij 0 $x;
|
wyslij 0 $x;
|
||||||
set lider 0; # nie jest liderem
|
set lider 0;
|
||||||
} elseif {$x==$id} { # tutaj ustawiam lidera
|
|
||||||
|
} elseif {$x==$id} {
|
||||||
|
#jest liderem
|
||||||
set lider 1;
|
set lider 1;
|
||||||
wyslij 0 0;
|
wyslij 0 0;
|
||||||
|
|
||||||
} elseif {$x < $id} {
|
} elseif {$x < $id} {
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -234,32 +244,44 @@ set sasiedzi(0) {4 1}
|
|||||||
set sasiedzi(1) {0 2}
|
set sasiedzi(1) {0 2}
|
||||||
set sasiedzi(2) {1 3}
|
set sasiedzi(2) {1 3}
|
||||||
set sasiedzi(3) {2 4}
|
set sasiedzi(3) {2 4}
|
||||||
|
|
||||||
set sasiedzi(4) {3 0}
|
set sasiedzi(4) {3 0}
|
||||||
|
|
||||||
fiber create $liczbaWierz {
|
fiber create $liczbaWierz {
|
||||||
|
|
||||||
set lider ?;
|
set lider ?;
|
||||||
wyslij 0 $id; # wysyłam w jedną stronę
|
|
||||||
wyslij 1 $id; # wysyłam w drugą stronę
|
# wysyłam w jedną stronę
|
||||||
|
wyslij 0 $id;
|
||||||
|
|
||||||
|
# wysyłam w drugą stronę
|
||||||
|
wyslij 1 $id;
|
||||||
|
|
||||||
fiber yield;
|
fiber yield;
|
||||||
|
|
||||||
while {$run} {
|
while {$run} {
|
||||||
|
|
||||||
if {$kom(0)!="" && $kom(1)!=""} {
|
if {$kom(0)!="" && $kom(1)!=""} {
|
||||||
|
#jesli obydwa komunikaty nie są puste
|
||||||
set x ?;
|
set x ?;
|
||||||
if {$kom(0) > $kom(1)} { # warunek 1
|
|
||||||
|
if {$kom(0) > $kom(1)} {
|
||||||
|
#komunikat 1 jest wiekszy od drugiego
|
||||||
set x $kom(0);
|
set x $kom(0);
|
||||||
|
|
||||||
if {$lider==1} {
|
if {$lider==1} {
|
||||||
|
#jest juz lider
|
||||||
|
|
||||||
} elseif {$x==0} {
|
} elseif {$x==0} {
|
||||||
|
#nie jest liderem
|
||||||
wyslij 1 0;
|
wyslij 1 0;
|
||||||
set lider 0;
|
set lider 0;
|
||||||
|
|
||||||
} elseif {$x>$id} {
|
} elseif {$x>$id} {
|
||||||
|
#przeslij dalej
|
||||||
wyslij 1 $x;
|
wyslij 1 $x;
|
||||||
|
|
||||||
} elseif {$x==$id} { #lider
|
} elseif {$x==$id} {
|
||||||
|
#jest liderem
|
||||||
set lider 1;
|
set lider 1;
|
||||||
wyslij 0 0;
|
wyslij 0 0;
|
||||||
wyslij 1 0;
|
wyslij 1 0;
|
||||||
@ -270,20 +292,25 @@ fiber create $liczbaWierz {
|
|||||||
|
|
||||||
fiber yield;
|
fiber yield;
|
||||||
|
|
||||||
} else { # warunek przeciwny
|
} else {
|
||||||
|
#jesli komunikat 2 jest wiekszy od pierwszego
|
||||||
set x $kom(1);
|
set x $kom(1);
|
||||||
|
|
||||||
if {$lider==1} {
|
if {$lider==1} {
|
||||||
|
#jest juz lider
|
||||||
|
|
||||||
} elseif {$x==0} {
|
} elseif {$x==0} {
|
||||||
|
#nie jest liderem
|
||||||
wyslij 0 $x;
|
wyslij 0 $x;
|
||||||
set lider 0;
|
set lider 0;
|
||||||
|
|
||||||
} elseif {$x>$id} {
|
} elseif {$x>$id} {
|
||||||
|
#przeslij dalej
|
||||||
wyslij 0 $x;
|
wyslij 0 $x;
|
||||||
|
|
||||||
} elseif {$x==$id} {
|
} elseif {$x==$id} {
|
||||||
set lider 1; # lider
|
#jest liderem
|
||||||
|
set lider 1;
|
||||||
wyslij 0 0;
|
wyslij 0 0;
|
||||||
wyslij 1 0;
|
wyslij 1 0;
|
||||||
|
|
||||||
@ -293,20 +320,25 @@ fiber create $liczbaWierz {
|
|||||||
fiber yield;
|
fiber yield;
|
||||||
}
|
}
|
||||||
|
|
||||||
} elseif {$kom(0)!=""} { # następny warunek
|
} elseif {$kom(0)!=""} {
|
||||||
|
#jesli tylko komunikat pierwszy nie jest pusty
|
||||||
set x $kom(0);
|
set x $kom(0);
|
||||||
|
|
||||||
if {$lider==1} {
|
if {$lider==1} {
|
||||||
|
#jest juz lider
|
||||||
|
|
||||||
} elseif {$x==0} {
|
} elseif {$x==0} {
|
||||||
|
#nie jest liderem
|
||||||
wyslij 1 0;
|
wyslij 1 0;
|
||||||
set lider 0;
|
set lider 0;
|
||||||
|
|
||||||
} elseif {$x>$id} {
|
} elseif {$x>$id} {
|
||||||
|
#przeslij dalej
|
||||||
wyslij 1 $x;
|
wyslij 1 $x;
|
||||||
|
|
||||||
} elseif {$x==$id} {
|
} elseif {$x==$id} {
|
||||||
set lider 1; # lider
|
#jest liderem
|
||||||
|
set lider 1;
|
||||||
wyslij 0 0;
|
wyslij 0 0;
|
||||||
wyslij 1 0;
|
wyslij 1 0;
|
||||||
|
|
||||||
@ -315,18 +347,24 @@ fiber create $liczbaWierz {
|
|||||||
}
|
}
|
||||||
fiber yield;
|
fiber yield;
|
||||||
|
|
||||||
} else { # ostatni warunek
|
} else {
|
||||||
|
#w przeciwnym wypadku
|
||||||
set x $kom(1);
|
set x $kom(1);
|
||||||
|
|
||||||
if {$lider==1} {
|
if {$lider==1} {
|
||||||
|
#jest juz lider
|
||||||
|
|
||||||
} elseif {$x==0} {
|
} elseif {$x==0} {
|
||||||
|
#nie jest liderem
|
||||||
wyslij 0 $x;
|
wyslij 0 $x;
|
||||||
set lider 0;
|
set lider 0;
|
||||||
|
|
||||||
} elseif {$x>$id} {
|
} elseif {$x>$id} {
|
||||||
|
#przeslij dalej
|
||||||
wyslij 0 $x;
|
wyslij 0 $x;
|
||||||
|
|
||||||
} elseif {$x==$id} {
|
} elseif {$x==$id} {
|
||||||
|
#jest liderem
|
||||||
set lider 1;
|
set lider 1;
|
||||||
wyslij 0 0;
|
wyslij 0 0;
|
||||||
wyslij 1 0;
|
wyslij 1 0;
|
||||||
@ -562,43 +600,57 @@ fiber create $liczbaWierz {
|
|||||||
#zmienne
|
#zmienne
|
||||||
set new 0
|
set new 0
|
||||||
set wielkosc 50
|
set wielkosc 50
|
||||||
|
|
||||||
|
#tworze kolory
|
||||||
set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]]
|
set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]]
|
||||||
set kolor_drugi 0
|
set kolor_drugi 0
|
||||||
|
|
||||||
set b 0
|
set b 0
|
||||||
set por 0
|
set por 0
|
||||||
set c 0
|
set c 0
|
||||||
|
|
||||||
|
#wyslij kolor pierwszy do lisci
|
||||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||||
fiber yield;
|
fiber yield;
|
||||||
|
|
||||||
#główna pętla
|
#główna pętla
|
||||||
while {$run} {
|
while {$run} {
|
||||||
#warunek 1
|
|
||||||
if {$kom(0)!=""} {
|
if {$kom(0)!=""} {
|
||||||
|
#komunikat pierwszy nie jest pusty
|
||||||
|
|
||||||
|
#ustawiam jako kolor drugi i porównuję z pierwszym
|
||||||
set kolor_drugi $kom(0)
|
set kolor_drugi $kom(0)
|
||||||
set por [porownanieC $kolor_pierwszy $kolor_drugi]
|
set por [porownanieC $kolor_pierwszy $kolor_drugi]
|
||||||
|
|
||||||
|
#wynik porównania
|
||||||
set c [lindex $por 1]
|
set c [lindex $por 1]
|
||||||
set b [lindex $por 0]
|
set b [lindex $por 0]
|
||||||
|
|
||||||
|
#ustawiam nowy kolor
|
||||||
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
|
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
|
||||||
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}]
|
|
||||||
set kolor_pierwszy $nowy
|
set kolor_pierwszy $nowy
|
||||||
|
|
||||||
|
#wysyłam do liści
|
||||||
|
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}]
|
||||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||||
|
|
||||||
}
|
}
|
||||||
if { $id == 0 } {
|
if { $id == 0 } {
|
||||||
|
|
||||||
|
#jeśli pierwszy wierzchołek, ustalam kolor, porównuję
|
||||||
set kolor_drugi [wyrownaj $wielkosc [bity 0]]
|
set kolor_drugi [wyrownaj $wielkosc [bity 0]]
|
||||||
set por [porownanieC $kolor_pierwszy $kolor_drugi]
|
set por [porownanieC $kolor_pierwszy $kolor_drugi]
|
||||||
|
|
||||||
|
#wynik porównania
|
||||||
set c [lindex $por 1]
|
set c [lindex $por 1]
|
||||||
set b [lindex $por 0]
|
set b [lindex $por 0]
|
||||||
|
|
||||||
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) +1)}]
|
#ustalam nowy kolor
|
||||||
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
|
set nowy [wyrownaj $wielkosc "[bity $b]$c"]
|
||||||
set kolor_pierwszy $nowy
|
set kolor_pierwszy $nowy
|
||||||
|
|
||||||
|
#wysyłam komunikat do liści
|
||||||
|
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) +1)}]
|
||||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -741,11 +793,17 @@ proc reverse li {
|
|||||||
|
|
||||||
|
|
||||||
fiber create $liczbaWierz {
|
fiber create $liczbaWierz {
|
||||||
|
|
||||||
set lider ?
|
set lider ?
|
||||||
|
|
||||||
|
#wysyłam id dalej
|
||||||
wyslij 0 "$id_los 0 0"
|
wyslij 0 "$id_los 0 0"
|
||||||
wyslij 1 "$id_los 0 0"
|
wyslij 1 "$id_los 0 0"
|
||||||
|
|
||||||
fiber yield
|
fiber yield
|
||||||
|
|
||||||
while {$run} {
|
while {$run} {
|
||||||
|
#wykonuje algorytm ponizej
|
||||||
algorytm [czytaj 0] [czytaj 1]
|
algorytm [czytaj 0] [czytaj 1]
|
||||||
fiber yield
|
fiber yield
|
||||||
}
|
}
|
||||||
@ -759,19 +817,30 @@ proc wizualizacja {} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fiber_iterate {
|
fiber_iterate {
|
||||||
# + ta procedura jedynie przekazuje komunikaty...
|
|
||||||
|
#to ma przekazac komunikaty
|
||||||
proc algorytm {m0 m1} {
|
proc algorytm {m0 m1} {
|
||||||
|
#ustwiamy zmienne globalny
|
||||||
global id id_los stopien lider
|
global id id_los stopien lider
|
||||||
|
|
||||||
if {$m0!=""} {
|
if {$m0!=""} {
|
||||||
|
#jesli pierwsza wartość nie jest pusta
|
||||||
foreach {id0 i0 l0} $m0 break
|
foreach {id0 i0 l0} $m0 break
|
||||||
|
|
||||||
|
#zwiększam i przekazuje
|
||||||
incr i0
|
incr i0
|
||||||
wyslij 1 "$id0 $i0 0";
|
wyslij 1 "$id0 $i0 0";
|
||||||
}
|
}
|
||||||
if {$m1!=""} {
|
if {$m1!=""} {
|
||||||
|
#jesli druga zmienna nie jest pusta
|
||||||
foreach {id1 i1 l1} $m1 break
|
foreach {id1 i1 l1} $m1 break
|
||||||
|
|
||||||
|
#zwiększam i ustawiam
|
||||||
incr i1
|
incr i1
|
||||||
set i1 [expr {$i1+1}]
|
set i1 [expr {$i1+1}]
|
||||||
|
|
||||||
if {$m1==$id}{
|
if {$m1==$id}{
|
||||||
|
#jest lider
|
||||||
set lider 1;
|
set lider 1;
|
||||||
}
|
}
|
||||||
wyslij 0 "$id1 $i1 0"
|
wyslij 0 "$id1 $i1 0"
|
||||||
@ -852,32 +921,42 @@ fiber create $liczbaWierz {
|
|||||||
set wielkosc 50
|
set wielkosc 50
|
||||||
set por 0
|
set por 0
|
||||||
set new 0
|
set new 0
|
||||||
|
|
||||||
|
#ustawiam kolory
|
||||||
set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]]
|
set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]]
|
||||||
set kolor_drugi 0
|
set kolor_drugi 0
|
||||||
|
|
||||||
set b 0
|
set b 0
|
||||||
set c 0
|
set c 0
|
||||||
|
|
||||||
|
#wysyłam kolor pierwszy
|
||||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||||
fiber yield;
|
fiber yield;
|
||||||
|
|
||||||
#główna pętla
|
#główna pętla
|
||||||
while {$run} {
|
while {$run} {
|
||||||
|
|
||||||
if {$kom(0)!=""} {
|
if {$kom(0)!=""} {
|
||||||
|
#jesli komunikat pierwszy nie jest pusty
|
||||||
set kolor_drugi $kom(0)
|
set kolor_drugi $kom(0)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
#jesli jest pusty
|
||||||
set kolor_drugi [wyrownaj $wielkosc [bity 0]]
|
set kolor_drugi [wyrownaj $wielkosc [bity 0]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#porownanie koloru drugiego z pierwszym
|
||||||
set por [porownanieC $kolor_pierwszy $kolor_drugi]
|
set por [porownanieC $kolor_pierwszy $kolor_drugi]
|
||||||
|
|
||||||
|
#wynik porownania
|
||||||
set c [lindex $por 1]
|
set c [lindex $por 1]
|
||||||
set b [lindex $por 0]
|
set b [lindex $por 0]
|
||||||
|
|
||||||
|
#ustawiamy nowy kolor
|
||||||
set new [wyrownaj $wielkosc "[bity $b]$c"]
|
set new [wyrownaj $wielkosc "[bity $b]$c"]
|
||||||
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}]
|
|
||||||
set kolor_pierwszy $new
|
set kolor_pierwszy $new
|
||||||
|
|
||||||
|
#przesylamy dalej
|
||||||
|
set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}]
|
||||||
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy}
|
||||||
|
|
||||||
fiber yield;
|
fiber yield;
|
||||||
@ -1001,23 +1080,32 @@ set sasiedzi(5) {4 0}
|
|||||||
|
|
||||||
fiber create $liczbaWierz {
|
fiber create $liczbaWierz {
|
||||||
|
|
||||||
set suma $id_los # losowanie wartości
|
# losowanie wartości
|
||||||
|
set suma $id_los
|
||||||
|
|
||||||
set licz [expr $liczbaWierz - 1] # zmienna licz
|
#zmienna okreslajaca czy moge liczyc
|
||||||
|
set licz [expr $liczbaWierz - 1]
|
||||||
set wynik ""
|
set wynik ""
|
||||||
wyslij 1 $suma # wysyłam w jedną stronę
|
|
||||||
|
# wysyłam w jedną stronę
|
||||||
|
wyslij 1 $suma
|
||||||
fiber yield;
|
fiber yield;
|
||||||
|
|
||||||
while {$run} {
|
while {$run} {
|
||||||
if {$wynik!="end" && $kom(0)!=""} { # warunek konieczny
|
if {$wynik!="end" && $kom(0)!=""} {
|
||||||
|
#jesli nie mam jeszcze wyniku i mam komunikat pierwszy
|
||||||
|
|
||||||
if {$licz>0} { # jeśli nadal mogę liczyć
|
if {$licz>0} {
|
||||||
|
# jeśli nadal mogę liczyć
|
||||||
set k $kom(0)
|
set k $kom(0)
|
||||||
|
|
||||||
|
#obliczam sume
|
||||||
set suma [expr $id_los + $k]
|
set suma [expr $id_los + $k]
|
||||||
set licz [expr $licz - 1]
|
set licz [expr $licz - 1]
|
||||||
wyslij 1 $suma
|
wyslij 1 $suma
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
#ustawiam wynik
|
||||||
set wynik "end"
|
set wynik "end"
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user