Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Taschenrechner (Anfänger) Problem mit Minuszahlen (https://www.delphipraxis.net/190406-taschenrechner-anfaenger-problem-mit-minuszahlen.html)

Prakti16 30. Sep 2016 10:02

Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Hallo ich wollte fragen ob mir jemand ein paar Tipps oder Beispiele für einen Delphi Taschenrechner geben kann.
Ich meine damit nur beispiele wie ich in einen Edit1.Text und/oder im Label1.Caption Minuszahlen anzeigen lassen kann.
Dazu soll er die Minuszahlen dann noch weiter rechnen. ( Beispiel: 9-9-9-9 = -18 )
Falls jemand den Quelltext sehen möchte bitte schreiben dann setze ich in rein.

Danke schon mal im vor raus.:thumb:

Aviator 30. Sep 2016 10:40

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Zitat:

Zitat von Prakti16 (Beitrag 1349304)
Hallo ich wollte fragen ob mir jemand ein paar Tipps oder Beispiele für einen Delphi Taschenrechner geben kann.
Ich meine damit nur beispiele wie ich in einen Edit1.Text und/oder im Label1.Caption Minuszahlen anzeigen lassen kann.
Dazu soll er die Minuszahlen dann noch weiter rechnen. ( Beispiel: 9-9-9-9 = -18 )
Falls jemand den Quelltext sehen möchte bitte schreiben dann setze ich in rein.

Danke schon mal im vor raus.:thumb:

Hallo Prakti,

SourceCode ist eigentlich immer gut wenn man bei einem konkreten Problem helfen soll. In diesem Fall wäre es interessant, was du bereits gemacht hast.

Für einen Anfänger hört sich das jetzt vielleicht schwierig an, aber man sollte niemals die GUI / Grafische Elemente zur Datenerhaltung benutzen/"missbrauchen".

Ein Label zeigt etwas an. Die Daten zur Anzeige werden aus einer Variablen geliefert. Sobald sich die Variable ändert, updatet sich das Label. In einfachster Form über Properties realisierbar.

Generell kann ein Label alles mögliche anzeigen. Setze ein Label auf deine Form und mache einen EventHandler für das OnShow Ereignis der Form.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    MyVar: Integer; // Nur um mal bei Ganzzahlen zu bleiben
  end;

implementation

procedure TForm1.OnShow(Sender: TObject);
begin
  MyVar := -18;
  Label1.Caption := IntToStr(MyVar);
end;
Du wirst sehen, dass die Zahl -18 vom Label angezeigt wird. Eigentlich kein Hexenwerk.

Um das jetzt automatisiert zu machen, kannst du auf die bereits erwähnten Properties zurückgreifen. Beispiel sähe dann so aus:


Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    FMyVar: Integer; // Nur um mal bei Ganzzahlen zu bleiben
    procedure SetMyVar(Value: Integer);
    property MyVar: Integer read FMyVar write SetMyVar;
  end;

implementation

procedure TForm1.OnShow(Sender: TObject);
begin
  MyVar := -18;
  Label1.Caption := IntToStr(MyVar);
end;

procedure TForm1.SetMyVar(Value: Integer);
begin
  FMyVar := Value;
  Label1.Caption := IntToStr(FMyVar); // Hierdurch wird das Label beim Aktualisieren der Property automatisch auf den neuen Wert gesetzt
end;

Prakti16 30. Sep 2016 10:49

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Ok danke ich mache das jetzt gerade in In real.
Delphi-Quellcode:
unit Taschenrechner;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math, Buttons;

type
  TForm1 = class(TForm)
    Gleich: TButton;
    Addieren: TButton;
    Subtrahieren: TButton;
    Multiplizieren: TButton;
    Dividieren: TButton;
    Edit1: TEdit;
    Zahl1: TButton;
    Zahl2: TButton;
    Zahl3: TButton;
    Zahl4: TButton;
    Zahl5: TButton;
    Zahl6: TButton;
    Zahl7: TButton;
    Zahl8: TButton;
    Zahl9: TButton;
    Label1: TLabel;
    Zahl0: TButton;
    Aus: TButton;
    Rechenweg: TLabel;
    C: TButton;
    procedure Zahl1Click(Sender: TObject);
    procedure AusClick(Sender: TObject);
    procedure AddierenClick(Sender: TObject);
    procedure SubtrahierenClick(Sender: TObject);
    procedure MultiplizierenClick(Sender: TObject);
    procedure DividierenClick(Sender: TObject);
    procedure GleichClick(Sender: TObject);
    procedure CClick(Sender: TObject);
  private
    { Private-Deklarationen}
    function TextZuZahl(Text: String): real;
// Deklaration nur mit den Kopf Der Funktion
  public
    { Public-Deklarationen }
end;
var
  Form1: TForm1;
  LetzteZahl: Integer;
  Zwischensumme: real;
  Rechnung: String;

implementation

{$R *.dfm}
function TForm1.TextZuZahl(Text: String): real;
begin
  result := StrToFloat(Text);
end;
function TForm1.MehrZahlenAlsZwei(Zwischensumme: real; LetzteZahl: Integer): real;
begin
  result := Zwischensumme + LetzteZahl;
end;

procedure TForm1.Zahl1Click(Sender: TObject);
begin
  Edit1.Text := Edit1.Text + (Sender as TButton).Caption;
  Rechenweg.Caption := Rechenweg.Caption + (Sender as TButton).Caption;
end;

procedure TForm1.AusClick(Sender: TObject);
begin
  Close;
end;

procedure TForm1.AddierenClick(Sender: TObject); // Pluszeichen-Button ( + )
begin
  Rechenweg.Caption := Rechenweg.Caption + (Sender as TButton).Caption;
  Rechnung := '+';
  GleichClick(nil);
  LetzteZahl := StrToInt(Edit1.Text);
  Edit1.Text := '';
end;

procedure TForm1.SubtrahierenClick(Sender: TObject); // Minuszeichen-Button ( - )
begin
  Rechenweg.Caption := Rechenweg.Caption + (Sender as TButton).Caption;
  Rechnung := '-';
  GleichClick(nil);
  LetzteZahl := StrToInt(Edit1.Text);
  Edit1.Text := '';
end;

procedure TForm1.MultiplizierenClick(Sender: TObject); // Malzeichen-Button ( * )
begin
  Rechenweg.Caption := Rechenweg.Caption + (Sender as TButton).Caption;
  Rechnung := '*';
  GleichClick(nil);
  LetzteZahl := StrToInt(Edit1.Text);
  Edit1.Text := '';
end;

procedure TForm1.DividierenClick(Sender: TObject); // Geteiltzeichen-Button ( / )
begin
  Rechenweg.Caption := Rechenweg.Caption + (Sender as TButton).Caption;
  Rechnung := '/';
  GleichClick(nil);
  LetzteZahl := StrToInt(Edit1.Text);
  Edit1.Text := '';
end;

procedure TForm1.GleichClick(Sender: TObject); // Gleichzeichen-Button ( = )
begin

  // Addieren
  if (Rechnung = '+') then
  begin
    Zwischensumme := Zwischensumme + TextZuZahl(Edit1.Text);
    Label1.Caption := FloatToStr(Zwischensumme);
  end;

  // Subtrahieren
  if (Rechnung = '-') then
  begin
    Zwischensumme := LetzteZahl + Zwischensumme - TextZuZahl(Edit1.Text);
    Label1.Caption := FloatToStr(Zwischensumme);
  end;

  // Multiplizieren
  if (Rechnung = '*') then
  begin
    if (Zwischensumme > 0) then
    begin
      Zwischensumme := Zwischensumme * TextZuZahl(Edit1.Text);
    end else
    begin
      Zwischensumme := LetzteZahl * TextZuZahl(Edit1.Text);
    end;
    Label1.Caption := FloatToStr(Zwischensumme);
  end;

  // Dividieren
  if (Rechnung = '/') then
  begin
    if (Zwischensumme > 0) then
    begin
      Zwischensumme := Zwischensumme / TextZuZahl(Edit1.Text);
    end else
    begin
      Zwischensumme:= LetzteZahl / TextZuZahl(Edit1.Text);
    end;
    Label1.Caption := FloatToStr(Zwischensumme);
  end;
end;

procedure TForm1.CClick(Sender: TObject);
begin
  Rechenweg.Caption := '';
  Edit1.Text := '';
  Label1.Caption := '';
  Zwischensumme := 0;
  LetzteZahl := 0;
end;

end.

Jim Carrey 30. Sep 2016 10:53

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
:idea: http://www.delphipraxis.net/190355-e...ml#post1348903

Prakti16 30. Sep 2016 10:55

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Das habe ich ja aber soweit ich meine Programmierung verstehe wird die zahl im Edit1.Text gespeichert und dann erst in die var Zwischensumme deswegen kann ich keine Minuszahlen Richtig rechnen aber ich kriege es nicht mehr behoben:(

Aviator 30. Sep 2016 10:56

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Bitte überarbeite deinen Beitrag nochmal und rahme den gesamten SourceCode in
Code:
[DELPHI][/DELPHI]
Tags ein damit man das ansatzweise lesen kann. Achte auch bitte auf Einrückungen in deinem SourceCode. Die sind jetzt natürlich verloren gegangen.

EDIT: Du kannst auch den SourceCode komplett markieren und dann den Delphi Helm über dem (erweiterten) Beitragseditor klicken.

Mavarik 30. Sep 2016 11:16

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Leider rechnet Dein Taschenrechner aber falsch...

1+2*3 = 7 und nicht 9

Am einfachsten kann man das umsetzen, in dem man einen Stack benutzt! - intern - die Umgekehrte polnische Notation verwenden. // Edit

Prakti16 30. Sep 2016 11:22

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Ok danke schön

Jim Carrey 30. Sep 2016 11:34

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Zitat:

Zitat von Mavarik (Beitrag 1349325)
Am einfachsten kann man das umsetzen, in dem man einen Stack benutzt - intern - die Umgekehrte polnische Notation verwendet.

Zitat:

Zitat von Prakti16 (Beitrag 1349328)
Ok danke schön

Weißt du denn, was er meint? Ich nämlich nicht :thumb:

Prakti16 30. Sep 2016 11:49

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Nicht so wirklich aber ich gucke im delphi treff nach der bedeutung von stack - intern - die Umgekehrte polnische Notation verwendet.
:)

Prakti16 30. Sep 2016 11:51

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
ich kann es dir ja gleich schreiben :)

Mavarik 30. Sep 2016 11:54

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Zitat:

Zitat von Prakti16 (Beitrag 1349334)
Nicht so wirklich aber ich gucke im delphi treff nach der bedeutung von stack - intern - die Umgekehrte polnische Notation verwendet.
:)

LOL...

Stack ist klar oder nicht?

UPN ist...

1 2 + 3 * =

Hierfür nimmt man einen Stack für die Zahlen und einen für die Operatoren... Jeder Operator hat eine Wertigkeit

Beispiel: (=3;*=2 +=1

So kann man die Reihenfolge was zu erst berechnet werden muss erhalten.

Prakti16 30. Sep 2016 11:57

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Hier ist es .
Damit zusammengesetzte Ausdrücke auch ohne Klammern geschrieben werden können, hat der polnische Mathematiker Jan Lukasiewicz eine Notation entworfen, welche die Operatoren neben den Zahlen und Variablen (und nicht dazwischen) aufführt.
Die hier verwendete Notation schreibt die Operatoren nach den Zahlen und wird "umgekehrte Polnische Notation" genannt.
Anstelle von "3 + 4" schreibt man hier "3 4 +". Damit können auch zusammengesetzte Ausdrücke ohne Klammern geschrieben werden. Anstelle von "(3 + 4) * (6 - 2)" schreibt man nun "3 4 + 6 2 - *". Es wird also zuerst 3 + 4 gerechnet, danach wird 6 - 2 bestimmt und am Schluss werden die beiden Faktoren miteinander multipliziert.
Achtung: Eine Änderung in der Reihenfolge der Operatoren hat natürlich auch eine Auswirkung auf die Auswertungsreihenfolge und somit auf das Resultat. Somit wird "3 4 + 6 - 2 *" wie folgt ausgewertet: "((3 + 4) - 6) * 2" .
Am einfachsten stellt man sich vor, die Zahlen werden der Reihe nach (von links nach rechts) auf Zettel geschrieben und aufeinadergetürmt (Stapel). Kommt nun ein Operator, so werden die beiden obersten Zettel vom Stapel genommen, miteinander verrechtet und am Schluss das Resultat wieder auf dem Stapel (auf einem neuen Zettel) aufgetürmt. (Die beiden verrechneten Zahlen werden nicht mehr auf den Stapel gelegt.)

Beispiel :


markieren
ausblenden Quelltext
1:
2:
3:
1
* 5 7
* * 68 9 2
Davor kommen wiederum die Operatoren für die Additionen. Das ganze sieht dann also so aus:
markieren
ausblenden Quelltext
1:
+ + 1 * 5 7 * * 68 9 2

Prakti16 30. Sep 2016 11:58

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Danke mavarik ich habs zwar selber gefunden aber noch mal danke für die kurz vor :)

Sherlock 30. Sep 2016 11:59

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
Gut kopiert, hast Du es denn auch verstanden?

;)

Sherlock

Prakti16 30. Sep 2016 12:00

AW: Taschenrechner (Anfänger) Problem mit Minuszahlen
 
im Großen und Ganze ja


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz