Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Fakultät Wurzel Potenz...


theBaby - So 20.11.05 14:56
Titel: Fakultät Wurzel Potenz...
Ich brauch mal eure Hilfe.

Arbeite in Info mit Delphi und es wurde uns zur Aufgabe gestellt, dass wir einen Taschenrechner erstellen sollen.
Ich werde euch mal die bisherige Unit reinkopieren, damit ihr ungefähr wisst, wie weit wir gekommen sind und wie das Ganze aussieht.
Es gibt 2 Editfelder, somit eine Variable a und eine b...

Mein Problem ist, dass ich nicht weiß, wie ich die Unit schreiben soll um

1.Wurzel (a)
2.log (a)
3.ln (a)
4.a^2
5.b^2
6.a^b
7.1/a
8.a!
9.MOD
10.DIV

zu erhalten/berechnen.

Hier die Unit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    ein_zahl1: TEdit;
    ein_zahl2: TEdit;
    Multiplikation: TButton;
    Division: TButton;
    Addition: TButton;
    Subtraktion: TButton;
    ausgabe: TLabel;
    loeschen: TButton;
    ende: TButton;
    procedure endeClick(Sender: TObject);
    procedure AdditionClick(Sender: TObject);
    procedure SubtraktionClick(Sender: TObject);
    procedure MultiplikationClick(Sender: TObject);
    procedure DivisionClick(Sender: TObject);
    procedure loeschenClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.endeClick(Sender: TObject);
begin
close;
end;

procedure TForm1.AdditionClick(Sender: TObject);
var zahl1, zahl2, erg:integer;
begin
zahl1:=strtoint (ein_zahl1.text);
zahl2:=strtoint (ein_zahl2.text);
erg:=zahl1+zahl2;
ausgabe.caption:=inttostr (erg)
end;

procedure TForm1.SubtraktionClick(Sender: TObject);
var zahl1, zahl2, erg:integer;
begin
zahl1:=strtoint (ein_zahl1.text);
zahl2:=strtoint (ein_zahl2.text);
erg:=zahl1-zahl2;
ausgabe.caption:=inttostr (erg);
end;

procedure TForm1.MultiplikationClick(Sender: TObject);
var zahl1, zahl2, erg:integer;
begin
zahl1:=strtoint (ein_zahl1.text);
zahl2:=strtoint (ein_zahl2.text);
erg:=zahl1*zahl2;
ausgabe.caption:=inttostr (erg)
end;

procedure TForm1.DivisionClick(Sender: TObject);
var zahl1, zahl2, erg:real;
begin
zahl1:=strtofloat (ein_zahl1.text);
zahl2:=strtofloat (ein_zahl2.text);
erg:=zahl1/zahl2;
ausgabe.caption:=floattostrF (erg, fffixed,10,2);
end;

procedure TForm1.loeschenClick(Sender: TObject);
begin
ein_zahl1.text:='';
ein_zahl2.text:='';
ausgabe.caption:='';
end;

end.


Wäre klasse, wenn ihr versuchen könntet mir die Unit komplett zu machen bzw. mir bitte nicht nur die Funktionen (also sqrt,...) schreiben würdet...

Vielen Dank im vorraus...

Moderiert von user profile iconraziel: B- durch Delphi-Tags ersetzt


AXMD - So 20.11.05 15:06

Die Funktionen findest du in der Unit Math. Der Rest mit dem Umwandeln der Dezimalzahlen in Strings und umgekehrt läuft analog wie in deinem Code bereits implementiert.
Einfach mal durch die Delphihilfe schauen: Sqrt, mod, div, ...

AXMD


Allesquarks - So 20.11.05 15:07

Entweder du bindest die Unit math ein da stehen die ganzen Sachen drin (mod und div gibts direkt als Delphi Befehl) oder du schreibst dir ne Funktion in der du die entsprechenden Funktionen (sin, cos, ln usw.) in ne Taylorreihe entwickelst, oder eine andere proprietäre Reihe, die du dann nach x-Schritten, wenn es dir genau genug ist abbrichst.

Vorsicht: nicht alle der Reihen die man üblicherweise findet haben nativ einen Konvergenzradius der genauso groß ist wie der Definitionsbereich.


AXMD - So 20.11.05 15:11

user profile iconAllesquarks hat folgendes geschrieben:
Eoder du schreibst dir ne Funktion in der du die entsprechenden Funktionen (sin, cos, ln usw.) in ne Taylorreihe entwickelst

Mc Laurin wäre hier besser geeignet - einfachere Formeln ;)
user profile iconAllesquarks hat folgendes geschrieben:
Vorsicht: nicht alle der Reihen die man üblicherweise findet haben nativ einen Konvergenzradius der genauso groß ist wie der Definitionsbereich.

Absolut korrekt. Wenn man das nicht beachtet kann viel Blödsinn rauskommen ;)

AXMD


iX0r - Do 24.11.05 09:01

Wer einen Taschenrechner programmieren soll, der wird wohl kaum Hochschulmathematik betreiben. Aber gut ihr habt gezeigt, dass ihr was wißt. Mal ganz davon abgesehen, dass sich der sinus immer noch am besten mit der richardson extrapolation bestimmen läßt, wie meinte unser prof. "der andere mist ist für die ingenieure.." :P

Nun zu dir, lieber Taschenrechner. Was wir nicht tun werden, ist dir deine unit auszuprogrammieren. Das hat zwei Gründe:
- es ist uns zu einfach
- du lernst genau genommen gar nix dabei (der ist eigentlich wichtiger)
Was ich dur empfehle:
- binde die "math" unit ein

Delphi-Quelltext
1:
uses ...,math...;                    

Dann stehen dir alle wichtigen mathematischen Funktonen zur Verfügung. Wenn du dann mit einer der Funktione Probleme hast, oder ein Beispiel benötigst, dann helfen dir hier alle sicherlich gerne weiter.