Rechenaufgabe zum Verstaendnis (Vorsicht: Pascal!)
Torsten
- programmiertechnik
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.
Kleiner Nachtrag, da Fehler:
Im Code heisst es: zahl:= 7;
Soll aber lauten: zahl:= 3;
Bei zahl:= 7 kommt als Ergebnis
16
33
raus.
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
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
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
a ist 3, b ist 3
a wird 3+1 = 4. Damit wird auch b = 4
2*4 ist 8a ist 8, b ist 8
a = 2*8 = 16, damit wird auch b = 16
b = 1+b = 17, damit wird auch a = 17Ist es nun klar?
Jupp, danke schoen! :)
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Frische Gruesse aus http://www.flensburg.de
Kay
...und noch eine kurze Anmerkung: Doppelnamen sind laestig! ;(
Torsten-Kay!