Übungsaufgabe für alle :: Nr. 4 - Rekursion

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

 

junky

BeitragSo, Jan 02, 2005 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ja ne Wink - das is klar @ Waveblue
nur mit 2er Begrenzung liefs halt wie geschmiert
gestern stand ich noch vorm Abgrund
heute bin ich einen Schritt weiter...

DA

BeitragSo, Jan 02, 2005 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Bin auch fertig. Hat etwas länger gedauert habe es erst heute gesehen.

Download: http://DarkAngel.cybton.com/UebungsaufgabeNr4.exe

Thx
DarkAngel
Deutscher Blitz Basic Chat
 

David

BeitragSo, Jan 02, 2005 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Boa dauert das lang, 5 Sekunden für "1000". Bisschen heftig oder????

grüße

DA

BeitragSo, Jan 02, 2005 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Meinst du mich?

Thx
DarkAngel
Deutscher Blitz Basic Chat

Kabelbinder

Sieger des WM-Contest 2006

BeitragSo, Jan 02, 2005 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Dimensionsfelder sind doch Global, oder?
Sind die erlaubt?
Ich würde die Werte nämlich gerne in Dimensionsfeldern speichern, und die dann nachher in das Koordinaten System setzen.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
 

David

BeitragSo, Jan 02, 2005 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

DarkAngel: Ja dich mein ich! Aber ok, irgendwie gehts jetzt doch schneller! Allerdings versteh ich dein Diagramm nicht... Shocked

Kabelbinder: Ich bin dafür das alles globale verboten sein sollte, wenn dann alles... Smile

grüße

DA

BeitragSo, Jan 02, 2005 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

@ David
Ja das Diagramm ist wirklich misslungen, nicht nur das es zu lang meistens wird, nein die Anteile für die Zahlen werden falschherum ausgegeben.
Aber das es zu lange dauert, davon merke ich nichts. Vieleicht ist einfach deine Mühle zu lahm Razz .

Thx
DarkAnel
Deutscher Blitz Basic Chat
 

David

BeitragSo, Jan 02, 2005 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ich denke 2.6 Gig sollten ausreichend sein. Auf der Arbeit hab ich 2x 3 Gigaherz, ich würde sagen dein Rechner ist nicht viel schneller...

Egal, machmal ist's ja recht flott aber ab und zu dauerts echt lang... Warum auch immer.

grüße

DA

BeitragSo, Jan 02, 2005 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Also ich habe gerade 15 mall das Programm gestartet, und ich habe keine Verzögerung gespürt. Vieleicht liegt's an Blitz2d?
Am Freitag kann ich ja den Code Posten vieleicht habe ich irgend was falsche gemacht?

Thx
DarkAngel
Deutscher Blitz Basic Chat
 

David

BeitragMo, Jan 03, 2005 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Jetzt hab ich doch nochwas gemacht... hier

grüße

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Jan 08, 2005 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin mal gespannt wer alles was hat....
hier erst mal meins, aber nicht über den Codestil beschweren!Code: [AUSKLAPPEN]
Rahmen_X = 50 :Rahmen_Y = 30
Frage$ = "Gib eine Zahl ein:?":max_Lang = 9

Graphics 800 ,600,16,1
SetBuffer BackBuffer ()
Font1 = LoadFont ("Comic Sans MS",35,0,0,0)
Font2 = LoadFont ("Comic Sans MS",20,0,0,0)

While Not KeyHit (1)
    Cls
    SetFont Font2
    Color 0 ,255,0
    Text 500 ,60,"Diagramm und Input Routine",1,1
    Text 500 ,100,"aus dem",1,1
    Text 500 ,140,"Code Archiv BB-Forum",1,1
    SetFont Font1
    If timer < MilliSecs () Then
        ;##################################
        ;Inputroutine
        Rahmenbreite = StringWidth (Frage$ + "XYZ") ;+ FontWidth ()*2)
        Rahmenhoehe = (FontHeight () * 4)
        Color 255 ,0,0 ; umrandung malen 2pix breit
        Rect Rahmen_X, Rahmen_Y,Rahmenbreite,Rahmenhoehe ,1
        Color 0 ,0,255; innenfeld
        Rect Rahmen_X + 2 ,Rahmen_Y + 2, Rahmenbreite - 4 , Rahmenhoehe - 4 ,1
        Color 0 ,0,0 ; Frage einzeichnen >> Schatten
        Text Rahmen_X + Rahmenbreite / 2 + 2, Rahmen_Y + Rahmenhoehe / 4 + 2 , Frage$,1,1
        Color 255 ,255,0 ; Frage einzeichnen
        Text Rahmen_X + Rahmenbreite / 2, Rahmen_Y + Rahmenhoehe / 4 , Frage$,1,1
        a = GetKeynew () ; Zeichen holen wenn gedrückt
        ; wenn gescheites zeichen, dann hinzufügen
        If Len (antwort$) < max_Lang Then
            If a >= 48 And a <= 57  Then antwort$ = antwort$ + Chr (a)
            If Len (antwort$) And Left (antwort,1) = "0" Then antwort = Mid (antwort,2)
            If a = 44 Or a= 46 And Instr(antwort,".")= 0 Then antwort$ = antwort$ + Chr (46)
            End If
        ;wenn Rücktaste dann Zeichen löschen... und Pause sonst ist der Text zu schnell gelöscht
        If KeyDown (14) And Len (antwort$) > 0 And MilliSecs () - WarteZeit > 125 Then
            antwort$ = Left (antwort$, (Len (antwort$) - 1) )
            WarteZeit = MilliSecs ()
        End If
        ; bei enter ist die Eingabe erledigt und gibt die 1 zurück
        If (KeyDown (28) Or KeyDown (156) ) Then Abfrage = 1 ; für beenden der Input routine
        Antwortbreite = max_Lang * StringWidth ("Ra") / 2;FontWidth() ; die maximale breite der Antwort ermitteln
        Startpos_der_Antwort = Rahmen_X + (Rahmenbreite / 2) - (Antwortbreite / 2)
        Color 0 ,0,0
        Text Startpos_der_Antwort,Rahmen_Y + Rahmenhoehe / 4 * 2.2 , Antwort$
        ; Cursor blinken
        If MilliSecs () - CursorZeit > 500 Then
            CursorStatus = CursorStatus Xor 1 ;ein - ausschalten
            CursorZeit = MilliSecs ()
        End If
        ;Cursor malen
        If CursorStatus = 1 Then
            StartCursorX = Startpos_der_Antwort + StringWidth (antwort$) + 1
            texthoehe = StringHeight (antwort$)
            Color 255 ,255,0
            Rect StartCursorX , Rahmen_Y + Rahmenhoehe / 4 * 2.2 + texthoehe * .2 , StringWidth ("l") , texthoehe * .6
        End If
;-<BM> 60
        If Abfrage = 1 Then
            bank$ = Antwort$ + "!" + teile (Antwort$)
            Antwort = ""
            Abfrage = 0
            Startdia=1
            Animation = 0
            timer = MilliSecs () + 1000
            FlushKeys
        End If
    End If

   
    If Startdia > 0 Then
        If animation < 760 Animation = Animation + 3
        Diagramm ( 0 ,bank$, 20 , 180 ,animation, 400)
    End If
    Flip
Wend

End

Function GetKeyNew ()
    XX = GetKey ()
    If XX = 0 Then
        If KeyHit (82) Then xx = 48 ;0
        If KeyHit (83) Then xx = 44 ;,
        If KeyHit (79) Then xx = 49 ;1
        If KeyHit (80) Then xx = 50 ;2
        If KeyHit (81) Then xx = 51 ;3
        If KeyHit (75) Then xx = 52 ;4
        If KeyHit (76) Then xx = 53 ;5
        If KeyHit (77) Then xx = 54 ;6
        If KeyHit (71) Then xx = 55 ;7
        If KeyHit (72) Then xx = 56 ;8
        If KeyHit (73) Then xx = 57 ;9
    End If
    Return XX
End Function


Function Diagramm ( ArrayVon,bank$, WinStartX, WinStartY, BreiteX#, HoeheY#)



    For i = 1 To Len (bank$)
        If Mid (bank$,i,1) = "!" Then size = size + 1
    Next
    Local Wert#[10]
   
    ArrayBis = size -1
   
    While Instr (bank$,"!")
    dummy#=Left (bank$,Instr (bank$,"!") - 1)
        Wert[x] = dummy#
        x = x + 1
        bank = Mid (bank,Instr (bank$,"!") + 1)
    Wend

    IndexMenge = ArrayBis - ArrayVon + 1
   
    For t = ArrayVon To ArrayBis
        If MaxWert# < Wert [t] Then MaxWert = Wert [t]
    Next
   
    SeedRnd (1)
    Color 0 ,0,0
   
        BalkenY = HoeheY / IndexMenge
        Rect WinStartX - 1 , WinStartY - 1 , BreiteX + 2 , BalkenY * IndexMenge + 2 , 1
        Factor# = BreiteX / MaxWert
       
        While IndexMenge > Zeiger
            Rx1 = WinStartX
            Ry1 = WinStartY + Zeiger * BalkenY
            Rx2 = Wert [ Zeiger + ArrayVon ] * Factor
            Ry2 = BalkenY - 1
            Color Rand ($FF) ,Rand ($FF) ,Rand ($FF)
            Rect Rx1 ,Ry1 , Rx2 , Ry2 , 1
            Color 0 ,0,0
            Text Rx1 + 1 , Ry1 + BalkenY / 2 + 1, Wert [Zeiger + ArrayVon] ,0,1
            Color $FF , $FF , $FF
            Text Rx1 , Ry1 + BalkenY / 2, Wert [Zeiger + ArrayVon] ,0,1
            Zeiger = Zeiger + 1
        Wend
   
End Function


Function teile$ (a#,bank$ = "",tiefe = 0)
    tiefe = tiefe + 1
    a# = a# / 2
    If a <= 2 Or tiefe = 10 Then Return bank
    Bank$ = Bank$ + a# + "!" + teile$ (a#,bank$,tiefe)
    Return Bank$
End Function

Teile ist die Rekursiv Function
[BB2D | BB3D | BB+]

DA

BeitragSa, Jan 08, 2005 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Ach ist auch egal...

Code: [AUSKLAPPEN]

; Übungsaufgabe Nr. 4

Graphics 640 , 480 , 16 , 2
SetBuffer BackBuffer ()
SeedRnd MilliSecs ()

zahl# = Input ("Bitte geben Sie eine Zahl ein:")

teilen (zahl#)

WaitKey ()
End

Function teilen (zahl#)
   
    If zahl# <= 3.99 Then
        Text 0, 20 , zahl#
        WaitKey ()
        End
    EndIf
   
    azahl# = zahl#
   
    For x = 1 To 10
        azahl# = azahl / 2
        If azahl# <= 2 Then Exit
    Next
   
    x = x - 1
   
    For y = 1 To x
        farbeR = Rand (0, 255)
        farbeG = Rand (0, 255)
        farbeB = Rand (0, 255)
        Color farbeR, farbeG, farbeB
        yachse = yachse + 20
        zahl# = zahl# / 2
        Rect zahl#, 300 , zahl# + 50 , 50 , 1
        Text 0, yachse, y + ": " + zahl#
    Next
   
    Flip
End Function



Thx
DarkAngel
Deutscher Blitz Basic Chat
  • Zuletzt bearbeitet von DA am Sa, Jan 08, 2005 15:12, insgesamt einmal bearbeitet

Waveblue

BeitragSa, Jan 08, 2005 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
zahl#=Input()
teile (zahl#,0)
WaitKey()






Function teile (zahl#, durchlauf)
zahl#=zahl#/2
If zahl#<=2 Or durchlauf=10 Then Return(durchlauf)
Print zahl#
durchlauf=durchlauf+1
teile (zahl#,durchlauf)
Return(durchlauf)
End Function


okay, is ohne Diagramm, weil das Return irgendwie ni durchlauf zurückbrachte!
This is 10% luck
20% skill
15% concentrated power of will
5% pleasure, 50% pain
and 100% reason to remember the name

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Jan 08, 2005 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
@DarkAngel:
Was bedeutet den Sonnabend?
So wie ich das kenne ist das der ganze Samstag und hat nichts mit Sonntag oder abends was zu tun!

Berichtige mich wenn ich da falsch liege!
[BB2D | BB3D | BB+]

DA

BeitragSa, Jan 08, 2005 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Aso. Embarassed
Ja dann. Razz

Warum muss wunderkind auch immer son Kauderweltsch reden? Very Happy



Thx
DarkAngel
Deutscher Blitz Basic Chat
 

junky

BeitragSa, Jan 08, 2005 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
jop - denn ma meine Lösung
Code: [AUSKLAPPEN]

Graphics(800,600,32,2)

;================================================================;

Function Rekursion(Zahl#, abstand_y#, Draw=1, Durchlauf=0)
   Durchlauf=Durchlauf+1
   Zahl=Zahl/2
   If Zahl>2
      Print(Durchlauf+": "+Zahl)
      If Draw : DrawCross(200 + 40 * Durchlauf, 550 - (Zahl * abstand_y), Durchlauf) : EndIf
      If Durchlauf<10
         Zahl=Rekursion(Zahl, abstand_y, Draw, Durchlauf)
      EndIf
   EndIf
   Return(Zahl)
End Function

;================================================================;

Function DrawCross(x, y, nr, width=2, height=2)
   Line(x-width, y, x+width, y)
   Line(x, y-height, x, y+height)
   Text(x+2, y-StringHeight(nr)-2, nr)
End Function

;================================================================;

Function DrawKoordSystem(StartZahl#, skala_x)
   Line(200, 550, 600, 550)
   Line(200, 550, 200, 038)

   For a=1 To 10
      Line(200+40*a, 550, 200+40*a, 555)
      Text(200+(40*a)-StringWidth(a)/2, 550+StringHeight(a), a)
   Next
   
   abstand#=512/skala_x
   konst#=StartZahl/(2.0*skala_x)
   For a=1 To skala_x
      zahl#=konst*a
      Line(200, 550-abstand*a, 195, 550-abstand*a)
      Text(190-StringWidth(zahl), 550-StringHeight(zahl)/2-abstand*a, zahl)
   Next
End Function

;====================================================================;
; Die folgenden 2 Werte können nach belieben verändert werden, wobei ;
; Skala_x immer ein Vielfaches von 2 sein sollte ( 2,4,8,...)        ;
; Skala_x stellt die Anzahl der horizontalen Skalastriche im         ;
; Koordinatensystem dar, welches mit Draw=1 gezeichnet werden kann   ;
;====================================================================;

Draw=1          ; ( 0=nicht zeichen | 1=zeichen )
Skala_x=16      ; ( 2,4,8,16, ... )

;================================================================;

Startzahl=Input("Startzahl: ")
If Draw
   Color(150,150,150)
   DrawKoordSystem(Startzahl, Skala_x)
EndIf
Color(255,255,255)
Print() : Print()
Rekursion(Startzahl,  1024.0/Startzahl, Draw)

WaitKey()
End
gestern stand ich noch vorm Abgrund
heute bin ich einen Schritt weiter...

Clonker

BeitragSa, Jan 08, 2005 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier meine Lösung:
Code: [AUSKLAPPEN]

Graphics 640,240,0,2

printline = 1 ; Line im Graph zeichnen?

font = LoadFont("Arial",16)
font2 = LoadFont("Arial",20,1)
SetFont font
dim schritte#(10)

schritte(0) = input (" Zahl: ")
print ""
ergebnis# = teilen#(schritte(0),0)
print ""
setfont font2
print " Ergebnis: " + ergebnis#
SetFont font

DrawGraph(ergebnis#,printline)

Waitkey()


Function teilen#(zahl#,tiefe = 0)
  zahl# = zahl# / 2.0   
  If zahl# >= 2 and tiefe < 10 Then
    schritte(tiefe+1) = zahl# ;Abspeichern der Zwischenergebnisse
      
    tiefe = tiefe + 1
   
    print " " + tiefe + ": " + zahl#
    zahl# = teilen#(zahl#,tiefe)
  Else
    zahl# = zahl# * 2
    return zahl#
  Endif
  return zahl#
End Function

Function DrawGraph(ergebnis#,printline)
  color 0,0,255
  ;Line 300,9,300,201,0
  Line 300,9,300,210
  Line 300,210,600,210
  maxy# = schritte(1)
  steps# = maxy# / 8.0
      
  For i = 0 to 8
    x = 300
    y = 9+(i*(200.0/8.0))
    color 255,255,255
    text x-5-(stringwidth(maxy#   - (steps# * i))),y-8,str(maxy#   - (steps# * i))   
    if i <> 8 then
      color 44,44,44
      line x+1,y-1,x+300,y-1
    Endif
  Next
  color 255,255,255

  for i = 1 to 10
    if schritte#(i) = ergebnis# then maxx = i      
  next

  for i = 1 to maxx
    x = 302+(i*(300.0/float(maxx)))-(float((300.0/float(maxx)))/2)
    y = 209-(schritte(i)*(200.0/schritte(1)))
    color 255,255,255
    text 300+(i*(300.0/float(maxx)))-(float((300.0/float(maxx)))/2),214,i
       
    color 44,44,44
    line x,209,x,9

    if i <> 1 and printline = 1
      color 0,55,0
      line x,y,302+((i-1)*(300.0/float(maxx)))-(float((300.0/float(maxx)))/2),208-(schritte(i-1)*(200/schritte(1)))
    endif
       
    color 255,0,0
    line x-2,y,x+2,y
    line x,y-2,x,y+2
            
    ;color 166,166,166 : text x,y-15,schritte(i)
  next
End Function

Die exzessive Akkumulation von Fremdwörtern suggeriert pseudointellektuelle Kompetenz.

Athlon XP 2800|Radeon 9600 Pro|512MB DDR RAM|240GB Festplatte
 

David

BeitragSo, Jan 09, 2005 0:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Meins:

Code: [AUSKLAPPEN]

Graphics 800, 600, 32, 2

Main()

WaitKey
End

Function Main()
   Locate 0, 10
   val# = Input( "Geben Sie eine Zahl ein: " )
   
   If ( val# <= 2 )
      Print "Zahl gleiner oder gleich zwei"
      Return
   End If
   
   Print ""
   
   numPass = GetStepCnt( val# )

   erg# = DivRecursive( val#, -1, 500, 550, val#, numPass )
   
   Print ""
   Print "Das Ergebniss lautet: " + erg#
   
   Display( 290, 10, 500, 560, 8, val, numPass  )
End Function

Function Display( x, y, width, height, steps, val#, numPass )
   Rect( x, y, width, height, 0 )
   
   For i# = steps To 0 Step -1
      Text x - 50, ( i# * ( ( height - y ) / steps ) ) + y, ( ( steps - i# ) * val# ) / 8
   Next
   
   If ( numPass = 0 )
      Text x, y + height, "0.0"
   Else
      For i# = 0 To numPass
         Text ( i# * ( ( width - StringWidth( i ) ) / numPass ) ) + x, y + height, i
      Next
   End If
End Function

Function DivRecursive#( val#, cnt%, diagWidth, diagHeight, max#, numPass )
   cnt = cnt + 1
   
   If ( cnt > 10 Or ( val# / 2 ) <= 2 )
      Return val#
   End If
   
   val# = val# / 2
   
   Print "Durchgang " + cnt% + ": " + val#
   
   If ( numPass = 0 )
      xPos = 290
   Else
      xPos = ( Float( cnt% ) * ( ( diagWidth - StringWidth( Float( cnt% ) ) ) / numPass ) ) + 290
   End If
   
   yPos = ( ( val# * Float( diagHeight ) ) / max# ) + 5
   yPos = yPos + ( 2 * ( Int( ( ( ( max# / 2 ) * Float( diagHeight ) ) / max# ) + 5 ) - yPos ) )

   Text xPos, yPos, "*"
   
   Return DivRecursive( val#, cnt%, diagWidth, diagHeight, max#, numPass )
End Function

Function GetStepCnt( val# )   
   numPass = 0
   tmp# = val#
   
   Repeat
      tmp# = tmp# / 2   
      numPass = numPass + 1
   Until ( numPass > 10 Or ( tmp# / 2 ) <= 2 )
   
   Return numPass - 1
End Function


grüße
 

junky

BeitragSa, Jan 22, 2005 11:37
Antworten mit Zitat
Benutzer-Profile anzeigen
möcht ja nit stören - aberrrrrrr
wo bleibten die nächste Aufgabe ?
gestern stand ich noch vorm Abgrund
heute bin ich einen Schritt weiter...

wunderkind

BeitragSa, Jan 22, 2005 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich öffne ein Bier und denke darüber nach Wink. Gib mir zwei, drei Minuten Zeit, denn ihr seid sichbar besser geworden, aber echte Anfänger sollen auch noch ein Chance haben und die Aufgaben nicht gefrustet links liegen lassen. Entsprechend ausgewogen muss die Aufgabe sein. Geduld.

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group