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 ▲ |
| |
| | | | - Seite 5 - |
|  | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | - Seite 4 - |
|  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) |
| | | | |  |
| |  Julian Schmidt | Hallo, Nochmal zu den Fragen Frage 1.
1. Wie findet man heraus an welcher Position der Operator(+,-./,*) liegt?
Das sollte mit op1%=instr("*",ans$) gehen. Das Ergebnis sollte dan die Position vom Sternchen sein Frage 2
2. Wie kann man das machen das er von dem Rechenoperator nun solange es Ziffern sind nachrechts geht und die Position des Zeichen vor dem Operator zwei in einer Variable speichern?
Das müsste dann folglich mit op2%=instr("*",ans$,op1%) funktionieren
Wenn ürgentetwas jetzt falsch ist bitte posten
Nun noch zur Frage 4
4. Wie rechnet man Anschließend den ersten Teil der Aufgabe aus, und Hängt den Rest widerum dran und gibt das Ergebnis aus?
Könnt euch ja schon mal was einfallen lassen, ich schreib erstmal Teil 1-3 fertig
mfg
Julian57 |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 08.11.2010 ▲ |
| |
| |  Julian Schmidt | Wie kann man mit instr mehrere Argumente nehmen? Beispiel op2%=instr("*,/,+,-",ans$,op1%) //geht mit Komma nicht Geht das überhaupt? |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 08.11.2010 ▲ |
| |
| |  Rolf Koch | Wie meinst Du das? op2% kann dir ja nur eine Position im String zurückliefern und nicht mehrere Stellen. Mach mehrere Variablen und frag diese dann mit case oder if ab. |
| | | | |
| |  Julian Schmidt | Ja gut ich wollte nicht schon wieder einen gigantischen Block bauen.Wird immer schwerer mit dem parsen.Wollte eigentlich nur das er gleichzeitig die Argumente +,-,*,/ im String ans$ ab der Position op1% sucht. Und das er mir die Position vom ersten gefundene Argument in die Variable op2% schreibt. Aber so wie sich das anhöhrt muss ich wohl doch noch eine gewaltige If-Prodzedur hinzufügen |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 08.11.2010 ▲ |
| |
| |  Julian Schmidt | Naja steigt mit jetzt übern Kopf werd jetzt doch wohl den Taschenrechner in der Hilfe umschreiben. |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 08.11.2010 ▲ |
| |
| |  Peter Max Müller | Mein erstes Posting zu diesem Thema ist nicht das was du brauchst? |
| | | | |
| |  Julian Schmidt | nunja wollte bei mir nicht debuggen außerdem wollte ich es nicht zu kompliziert kommen lassen |
| | | ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ Webseite [...]  | 08.11.2010 ▲ |
| |
| |  Peter Max Müller | | | | | |
| |  | @Peter: Ich sag nur:
Julian57 (08.11.10)
Nunja auf das was ich schreibe scheinst du(IF) ja nich sonderlich Wert zulegen

@Julian: Mit ZIP packste das einfach. |
| | | | |
| |  | Wie komm ich jetzt hier her??? |
| | | | |
| |  E.T. | ... das scheind ja hier wieder mal in's Sinnlose abzutrifften 
[OFFTOPIC] @IF: Irgendwie scheind das mit den Smilies überhaupt nich hinzuhau'n: S aus S-Auswahl eingefügt, aber im Post steht der S-Code (*irgendwas*), jedoch nicht das Smilie  Nachtrag: mit den S, welche mit : anfangen, scheind es zu funzen, mit *-S aber nicht... [/OFFTOPIC] |
| | | Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 09.11.2010 ▲ |
| |
| |  | [OFFTOPIC] Irgendwie scheind das mit den Smilies überhaupt nich hinzuhau'n: Welcher tritt seinen Dienst nicht an?[/OFFTOPIC] |
| | | | |
|
AntwortenThemenoptionen | 33.873 Betrachtungen |
ThemeninformationenDieses Thema hat 8 Teilnehmer: |