Seite 1 von 1

Euklidischer Algorithmus

Verfasst: 16.10.2007 15:48
von Dark Skillu
Hallo ich habe versucht den euklidischen Algorithmus (Berechnung des ggT) in PB zu übersetzen, aber die Berechnung funktioniert nicht ganz, kann mir jemand helfen bitte ?

Hier der Algorithmus den ich übersetzen will als Bild :

Bild

Code: Alles auswählen

; Coded By Sebastian Bienefeld (c)

Enumeration
  #Window
EndEnumeration

Enumeration
  #Text_0
  #Text_1
  #Text_2
  #String_0
  #String_1
  #Button_0
  #String_3
  #Text_3
  #Text_5
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Comic Sans MS", 12, #PB_Font_Bold)
Global FontID2
FontID2 = LoadFont(2, "Arial Black", 12)
Global FontID3
FontID3 = LoadFont(3, "Arial Black", 10)
Global FontID4
FontID4 = LoadFont(4, "Estrangelo Edessa", 10)
Global FontID5
FontID5 = LoadFont(5, "WST_Span", 10, #PB_Font_Bold)
Global FontID6
FontID6 = LoadFont(6, "Times New Roman", 10)
Global FontID7
FontID7 = LoadFont(7, "Times New Roman", 14)
Global FontID8
FontID8 = LoadFont(8, "Times New Roman", 12)


Procedure Berechne()

Zahl1$=GetGadgetText(4)    
Zahl2$=GetGadgetText(5)
     
     Zahl1.l = Val(Zahl1$) 
     Zahl2.l = Val(Zahl2$) 
     
     
  If Zahl1>Zahl2
     
     Zahl1=zahl
     Zahl2=test
     
     Else
     
     Zahl2=zahl
     Zahl1=test
     
  EndIf
  
  If zahl % test = 0
  
  Ergebnis_1=2
  Ergebnis1=test
  
  Ergebnis_1$=Str(Ergebnis1)
  
  Else
  
  Repeat
  ergebnis_2=2
  
  rest = zahl % test
  zahl = test
  test = rest
  
  Ergebnis2=rest
  Ergebnis_2$=Str(Ergebnis2)
  
  Until rest=0
  
  
  If Ergebnis_1=2
  SetGadgetText(7, Ergebnis_1$)
  Else 
  SetGadgetText(7, Ergebnis_2$)
  EndIf
  
  EndIf
  
  Debug Ergebnis_2$
    
EndProcedure





If OpenWindow(#Window, 241, 42, 510, 150, "Der euklidische Algorithmus",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) And CreateGadgetList(WindowID(#Window))
      TextGadget(1, 20, 20, 500, 40, "Der euklidische Algorithmus berechnet den ggT von zwei Zahlen:")
      SetGadgetFont(1, FontID7)
      TextGadget(2, 10, 70, 60, 30, "Zahl 1:")
      SetGadgetFont(2, FontID8)
      TextGadget(3, 10, 100, 60, 30, "Zahl 2:")
      SetGadgetFont(3, FontID8)
      StringGadget(4, 90, 70, 140, 20, "", #PB_String_Numeric)       ;Zahl 1
      StringGadget(5, 90, 100, 140, 20, "", #PB_String_Numeric)      ;Zahl 2
      ButtonGadget(6, 250, 60, 80, 60, "Berechne")                   ; Berechne
      StringGadget(7, 360, 100, 120, 20, "", #PB_String_ReadOnly)    ; Ergebnis
      TextGadget(8, 360, 70, 120, 20, "Ergebnis:", #PB_Text_Center)
      SetGadgetFont(8, FontID8)
      TextGadget(9, 10, 130, 200, 20, "Made by Sebastian Bienefeld (c)")
      
EndIf


Repeat

Event= WaitWindowEvent()

  Select Event 
    Case #PB_Event_CloseWindow
    
       quit=1
       
    Case #PB_Event_Gadget
      Select EventGadget()
  
     Case 6
     
    
    

EndSelect
EndSelect


Until quit=1
Schonmal vielen Dank im Voraus für eure Hilfe und Mühen ...

gruß DarkSkillu

Verfasst: 16.10.2007 16:19
von AND51

Code: Alles auswählen

  If Zahl1>Zahl2 
      
     Zahl1=zahl 
     Zahl2=test 
      
     Else 
      
     Zahl2=zahl 
     Zahl1=test 
      
  EndIf 
Das ist schon mal falsch bei dir! Du sollst nicht test in zahl2 speichern, sondern umgekehrt!


Hier eine richtige Version, etwas optimiert:

Code: Alles auswählen

Procedure ggT(zahl1, zahl2)
	If zahl2 > zahl1
		Swap zahl1, zahl2
	EndIf
	Protected rest=1, ergebnis=zahl2
	If zahl1 % zahl2
		While rest
			ergebnis=rest
			rest=zahl1%zahl2
			zahl1=zahl2
			zahl2=rest
		Wend
	EndIf
	ProcedureReturn ergebnis
EndProcedure

Debug ggT(18, 27) ; 9
15 Zeilen

Verfasst: 17.10.2007 13:57
von Dark Skillu
Ok Danke, ich versuche mal deinen Code zu verstehen und auch einzubauen ...

Verfasst: 17.10.2007 14:11
von Dark Skillu
So habe die Prozedur eingebaut und funktioniert soweit , ich ahbe aber nopch einige Fragen , was bewirken

Code: Alles auswählen

swap[code],
[code]ProcedureReturn 
und

Code: Alles auswählen

Protected 
?

Verfasst: 17.10.2007 14:13
von Fluid Byte
Steht alles in der Hilfe. Ist nicht wirklich kompliziert.

Verfasst: 17.10.2007 17:28
von AND51
genau, das steht in der Hilfe. Guck mal nach. Swap vertauscht einfach den Inhalt von zwei Variablen.

Du musst doch da eine If-Abfrage machen, ne? If zahl1 > zahl2 bewirkt, dass die größere Zahl in "Zahl" gespeichert werden soll.
Ich mache es einfach: Ich tausche die beiden Variablen nur, wenn nötig. Das sind diese kleinen Optimierungen, von denen ich sprach, die man einbauen kann und die nicht in dem Bild stehen.

Falls du noch Fragen hast, beantworte ich sie gern.

Verfasst: 17.10.2007 17:46
von gekkonier
Dark Skillu hat geschrieben:So habe die Prozedur eingebaut und funktioniert soweit , ich ahbe aber nopch einige Fragen , was bewirken

Code: Alles auswählen

swap[code],
[code]ProcedureReturn 
und

Code: Alles auswählen

Protected 
?
Draufklicken, F1 drücken ;)

Verfasst: 18.10.2007 14:40
von Dark Skillu
Ey die Hilfe kenne ich schon, aber ich habe swap nicht gefunden ...

Naja egal Danke !!