Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Taschenrechner,Reference-Value (https://www.delphipraxis.net/164772-taschenrechner-reference-value.html)

hotkey 29. Nov 2011 13:38

Taschenrechner,Reference-Value
 
Hallo , als Übung habe ich mal einen noch unvollständigen Taschenrechner programmiert; hier mal der Code :

Code:
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.
Und jetzt mal eine Frage ; im Funktionskopf habe ich die Parameter drin , die als Integer deklariert worden sind.

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.

DeddyH 29. Nov 2011 13:42

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.

Codewalker 29. Nov 2011 13:43

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 ;-)

hotkey 29. Nov 2011 13:46

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?

himitsu 29. Nov 2011 13:56

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.

Sir Rufo 29. Nov 2011 13:58

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.

hotkey 29. Nov 2011 14:04

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:
 if (additionsb='ja') then
   begin
   writeln('Geben Sie die erste Zahl ein: ');
   readln(????);
   writeln('Geben Sie die zweite Zahl ein: ');
   readln(???);
   addition(???);
   end;
EDIT: Hat sich geklärt , danke für die Antworten.

Sir Rufo 29. Nov 2011 14:13

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.

hotkey 29. Nov 2011 14:16

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.

DeddyH 29. Nov 2011 14:19

AW: Taschenrechner,Reference-Value
 
Und welchen Sinn soll c dabei haben?

Sir Rufo 29. Nov 2011 14:22

AW: Taschenrechner,Reference-Value
 
ordentlich formatiert sieht das sogar nach was aus ... ja bis auf das mit dem
Delphi-Quellcode:
readln(c)
Delphi-Quellcode:
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.

hotkey 29. Nov 2011 14:30

AW: Taschenrechner,Reference-Value
 
Eigentlich garkeinen , braucht man nicht..

Sir Rufo 29. Nov 2011 14:34

AW: Taschenrechner,Reference-Value
 
Zitat:

Zitat von hotkey (Beitrag 1138430)
Vielen Dank , habs verstanden.

irgendwie glaube ich das noch nicht so recht ... wenn du das so geschrieben hättest
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses sysutils;

var
  a, b :       real;
  bestatigung : string;

function addition( Val1, Val2 : real ) : real;
begin
  result := Val1 + Val2;
end;

function multiplikation( Val1, Val2 : real ) : real;
begin
  result := Val1 * Val2;
end;

function division( Val1, Val2 : real ) : real;
begin
  result := Val1 / Val2;
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
      writeln( addition( a, b ) );
    end;

  if bestatigung = ( '*' )
  then
    begin
      writeln( multiplikation( a, b ) );
    end;

  if bestatigung = ( '/' )
  then
    begin
      writeln( division( a, b ) );
    end;

  readln; // auf Tastendruck warten, sonst sieht der Anwender ja nix :o)

end.
dann ja ;)

hotkey 29. Nov 2011 14:40

AW: Taschenrechner,Reference-Value
 
Also vielen Dank , das was du da grade gemacht hast , ist wirklich gut für mich , so kann man es einfacher kapieren , jetzt habe ich es aber kapiert 100 %ig , vielen vielen Dank.
Das wird mich in der Klausur weiterbringen, danke nochmal an alle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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