AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Taschenrechner

Ein Thema von Enten Mann · begonnen am 20. Jan 2008 · letzter Beitrag vom 28. Jul 2011
Antwort Antwort
Benutzerbild von PaddyL
PaddyL

Registriert seit: 23. Nov 2007
Ort: Lautertal
34 Beiträge
 
#1

Re: Taschenrechner

  Alt 20. Jan 2008, 15:34
Ich würde dir RPN als Standard empfehlen bzw. RPN las Backend nutzen, da gibt es Algorythmen für um es umzurechnen, dann ist es um einiges Leichter den Taschenrechner zu programmieren. Hier ein Beispielcode (Lazarus/Free Pascal) den ich für einen RPN-Rechner auf meinem PocketPC verwendet habe:

Delphi-Quellcode:
unit MainForm;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Math,
  StdCtrls, ComCtrls, Menus;

type

  { TMainForm }

  TMainForm = class(TForm)
    MainMenu1: TMainMenu;
    MenuItem1: TMenuItem;
    Stack: TListBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button0: TButton;
    ButtonPoint: TButton;
    ButtonEnter: TButton;
    ButtonAdd: TButton;
    ButtonSub: TButton;
    ButtonMul: TButton;
    ButtonDiv: TButton;
    edtCalc: TEdit;
    ButtonPower: TButton;
    ButtonPosNeg: TButton;
    ButtonRoot: TButton;
    ButtonLog: TButton;
    ButtonRound: TButton;
    ButtonPi: TButton;
    ButtonFak: TButton;
    Button1_2: TButton;
    Button10: TButton;
    Button11: TButton;
    ButtonProm: TButton;
    ButtonProz: TButton;
    procedure Button0Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button1_2Click(Sender: TObject);
    procedure ButtonPowerClick(Sender: TObject);
    procedure ButtonAddClick(Sender: TObject);
    procedure ButtonDivClick(Sender: TObject);
    procedure ButtonEnterClick(Sender: TObject);
    procedure ButtonFakClick(Sender: TObject);
    procedure ButtonLogClick(Sender: TObject);
    procedure ButtonMulClick(Sender: TObject);
    procedure ButtonPiClick(Sender: TObject);
    procedure ButtonPointClick(Sender: TObject);
    procedure ButtonPosNegClick(Sender: TObject);
    procedure ButtonPromClick(Sender: TObject);
    procedure ButtonProzClick(Sender: TObject);
    procedure ButtonRootClick(Sender: TObject);
    procedure ButtonRoundClick(Sender: TObject);
    procedure ButtonSubClick(Sender: TObject);
    procedure edtCalcClick(Sender: TObject);
    procedure MenuItem1Click(Sender: TObject);
    procedure StackDblClick(Sender: TObject);
  private
    { private declarations }
    function Pop: Real;
    procedure Push(R: Real);
  public
    { public declarations }
  end;

var
  frmMainForm: TMainForm;

implementation

function TMainForm.Pop: Real;
begin
  Result := StrToFloat(Stack.Items[Stack.Items.Count - 1]);
  Stack.Items.Delete(Stack.Items.Count - 1);
end;

procedure TMainForm.Push(R: Real);
begin
  Stack.Items.Add(FloatToStr(R));
end;

procedure TMainForm.Button0Click(Sender: TObject);
begin
  edtCalc.Text := edtCalc.Text + (Sender as TButton).Caption;
end;

procedure TMainForm.Button10Click(Sender: TObject);
begin
  Push(1/4);
end;

procedure TMainForm.Button11Click(Sender: TObject);
begin
  Push(3/4);
end;

procedure TMainForm.Button1_2Click(Sender: TObject);
begin
  Push(1/2);
end;

procedure TMainForm.ButtonPowerClick(Sender: TObject);
var
  Num1, Num2: Real;
begin
  if Stack.Items.Count > 1 then
  begin
    Num1 := Pop;
    Num2 := Pop;
    Push(Power(Num2, Num1));
  end;
end;

procedure TMainForm.ButtonAddClick(Sender: TObject);
var
  Num1, Num2: Real;
begin
  if Stack.Items.Count > 1 then
  begin
    Num1 := Pop;
    Num2 := Pop;
    Push(Num2 + Num1);
  end;
end;

procedure TMainForm.ButtonDivClick(Sender: TObject);
var
  Num1, Num2: Real;
begin
  if Stack.Items.Count > 1 then
  begin
    Num1 := Pop;
    Num2 := Pop;
    Push(Num2 / Num1);
  end;
end;

procedure TMainForm.ButtonEnterClick(Sender: TObject);
begin
  if edtCalc.Text <> 'then
  begin
    Stack.Items.Add(edtCalc.Text);
    edtCalc.Text := '';
  end;
end;

procedure TMainForm.ButtonFakClick(Sender: TObject);
var
  Num: Real;
  I, J: Integer;
begin
  if Stack.Items.Count > 0 then
  begin
    Num := Pop;
    J := 1;
    for I := 1 to Round(Num) do
      J := J * I;
    Push(Round(J));
  end;
end;

procedure TMainForm.ButtonLogClick(Sender: TObject);
var
  Num: Real;
begin
  if Stack.Items.Count > 0 then
  begin
    Num := Pop;
    Push(Log10(Num));
  end;
end;

procedure TMainForm.ButtonMulClick(Sender: TObject);
var
  Num1, Num2: Real;
begin
  if Stack.Items.Count > 1 then
  begin
    Num1 := Pop;
    Num2 := Pop;
    Push(Num2 * Num1);
  end;
end;

procedure TMainForm.ButtonPiClick(Sender: TObject);
begin
  Stack.Items.Add(FloatToStr(PI));
end;

procedure TMainForm.ButtonPointClick(Sender: TObject);
begin
  if Pos('.', edtCalc.Text) = 0 then
    edtCalc.Text := edtCalc.Text + '.';
end;

procedure TMainForm.ButtonPosNegClick(Sender: TObject);
var
  Num: Real;
begin
  if Stack.Items.Count > 0 then
  begin
    Num := Pop;
    Push(Num * -1);
  end;
end;

procedure TMainForm.ButtonPromClick(Sender: TObject);
var
  Num: Real;
begin
  if Stack.Items.Count > 0 then
  begin
    Num := Pop;
    Push(Num / 1000);
  end;
end;

procedure TMainForm.ButtonProzClick(Sender: TObject);
var
  Num: Real;
begin
  if Stack.Items.Count > 0 then
  begin
    Num := Pop;
    Push(Num / 100);
  end;
end;

procedure TMainForm.ButtonRootClick(Sender: TObject);
var
  Num1, Num2: Real;
begin
  if Stack.Items.Count > 1 then
  begin
    Num1 := Pop;
    Num2 := Pop;
    Push(Power(Num2, (1 / Num1)));
  end;
end;

procedure TMainForm.ButtonRoundClick(Sender: TObject);
var
  Num: Real;
begin
  if Stack.Items.Count > 0 then
  begin
    Num := Pop;
    Push(Round(Num));
  end;
end;

procedure TMainForm.ButtonSubClick(Sender: TObject);
var
  Num1, Num2: Real;
begin
  if Stack.Items.Count > 1 then
  begin
    Num1 := Pop;
    Num2 := Pop;
    Push(Num2 - Num1);
  end;
end;

procedure TMainForm.edtCalcClick(Sender: TObject);
begin
  edtCalc.Text := Copy(edtCalc.Text, 1, Length(edtCalc.Text) - 1);
end;

procedure TMainForm.MenuItem1Click(Sender: TObject);
begin
  ShowMessage('(C) 2007 by Paddy Lerner [PaddyLerner@gmail.com]');
end;

procedure TMainForm.StackDblClick(Sender: TObject);
begin
  if not Stack.ItemIndex = -1 then
    Stack.Items.Delete(Stack.ItemIndex);
end;

initialization
  {$I MainForm.lrs}

end.
Patrick
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 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