schriftliches Wurzelziehen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
SimonSimCity
Beiträge: 132
Registriert: 14.01.2007 00:49

schriftliches Wurzelziehen

Beitrag von SimonSimCity »

Ich möchte dieses Script am Ende der Seite im PB verwirklichen, komme jetzt aber nicht mehr weiter.

Falls sich jemand da auskennt bin ich sehr dankbar.

Code: Alles auswählen

EnableExplicit

Procedure.s Wurzel(Zahl.w, Exponent.b = 2, Laenge.b = 9)
  
  Define Zahlanf.s, i.b, echo.s, b.b
  If Zahl < 0
    Debug "Die Zahl ist kleiner als 0"
  EndIf
  
  Zahlanf = Str(Int(Pow(Zahl, 1/Exponent)))
  If Val(Zahlanf)*Val(Zahlanf) = Zahl
    ProcedureReturn Zahlanf+".0"
  EndIf
  echo = Zahlanf+","
  Zahlanf = Str(Zahl-Val(Zahlanf)*2)
  ;Debug echo
  For i=1 To Laenge
    Zahlanf = Zahlanf+"00"
    
    For b=0 To 10
      If Val(Zahlanf)/Val(Str(Val(RemoveString(echo, ","))*2)+Str(b)) = b
        Zahlanf = Str(Val(Zahlanf)-Val(Str(Val(RemoveString(echo, ","))*2)+Str(b))*b)
        echo + Str(b)
        Break
      EndIf
      If b = 10
        If i = 8
            Debug Zahlanf
            Debug "-"+Str(Val(Str(Val(RemoveString(echo, ","))*2)+Str(b))*b)
        EndIf
        echo + Str(0)
      EndIf
    Next
    
  Next i
  ProcedureReturn echo
EndProcedure
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Kannst du ein bischen genauer schreiben an welchem Schritt du nicht weiter kommst, sonst müssen die armen Programmierer hier die sowieso an chronischem Zeitmangel :wink: leiden den ganzen Code und das Script erstmal durcharbeiten um überhaupt an den Arbeitspunkt zu kommen.

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
SimonSimCity
Beiträge: 132
Registriert: 14.01.2007 00:49

Beitrag von SimonSimCity »

Die Procedure geht genau richtig, aber bei der 9. Stelle kommt immer 0 raus, und das kann ja nicht stimmen.

Ich werde den Code mahl mit mehr Kommentarten posten... :wink: :wink:

Code: Alles auswählen

EnableExplicit ;Hoffe das kann noch jeder

Procedure.s Wurzel(Zahl.w, Exponent.b = 2, Laenge.b = 9)
 
  Define Zahlanf.s, i.b, echo.s, b.b
  If Zahl < 0 ;{ Selbsterklärend
    Debug "Die Zahl ist kleiner als 0"
  EndIf ;}
 
  Zahlanf = Str(Int(Pow(Zahl, 1/Exponent))) ;Hier wird die richtige Wurzel der Zahl genommen
                                            ;und als Ganzzahl in einen String gespeichert
  If Val(Zahlanf)*Val(Zahlanf) = Zahl ;{    ;Wenn die Zahl genau ein Quadrat ist, breche ab
    ProcedureReturn Zahlanf+".0"
  EndIf ;}
  
  echo = Zahlanf+","
  Zahlanf = Str(Zahl-Val(Zahlanf)*2)
  ;Debug echo
  For i=1 To Laenge
    Zahlanf = Zahlanf+"00"  ;Hier werden die Kommastellen runtergeholt
   
    For b=0 To 10           ;Jetzt wird ausprobiert, bis eine Zahl gefunden ist, die passt
      If Val(Zahlanf)/Val(Str(Val(RemoveString(echo, ","))*2)+Str(b)) = b
        Zahlanf = Str(Val(Zahlanf)-Val(Str(Val(RemoveString(echo, ","))*2)+Str(b))*b)
        echo + Str(b)
        Break
      EndIf
      If b = 10
        ;If i = 8   ;{  Gibt die errechneten Zahlen als Debug aus
        ;    Debug Zahlanf
        ;    Debug "-"+Str(Val(Str(Val(RemoveString(echo, ","))*2)+Str(b))*b)
        ;EndIf      ;}
        echo + Str(0)
      EndIf
    Next
   
  Next i
  ProcedureReturn echo
EndProcedure
Benutzeravatar
SimonSimCity
Beiträge: 132
Registriert: 14.01.2007 00:49

Beitrag von SimonSimCity »

Ich habe jetzt mich mal ganz auf den Text bezogen und bin bis jetzt nur bis hier her gekommen:

Code: Alles auswählen

EnableExplicit

Procedure GeraderString(String.s)
  If Int(Len(String)/2)*2 = Len(String)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure.s Wurzel(Zahl.s, Laenge.b = 3)
  Define rechnen.s, i.b, rest.s, vk.s, hk.s, rest2.s, d.b
  
  vk = Left (Zahl, FindString(Zahl, ".", 1)-1)
  hk = ReplaceString(Zahl, Left (Zahl, FindString(Zahl, ".", 1)-1)+".", "")
  rest = vk
  For d=1 To Laenge
    rechnen = Left(rest, 2)
    rest    = Right(rest, Len(rest)-2)
    
    rechnen=rest2+rechnen
    Debug rechnen
    For i=0 To 9
      Debug Pow(i+1, 2)
      If (Pow(i+1, 2) > Val(rechnen)) And (Val(rechnen) >= Pow(i, 2))
        Debug rechnen+"-"+Str(Pow(i, 2))+"=>"+Str(i)+"  "+rest
        rest2.s = Str(Val(rechnen)-Pow(i, 2))
        rechnen = rest
      EndIf
    Next
  Next
EndProcedure

Wurzel("387654.567578697976")
Das ist Schritt 4 im Beispiel.
Aber diesmal hab ich mich genau an den Text gehalten.

Wer Spass hat, kann es beenden.
Ich hab es nach 3 Stunden aufgegeben. :freak:
Antworten