x-kom hosting

[PASCAL] problem z procedurą, nie wyświetlają sie prawidłowe wyniki

Bruce666
utworzono
utworzono

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:

  - 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 w1w2 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
komentarz

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
komentarz

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
komentarz (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 przez rafalluz
Bruce666
komentarz
komentarz

w którym miejscu?

rafalluz
komentarz
komentarz

Co "w którym miejscu"?

Bruce666
komentarz
komentarz

zastanawiam się jak to w ogóle zapisać z if'ami. 

MasterYoghourt
komentarz
komentarz (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 przez MasterYoghourt
rafalluz
komentarz
komentarz (edytowane)

Przy = nawet nie trzeba Abs. Wystarczy zwykłe g1 = g2.

Edytowane przez rafalluz

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.