Torsten: Rechenaufgabe zum Verstaendnis (Vorsicht: Pascal!)

Moin Forum,

ich habe da eine Aufgabe zum Loesen, wobei das Ergebnis im Grunde nebensaechlich ist... das Zustandekommen ist mir reichlich unklar:

Der Code:
----------------------------------------------------------------
program verwirrung;

uses crt;

var zahl: integer;

procedure addiereverdopple (var a,b: integer);

begin
a:= 1+a;
b:= 2*b;
end;

procedure verdoppleaddiere (var a,b: integer);

begin
a:= 2*b;
b:= 1+b;
end;

begin
clrscr;

zahl:= 7;
addiereverdopple (zahl,zahl);
writeln (zahl:5);
verdoppleaddiere (zahl,zahl);
writeln (zahl:5);

repeat until keypressed;

end.
----------------------------------------------------------------

Ergebnis:
    8
   17

Bei zahl:=1
    4
    9

Bei zahl:=2
    6
   13

bei zahl:=4
   10
   21

bei zahl:=5
   12
   25

usw.

Waere dankbar, wenn mir jemand dieses erlaeutern kann.
Gruss, Torsten.

  1. Kleiner Nachtrag, da Fehler:

    Im Code heisst es: zahl:= 7;

    Soll aber lauten: zahl:= 3;

    Bei zahl:= 7 kommt als Ergebnis
       16
       33
                               raus.

  2. Hello,

    procedure addiereverdopple (var a,b: integer);

    Waere dankbar, wenn mir jemand dieses erlaeutern kann.

    Ich steige da jetzt nicht sooo tief ein... Aber wenn Du Dir mal Gedanken über die Aufrufparameter machst. Die Parameter a werden als Referenz übergeben.
    Wenn Du dann dieselbe Referenz zweimal benutzt, sind a und b identisch.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hóla Tom,

      Ich steige da jetzt nicht sooo tief ein... Aber wenn Du Dir mal Gedanken über die Aufrufparameter machst. Die Parameter a werden als Referenz übergeben.
      Wenn Du dann dieselbe Referenz zweimal benutzt, sind a und b identisch.

      Das bringt mich weiter: Vereinfacht wuerde ich dann behaupten:

      a:= 1+a;
      b:= 2*b;

      und

      a:= 2*b;
      b:= 1+b;

      waere bspw. bei zahl:=8

      (1+8)*2 =   18
      18*2+1  =   37

      welches das Programm auch ausgeben wuerde.

      Danke!

      Gruss, Torsten

  3. Hello,

    program verwirrung;

    uses crt;

    var zahl: integer;
    {----------------------------------------------}
     procedure addiereverdopple (var a,b: integer);

    begin
     a:= 1+a;
     b:= 2*b;
     end;
    {----------------------------------------------}
     procedure verdoppleaddiere (var a,b: integer);

    begin
     a:= 2*b;
     b:= 1+b;
     end;
    {----------------------------------------------}
     begin
     clrscr;

    zahl:= 7;
     addiereverdopple (zahl,zahl);
     writeln (zahl:5);
     verdoppleaddiere (zahl,zahl);
     writeln (zahl:5);

    repeat until keypressed;

    end.

    a ist 3, b ist 3
    a wird 3+1 = 4. Damit wird auch b = 4
    2*4 ist 8

    a ist 8, b ist 8
    a = 2*8 = 16, damit wird auch b = 16
    b = 1+b = 17, damit wird auch a = 17

    Ist es nun klar?

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. a ist 3, b ist 3
      a wird 3+1 = 4. Damit wird auch b = 4
      2*4 ist 8

      a ist 8, b ist 8
      a = 2*8 = 16, damit wird auch b = 16
      b = 1+b = 17, damit wird auch a = 17

      Ist es nun klar?

      Jupp, danke schoen! :)

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      Frische Gruesse aus http://www.flensburg.de

      Kay

      1. ...und noch eine kurze Anmerkung: Doppelnamen sind laestig! ;(

        Torsten-Kay!