Ein Rechenprogramm

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Smokie

Betreff: Ein Rechenprogramm

BeitragMo, Nov 22, 2004 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Nov 22, 2004 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, von 3.ens habe ich keine Ahnung, da ich mich mit Types überhaupt nicht auskenne Embarassed

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 Smile

Smokie

BeitragMo, Nov 22, 2004 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused
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

BeitragMo, Nov 22, 2004 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 23, 2004 1:56
Antworten mit Zitat
Benutzer-Profile anzeigen
lol... wie komplisiert muss man das machen? Shocked

EDIT: sag mal, unterstützt bb keine rekursive function calls?
Norweger...

Spreche aber verdammt gut 8086

regaa

BeitragDi, Nov 23, 2004 9:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 23, 2004 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich versteh nur Bahnhof von dem code von timo
ich bin erst ein anfänger Embarassed also ich aknn den ganzen code schreiben aber das nützt nichts wenn einer Zeit und lust hat schicke ich das ganze prog per email
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

BeitragDi, Nov 23, 2004 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 23, 2004 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
so ganz verstehe ich das prog von dir net warum net einfach Print "23" ist doch einfacher Laughing naja jetzt mal ganz im ernst bei mir steht das nur 23 mehr net
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

BeitragDi, Nov 23, 2004 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
@Exception: die Funktion von mir oben ist rekursiv Wink

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.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group