Forum | | | | - Seite 1 - |
|  Julian Schmidt | Hallo, bin gerade dabei aus Just for Fun einen Taschenrechner zuschreiben. Häng allerdings noch an den Punkt wie man an besten das Ergebnis ausrechnet. Bräucht eine gute Strategie wie man eine in eine Editierbox eingebene Matheaufgabe, gelöst in eine Variable speichert und dann in der besagten Editierbox ausgibt Weiß jetzt nicht wie ich das genau anstellen soll. Hoffe ihr könnt mir sagen wie ich das anstelle
DEF GetSysColor(1)!"USER32","GetSysColor"
declare Edit&,e%,eins&,zwei&,drei&,vier&,fünf&,sechs&,sieben&,acht&,neun&,null&
declare komma&,plus&,minus&,mal&,geteilt&,gleich&,clear&,off&,del&,info&,ans$,ergebnis!
WindowStyle 24
Window 10,10-250,250
cls GetSysColor(15)
WindowTitle "Taschenrechner"
Edit& = Create("Edit",%HWnd,"",20,20,200,20)
eins& = Create("Button",%HWnd,"1",20,60,30,25)
zwei& = Create("Button",%HWnd,"2",60,60,30,25)
drei& = Create("Button",%HWnd,"3",100,60,30,25)
vier& = Create("Button",%HWnd,"4",20,100,30,25)
fünf& = Create("Button",%HWnd,"5",60,100,30,25)
sechs& = Create("Button",%HWnd,"6",100,100,30,25)
sieben& = Create("Button",%HWnd,"7",20,140,30,25)
acht& = Create("Button",%HWnd,"8",60,140,30,25)
neun& = Create("Button",%HWnd,"9",100,140,30,25)
null& = Create("Button",%HWnd,"0",20,180,30,25)
komma& = Create("Button",%HWnd,".",60,180,30,25)
plus& = Create("Button",%HWnd,"+",140,60,30,25)
minus& = Create("Button",%HWnd,"-",140,100,30,25)
mal& = Create("Button",%HWnd,"*",140,140,30,25)
geteilt& = Create("Button",%HWnd,":",140,180,30,25)
gleich& = Create("Button",%HWnd,"=",100,180,30,25)
clear& = Create("Button",%HWnd,"C",180,100,40,25)
del& = Create("Button",%HWnd,"Del",180,140,40,25)
off& = Create("Button",%HWnd,"Off",180,60,40,25)
info& = Create("Button",%HWnd,"?",180,180,40,25)
whilenot e%
waitinput
waitinput
if getfocus(eins&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "1"
elseif getfocus(zwei&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "2"
elseif getfocus(drei&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "3"
elseif getfocus(vier&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "4"
elseif getfocus(fünf&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "5"
elseif getfocus(sechs&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "6"
elseif getfocus(sieben&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "7"
elseif getfocus(acht&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "8"
elseif getfocus(neun&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "9"
elseif getfocus(null&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "0"
elseif getfocus(plus&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "+"
elseif getfocus(minus&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "-"
elseif getfocus(mal&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "*"
elseif getfocus(geteilt&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "/"
elseif getfocus(komma&)
ans$ = Val(GetText$(Edit&))
SetText Edit&,ans$ + "."
elseif getfocus(clear&)
SetText Edit&,""
elseIf Getfocus(off&)
end
elseif getfocus(info&)
MessageBox("Title:\t\tTaschenrechner\t\nAutor:\t\tJulian Schmidt\nVersion:\t\t1.0\nErstellungsdatum:\t5.11.2010","I N F O",64)
elseif getfocus(del&)
SetText Edit&,ans$
elseif getfocus(gleich&)
ergebnis! = Val(GetText$(Edit&))
ans$ = ergebnis!
SetText Edit&,ans$
endif
endwhile
Außerdem würde ich gerne die Del-Funktion verbessern. Kann bisher nur ein Zeichen entfernen. Man müsste also aus einer Variable ein Zeichen abschneiden und den Wert dann neu übergeben. Für andere Verbesserungsvorschläge bin natürlich offen Naja Hoffe ihr könnnt mir bei meinen zwei anliegen einwenig helfen

mfg
Julian57 |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 07.11.2010 ▲ |
| |
|  | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | |  Peter Max Müller |  
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))))
'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
declare ed1%,bt1%
window 20,20-420,150
drawtext 5,5,"Berechnung eingeben... (+ Add ; - Sub ; / Div ; * Mul ; ( ) Prio)"
ed1%=create("edit",%hwnd,"5+(30*(4/2)+10)",5,25,400,21)'5+((10/2)*10)-30
bt1%=create("button",%hwnd,"Berechnen",5,50,400,40)
whilenot %key=2
waitinput
'XProfan
case getfocus(bt1%):messagebox("Ergebnis: "+str$(math(gettext$(ed1%))),"Ergebnis:",0)
''Profan 7:
'case getfocus(bt1%):math gettext$(ed1%)
'case getfocus(bt1%):messagebox("Ergebnis: "+str$(&(0)),"Ergebnis:",0)
wend
end
Das ganze ist in 2 Module aufgeteilt: Mathcore berechnet einen Ausdruck, Math rechnet zusätzlich zuerst alle Klammern aus.
Die Prozedur Math aufrufen !
Parameter: $ (Formel) Rückgabe: & (Ergebnis) |
| | | | |  |
| |  | Musst halt Argumente "auflösen" - Stringmanipulation / Parserei.
Wo Klammer, Mal, Div, Plus, Minus im String nach Links und Rechts parsen und Platzhalter setzen:
10+20x30
10+20x30
10+600
10+600
610
"Parsen" in dem einfachen Fall einfach solange Zeichen = Ziffer (oder Punkt etc... halt ungleich Operator)
Siehe auch Eval: [...]  |
| | | | |
| |  Julian Schmidt | Ja schon aber wie mach ich das am besten. Wie teile ich die Aufgabe in mehrere Aufgaben\Teile |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 07.11.2010 ▲ |
| |
| |  | Wo Klammer, Mal, Div, Plus, Minus im String nach Links und Rechts parsen und Platzhalter setzen:
InStr(...
Finde das Malzeichen!
Gehe von dort nach Rechts solange Ziffern. Gehe von dort nach Links solange Ziffern.
Quasi ganz ultraeasy. |
| | | | |
| |  Julian Schmidt | ah ok und zu Frage zwei was fällt dir da ein? |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 07.11.2010 ▲ |
| |
| |  | Ehm, Du kannst die Linke mit der rechten Zahl multiplizieren und das Ergebnis in die Formel setzen... |
| | | | |
| |  Julian Schmidt | Ich meinte eigentlich die Frage zwei im ersten Post
Außerdem würde ich gerne die Del-Funktion verbessern. Kann bisher nur ein Zeichen entfernen. Man müsste also aus einer Variable ein Zeichen abschneiden und den Wert dann neu übergeben. |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 07.11.2010 ▲ |
| |
| |  |
Kann bisher nur ein Zeichen entfernen
Warum? |
| | | | |
| |  Julian Schmidt | Naja tue einfach bei einen "Buttondruck"(0-9,+,#,/ ,*)erst den Inhalt aus der Editierbox auslesen und das neue Zeichen dranhängen.Aber nicht in die Variable neu übergeben. Wenn ich dann den Del Button drücke wird einfach die unaktuelle Variable an die Editierbox übergeben. Wenn ich dann den Butten nochmal drücke wird der gleiche Inhalt wieder übergeben. |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 07.11.2010 ▲ |
| |
| |  | Funktion Del$( ist da doch sehr hilfreich... |
| | | | |
| |  Julian Schmidt | Wenn ich DEL benutze muss ich allerdings noch die Stringlänge auslesen @Del$(Ans$,Letztes Zeichnen,1) oder geht das auch mit @Del$(Ans$,-1,1) ? |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 07.11.2010 ▲ |
| |
| |  | Inwiefern spielt das eine Rolle? |
| | | | |
|
AntwortenThemenoptionen | 33.875 Betrachtungen |
ThemeninformationenDieses Thema hat 8 Teilnehmer: |