Bruce666 utworzono 29 marca 2015 utworzono 29 marca 2015 Witam Jestem w II klasie LO na profilu Mat-Fiz-Info, od początku II klasy uczymy sie pascala. Przejdę do rzeczy Dostałem do napisania program o wymownej nazwie "Gwiazdki" . Chodzi w nim o to, że komputer losuje losową liczbę z przedziału od 1 do 50. Następnie gracz 1 podaje liczbę z tego samego przedziału, potem gracz 2. Problem pojawia się z procedurą "sprawdź" - ma ona wystawic graczowi 1 i 2 oceny. Procedura ma 5 parametrów: k - wartość [integer] - podana przez komputer g1 - liczba [integer] - podana przez gracza1 g2 - liczba [integer] - podana przez gracza 2 w1 - zmienna [integer] w2 - zmienna [integer] Na podstawie parametrów k,g1,g2 procedura ocenia graczy i i umieszcza oceny w zmiennych w1 i w2 wg poniższych kryteriów: > 0 - jezeli wygrał > 1 - przegrał bo za mała liczba > 2 - przegrał bo za duża liczba > 3 - remis Procedura jaką napisałem wygląda tak: procedure sprawdz(k,g1,g2:integer; var w1,w2:integer); begin if (g1<=k) and (g1=g2) then w1:=3 else begin if g1>k then w1:=2 else begin if (g1<=k) and (g1<g2) and (g2<=k) then w1:=1 else begin if ((g1<=k) and (g1>g2)) or ((g1<=k) and (g2<k)) then w1:=0 end end end; if (g1=g2) and (g2<=k) then w2:=3 else begin if g2>k then w2:=2 else begin if (g2<=k) and (g2<g1) and (g1<=k) then w2:=1 else begin if ((g2<=k) and (g2>g1)) or ((g2<=k) and (g1>k)) then w2:=0 end end end; Niestety wg powyższej procedury zawsze otrzymuję taki sam wynik niezależnie od tego jaką liczbę podam (testowo ustawiona jest stała liczba 10) i jak wpisze liczbe gracza 2 10 to wyskakuje mi wartość 2 czyli że przegrał. Jak zacząłem pisać procedurę zastanawiałem się czy użyć case'a czy if'ów. Nauczyciel podpowiedział że użycie case'a byłoby bardziej skomplikowane. Moje pytanie jest takie: Gdzie jest błąd w procedurze?
rafalluz komentarz 29 marca 2015 komentarz 29 marca 2015 Jakie są warunki zwycięstwa? Dokładne trafienie w liczbę? To co dokładnie oznacza "remis"? I co trzeba wpisać, jak obaj nie zgadną?
Bruce666 komentarz 29 marca 2015 Autor komentarz 29 marca 2015 wygrywa ten kto poda liczbę najbliższą do wylosowanej przez komputer. remis jest wtedy gdy np obaj wygrają albo podadzą te same liczby albo gdy obaj gracze mają te same liczby.
rafalluz komentarz 29 marca 2015 komentarz 29 marca 2015 (edytowane) No to prosto: 3 wpisujesz, jak g1 = g2. Jak g1 <> g2 ,porównujesz, kto bliżej k. Robisz to przez Abs(g1 - k) (i Abs(g2 - k)) i kto ma mniejsze Abs, dostaje 0, drugi 1 albo 2. Edytowane 29 marca 2015 przez rafalluz
Bruce666 komentarz 30 marca 2015 Autor komentarz 30 marca 2015 zastanawiam się jak to w ogóle zapisać z if'ami.
MasterYoghourt komentarz 30 marca 2015 komentarz 30 marca 2015 (edytowane) Tak to może wyglądać: program generator; uses crt; procedure losowanie; var k,g1,g2:byte; begin clrscr; write ('Gracz numer jeden podaj liczbę z przedziału 1-50: '); readln (g1); writeln; write ('Gracz numer dwa podaj liczbę z przedziału 1-50: '); readln (g2); k:=random(51); clrscr; writeln ('Wygenerowano liczbę:',k); writeln; writeln ('Liczba gracza numer jeden:',g1); writeln ('Liczba gracza numer dwa:',g2); writeln; writeln; if (abs(g1-k) = abs(g2-k)) then writeln ('Jest remis !'); if (abs(g1-k) > abs(g2-k)) then writeln ('Gracz numer dwa zwyciężył !'); if (abs(g1-k) < abs(g2-k)) then writeln ('Gracz numer jeden zwyciężył !'); end; begin randomize; losowanie; readln; end. Edytowane 30 marca 2015 przez MasterYoghourt
rafalluz komentarz 30 marca 2015 komentarz 30 marca 2015 (edytowane) Przy = nawet nie trzeba Abs. Wystarczy zwykłe g1 = g2. Edytowane 30 marca 2015 przez rafalluz
Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!
Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.