Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

ifanovich

Pascal a błąd!

Polecane posty

Witam serdecznie! Otóż chce sobie zrobić program, który po wprowadzeniu długości boku będzie po prostu obliczał pole i obwód. Wziąłem się za to i mam pewien problem, mianowicie wyskakuje błąd przy kompilacji:

program pole_i_obwod;
uses CRT;
var
x:byte;

PROCEDURE kwadrat(a,b,c:byte);
begin
clrscr;
writeln('Wybrałeś figurę kwadrat, proszę podać długość boku A');
readln(a);
c:=a;
a:=a+a+a+a;
b:=c*c;
writeln('Obwód kwadratu wynosi: ',a,' cm.');
writeln('Pole kwadratu wynosi: ',b,' cm2.');
readln;
end;

PROCEDURE prostokat(a,b,c,d:byte);
begin
clrscr;
writeln('Wybrałeś figurę prostokąt, proszę podać długość boku A i B');
readln(a,b);
c:=a+a+b+b;
d:=a*b;
writeln('Obwód prostokąta wynosi: ',c,' cm.');
writeln('Pole prostkąta wynosi: ',d,' cm2.');
readln;
end;

begin
clrscr;
writeln('Witam w moim programie do liczenia pola i obwodu.');
delay(2500);
clrscr;
writeln('Proszę wybrać figurę.');
readln(x);
//TUTAJ BŁĄD!
if x=1 then kwadrat;
if x=2 then prostokat;
//TUTAJ BŁĄD

readln;
end.

Pewnie robię coś źle ze zmiennymi lokalnymi, ale dokładnie nie wiem co i czy to nie powinno wyglądać inaczej, czyli: kwadrat(a*b) blablabla. Zależy mi, żeby zachować lokalne!

Jakieś propozycję co zmienić i co robię źle? :)

btw. mam dziwny układ okna Pascala, może wie ktoś jak to naprawić? Jest strasznie małe, co przekszadza mi przy tak dużej rozdzielczości oraz strasznie dziwnie ułożone, bo nawet nie mogę kliknąć "New" bo nie łapie, tak dziwnie zakryte.

55fimg.png

Link do komentarza
Udostępnij na innych stronach

Nie działa, bo kod napisałeś w ten sposób, że procedury kwadrat i prostokat mają być wywoływane z parametrami, a wywołujesz je bez parametrów (i, jak rozumiem, taki był zamiar). Wywal (a,b,c:byte), a zamiast tego wstaw var a,b,c:integer przed begin procedury kwadrat. To samo z prostokątem.

Nawiasem mówiąc, to chyba zmienne c i d są tu zbędne ;)

Link do komentarza
Udostępnij na innych stronach

Mógłbyś jaśniej z tymi parametrami? Bo chciałbym wiedzieć w czym mój błąd żeby go w przyszłości nie popełnić, a nie bardzo go rozumiem. I btw. będą to wtedy zmienne globalne czy lokalne?

I czemu c, d są zbędne? Jakiś innym sposób zapisu preferujesz?

Link do komentarza
Udostępnij na innych stronach

Zapis PROCEDURE kwadrat(a,b,c:byte); oznacza że tworzysz procedurę, która przyjmuje trzy argumenty. Czyli zamiast if x=1 then kwadrat; musiałbyś napisać np. if x=1 then kwadrat(4,3,7); i wtedy a=4, b=3, c=7. Ot, i cała zagwozdka ;)

Zmienne tworzone w procedurze są zmiennymi lokalnymi.

A zamiast używać zmiennych tymczasowych c i d, wynik możesz liczyć przy wyświetlaniu komunikatu. Przykładowo ("a" to bok kwadratu):

writeln('Obwód kwadratu wynosi: ',4*a,' cm.');

writeln('Pole kwadratu wynosi: ',a*a,' cm2.');

Link do komentarza
Udostępnij na innych stronach

I wszystko jasne! Tak też planowałem zrobić właśnie, żeby zmniejszyć ilość zmiennych ale najpierw chciałem się zająć tymi głównymi sprawami. Naprawdę bardzo mi pomogłeś, wielkie dzięki! :)

//e:

próbuję zrobić menu które steruje się za pomocą kursorów i na razie wytworzyłem takie coś przy pomocy tutoriala. Wie ktoś może jak zrobić, by jednak zwiększyć ilość, bo raczej na kwadracie i prostokącie nie skończe.

Begin
  Tablica[1]:='   Kwadrat    ';
  Tablica[2]:='  Prostokąt  ';
  Tablica[3]:='   Wyjscie  ';
  clrscrl
  textcolor(15);
  for y:=1 to 3 do
    begin
      textcolor(15);
      textbackground(0);
      gotoxy(40,3+y);
      gotoxy(40,3+y);
      write(tablica[y]);
    end;
  y:=1;
  REPEAT
    textcolor(0);
    textbackground(15);
    gotoxy(40,3+y);
    write(tablica[y]);
    c1:=ReadKey;
    c2:=' ';
    if c1=Chr(0) then c2:=ReadKey;
    textcolor(15);
    textbackground(0);
    gotoxy(40,3+y);
    write(tablica[y]);
    if c2='H' then Dec(y); <--- //dlaczego H?
    if c2='P' then Inc(y); <--- //dlaczego P?
    if y=0 then y:=3;
    if y=4 then y:=1;
    if c1=Chr(27) then y:=3;
  UNTIL (c1=chr(27)) or (c1=chr(13));
  if y=1 Then kwadrat;
  if y=2 Then prostokat;
end.

nie bardzo też wiem co oznacza to co zaznaczyłem.

//e2: już wiem i logicznie doszedłem do tego jak działa to, lecz ciągle nie wiem czemu strzalka w górę to #72 a w dół to #80 w ASCII, skoro to po prostu H i P. Może ktoś wytłumaczyć? I czy można to zapisać inaczej niż po prostu H i P? np if c2=chr(75)?

Link do komentarza
Udostępnij na innych stronach

strzałki to znaki specjalne poprzedzone znacznikiem 0 ich kod to #0#72, #0#80 itd. musisz zrobić komendą if sprawdzenie czy w buforze znajduje się #0 potem czy #72, #80

np:

if kl=#0 then
     begin
      if kl=#72 then {tu kawałek programu na ruch w górę}
      if kl=#80 then {tu w dół}
     end

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...