Problem z funkcjami i procedurami.

0

Witam!
Mam problem z Programowaniem.
Nie ogarniam funkcji i procedur, a niebawem sprawdzian. Babka zaiwania jak szalona, było z tego 3-4 lekcje i już sprawdzian. Przykładów praktycznie nic, tyle co pokazywała na lekcji ( nie zdążyłem spisać ). A niestety jestem taki, że zrozumiem dopiero, gdy przysiądę nad problemem w domu.
Problem jest taki. Po pierwsze, nie rozumiem dokładnie zmiennych/parametrów lokalnych, globalnych, formalnych, aktualnych ( są jeszcze jakieś? ).
Nie rozumiem też ogólnie metody wprowadzania procedur.
Może dla przykładu dam program. Proszę o na prawdę proste, wręcz łopatologiczne wytłumaczenie problemu.

Przykład:

program kwadrat;
var
a,c,c,x1,x2: Real;     { Są to zmienne globalne, tak? }
liczba: Real;
Procedure rownaniekwadratowe (a,b,c: Real; 
var liczbarozwiazan: Byte;                            {Jeśli powyżej są zadeklarowane zmienne globalne, to po co te same 
var x1,x2:Real );                                           zmienne deklaruje się w procedurze? }
var
Delta:Real           {A to jaka jest zmienna? Czemu stoi tutaj?}
begin                                                                                   { OD TĄD
Delta:=sqr(b)-4*a*c;
if (Delta<0) then Liczbarozwiazan:=1
else
if (Delta:=0) then 
begin
Liczbarozwiazan:=1;
x1:=-b/(2*a);
end.
else
begin                                                          
Liczbarozwiazan:=2;
x1:=(-b-agrt(Delta))/(2*a);
x2:=(-b+agrt(Delta))/(2*a);                            DO TĄ to deklaracja procedury, tak? }
end.
begin
Write('Podaj A'); Read('A');
Write('Podaj B'); Read('B');
Write('Podaj C'); Read('C');
Rownaniekwadratowe (a,b,c,liczba,x1,x2); 
if (liczba:=0) then writeln ('Brak rozwiazania')              {Tutaj wywołujemy procedurę, tak? Po co te zmienne w 
else                                                                        nawiasie? Przypisujemy do nich wartości?}
if (liczba:=1) then writeln('1rozwiazanie')
else writeln ('2 rozwiazania');
repeat untill keypressed;
end;

Proszę o pomoc.

Pozdrawiam!

0

Zacznij od sformatowania kodu, bo aż oczy bolą...

1

Planowałem ci opisać niektóre rzeczy ale po czymś takim jak if Delta:=0 then stwierdziłem że lepiej po prostu dać link do kursu który opisze to dokładniej i od podstaw.

Może i stary ale dobrze tłumaczy podstawy (tylko się nie przejmuj dziwactwami z DOSa które już nie obowiązują: http://www.pascal.eu.org/

0

Dzięki!
Przeczytałem podane poradniki i nieco mi rozjaśniły.
Mam jednak jeszcze pytania.
Zmienna 'Delta' jest zmienną globalną, tak? Mógłbym ją zadeklarować przed procedurą? Dalej nie wiem, czemu w procedurze zadeklarowane są drugi raz zmienne formalne, kiedy wcześniej te same zadeklarowane są jako globalne? Przecież procedura je widzi?

1

Cienko u Ciebie ze składnią, pomyliły Ci się kropki i średniki przy endach, oraz operator przypisania (:=) z operatorem porównania (=). A tu:

Procedure rownaniekwadratowe (a,b,c: Real; 
var liczbarozwiazan: Byte;                            {Jeśli powyżej są zadeklarowane zmienne globalne, to po co te same 
var x1,x2:Real );   

nie następuje deklarowanie zmiennych, tylko parametrów procedury.

Oto jak powinno się formatować kod.

program kwadrat;

var
  a, c, c, x1, x2: Real;     { Zmienne globalne (wywali błąd, dwie deklaracje tej samej zmiennej }
  liczba: Real;

procedure RownanieKwadratowe (A, B, C: Real; var LiczbaRozwiazan: Byte; var x1, x2:Real ); 
var
  Delta:Real           {Zmienna lokalna, której można używać tylko w tej procedurze}
begin                                                                                   { OD TĄD}
  Delta:=sqr(b)-4*a*c;
  if (Delta < 0) then LiczbaRozwiazan := 1
    else
      if (Delta:=0) then 
        begin
          Liczbarozwiazan:=1;
          x1:=-b/(2*a);
        end    //jak używasz else, to bez kropki ani średnika.
      else
        begin                                                          
          Liczbarozwiazan:=2;
          x1 := (-b - agrt(Delta)) / (2 * a);
          x2 := (-b + agrt(Delta)) / (2 * a);                          {  DO TĄ to deklaracja procedury, tak? }  //Tak
        end;    //<== gdzie kropke znowu wpieprzasz. Kropka ma być TYLKO na końcu programu.
end;

begin
  Write('Podaj A'); Read('A'); 
  Write('Podaj B'); Read('B');
  Write('Podaj C'); Read('C');
  Rownaniekwadratowe(a, b, c, liczba, x1, x2);  // Wywołanie procedury z parametrami.
  if (liczba = 0) then Writeln ('Brak rozwiazania')              
    else                                                                        
      if (liczba = 1) then writeln('1 rozwiazanie')
        else
          Writeln ('2 rozwiazania');
  Readln;
end.

Faktycznie nie ogarniasz procedur. Bo to działa tak. Jak masz np

procedure WypiszNaEkranie(X, Y: Real);
begin
  Writeln('Pierwszy parametr to: ', X, ', a drugi to: ', Y);
end;

a potem wywołasz tą procedurę z paramtrem np

WypiszNaErkanie(3.2, 8.5);

to na ekranie zostanie wypisany tekst: `Pierwszy parametr to: 3.2, a drugi to: 8.2''. Czaisz?

1

zmienna globalna to taka ktora istnieje przez caly czas "zycia" programu i jest do niej dostep z kazdego miejsca w porgamie.
delta nie jest zmienna globalna, bo jest zadeklarowana tylko wewnatrz procedury rownaniekwadratowe(). czy widziesz to? w innym miejscu programu ta zmienna nie istnieje. gdybys zadeklarowaj ja przed procedura (obok a,c,c,x1,x2...) to wtedy ta zmienna juz bedzie globalna.

0

@TomRiddle, jesteś mistrzem! Nie mogłem pojąć, że przy przypisywaniu zmiennych procedury, przy jej deklaracji na tych samych miejscach wstawiamy odpowiednie wartości ( Ostatni przykład ). Dzięki wielkie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1