Forum | | | | - Seite 1 - |
| Stefan Landsberg | Hallo,
ich möchte ein Programm schreiben, dass die Quadratwurzel einer Zahl berechnet. ABER es soll nicht auf 6 Nachkommastellen runden, sondern solange weitermachen bis man auf Stop klickt.
Frage: (wie) kann man das Kürzen auf 6 Nachkommastellen bei sqrt() und pow() abstellen.
Wenn das nicht geht, dann muss ich mir irgend eine Prozedur einfallen lassen die dass macht. Aber bitte keine Fertiglösung posten. Dann lerne ich nichts.
Noch eine Frage: ist in XProfan 10 die länge eines floats begrenzt? |
| | | | |
| | | | | - Seite 1 - |
| Jac de Lad | Nein, nein, nein! Typischer Anfängerfehler. Um mit den Eingaben zu rechnen musst du es erst von String in ein Float umwandeln (siehe "Val()") und zur Ausgabe im MultiEdit wieder in einen String (siehe "Str$()").
Declare
declare in&,out&,btn&,ergebnis$,ende%,eingabe$
Fenster erstellen
windowstyle 575
windowtitle "Quadratwurzel"
window 20,20 - 600,400
usefont "MS Sans Serif",20,0,0,0,0
Fenster gestalten
in&=create("edit",%hWnd,"25",5,5,580,20)
btn&=create("button",%hWnd,"Berechnen",250,30,100,30)
out&=create("multiedit",%hWnd,"",5,65,580,-270)
whilenot ende%
WaitInput
case %key=2 : break
if clicked(btn&)
eingabe$=gettext$(in&)
ergebnis$=Str$(sqrt(Val(eingabe$)))
settext out&,""
settext out&,ergebnis$
endif
endwhile
Kürzer wäre dein Prog so:
Declare
declare in&,out&,btn&,ende%
Fenster erstellen
windowstyle 575
windowtitle "Quadratwurzel"
window 20,20 - 600,400
usefont "MS Sans Serif",20,0,0,0,0
Fenster gestalten
in&=create("edit",%hWnd,"25",5,5,580,20)
btn&=create("button",%hWnd,"Berechnen",250,30,100,30)
out&=create("multiedit",%hWnd,"",5,65,580,-270)
whilenot ende%
WaitInput
if %key=2
break
elseif clicked(btn&)
settext out&,Str$(sqrt(Val(gettext$(in&))))
endif
endwhile
Zum Thema Berechnung:
Du kannst entweder jede Stelle einzeln berechnen lassen oder eine Zahl quadrieren und je nachdem ob sie zu groß oder zu klein ist immer ein wenig erhöhen oder abziehen. Dazu musst du die Zahlen in Strings speichern und jede Stelle einzeln multiplizieren.
Jac |
| | | Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 15.08.2008 ▲ |
| |
| | Stefan Landsberg | Hallo,
ich nehme für die ausgabe des ergebnisses ein einfaches editfeld, aber da ich in meinem Programm ja an die vorhandene zahl immer die neu berechnete stelle dranhängen will, ist es meiner meinung nach unpraktisch und wahrscheinlich auch zu langsam immer erst den aktuellen text mit gettext aus dem editfeld auszulesen, eine neu ziffer dranzuhängen, und dann wieder die zahl mit settext ins editfeld zu schreiben. gibts da eine bessere methode oder irgendeine message (gibts eine seite/datei in der die messages auf deutsch erklärt sind) ? |
| | | | |
| | | wm_copyData könnte Dir hier helfen. |
| | | | |
| | Stefan Landsberg | hallo, danke erstmal aber gibt es irgendwo ne dokumentation in der die messages verständlich (am besten deutsch) erklärt sind? ich blick bei msdn nicht so richtig durch! |
| | | | |
| | | Klar, xprofan.com suche und google sind die Helfer in solcher Not! |
| | | | |
| | Stefan Landsberg | nachdem ich jetz endlich wieder ein wenig zeit für xprofan gefunden hab (schule beansprucht ne ganze menge zeit. vor allem latein ) stelle ich mal wieder eine frage:
warum wir in der if abfrage keine wert an die variable firstpart$ übergeben? ich hab auch schon versucht sie als integer zu declarieren. geht auch nicht:
Declare
declare in&,out&,calcbtn&,stopbtn&,ergebnis$,ende%,eingabe$
PROC-Teil
Proc sqrtlong
Algorithmus zum ziehen einer Quadratwurzel
Parameters zahl$, output&, stopbtn&
declare vorkomma$, div2%, firstsqrt%, firstpart$
zahl$=translate$(zahl$, "," , ".") Dezimalkomma durch Dezimalpunkt ersetzen
vorkomma$=substr$(zahl$,1,".") Ziffern vor dem Komma in vorkomma$ speichern
div2%=Instr(".",str$(substr$(len(vorkomma$ / 2),1,"."))) Prüfen ob die Anzahl der Ziffern vor dem Komma gerade oder ungerade ist.
if div2% = 0
firstpart$=mid$(vorkomma$,0,2) erste 2 Ziffern aus vorkomma$ werden in firstpart$ gespeichert
firstsqrt%=substr$(str$(sqrt(val(firstpart$))), 1 , ".") es wird die sqrt aus firstpart$ gebildet (rest wird weggelassen)
else
firstpart$=mid$(vorkomma$,0,1) erste Ziffer aus vorkomma$ wird in firstpart$ gespeichert
firstsqrt%=substr$(str$(sqrt(val(firstpart$))), 1 , ".") es wird die sqrt aus firstpart$ gebildet (rest wird weggelassen)
endif
locate 4,1 nur zum testen was firstpart$ enhält
print "firstpart:",firstpart$ nur zum test was firstpart$ enhält
sendmessage(output&,$004A,%hWnd,Addr(firstsqrt%))
endproc
Fenster erstellen
windowstyle 575
windowtitle "Quadratwurzel"
window 20,20 - 600,125
usefont "MS Sans Serif",20,0,0,0,0
Fenster gestalten
in&=create("edit",%hWnd,"25,5",5,5,580,20)
calcbtn&=create("button",%hWnd,"Berechnen",170,30,100,30)
stopbtn&=create("button",%hWnd,"Stop",310,30,100,30)
out&=create("edit",%hWnd,"",5,65,580,20)
whilenot ende%
WaitInput
case %key=2 : break
if clicked(calcbtn&)
sqrtlong gettext$(in&), out&, stopbtn&
endif
endwhile
|
| | | | |
| | | Der Zweite Parameter von Mid$ muss mindestens 1 sein wenn man tatsächlich ab erster Position ermitteln möchte. |
| | | | |
| | Stefan Landsberg | ahhh, danke (warum bin ich da nicht selbst drauf gekommen ) |
| | | | |
| | | | - Seite 2 - |
| | Stefan Landsberg | soo, ich hab jetz noch ein bisschen weitergebastelt, und es funktioniert auch alles so wie ich es will. Aber jetz hab ich wieder mein Problem mit sendmessage. Was muss ich machen, damit der inhalt der variable firstsqrt% an das editfeld out$ gesendet wird? KompilierenMarkierenSeparierenDeclare
declare in&,out&,calcbtn&,stopbtn&,ergebnis$,ende%,eingabe$
PROC-Teil
Proc sqrtlong
Algorithmus zum ziehen einer Quadratwurzel
Parameters zahl$, output&, stopbtn&
declare vorkomma$, div2$, firstsqrt%, firstpart$
zahl$=translate$(zahl$, "," , ".") Dezimalkomma durch Dezimalpunkt ersetzen
vorkomma$=substr$(zahl$,1,".") Ziffern vor dem Komma in vorkomma$ speichern
div2$=substr$(len(vorkomma$)/2,2,".") Prüfen ob die Anzahl der Ziffern vor dem Komma gerade oder ungerade ist.
locate 3,1
print "div2:",div2$
if div2$ = 0
firstpart$=mid$(vorkomma$,1,2) erste 2 Ziffern aus vorkomma$ werden in firstpart$ gespeichert
firstsqrt%=val(substr$(str$(sqrt(val(firstpart$))), 1 , ".")) es wird die sqrt aus firstpart$ gebildet (rest wird weggelassen)
else
firstpart$=mid$(vorkomma$,1,1) erste Ziffer aus vorkomma$ wird in firstpart$ gespeichert
firstsqrt%=val(substr$(str$(sqrt(val(firstpart$))), 1 , ".")) es wird die sqrt aus firstpart$ gebildet (rest wird weggelassen)
endif
locate 4,1 nur zum testen was firstpart$ enhält
print "firstpart:",firstpart$ nur zum test was firstpart$ enhält
locate 5,1
print "firstsqrt:",firstsqrt%
sendmessage(output&,$004A,%hWnd,Addr(firstsqrt%))
endproc
Fenster erstellen
windowstyle 575
windowtitle "Quadratwurzel"
window 20,20 - 600,125
usefont "MS Sans Serif",20,0,0,0,0
Fenster gestalten
in&=create("edit",%hWnd,"25,5",5,5,580,20)
calcbtn&=create("button",%hWnd,"Berechnen",170,30,100,30)
stopbtn&=create("button",%hWnd,"Stop",310,30,100,30)
out&=create("edit",%hWnd,"",5,65,580,20)
whilenot ende%
WaitInput
case %key=2 : break
if clicked(calcbtn&)
sqrtlong gettext$(in&), out&, stopbtn&
endif
endwhile
|
| | | | |
| | | | | | | |
| | Stefan Landsberg | ok dann mach ichs erstmal damit. aber später wäre es aus folgendem grund doch effizienter eine andere methode zu nehmen oder:
Stefan Löwen
Hallo,
ich nehme für die ausgabe des ergebnisses ein einfaches editfeld, aber da ich in meinem Programm ja an die vorhandene zahl immer die neu berechnete stelle dranhängen will, ist es meiner meinung nach unpraktisch und wahrscheinlich auch zu langsam immer erst den aktuellen text mit gettext aus dem editfeld auszulesen, eine neu ziffer dranzuhängen, und dann wieder die zahl mit settext ins editfeld zu schreiben. gibts da eine bessere methode oder irgendeine message (gibts eine seite/datei in der die messages auf deutsch erklärt sind) ?
iF
wm_copyData könnte Dir hier helfen. |
| | | | |
| | | Hängt davon ab, ob Du etwas an der Cursorposition "anhängen" möchtest (wm_copyData), oder den ganzen Inhalt ersetzen (setText). |
| | | | |
|
AntwortenThemenoptionen | 10.320 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |