[Pascal]Funkcje-o co w nich biega?jak powinien wyglądać kod?


(M4thy5) #1

Procedury rozumiem na czym polegają ale nie potrafię zrozumieć idei funkcji. Przecież procedury także nam zwracają to co między begin i end jest w procedurze, możemy w procedurze napisać tak by wyliczało i wypisywało coś, to wypisanie wywołamy wywołując procedurę więc będziemy mieli zwrócony wynik. Czytam i czytam i wszystkie opisy funkcji są tak napisane że tylko ci co to już rozumieją zrozumieją. Może mi to ktoś wytłumaczyć?

Jak powinien wyglądać ten kod:

function a(imie,nazwisko:string):string;

  begin

    imie:= 'AAA';

    nazwisko:= 'BBB';

    write(imie,nazwisko);

  end;


begin


  Writeln('Nazywam się ' + a);

  Readln;


end.

by pobierane było z tej funkcji imie i nazwisko?


([alex]) #2

M być raczej:

function a(imie,nazwisko:string):string; begin Result:=imie+' '+nazwisko; end;


begin

  Writeln('Nazywam się ' + a('AAA','BBB'));

  Readln;

end.

ale to trochę bez sensu to tak jak pisać funkcję która jedyne co robi to dodaje dwie liczby, z tym że niektórzy "eksperci" na tym forum uważają inaczej :stuck_out_tongue: lub:

function a:string;

var imie,nazwisko:string

begin

  Write('Podaj nazwisko: '); ReadLn(nazwisko);

  Write('Podaj imie: '); ReadLn(imie);

  Result:=imie+' '+nazwisko; 

end;


begin

  Writeln('Nazywam się ' + a);

  Readln;

end.

To już ma trochę sensu jeżeli w programie kilkakrotnie i w różnych miejscach używasz wczytywania danych osobowych. Czasami też się stosuje się taki zabieg, jeżeli jakaś funkcja zrobiła się na tyle duża że przestała być czytelna, wtedy rozrzuca się jej treść na kilka krótszych procedur i funkcji.


(Krzkaczor) #3

Dawno nie programowałem w pascalu (radzie przerzucić się na c++) ale jest taka różnica: funkcja może zwracać jakąś wartość poprzez result, a procedura to tylko wydzielony fragment kodu. W innych językach programowania w ogóle nie istnieje możliwość deklarowania procedury (albo jest to nie popularne) zwykle używa się funkcji.


(M4thy5) #4
function a(imie,nazwisko:string):string; begin Result:=imie+' '+nazwisko; end;


begin

  Writeln('Nazywam się ' + a('AAA','BBB'));

  Readln;

end.

aaa.pas(3,7) Error: Identifier not found "Result"

aaa.pas(9,4) Fatal: There were 1 errors compiling module, stopping

aaa.pas(0) Fatal: Compilation aborted

Ten drugi kod też- taki sam błąd.

W pascalu ucze sie narazie, dlatego takie programy. Wiem że lepiej c++ ale w szkole tego wymagają obecnie.

Jaka w tym różnica? Do jednego sie to sprowadza.

Dalej nie potrafię pojąć tej funkcji...


(Pk1001100011) #5

Nie mam pojęcia co robi tam Result. Nie widzę, żeby gdziekolwiek było to zadeklarowane.

Powinno być raczej tak:

function a(imie,nazwisko:string):string; begin a:=imie+' '+nazwisko; end;

Jeśli chce się przypisać funkcji wynik, to używa się jej nazwy, czyli w tym przypadku a.

Polecam: http://turbopascal.helion.pl/r-11.htm


(M4thy5) #6

Wczoraj jak to czytałem to mnie ta teoria na początku przygniotła, później też nie miałem pojęcia o co biega albowiem teorii nie zrozumiałem. Napisane tak że ciężko zrozumieć jeśli nie ma sie pojęcia o tym.

Result z tego co widzę nie działa w pascalu, w delphi może działa.

Jak więc za pomocą funkcji wypisać zapętlone pięciokrotnie pętlą for, writeln(''abc); lub jakiś tekst sformatowany?? Z tego co widze funkcja tylko wypisuje jedną wartość za pomocą nazwa_funkcji:=


([alex]) #7

Co do

result:=

ro w nowszych kompilatorach Pascala to jest alternatywa do

nazwa_funkci:=

trzeba w tytule pisać nie [Pascal] zaś [Pascal,przedpotopowy] :smiley:

Nie wypisuje tylko zwraca, to wielka różnica.

Przede wszystkim różnica pomiędzy funkcją a procedurą polega na tym że z funkcji da się budować złożone obliczenia, np wyobraź sobie procedurę sqrt zamiast funkcji, zamiast:

z:=sqrt(x)+sqrt(y);

było by to:

sqrt(z1,x);

sqrt(z2,y);

z:=z1+z2;

chyba się zgodzisz że niezbyt wygodny zapis?


(Pk1001100011) #8

Prościej już chyba nie można tego wytłumaczyć.

Mógłbyś powiedzieć w jakich?

Próbowałem skompilować ten kod w najnowszej wersji środowiska Turbo Pascal (7.01) i kompilator "wyrzucał" błąd (nie znaleziono identyfikatora). Tak samo było w najnowszej wersji kompilatora Free Pascal (2.2.2).

No chyba, że trzeba zmienić coś w ustawieniach.


([alex]) #9

Ja używam Delphi lub ewentualnie DevPas.