Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
1 - Einsteigerfragen

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Vorherige Nachricht  |  Nächste Nachricht 
 Re: Bewährte Proc nicht mehrfach aufrufbar
Autor: Arndt Lindner (---.dip0.t-ipconnect.de)
Datum:   22.08.18 00:02

Einige kleine Anmerkung zum Code

1. Ein Aussprung aus einer Endlosschleife mit einer Gleichheitsbedingung ist nicht empfehlenswert. Auch nicht in "bewährten" Prozeduren. Workarounds verschlimmbessern häufig die Probleme.
2. Auch eine Breakanweisung sollte Ausnahmefällen vorbehalten bleiben.
3. Parameterrückgaben über Seiteneffekte (das Array F[], bzw. FF[] in der Procedure) ist immer kritisch zu sehen.

Der eigentliche Hinweis:

4. Das Hochzählen des Divisors in der Prozedur kann man abbrechen, wenn er größer als die Quadratwurzel aus der zu zerlegenden Zahl ist. Ein Primteiler einer Zahl kann nicht gößer als die Wurzel aus der Zahl selbst sein. Bei vielen kleinen Primteilern hat das auf die Rechenzeit keinen Einfluss, aber falls einer der Primteiler relativ groß ist schon. Da außer der 2 alle Primzahlen ungerade sind, lohnt es sich ab der 3 den Divisor immer um 2 zu erhöhen. Der Beispielcode zeigt die Unterschiede in der Rechenzeit.

Der folgende Code funktioniert bei mir mit XProfan X3. Profan 11.2a kannte quadint und die Variablendeklaration mit Typangabe noch nicht. Ich bin mir nicht sicher, ob die Rückgabe von Arrays aus Prozeduren schon möglich war. Eventuell ein guter Grund für ein Update.

  CLS
  Declare quadint F[],Zahl,j,at
  for zahl,1,11
    F[] = getPrimeFactors(Zahl)
    print Zahl,sizeof(f[])
  endfor
  Print "-- OK ---"
  Zahl = 2^29+1
  at = &gettickcount
  F[] = getPrimeFactors(Zahl)
  print Zahl,sizeof(F[]),(&gettickcount-at)/1000,"s"
  for j,0,sizeof(F[])-1
    print F[j];" ";
  endfor
  print
  print
  at = &gettickcount
  F[] = getPrimeFactors1(Zahl)
  print Zahl,sizeof(F[]),(&gettickcount-at)/1000,"s"
  for j,0,sizeof(F[])-1
    print F[j];" ";
  endfor
  print
  Waitinput
  
  Proc getPrimeFactors :parameters quadint K
  declare quadint FF[]
  var quadint divisor  = 2
  clear FF[]
   While (k > 1)
       If (K mod divisor) = 0
        FF[sizeof(FF[])] = divisor
        K = K \ divisor
      Else
        inc divisor
      EndIf
  EndWhile
  return FF[]
  EndProc
  
  Proc getPrimeFactors1 :parameters quadint K
  declare quadint FF[]
  var quadint divisor  = 3
  var quadint abbruch  = sqrt(k)
  clear FF[]
   if (k mod 2) = 0
     FF[sizeof(FF[])] = divisor
 	k = K \ 2
   endif	
   While (k > 1) and (divisor < abbruch)
       If (K mod divisor) = 0
        FF[sizeof(FF[])] = divisor
        K = K \ divisor
      Else
        inc divisor,2
      EndIf
  EndWhile
  case k > 1 : FF[sizeof(FF[])] = k
  return FF[]
  endproc
 End
  




 Beitrag beantworten  |  Foren-Liste  |  Alle Antworten   Neuerer Beitrag  |  Älteres Thema 

 Beiträge Autor  Datum
 Bewährte Proc nicht mehrfach aufrufbar  Neu
p. specht 19.08.18 21:54 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
Jörg Sellmeyer 19.08.18 22:30 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
p. specht 19.08.18 23:16 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
Jörg Sellmeyer 20.08.18 00:42 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
p. specht 20.08.18 01:10 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
RGH 20.08.18 09:37 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
Michael Wodrich 20.08.18 09:31 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
p. specht 20.08.18 16:40 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
p. specht 20.08.18 17:09 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
Arndt Lindner 22.08.18 00:02 
 Re: Bewährte Proc nicht mehrfach aufrufbar  Neu
p. specht 22.08.18 21:55 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org