Pascal program liczący działa ale wykonuję źle obliczenia


(Paulpolska) #1

Chodzi o to, że program ma 5 razy wylosować a[1] oraz b[1] i za każdym razem gdy np a[1] jest większe dodać do a[2] jeden punkt i na końcu wyświetlić wynik. Niby wszystko cacy ale program liczy nawet do 10 razy ;/ i czasem dostaję wynik np 0:10 gdzie maksymalny powinien być 0:5 co wyznacza wartość C. Pomocy

W ogóle dostaje tylko trzy te same wyniki albo 5:5 albo 0:10 albo 0:5 (5:0, 10:0).

Program Licz;

uses crt;


var

a:array[1..2] of integer;

b:array[1..2] of integer;

c:integer;


begin

clrscr;

a[2]:=0;

b[2]:=0;

repeat;

randomize;

c:=c+1;

a[1]:=random(400)+450;

b[1]:=random(400)+400;



if a[1] > b[1] then

a[2]:=a[2]+1

else

if b[1] > a[1] then

b[2]:=b[2]+1

else

if b[1] = a[1] then

a[2]:=a[2]+1;

b[2]:=b[2]+1;


until c=5 ;



If c=5 then

begin


Writeln(a[2], ':', b[2]);

readkey;

end;

end.

(Sawyer47) #2

Wprawdzie nie piszę w Pascalu, więc nie wiem czy to o to chodzi, ale rzuca się w oczy brak inicjalizacji zmiennej c.


(Paulpolska) #3

No to za wiele nie pomogło mi. Zwykły offtop zrobiłes


(Tomek Matz) #4

To nie był OT. Zmienną c musisz zainicjalizować. Poza tym wywołanie funkcji randomize przenieś na sam początek kodu (np. zaraz za begin). Po tym jak to zrobisz poczytaj jak się używa instrukcji if else i poczytaj co to są zakresy (begin end;), bo tutaj głównie masz bałagan. Zacznij też stosować wcięcia w kodzie.


(Paulpolska) #5

W szkole wykładowca tłumaczył to 100razy więc nie potrzebuję czytać a bałaganu tu nie widzę w C++ stosuję else i nie mam żadnych problemów. Zainicjowałem zmienną c i nie zmieniło to nic.

Przeniosłem randomize i to już coś dało wyniki są poprawne z tym, że w skali 2:1 ;o;o

Naprawiłem to uzywając "div". Więc ogólnie dzięki za pomoc.


(Tomek Matz) #6

A ja Ci mówię, że nie wiesz jak się używa if else. Brakuje jednego zakresu, a gdzie to Ci nie powiem. Poszukaj sam :slight_smile: Zmienną c zainicjalizowałeś wartością 0?


(Paulpolska) #7

Tak

Ale jest inny problem. b[2] jest za każdym razem większe bądź równe a[2] co jest dziwne jeżeli usatwie np a[2] jako 500 a b[2] jako 300 to program będzie widział obie sumy jako równe ;| kod wygląda teraz tak

Program Licz;

    uses crt;


    var

    a:array[1..3] of integer;

    b:array[1..2] of integer;

    c:integer;


    begin

    randomize;

    clrscr;

    a[2]:=0;

    b[2]:=0;

   c:=0;


    repeat;

   c:=c+1;

    a[1]:=random(400)+460;

    b[1]:=random(400)+380;



    if a[1] > b[1] then

    a[2]:=a[2]+1

    else

    if b[1] > a[1] then

    b[2]:=b[2]+1

    else

    if b[1] = a[1] then

    a[2]:=a[2]+1;

    b[2]:=b[2]+1;


    until c=5;



    If c=5 then

    begin


    a[2]:=a[2] div 2;

    b[2]:=b[2] div 2;

    Writeln(a[2], ':', b[2]);

    readkey;

    end;

    end.

EDIT://////

TE "C" CHYBA I TAK TRZEBA WYWALIĆ BO MI CHODZI O TO ŻEBY ANI A[2] ANI B[2] NIE PRZEKROCZYŁO WARTOŚCI 5 W OSTATECZNYM WYNIKU


(Tomek Matz) #8

Nie czytasz co piszę. Spójrz na tą poniższą instrukcję i zastanów się w jaki sposób należy tutaj użyć zakresu (begin end;)

if b[1] = a[1] then

    a[2]:=a[2]+1;

    b[2]:=b[2]+1;

Jak to poprawisz to będzie dobrze. Ten cały div jest niepotrzebny.


(Paulpolska) #9

Ok już mam. Ale efekt końcowy mam inny niż załozylem tzn dostaje np

2:3, 3:2, 5:0, 0:5

A chodzi mi o to aby ani a[2] ani b[2] nie przekroczyło 5 (i nie przekracza ale ...) i o to by ta wartość C była losowa tzn aby móc otrzymac np 1:0, 1:2


(Tomek Matz) #10

Dodaj sobie deklarację jeszcze jednej zmiennej. Nazwij ją np. max. Niech będzie typu integer tak jak c. W miejscu gdzie inicjalizujesz c dodaj inicjalizację zmiennej max max:=random(5)+1;. W miejscu gdzie jest warunek kończący pętlę zamień c=5; na c=max;. Zmień if c=5 then na if c<=5 then.

Jak to zrobisz to poczytaj o tym jak stosować wcięcia i zastanów się, czy ten program da się napisać przy użyciu mniejszej ilości linijek kodu.


(Paulpolska) #11

Wielkie dzięki za pomoc. Działa perfect po zrobieniu paru przykładów. Pewnie się da prościej, ale jestem nie doświadczonym jeszcze programistą (w Pascalu).


([alex]) #12

Oczywiście że można uprościć.

Program Licz;


var a,b:array[1..2] of integer;

c:integer;


begin

  randomize;

  a[2]:=0;

  b[2]:=0;

  repeat

     c:=c+1;

     a[1]:=random(400)+450;

     b[1]:=random(400)+400;

     if a[1] >= b[1] then a[2]:=a[2];

     if b[1] >= a[1] then b[2]:=b[2];

  until c=5 ;

  writeln(a[2], ':', b[2]);

  readkey;

end.


//lib jeszcze prościej z tym samym wynikiem:


Program Licz;

begin

  randomize;

  writeln(Random(6),':',Random(6));

  readkey;

end;