Deutsch
Forum

Problem - Selbst programmierter Taschenrechner

 
- 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 4 -


« 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)
 
XProfan X3, X4ß, Win 10.1
08.11.2010  
 




Julian
Schmidt
Nunja auf das was ich schreibe scheinst du(IF) ja nich sonderlich Wert zulegen



Wäre nett wenn du ein Beispiel postest (bitte mit Kommentaren arbeiten)
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
08.11.2010  
 



Julian57 (08.11.10)
Nunja auf das was ich schreibe scheinst du(IF) ja nich sonderlich Wert zulegen


Hab ich mir von Dir abgeschaut!
 
08.11.2010  
 




Julian
Schmidt
iF (08.11.10)

Julian57 (08.11.10)
Nunja auf das was ich schreibe scheinst du(IF) ja nich sonderlich Wert zulegen


Hab ich mir von Dir abgeschaut!


Sowas kann man sich nicht abschauen
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
08.11.2010  
 



Julian57 (08.11.10)

iF (08.11.10)

Julian57 (08.11.10)
Nunja auf das was ich schreibe scheinst du(IF) ja nich sonderlich Wert zulegen


Hab ich mir von Dir abgeschaut!


Sowas kann man sich nicht abschauen


Offensichtlich doch...:  [...] 
 
08.11.2010  
 




Julian
Schmidt
iF (08.11.10)

Julian57 (08.11.10)

iF (08.11.10)

Julian57 (08.11.10)
Nunja auf das was ich schreibe scheinst du(IF) ja nich sonderlich Wert zulegen


Hab ich mir von Dir abgeschaut!


Sowas kann man sich nicht abschauen


Offensichtlich doch...:  [...] 


Hier gehen unsere Meinugen ja ganz klar auseinander
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
08.11.2010  
 



Julian57 (08.11.10)

iF (08.11.10)

Julian57 (08.11.10)

iF (08.11.10)

Julian57 (08.11.10)
Nunja auf das was ich schreibe scheinst du(IF) ja nich sonderlich Wert zulegen


Hab ich mir von Dir abgeschaut!


Sowas kann man sich nicht abschauen


Offensichtlich doch...:  [...] 


Hier gehen unsere Meinugen ja ganz klar auseinander


Dazu müsste ich dazu erstmal eine haben!
 
08.11.2010  
 




Julian
Schmidt
iF (08.11.10)

Julian57 (08.11.10)

iF (08.11.10)

Julian57 (08.11.10)

iF (08.11.10)

Julian57 (08.11.10)
Nunja auf das was ich schreibe scheinst du(IF) ja nich sonderlich Wert zulegen


Hab ich mir von Dir abgeschaut!


Sowas kann man sich nicht abschauen


Offensichtlich doch...:  [...] 


Hier gehen unsere Meinugen ja ganz klar auseinander


Dazu müsste ich dazu erstmal eine haben!


Nun ja hast ja eine schöne geeusert

iF (08.11.10)

Julian57 (08.11.10)

iF (08.11.10)

Julian57 (08.11.10)
Nunja auf das was ich schreibe scheinst du(IF) ja nich sonderlich Wert zulegen


Hab ich mir von Dir abgeschaut!


Sowas kann man sich nicht abschauen


Offensichtlich doch...:  [...] 
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
08.11.2010  
 




Julian
Schmidt
wird immer länger
Ich würd sagen an den Punkt höhren wir auf mit der Diskussion
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
08.11.2010  
 



Rockt doch... xD


Nun ja hast ja eine schöne geeusert


Nur eine Beobachtung kundgetan, mir diese aber nicht als Meinung angeeignet!
 
08.11.2010  
 




Julian
Schmidt
Ja schön,
jetzt artet dieser Thread als chat aus.
Können wir wieder zur Sache kommen
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
08.11.2010  
 



Julian57 (08.11.10)

Können wir wieder zur Sache kommen


Scheinbar nicht, hätte es ja bei meinem 2. Beitrag hier im Thread bleiben können in dem ich bereits InStr "empfohlen" hatte.
 
08.11.2010  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

33.859 Betrachtungen

Unbenanntvor 0 min.
Peter Max Müller21.01.2024
iF23.07.2015
Julian Schmidt02.02.2013
Michaeal18.10.2012
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie