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ń.
## Temat A
W trakcie.
Zadania rozwiązane.

View File

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