Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Delphi

Programmauschnitt 1

Funktion (Deklaration).

Function mmm (a, b: real): real;

Begin

if a > b then

result := a //Rückgabe a

Else

result:=b; //Rückgabe b

End;

Aufruf der Funtion:

Zahl1:= 2;

Zahl2:= 5.4;

Zahl3:= ????????; //Aufruf

Programmauschnitt 2

Prozedur (Deklaration)

Procedure xxxx (var a,b: real);

Var zwspeicher: real;

Begin

Zwspeicher :=a;

a:=b;

b:=zwspeicher

end;

Aufruf der Prozedur:

Zahl1:=2;

Zahl2:= 5.4;

????????????

1. Erklären sie genau die Abreitweise der Funktion von Programmauschnitt1 und den Funktionskopf

2. Ergänzen sie die Zeile 3 ???????

3. Schreiben sie die Funktion von Programmauschnitt1 als Procedure

4. Was ändert sich dann beim Aufruf? Welche werte stehn am ende in Zahl1, Zahl2 und Zahl3?

5. Erklären sie genau die Abreitweise der Funktion von Programmauschnitt2 und den Funktionskopf

6. Kann die Prozedur als Funktion geschrieben werden? (Begründung)

7. schreiben sie ein procedure, die 2 zahlen verdoppelt zurückgibt und außerdem die summe dieser beiden zahlen verdoppelt.

Geschrieben

1. Das solltest du selber hinbekommen. ;)

2. zahl3 := mmm(zahl1,zahl2);

3.


procedure mmm (a, b: real; var c: real);

Begin

  if a > b then c := a //Rückgabe a

  Else c:=b; //Rückgabe b

End;

4. Das solltest du jetzt auch schaffen 5. http://de.wikipedia.org/wiki/Dreieckstausch Den Unterschied zwischen Wert- und Referenzparametern solltest dir auch mal anschauen: http://de.wikipedia.org/wiki/Call_by_value http://de.wikipedia.org/wiki/Referenzparameter
procedure callByValue(a,b: string);
ist wie der Name schon sagt "Call by value" und
procedure callByReference(var a,b: string);

ist wie der Name schon sagt "Call by reference"

Geschrieben

Hier mal ein kleines Beispiel:


procedure summe(paSummand1,paSummand2: double; var paSumme: double);

begin

 paSumme := paSummand1 + paSummand2; //das wirkt sich nach "außen" aus

 paSummand2 := 4711; //hat nach außen keine Auswirkung

 paSummand1 := 42;  //hat auch keine Auswirkung nach außen

end;


var

  summand1,summand2,ergebnis: double;

begin

  summand1 := 7;

  summand2 := 3;

  summe(summand1,summand2,ergebnis); 

end;

paSummand1 und paSummand2 sind Wertparameter, d.h. ich übergebe direkt einen Wert. Innerhalb der Prozedur kann ich mit paSummand1 und paSummand2 machen, was ich will, auf die Variablen summand1 und summand2 wirkt sich das nicht aus.

paSumme ist ein Referenzparameter, weise ich in der Prozedur paSumme einen Wert zu, dann verändere ich damit auch den Wert von ergebnis.

Bei diesem Beispiel heißt das konkret:

In ergebnis steht nach dem Prozeduraufruf 10. In summand1 steht immer noch 7, obwohl ich in der Prozedur paSummand1 den Wert 42 zugewiesen habe. Das gleiche gilt für summand2, d.h. summand2 hat nach Prozedur-Aufruf immer noch den Wert 3.

P.S.: Innerhalb von 15min kann man einen Beitrag noch editieren, mußt also keine Doppelposts machen. Großschreibung und der exzessive Gebrauch von Satzzeichen gelten im Übrigen als einigermaßen unhöflich.

Geschrieben

Eine Funktion gibt einen Wert zurück, bei einer Prozedur geht das nur über einen Referenzparameter.


function gibFuenf: Integer;

begin

  result := 5;  //result ist der Rückgabewert der Funktion

end;


var

  zahl1: integer;

begin

  zahl1 := gibFuenf;

Als Prozedur sieht das so aus:

procedure gibFuenf(var paZahl: Integer);

begin

  paZahl := 5;

end;

var

  zahl: Integer;

begin

  gibFuenf(zahl);

Frage 6 find ich einigermaßen doof, da könnte man nämlich durchaus mit "Ja" anworten, obwohl dein Lehrer vermutlich "Nein" hören will. ;)

Geschrieben

Ja...mmm. Also wenn ich in der Function mit Referenzparametern Arbeite kann ja der veränderte Wert in das Programm übergeben, aber ich danke bei einer Function hat man am ende nur einen Augabewert und nur Procedures können auch mehr als einen Ausgabewert haben, und wir haben doch 2 ausgabewerte?

Geschrieben

Dein Lehrer will vermutlich hören, daß man eine Prozedur verwenden soll, weil eine Funktion nur einen Rückgabewert hat, das hast du richtig verstanden.

Braucht man mehr als einen Rückgabewert, dann muß man mit Referenzparametern arbeiten.

function xxxx (var a,b: real): integer;

Var zwspeicher: real;

Begin

  Zwspeicher :=a;

  a:=b;

  b:=zwspeicher;

  result := 1;  //kann man auch weglassen, aber dann spuckt der Compiler ne

                   // Warnung aus

end;

Das funktioniert genau so gut, wie die Prozedur, am Aufruf ändert sich auch nix. Der Rückgabewert ist zwar total sinnlos, aber stört nicht.

Also ich würde sagen, die Prozedur kann ganz eindeutig auch als Funktion implementiert werden. :D

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...