Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum: 30.09.19 18:33
Such mal hier im Forum nach Formel Rechner.
Dann haste hier sowas (in dein Programm integriert) :
$P+
SET("ERRORLEVEL",0)
SET("Decimals", 2)
$I PROFALT.INC
declare ma_s1$,ma_s2$,ma_s3$,ma_s4$,ma_v1&,ma_v2&,ma_v3&,ma_v4& 'bei häufiger Benutztung Global setzen (Ergebnis immer in ma_v1& !)
DECLARE EDIT1&,BUTTON1&,TEXT1&,TEXT2&, ENDE%,A$[],e1$,Erg!,m$
DEF GETSYSCOLOR(1) !"USER32","GetSysColor"
'Benötigte Funktionen: 3 mächtige Zeilen, sie machen einen Großteil der Arbeit !
DEF CTStr(2) if(len($(2))=0,0,(len($(1))-len(translate$($(1),$(2),"")))/len($(2))) 'zählt wie oft $2 in $1 vorkommt
DEF InStrExt(3) int(instr($(2),mid$($(1),&(3),len($(1))))+&(3)) 'sucht in $1 ab &3 nach $2
DEF InStrLast(3) if(instrext($(1),$(2),&(3))>&(3),instrlast($(1),$(2),instrext($(1),$(2),&(3))),int(&(3)-1)) 'sucht in $1 ab &3 nach dem letzen vorkommen von $2, arbeitet Rekursiv.
'Wenn man die Operatorzeichen ändern möchte braucht man nur die entsprechenden Zeichen ändern in den 2 folgenden Funktionen ändern
DEF MathTabs(2) translate$(translate$(translate$(translate$($(1),"+",$(2)),"-",$(2)),"*",$(2)),"/",$(2))
DEF GetMath(1) if($(1)="+",1,if($(1)="-",2,if($(1)="*",3,if($(1)="/",4,0))))
WINDOWSTYLE 63
WINDOWTITLE "Test"
WINDOW 481,158-640,500
CLS GETSYSCOLOR(15)
USEFONT "MS Sans Serif",13,0,0,0,0
SETDIALOGFONT 1
EDIT1& = CREATE("EDIT",%HWND,"1.25",80,45,240,20)
BUTTON1& = CREATE("BUTTON",%HWND,"BUTTON",230,90,70,20)
TEXT1& = CREATE("TEXT",%HWND,"Ergebnis :",84,110,100,20)
TEXT2& = CREATE("TEXT", %HWND, "", 185, 110, 70, 20)
SETFOCUS(EDIT1&)
WHILENOT ENDE%
WAITINPUT
If %KEY=2
ENDE%= 1
ELSEIF %KEY=4
ELSEIF CLICKED(EDIT1&) 'EDIT
ELSEIF CLICKED(BUTTON1&) 'BUTTON
Erg! = Math(GetText$(EDIT1&))
SETTEXT TEXT2&, Str$(Erg!)
SETFOCUS(EDIT1&)
ENDIF
ENDWHILE
'Das Kernstück, so klein und doch ein ganzer Taschenrechner
'Funktioniert nur alleine wenn die Variablen aus Math Global gesetzt wurden (Ergebnis immer in ma_v1& !)
proc mathcore
parameters ma_cmd$
ma_s2$="«Æ»" 'MathTabs-Zeichen = Beliebige Zeichenfolge die nicht im Ausdruck vorkommen sollte, sonst falsche Berechnung !
ma_s4$=mathtabs(ma_cmd$,ma_s2$) 'MathTabs setzen
ma_s3$=""
ma_v1&=0
ma_v2&=1
whileloop ctstr(ma_s4$,ma_s2$)+1
ma_s3$=substr$(ma_s4$,&loop,ma_s2$) 'Wert erfassen - Hier könnte man den Ausdruck zB. auf einen bestimmten Namen prüfen (für Variablen in Skriptsprachen).
ma_v1&=if(ma_v2&=0,ma_v1&,if(ma_v2&=1,ma_v1&+val(ma_s3$),if(ma_v2&=2,ma_v1&-val(ma_s3$),if(ma_v2&=3,ma_v1&*val(ma_s3$),if(val(ma_s3$)<1,ma_v3&,ma_v1&/val(ma_s3$))))))
ma_v2&=GetMath(mid$(ma_cmd$,len(ma_s3$)+1,1))
ma_cmd$=del$(ma_cmd$,1,len(ma_s3$)+1)
wend
endproc
'Berechnung mit Klammern
'Haupt-Prozedur die automatisch erst alle Klammern ausrechnet (wenn welche vorkommen)
proc math
parameters ma_prio$
'declare ma_s1$,ma_s2$,ma_s3$,ma_s4$,ma_v1&,ma_v2&,ma_v3&,ma_v4& 'bei häufiger Benutztung Global setzen (Ergebnis immer in ma_v1& !)
case or(instr(")",ma_prio$)<instr("(",ma_prio$),neq(ctstr(ma_prio$,"("),ctstr(ma_prio$,")"))):ma_prio$="0" 'ungültige Klammersetzung: Wert auf Null setzen
whilenot ctstr(ma_prio$,"(")=0
ma_v3&=instr("(",ma_prio$)+1
ma_v4&=instrext(ma_prio$,")",ma_v3&)-1
ma_v3&=ma_v3&+instrlast(mid$(ma_prio$,ma_v3&,ma_v4&-ma_v3&),"(",1) 'Klammern von Innen nach Außen auflösen
mathcore mid$(ma_prio$,ma_v3&,ma_v4&-ma_v3&)
ma_prio$=del$(ma_prio$,ma_v3&-1,ma_v4&-ma_v3&+2)
ma_prio$=ins$(str$(ma_v1&),ma_prio$,ma_v3&-1)
wend
mathcore ma_prio$
return ma_v1&
endproc
Ist es das, was du meinst ?
H.Brill
XProfan X4 + FreeProfan
|
|