komentarze

This commit is contained in:
Jakub Adamski 2021-04-05 10:51:44 +02:00
parent 46dc61e655
commit 93066b3398
2 changed files with 160 additions and 72 deletions

View File

@ -2,4 +2,4 @@
Zadania z ćwiczeń. Zadania z ćwiczeń.
## Temat A ## Temat A
W trakcie. Zadania rozwiązane.

View File

@ -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"
} }
} }