Ein Rechenprogramm
Übersicht

![]() |
SmokieBetreff: Ein Rechenprogramm |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
Ich habe angefangen ein programm zu schreiben für Mathe um Hausaufgaben zu erleichtern und anderem zum einen wollte ich wissen was ihr für bereiche Vorschlagt z.b. Prozentrechnen und zum zweiten wer will mal die demo sehen wenn ich dritten gelöst habe drittens ich möchte ein Koordinatensystem zecihen wo man per maus klick ein kreuz erzeugt wären man noch eine taste drückt (1-9) und wenn man ein zweites kreuz erzeugt (man hatt erst 1 plus maus ) und dann (2+maus)gedrückt soll zwischen dem ersten und dem zweiten kreuz eine linnie gezeichnet werden aber immer wenn ich das zweite kreuz zeichnen will muss ich x mal auf die mauss hämmer und nach ner zeit wird es gezeichnet aber es wird nicht nurmit dem ersten kreuz verbunden sondern auch mit dem null punkt im koordinaten system das erste Kreuz kann ich x mal zeichnenich habe den code für das zweite kreuz weggelassen Code: [AUSKLAPPEN] ;Kreuz zeichnen
If MouseHit(1) And KeyDown(2) Then neueskreuz.Kreuz=New kreuz neueskreuz\ykreuz= MouseY() neueskreuz\xkreuz= MouseX() EndIf For aktuelleskreuz.kreuz = Each kreuz DrawImageRect Kreuz, aktuelleskreuz\xkreuz-8,aktuelleskreuz\ykreuz-8,9,89,24,103 Line 23,450,aktuelleskreuz\xkreuz,aktuelleskreuz\ykreuz Next danke im vorraus mfg Smokie |
||
M-Soft Studios Mit selbst gemachtem Forum!!!
Unbequem lebt's sich schwer. Musik macht erst Spaß, wenn man sie mit 2,8 facher Geschwindigkeit hört Zuletzt bearbeitet von Smokie am Fr Jan 01, 1888 51:58 PM, insgesamt 1000-mal bearbeitet |
![]() |
Benibaerenstark |
![]() Antworten mit Zitat ![]() |
---|---|---|
hm, von 3.ens habe ich keine Ahnung, da ich mich mit Types überhaupt nicht auskenne ![]() aber was so ein Prog leisten könnte, habe ich einen Vorschlag: Gleichungen lösen, das heisst nach Variablen auflösen. zb: a+b=c; a? ->a=c-b also diese Schema, nur komplizierter + mehr Variabeln, wär noch ganz praktisch ![]() |
||
![]() |
Smokie |
![]() Antworten mit Zitat ![]() |
---|---|---|
also so aufgaben wie 6-5=1 wollte ich nicht machen aber terme wie z.b
(5-6) : 1/2 +((4*5)-3*2)=16 nur weiß ich noch nicht wie ich den term berechne ![]() |
||
M-Soft Studios Mit selbst gemachtem Forum!!!
Unbequem lebt's sich schwer. Musik macht erst Spaß, wenn man sie mit 2,8 facher Geschwindigkeit hört Zuletzt bearbeitet von Smokie am Fr Jan 01, 1888 51:58 PM, insgesamt 1000-mal bearbeitet |
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Bei Blitzcoder gab es mal so was (glaub ich) zumindest hab ich diesen Quelltext von irgendwoher und für meine Zwecke umgeschrieben. Die Kommentare hab ich n bissle übersetzt. Wichtig ist nur die Funktion "MathToString". Du übergibst einfach die Rechnung als Zeichenkette. Zusätzlich hab ich es eingebaut, mit der Variable x arbeiten zu können. Wenn du zum Beispiel eine Funktion zeichnen willst, dann führst du die Funktion beliebig oft aus und übergibst jeweils einen anderen x-wert. "Unit" sollte beim Aufruf immer 0 sein. Code: [AUSKLAPPEN] Function MathToString$(TheMath$, unit = 0, x# = 0.0)
Local MyParam$ = "*/^+-",myOperations$="ls" ;ls, da die beiden buchstaben in log,lgn,cos und sin vorkommen Local MathPower#, OldMathPower# Local deMathScan$, ScanNumber$, OldScanNumber$, MathScan$, MyScanText$, MathArt$ Local bscan, bscannow, bscanhave, ScanPosA, ScanPosB, Scan, MathAnswer# MathScan$ = Replace(TheMath$, " ", "") While bscan < Len(MathScan$) ;Solange bscan kleiner als die Länge der Formel ist bscan = bscan + 1 ;Bscan + 1 If Mid$(MathScan$, bscan, 1) = "(" Then ;Wenn an der Pos Bscan ein ( steht, dann... ScanPosA = bscan : bscannow = 1 ;ScanPosA = Pos der Klammer, bscannow = 1 While bscannow ;Solange bscannow nicht 0 ist If Mid$(MathScan$, bscan, 1) = "(" Then bscanhave = bscanhave + 1;ist auf der Pos ne (? --> bscanhave + 1 If Mid$(MathScan$, bscan, 1) = ")" Then bscanhave = bscanhave - 1;oder ne )? --> bscanhave - 1 If bscanhave = 0 Then bscannow = 0 ;wenn die Richtige klammer wieder zu ist, gehts weiter bscan = bscan + 1 ;incrementieren nicht vergessen If KeyDown(1) Then End ;ESC für Abbrechen Wend ;Ende Solange bscannow nicht 0 ist ScanPosB = bscan ;ScanPosB = Pos der schließenden Klammer MyScanText$ = Mid$(MathScan$, ScanPosA+1, ScanPosB - ScanPosA - 2);Inhalt der Klammer entnehmen MyScanText$ = MathToString$(MyScanText$, unit + 1) ;Rekursion, die Func wird mit dem Inhalt der Klammer neu ausgeführt MathScan$ = Replace(MathScan$, Mid$(MathScan$, ScanPosA, ScanPosB - ScanPosA), MyScanText$);Ergebnis dann einfügen bscan = 0 ;Bscan ist wieder 0 End If ;Ende Wenn and der Pos Bscan ein ( steht, dann... If KeyDown(1) Then End ;Wenn ESC, bla bla bla... Wend ;Ende Solange bscan kleiner als die Länge der Formel ist .NewMathScan deMathScan$ = MathScan$ ;Kopie von MahthScan$ erstellen Scan = InMid$(MathScan$, MyParam$) ;Inhalt von der Formel nach Operatoren untersuchen (*+-^ usw) If Scan Then ;Wenn es welche gibt, dann... ScanNumber$ = Mid$(MathScan$, 1, Scan-1) ;Die erste Zahl herausfischen --> ScanNumber$ MathScan$ = Mid$(MathScan$, Scan) ;Operator herausfischen --> MathScan$ MathAnswer = val2(ScanNumber$,x#) ;Ich nehme einfach mal an, MathScan in Integerform Else ;Wenn es keine Operatoren gib Scan = InMid$(MathScan$,MyOperations$);dann vielleicht etwas wie sin oder cos? if scan then Return val2(Mathscan$,x#) else return Mathscan$ endif End If ;Ende Wenn es Operatoren gibt, dann.... While Not MathScan$ = "" ;Solange unsere Formel nicht leer ist uu$ = MathScan$ ;schon wieder eine Kopie von MathScan$ MathArt$ = Mid$(MathScan$, 1, 1) ;MathArt$ = erstes Zeichen aus der Formel MathScan$ = Mid$(MathScan$, 2) ;MathScan$ = der Rest der Formel If Mid$(MathScan$,1,1) = "-" Then ;Wenn das erste Zeichen ein - ist (negatives Vorzeichen) MathPower# = -1 ;dann stelle Mathpower auf -1 MathScan$ = Mid$(MathScan$, 2) ; MathScan$ mal wieder den Rest zuorden Else ;Wenn nicht... MathPower# = 1 ;MathPower auf +1 stellen End If ;Ende Scan = InMid$(MathScan$, MyParam$) ;Scan = Pos des Operanten (Glaub ich!!!) OldScanNumber$ = ScanNumber$ ;Kopie von ScanNumber$ erstellen OldMathPower# = MathPower# ;Kopie von Mathpower# erstellen ScanNumber$ = Mid$(MathScan$, 1, Scan-1) ;ScanNumber$ = Die Nummer vor dem Zeichen MathScan$ = Mid$(MathScan$, Len(ScanNumber$)+1) ;MathScan ist das Zeichen Nach der Nummer If MathArt$ = "+" Then; Addieren MathAnswer = MathAnswer + (val2(ScanNumber$,x#)*MathPower#) ;Lösung = Zahl * (-1 oder 1) ElseIf MathArt$ = "-" Then;Subtrahieren MathAnswer = MathAnswer - (val2(ScanNumber$,x#)*MathPower#) ElseIf MathArt$ = "*" Then;Multiplizieren MathAnswer = (val2(OldScanNumber$,x#)*OldMathPower#) * (val2(ScanNumber$,x#)*MathPower#) If MathPower# = -1 Then MathScan$ = Replace(deMathScan$, OldScanNumber$ + "*-" + ScanNumber$, "-" + Str$(MathAnswer)) ElseIf MathPower# = 1 Then MathScan$ = Replace(deMathScan$, OldScanNumber$ + "*" + ScanNumber$, Str$(MathAnswer)) End If Goto NewMathScan ElseIf MathArt$ = "/" Then;Dividieren MathAnswer = (val2(OldScanNumber$,x#)*OldMathPower#) / (val2(ScanNumber$,x#)*MathPower#) If MathPower# = -1 Then MathScan$ = Replace(deMathScan$, OldScanNumber$ + "/-" + ScanNumber$, "-" + Str$(MathAnswer)) ElseIf MathPower# = 1 Then MathScan$ = Replace(deMathScan$, OldScanNumber$ + "/" + ScanNumber$, Str$(MathAnswer)) End If Goto NewMathScan ElseIf MathArt$ = "^" Then;x hoch n MathAnswer = (val2(OldScanNumber$,x#)*OldMathPower#) ^ (val2(ScanNumber$,x#)*MathPower#) If MathPower# = -1 Then MathScan$ = Replace(deMathScan$, OldScanNumber$ + "^-" + ScanNumber$, "-" + Str$(MathAnswer)) ElseIf MathPower# = 1 Then MathScan$ = Replace(deMathScan$, OldScanNumber$ + "^" + ScanNumber$, Str$(MathAnswer)) End If Goto NewMathScan Else;Nichts von alle dem? Return "SYNTAX ERROR" End If Wend Return Str(MathAnswer) End Function Function InMid$(A$, B$);Durchsucht, ob in A irgendetwas von B drin ist Local C, Q, W ;und gibt, wenn true, die pos[A] zurück C = 0 For Q = 1 To Len(A$) For W = 1 To Len(B$) If (Mid$(A$, Q, 1) = Mid$(B$, W, 1)) And C = 0 Then C = Q : Exit Next If C>0 Then Exit Next Return C End Function Function val2#(sstring$,var#) ;String wird übergeben - Float zurückgegeben Local temp#=0,decimal=0,sign=1 Local posa,posb,char ;positionen von eventuellen zeichen Local base=10 local negative ; zahl negative? dann var auf true local operation = 0 select mid(sstring$,1,3) case "log","lgn","cos","sin" operation = 1 posa = 3 end select if Instr(sstring$,"-",1) <> 0 then negative=-1 posb=Instr(sstring$,"&",posa+1);wenn ein *&* davor steht, wird in einem anderen System gerechnet If posb Then Select Mid$(sstring$,posa+1,1);welches System willst du haben? Case "B", "b" ;Anzubieten haben wir Binär,Oktan,oder Hexansystem base=2 ;Natürlich auch das zehnersystem!! posa=posb+1 Case "O", "o" base=8 posa=posb+1 Case "H", "h" base=16 posa=posb+1 Default base=10 End Select End If For posb=posa+1 To Len(sstring$);die ganze zahl durchrattern mit posb char=Asc(Mid(sstring$,posb,1));c speichert den buchstaben Select char Case 44 ;"," Goto skip Case 45 ;"-" sign= - sign Case 46 ;"." decimal=1 Case 48,49,50,51,52,53,54,55,56,57 ;"0" To "9" temp# = temp * base + char - 48 If decimal Then decimal=decimal*base case 88,120 ;"X" oder "x" temp# = temp * base + var Case 65,66,67,68,69,60 ;"A" to "F" If base=16 Then temp# = temp# * base + c - 55 If decimal Then decimal=decimal*base Else Goto fini EndIf Case 97,98,99,100,101,102 ;"a" to "f" If base=16 Then temp# = temp# * base + c - 87 If decimal Then decimal=decimal*base Else Goto fini EndIf Default Goto fini End Select .skip Next .fini If decimal Then temp# = temp# / decimal If negative = -1 Then temp# = -(temp# * sign) Else temp# = temp# * sign End If if operation then select mid(sstring$,1,3) case "log" temp# = log10(temp#) case "Lgn" temp# = log(temp#) case "cos" temp# = cos(temp#) case "sin" temp# = sin(temp#) end select endif return temp# End Function |
||
![]() |
eXceptION |
![]() Antworten mit Zitat ![]() |
---|---|---|
lol... wie komplisiert muss man das machen? ![]() EDIT: sag mal, unterstützt bb keine rekursive function calls? |
||
Norweger...
Spreche aber verdammt gut 8086 |
![]() |
regaa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Doch klar, aber musst drauf achten das kein Overflow kommt. Probier es doch einfach mal aus. | ||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
![]() |
Smokie |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich versteh nur Bahnhof von dem code von timo
ich bin erst ein anfänger ![]() |
||
M-Soft Studios Mit selbst gemachtem Forum!!!
Unbequem lebt's sich schwer. Musik macht erst Spaß, wenn man sie mit 2,8 facher Geschwindigkeit hört Zuletzt bearbeitet von Smokie am Fr Jan 01, 1888 51:58 PM, insgesamt 1000-mal bearbeitet |
![]() |
simi |
![]() Antworten mit Zitat ![]() |
---|---|---|
https://www.blitzforum.de/view...highlight=
hab ich mal gemacht, ist ein bisschen kürzer, aber auch schlechter (muss immer KLammern setzten, kein nach x auflösen) Viellecht verstehst du das besser. |
||
![]() |
Smokie |
![]() Antworten mit Zitat ![]() |
---|---|---|
so ganz verstehe ich das prog von dir net warum net einfach Print "23" ist doch einfacher ![]() |
||
M-Soft Studios Mit selbst gemachtem Forum!!!
Unbequem lebt's sich schwer. Musik macht erst Spaß, wenn man sie mit 2,8 facher Geschwindigkeit hört Zuletzt bearbeitet von Smokie am Fr Jan 01, 1888 51:58 PM, insgesamt 1000-mal bearbeitet |
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Exception: die Funktion von mir oben ist rekursiv ![]() joa sie sieht sehr kompliziert aus, aber es ist schwer, Klammern zu beachten, Punkt vor Strichrechnung, etc. Zusätzlich habe ich halt noch eingefügt, das man Potenzieren, Wurzelziehen, logarithmieren kann und sin() und cos() berechnen kann... ach ja, und man kann in anderen Systemen rechnen (2er, 8er, 16er, etc.) Das größte Problem ist halt, das alles nur mit Zeichenketten geht. Das macht die geschichte ziemlich langsam. aber anders gehts glaubig nicht. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group