Ich verstehe Procedure und Function nicht (TP)

Xeal87

Erfahrenes Mitglied
Hallo.
Ich habe seit einem halben jahr Informatikunterricht (gymnasiale oberstufe).
In den letzten Stunden haben wir Procedures und Functions durchgenommen (TurboPascal).
Leider habe ich sogut wie nicht verstanden, und möchte mir das jetzt nachträglich aneignen. Also ich weiss soviel, dass Procedures und Functions Unterprogramme sind. Die sehr einfachen dinge die ich wissen muss, habe ich auch schon rausgefunden, wie z.B:
Procedure bla;
Begin
Readln(a);
End;
procedure xcas;
Begin
Writeln(a);
End;
Begin
bla;
xcas;
End.
Zugegeben, das ist jetzt ein sehr blödes Beispiel *g*
Kennt jemand eine gute Informationsquelle zu diesem Thema ?
Ich habe schon mehrere Tutorials gelesen, kapier sie aber absolut nicht.
Ps: was ist ein Parameter ?
Cya
 

Receiver

Erfahrenes Mitglied
Also:

Eine Prozedur und eine Funktion sind zwei vollkommen verschiedene Dinger...

Die Prozedur:
Wenn Du eine Prozedur aufrufst, dann ist das so ähnlich als wie wenn Du in Deinem Programm ein "unterprogramm" laufen lässt. Eine Prozedur kann während der Laufzeit Deines Programms Dinge im eigentlichen Programm verändern. Das heißt, dass du zum Beispiel eine Prozedur hast, die einer Variable einen bestimmten Wert zuweist.

Beispiel:

var x : Integer;
procedure Wert zuweisen();
begin
x := 5;
end;

Nach dem Aufrufen dieser Prozedur hat also die Variable x den Wert "5"
Mit einer Prozedur kannst Du zum Beispiel auch Dinge auf den Bildschirm zaubern. Angenommen Dein Bildschirm ist leer, und Du hast ne Prozedur, die Linien zeichnet, kannst Du wenn Du die Prozedur aufrufst Linien auf Deinen Bildschirm malen lassen.


Die Funktion:
Eine Funktion ist halt ne Funktion (wie auch in der Mathematik). Ne Funktion kann selbst nichts verändern, sondern bekommt in der Regel einen oder mehr Werte (zum Beispiel in Form von Parametern ->siehe unten) bereitgestellt, und berechnet aus diesen Werten dann irgend etwas neues.

Beispiel:

funtion Addieren(Zahl1, Zahl2 : integer):integer;
begin
result := Zahl1 + Zahl2;
end;

Das Bewirkt folgendes: Zahl1 und Zahl2 sind unsere Parameter, und zwar vom Typ Integer. Das heißt, dass der Computer weiß, dass er für diese Funktion zwei Werte bekommen kann, die beide eine Zahl beinhalten.
Also: Zahl1, Zahl2 : (vom Typ) Integer. Als Ergebnis gibt die Funktion auch wieder einen Integer-Wert (also ne Zahl) zurück.
Der eigentliche Anweisungsteil der Funtion macht dann folgendes:
result := Zahl1 + Zahl2
Das heißt: Das Resultat der Funktion ist gleich Zahl1 + Zahl2

->Funtkionen sind Hilfsmittel, mit denen Du Deinen Quellcode drastisch reduzieren kannst...

Parameter:
Parameter sind Werte, die an Funktionen und Prozeduren übergeben werden. Diese arbeiten dann mit den Parametern (ähnlich wie mit Variabeln)


und nun noch ein Beispiel, wie das alles zusammen funktioniert:

//ANFANG

var ausgeben : Integer;

function Addieren(Zahl1, Zahl2: Integer):Integer;
begin
result := Zahl1 + Zahl2;
end;

procedure Addition_anzeigen;
begin
ausgeben := Addieren(1, 2);
end;

//ENDE

Folgendes passiert:
Als erstes mal haben wir ne Variable, in der Zahlenwerte gespeichert werden können. Die ist uns erst mal egal, sie hat keinen Inhalt und wird auch nicht wirklich gebraucht...

Dann kommt die Funktion, die wir oben schon mal hatten. Sie ist in der Lage aus 2 Werten die sie als Parameter übergeben bekommt (Zahl1 und Zahl2) eine Summe zu bilden und diesen neuen Wert zurückzugeben.

Dann kommt die Prozedur, die letzten Endes innerhalb unseres Programms agieren kann. Die Prozedur ist nun dazu da 2 Werte an die Funktion zu übergeben, und das Ergebnis zu speichern, auszugeben oder weiter zu verwenden.
In unserem Fall speicher sie das Ergebnis in der Variablen "ausgeben"
Es passiert folgendes:
ausgeben "ist gleich" das Ergebnis der Funktion Addieren. Da die Funktion aber wissen muss was sie addieren soll, bekommt sie von der Prozedur 2 Werte mit auf den Weg, nämlich 1 und 2.
Im Endeffekt wird nach dem Aufruf der Prozedur "Addition_anzeigen" in der vorher leeren Variable "ausgeben" die Zahl 3 gespeichert sein

Hoffe mal, dass ich Dir was helfen konnte, und das das auch alles so stimmt, weil das bei mir mittlerweile auch ein gutes Jahr her ist, dass ich Informatik hatte. Falls irgendwas im Quellcode nicht stimmen sollt, kann das gut sein, weil ich nie Pascal hatte, sonder Delphi. Da Delphi aber auf Pascal basiert, sollte das eigentlich alles so stimmen....
 

Xeal87

Erfahrenes Mitglied
Also erstmal danke. Aber ich hab mir sagen lassen, dass Prozeduren und Funktionen schon zusammengehören... Währ ja auch komisch, warum werden die dann in jedem Tutorial zusammen behandelt ?!
Also ich hab inzwischen rausgefunden, dass Funktionen einfach nur Prozeduren sind, bei denen man nur einen Wert zuweisen kann (vgl. Mathematik:
eine Funktion weist einem y wert genau einen x wert zu).
 

Patrick Kamin

Erfahrenes Mitglied
-

Der wesentliche Unterschied ist, dass eine Funktion einen Rückgabewert hat. Dies lässt sich aber über Referenzen, sei es bei Funktionen oder Prozeduren, lösen. Der Nutzen ist, dass man Quellcode, den man häufig in seinem Programm benötigt, auslagert, um per Aufruf auf ihn zu zugreifen.

Auf globale Variablen sollte gänzlich verzichtet werden, da es den Quellcode unübersichtlich macht.
 
N

Narrator

Nebeneffekte

Es stimmt nicht nicht das Funktionen nix verändern können. Eine Funktion kann genausogut einer globalen Variable beispielsweise Werte zuweisen wie eine Prozedur.
Auf solche Nebeneffekte von Funktionen (und auch Prozeduren) sollte jedoch verzichtet werden, da es dann (bei größeren Programmen) zu unerklärlichen Geschehnissen kommen, kann, wenn eine Prozedur/Funktion einfach ungefragt in äußere Variablen schreibt. Falls man diese Werte braucht sollte man einen out-parameter hinzufügen.

Deklariert wird das dann so:

function name1(out ss: Integer): Integer;
procedure name2(out ss: Integer);

Dabei können natürlich beliebige Datentypen( anstatt Integer) genommen werden und die Namen können auch anders sein. Auf jeden Fall kann man natürlich auch weitere Parameter hinzufügen.

Solchen Funktionen/Prozeduren kann man dann jedoch keine konstanen Werte übergeben (wie z.B mit const dekl. Variablen(Konstanten eben) oder Zahlen wie 99, oder auch Strings). Zudem dürfte es auch nicht gehen ihnen die Rückgabewerte von Funktionen zu übergeben. So z.b:

var k: Integer;
name2( name1( k ) );

Man kann nur Variablen übergeben(wie oben k). Der vorherige Wert dieser Variablen, wird dabei verworfen und es wird von der Prozedur/Funktion ein neuer Wert in die Variable geschrieben.

Falls es für die Funktion/Prozedur wichtig ist den vorigen Inhalt der Variablen zu erfahren, nimmt man stattdessen var-Parameter(also einfach das out mit var ersetzen). Für var-Parameter gilt das gleiche, wie für out-Parameter ausser das die Prozedur/Funktion Zugriff auf den vorherigen Wert der Variablen hat.

Hoffe mal ich hab das jetzt nicht umsonst geschrieben und irgendwer liest das...:)