Delphi-PRAXiS
Seite 5 von 10   « Erste     345 67     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Rechenprogramm (https://www.delphipraxis.net/134885-rechenprogramm.html)

Corpsman 30. Jun 2009 10:40

Re: Rechenprogramm
 
Ob dein Programm nun entsprechend Lange Zahlen Kann oder nicht ist eine Sache.

Ich nutze dein Programm mittlerweile gern und oft.

Der Fade beigeschmack das mir "Interne" fehler, also üebrläufe und der leien, nicht mit geteilt werden ist allerdings sehr störend.

Wenn du entsprechende Fehlerbehandlungen einbaust, wäre das für mich aber auch vollkommen OK.

BZW, wie ists denn mit nem Flag das man setzen kann, das die Anwendung auf gänzlich große Zahlen umschaltet ?

Denn zumindest bei mir ists ja so das ich nur 5 - 10 Rechnungen gleichzeitig habe, und wenn dann bei einer die Fehlermeldung käme, dann könnte ich sozusagen hergehn und einfach sagen, Umschalten und langsam rechnen, danach wieder im "schnell" modus ?

oder ist das zu aufwendig ...

Amateurprofi 2. Jul 2009 12:17

Re: Rechenprogramm
 
Zitat:

BZW, wie ists denn mit nem Flag das man setzen kann, das die Anwendung auf gänzlich große Zahlen umschaltet ?
Sicherlich werde ich so etwas irgndwann einmal implementieren, jedoch wann und in welcher Form, steht in den Sternen (hat für mich einfach eine sehr geringe Priorität, gewissermaßen "below onIdle").

Zitat:

der ist das zu aufwendig ...
Aufwendig? Ja. Zu Aufwendig? Nein, eigentlich nicht.

Und noch mal zum "Mod"-Problem.
Verwende lieber IMOD bzw || .
x Mod y bzw. x|y ist bei mir definiert als x-y*Floor(x/y) und da ergibt dann 35 mod 3.6 = 2.6

himitsu 2. Jul 2009 13:03

Re: Rechenprogramm
 
Zitat:

Zitat von Amateurprofi
Und noch mal zum "Mod"-Problem.
Verwende lieber IMOD bzw || .
x Mod y bzw. x|y ist bei mir definiert als x-y*Floor(x/y) und da ergibt dann 35 mod 3.6 = 2.6

wäre es dann nicht etwas besser, wenn es andersrum definiert wäre?

z.B.:
|| und mod als "normales" MOD
| und fmod als x-y*Floor(x/y)

vorallem MOD kenn ich eigentlich mehr im Zusammenhang mir Integern/Ganzzahlen,

aber wenn man sich das mal gemerkt hat, daß hier mod nicht so wie in Delphi und Co. arbeitet, dann ginge es auch so-

himitsu 2. Jul 2009 13:29

Re: Rechenprogramm
 
nochmal zu den vielen Befehlen ...

z.B. TAutoComplete siehe http://www.delphipraxis.net/internal...=976287#976287
Delphi-Quellcode:
uses AutoComplete;

MathAutoComplete: TAutoComplete;


// Form.OnCreate
SL: TStringList;

SL := TStringList.Create;
Try
  SL.Add('Abs()');
  SL.Add('Sqr()');
  ...
  SL.Add('Power(, )');
  ...
  MathAutoComplete := TAutoComplete.Create(Memo2, SL);
  MathAutoComplete.CompleteStartLength := 2;
Finally
  SL.Free;
End;


// Form.OnDestroy
MathAutoComplete.Free;
Also das was in der Liste steht, wird so angezeigt und auch eingefügt

Per Standard wird ab dem 3. Zeichnen die Liste eingeblendet,
hier hab ich's aber auf 2 eingestellt (CompleteStartLength), wobei auch bestimmt noch gehn würde.

Und mit Strg+Leertaste wird die Liste sofort angezeigt.


Achtung:
Von der Komponente werden .OnKeyDown, .OnKeyUp, .OnKeyPress und .OnChange des Controls geändert.

Also wenn/da du dort bestimmt selber was eingetragen hast, dann diese Komponente erst später hinzufügen,
falls du diesen Ereignissen im Code etwas zuweist (im OI isses egal, da dieses eh vorher schon existiert)
Es werden allerdings die alten/vorherigen Zuweisungen gemerkt und die Aufrufe weitergeleitet.

Amateurprofi 3. Jul 2009 00:32

Re: Rechenprogramm
 
Zitat:

Zitat von himitsu
wäre es dann nicht etwas besser, wenn es andersrum definiert wäre?
z.B.:
|| und mod als "normales" MOD
| und fmod als x-y*Floor(x/y)

Werd ich ändern, was natürlich auch eine Änderung bei div und idiv nach sich zieht.
Die Definitionen werden dann so sein :

x MOD y (bzw. x|y) = Trunc( x )-Trunc( y ) * Trunc( Trunc( x ) / Trunc( y ) )
x RMOD y (bzw. x||y) = x - y * Floor( x / y ) (Das Floor ist nicht das aus Math.pas)
x DIV y (bzw. x\y) = Trunc( Trunc( x ) / Trunc( y ) )
x RDIV y (bzw. x\\y) = Int( x / y )

Ich denke, daß ich in der 2ten Hälfte Juli die neue Version in die DP stellen werde.
Neu sind ein paar zusätzliche Funktionen (die, die keiner braucht) und neu ist auch daß ich das unterste nach oben gekehrt habe. Intern steht da kein Stein mehr auf dem anderen. Nach Außen ist davon nichts zu sehen, außer daß die Auswertung um ca. 50 % schneller ist als vorher.

Zitat:

Zitat von himitsu
vorallem MOD kenn ich eigentlich mehr im Zusammenhang mir Integern/Ganzzahlen

Ich habe meine ersten Programmier-Erfahrungen mit APL gemacht. Da ist das so definiert wie ich implementiert hatte.
Ist also nicht auf meinem Mist gewachsen.

Amateurprofi 28. Jul 2009 08:22

Re: Rechenprogramm
 
Ich habe eine neue Version des Rechenprogramms in #1 gestellt.
Wie schon im vorigen Beitrag angedeutet, habe ich den Teil, der Ausdrücke auswertet komplett überarbeitet. Ich gehe davon aus, daß ich den einen oder anderen Bug noch nicht gefunden habe......


Die im .zip file enthaltenen .dcu Dateien
parser_base.dcu
parser_parse.dcu
parser_errors.dcu
können in eigene Programme eingebunden werden.
Näheres hierzu steht im Helpfile unter "Einbinden in eigene Programme".

Änderungen des Parsers

Funktion RSum
Die Funktionen, die Listen verarbeiten können, wurden ergänzt
um die Funktion RSum(a,b,c,...) die die Summe der Quadratwurzeln
ermittelt.

Funktionen FMin, FMax, FAvg, FSum, FMul, FQSum und FRSum
In Anlehnung an die Funktionen Min, Max, Avg, Sum, Mul, QSum und RSum wurden
die Funktionen FMin, FMax, FAvg, FSum, FMul, FQSum und FRSum implementiert.
Ein Beispiel :
FSum( a, b, 1 / x ! )
gibt die Summe aus 1/a! + 1/(a+1)!, +..., + 1/b! zurück
Zum Beispiel FSum(0,20,1/x!) errechnet e (2,718...)
Die ersten beiden Parameter sind Integerzahlen im Bereich 0 bis 2^31-1, der dritte Parameter ist ein beliebiger Ausdruck, der eine Variable (x) enthalten muß (soll).
x wird dann von a bis b hochgezählt und der Ausdruck mit diesem Wert von x ausgewertet.
Aus den Ergebnissen der Ausdrücke wird dann die Summe gebildet (oder das Minimum, Maximum etc. bei den anderen Fxx-Funktionen)

Funktion Ord
Die Funktion Ord(x) wurde implementiert.
Innerhalb der () muß genau 1 Zeichen stehen, dessen numerischer Wert zurückgegeben wird. Das Zeichen steht nicht in Anführungszeichen und es kann auch das "(" oder ")" sein. Ord(() und Ord()) (auch wenn's bescheuert aussieht) sind gültige Ausdrücke, die 40 bzw 41 als Resultat liefern.
Das Gegenstück zu Ord, also Chr ist hier nicht als Funktion implementiert, aber als Ausgabeoption vorhanden. Zum Beispiel Chr 65 oder )65 gibt ein A aus.

Funktion Erase
Die Funktion Erase(name, name, ... ) wurde implementiert.
Die Parameterliste enthält beliebig viele, durch Kommas voneinander getrennte Namen von Variablen, die gelöscht werden sollen.
Ist die Parameterliste leer, werden alle Variablen gelöscht.
Die Anzahl gelöschter Variablen wird als Resultat zurückgegeben.

Funktionen EqC und EqE
Die Funktionen EqC und EqE zum lösen von Gleichungen erster bis vierter Ordnung wurden implementiert.
Beispiel:
EqE( 2x² + 2x - 12 ) ergibt 2
EqE( 2x² + 2x - 12, #2 ) ergibt -3 (die zweite mögliche Lösung)
Bei der Funktion EqC wird nicht der Text der Gleichung eingegeben, sondern nur die Koeffizienten.
EqC( 2, 2, - 12 ) ergibt 2
EqC( 2, 2, - 12, #2 ) ergibt -3 (die zweite mögliche Lösung)

Ergebnisse ins Clipboard kopieren
Eine Zeile kopieren:
Rechtsklick in Zeile kopiert diese Zeile ins Clipboard.
Mehrere Zeilen kopieren:
In erste zu kopierende Zeile zeigen. Rechte Mousetaste drücken. Zeiger mit gedrückter rechter Mousetaste in letzte zu kopierende Zeile ziehen. Mousetaste loslassen.
Wenn dezimale-, hexadezimale-, binäre Zahlen oder Zahlen mit anderer Basis Trennzeichen wie Kommas oder Blanks enthalten, werden diese entfernt, es sei denn, beim loslassen der rechten Mousestaste ist die Shift-Taste gedrückt.
Alle Zeilen kopieren : Strg-A bzw Shift-Strg-A drücken

Die Bedeutung von @ und # wurden vertauscht
also
# steht für das Resultat der vorigen Zeile
#x steht für das Resultat von Zeile x (wobei x eine Folge von Ziffern ist)
#-x steht für das Resultat aus Zeile (aktuelle Zeile - x)
x@Ziffern = Zahl mit der Basis x
Warum die Änderung?: Weil ich registriert habe, daß ich oft und gern auf die Ergebnisse vorheriger Zeilen zugreife und # leichter zu tippen ist als @

Für Div und Mod
wurden die Namen der Operatoren geändert
Div (bzw. " \ ") ist das frühere IDiv (bzw. " \\ ")
RDiv (bzw. " \\ ") ist das frühere Div (bzw. " \ ")
Mod (bzw. " | ") ist das frühere IMod (bzw. " || ")
RMod (bzw. " || ") ist das frühere Mod (bzw. " | ")

himitsu 28. Jul 2009 09:09

Re: Rechenprogramm
 
Zitat:

Zitat von Amateurprofi
Die im .zip file enthaltenen .dcu Dateien
parser_base.dcu
parser_parse.dcu
parser_errors.dcu
können in eigene Programme eingebunden werden.
Näheres hierzu steht im Helpfile unter "Einbinden in eigene Programme".

Es sollte vielleicht noch erwähnt werden, daß diese nur in Delphi 2005 verwendet werden konnen
(vermute einfach mal, daß sie damit kompiliert wurden)

DCUs können nur mit der Delphi-Version verwendet werden, womit sie auch kompiliert wurden
(manchmal sogar auch noch nur mit dem selben Servicepack),
da sie Compilerspezifig sind ... also nur von diesem Compiler verstanden werden.

Amateurprofi 28. Jul 2009 15:25

Re: Rechenprogramm
 
@himitsu:
Das war mir nicht bekannt. Danke für den Hinweis.
Und : Ja, mit Delphi 2005 kompiliert.

himitsu 10. Nov 2009 08:03

Re: Rechenprogramm
 
[nicht wichtig]

mathe parser

sind nur'n paar Stichworte für die Suchfunktion

blablab 26. Feb 2010 20:10

Re: Rechenprogramm
 
Kleiner Bug:

Ausgabe = Dec
Präfix ausgeben (Lang oder Kurzform)
Ergebnis = 0
:arrow:
Gleitkommadivision durch Null


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.
Seite 5 von 10   « Erste     345 67     Letzte »    

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