![]() |
Taschenrechner,Reference-Value
Hallo , als Übung habe ich mal einen noch unvollständigen Taschenrechner programmiert; hier mal der Code :
Code:
Und jetzt mal eine Frage ; im Funktionskopf habe ich die Parameter drin , die als Integer deklariert worden sind.
program p1;
{$AppType Console} var additionsb,subtraktionsb,multib,divb:string; zahl1:integer; zahl2:integer; function addition (x:integer ; y:integer):integer; var ergebnis:integer;zahl1:integer; zahl2:integer; begin ergebnis:=zahl1+zahl2; result:=ergebnis; writeln('Das Ergebnis lautet:'); write(ergebnis); readln; end; begin writeln('Wollen Sie addieren,subtrahieren,multiplizieren oder dividieren?: '); readln(additionsb,subtraktionsb,multib,divb); if (additionsb='addieren') then begin writeln('Geben Sie die erste Zahl ein: '); readln(zahl1); writeln('Geben Sie die zweite Zahl ein: '); readln(zahl2); addition(zahl1,zahl2); end; end. Sobald ich aber jetzt noch var hinzufüge ( also call by reference) , und z.B 6 und 8 als Zahl1 und Zahl2 eingebe , kommt ein riesengroßer Wert raus. Da bei der Reference-Technik der Inhalt übergeben wird und keine lokale Kopie , verstehe ich nicht , warum man nicht die 14 als Ergebnis rauskriegt. Bitte um einen Tipp. Danke. |
AW: Taschenrechner,Reference-Value
Du solltest die lokalen Variablen Zahl1 und Zahl2 entweder aus x und y zuweisen oder ganz weglassen und gleich auf die übergebenen Werte zugreifen. Das hat mit Call By Reference/Value nicht die Spur zu tun.
|
AW: Taschenrechner,Reference-Value
Schau mal in deine Funktion addition und schaue mal genau hin, was mit X und Y passiert und wie genau du Ergebnis ausrechnest.
Edit: DeddyH war mal wieder schneller ;-) |
AW: Taschenrechner,Reference-Value
Erstmal danke für die Antworten.
Habe das aber jetzt irgendwie nicht verstanden , x und y stehen bei mir als Parameter , das sind doch meine Parameter.. Die Zahlen , die ich eingebe , werden ja mit Zahl1 und Zahl2 angesprochen , aber trotzdem muss ich doch im Funktionskopf Parameter einfügen , oder nicht? |
AW: Taschenrechner,Reference-Value
Wieso hast du globale Variablen, wo du die Werte doch als Parameter übergeben wolltest?
Abgesehn davon rechnest du auch noch mit den Globalen und nicht mit den Lokalen/Parametern ... und beschwerst dich dann, daß bei den Parametern etwas nicht stimmt :roll: schaff' erstmal die blöden Globalen ab. |
AW: Taschenrechner,Reference-Value
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe mal die Projekt-Quellen formatiert und alle Variablen entsprechend farbig markiert.
rot = globale Variablen orange = lokale Variablen grün = Parameter Dabei ist zu beachten, dass z.B. zahl1 eine völlig andere Variable als zahl1 ist. |
AW: Taschenrechner,Reference-Value
Wenn ich aber die globalen Variablen entferne , also Zahl1 und Zahl2 , was soll ich dann bei readln und addition() schreiben?
Code:
EDIT: Hat sich geklärt , danke für die Antworten.
if (additionsb='ja') then
begin writeln('Geben Sie die erste Zahl ein: '); readln(????); writeln('Geben Sie die zweite Zahl ein: '); readln(???); addition(???); end; |
AW: Taschenrechner,Reference-Value
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang mal der gute alte Papierrechner. Die einzelnen Punkte habe ich im Quelltest markiert.
Evtl. siehst du ja dann, wo dein Fehler liegt.
Delphi-Quellcode:
program p1;
{$AppType Console} var additionsb, subtraktionsb, multib, divb : string; zahl1 : integer; zahl2 : integer; function addition( x : integer; y : integer ) : integer; var ergebnis : integer; zahl1 : integer; zahl2 : integer; begin ergebnis := zahl1 + zahl2; // 5. result := ergebnis; // 6. writeln( 'Das Ergebnis lautet:' ); write( ergebnis ); readln; end; begin writeln( 'Wollen Sie addieren,subtrahieren,multiplizieren oder dividieren?: ' ); readln( additionsb, subtraktionsb, multib, divb ); // 1. if ( additionsb = 'addieren' ) then begin writeln( 'Geben Sie die erste Zahl ein: ' ); readln( zahl1 ); // 2. writeln( 'Geben Sie die zweite Zahl ein: ' ); readln( zahl2 ); // 3. addition( zahl1, zahl2 ); // 4. end; end. |
AW: Taschenrechner,Reference-Value
Vielen Dank , habs verstanden.
Ich habe den ganzen Code mal schnell verändert , und so finde ich es jetzt besser , viel übersichtlicher und kürzer :
Code:
program Project2;
{$APPTYPE CONSOLE} uses sysutils; var a,b,c:real; bestatigung:string; function addition(a:real; b:real):real; begin result:=a+b; end; function multiplikation(a:real; b:real):real; begin result := a*b; end; function division(a:real; b:real):real; begin result := a/b; end; begin writeln('Taschenrechner - Addition,Multiplikation,Division'); writeln('Geben Sie die erste Zahl ein: '); readln(a); writeln('Geben Sie die zweite Zahl: '); readln(b); writeln('Welche Rechenoperation moechten Sie ausfuehren(z.B.+,-,/): '); readln(bestatigung); if bestatigung=('+') then begin c:=a+b; writeln(addition(a,b)); readln(c); end; if bestatigung=('*') then begin writeln(multiplikation(a,b)); readln(c); end; if bestatigung=('/') then begin writeln(division(a,b)); readln(c); end; end. |
AW: Taschenrechner,Reference-Value
Und welchen Sinn soll c dabei haben?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz