ist break wirklich schlechter programmierstil?



  • das programm sollte doch aber nachdem es siche einmal aufgerufen hat, alles ausgefuehrt wurde, weiterlaufen zum nexten aufruf oder?

    also bis jetzt sind die ergebisse so dass das auf jedenfall auch so ablaeuft

    ja die ganze formsache muss ich nochmal bearbeiten darauf wurde ich auch verwiesen 😉

    opkay ich poste mal die ganze funktion:

    void fermat_zerlegung(long int zahl,liste *ende) /*rekursive funktion zur berechnung der primteiler mit der zerlegungsmethode von fermat uebernimmt eine zahl und die adresse eine listenelemnts an welches neue zahlen angehengt werden koennen*/ 
    {
    	long int hilfzahl,pot,root; /*pot zur erkennung ob eine zahl eine ganze quadratwurzel hat und root zur umwandlung eines double in einen integer */
    	bool b=true; /*enthaelt information daruber ob es sich um eine primzahl handelt wenn false dann wird der wert nicht in der liste gespeichert */
    	hilfzahl=sqrt(zahl); /*wird bentuzt um von floor(sqrt(n)) bis (n+9)/6 zu laufen */
    	while(hilfzahl<=(zahl+9)/6 && zahl !=3) /*die zahl 3 wird hier ausgeschlossen da floor(sqrt(3)) eins ist*/
    	{
    		if(hilfzahl*hilfzahl >= zahl) /*um auch die zahlen zu erfassen die eine primzahlpotenz sind wurde hier floor von sqrt(zahl) benutzt hier werden die faelle ausgeschlossen bei denen hilfzahl^2 <zahl ist*/
    		{	
    			root=sqrt(hilfzahl*hilfzahl-zahl); /*um wandlung eines doubbles in einen integer um spaeter zu testen ob die zahl eine ganze quadratwurzelk besitzt*/
    			pot=pow(root,2); /*speicherung des zu testenden ereignisses in einem long integer*/
    
    			if(pot==hilfzahl*hilfzahl-zahl) /*wird ausgefuehrt wenn die zahl keine primzahl ist die teiler sind als hilfzahl-hilfzahl*hilfzahl-zahl und hilfzahl+hilfzahl*hilfuzahl-zahl nach der methode von fermat erkannt*/
    			{
    				b=false; /*wird hierdurch nicht in der liste gespeichert da es sich bei zahlk nich um eine primzahl handelt*/
    					fermat_zerlegung(hilfzahl-root,ende); /*rekursives vorgehen mit den neuen teiler*/
    					fermat_zerlegung(hilfzahl+root,ende); /*die abbruchbedingung ist hier klar mathematisch definiert durch den fakt dass sich jede zahl in endlich viele primfaktoren zerlegen laesst*/
    				break; /*wenn 2 teiler gefunden wurden wird die while schleife verlassen */
    			}
    		}
    		hilfzahl++; /*hilfzahl wandert bis (n+9)/6 wird bis dahin kein teiler gefunden so ist die zahl als primzahl erkannt*/
    	}
    	if(b==true) /*hier werden nur primzahlen gespeichert was b angibt*/
    	{
    		while(ende->ende==true) /*hier wandert das uebergebene listenelement bisa ans ende*/
    		{
    			ende=ende->next;
    		}	
    		liste *lauf;
    		lauf=new liste; /*fuer neues listenelement das ans ende gehaengt wird*/
    		ende->primteiler=zahl; /*primzahl wird gespeichert*/
    		ende->ende=true; /*das lsitenende wird verschoben*/
    		ende->next=lauf;
    		ende=ende->next;
    		ende->ende=false; /*neues ende wird gesetzt*/
    	}
    
    }
    


  • Ich denke der Prof hat das break bemängelt weil er eine Rekursion haben wollte.



  • junix schrieb:

    Ich denke der Prof hat das break bemängelt weil er eine Rekursion haben wollte.

    dann kann ich aber nicht mehr beide teiler in die funktions chicken jedenfalls wuesste ich net wie



  • Hi,

    da brauch ich gar nicht lange drübergucken:

    b=false; 
    fermat_zerlegung(hilfzahl-root,ende); /*rekursives vorgehen mit den neuen teiler*/
    // Ab hier ist Schluss....
    fermat_zerlegung(hilfzahl+root,ende); // Das wird niemals aufgerufen...
    

    Allein das sollte dir zu denken geben. Der Code sollte nochmal gründlich überarbeitet werden.



  • CarstenJ schrieb:

    Hi,

    da brauch ich gar nicht lange drübergucken:

    b=false; 
    fermat_zerlegung(hilfzahl-root,ende); /*rekursives vorgehen mit den neuen teiler*/
    // Ab hier ist Schluss....
    fermat_zerlegung(hilfzahl+root,ende); // Das wird niemals aufgerufen...
    

    Allein das sollte dir zu denken geben. Der Code sollte nochmal gründlich überarbeitet werden.

    dann duerfte bei der eingabe von 15 nicht 3 und 5 rauskommen

    da der eine aufruf 4+1 und der andre 4-1 bearbeitet



  • @carstenJ: ich ha zwar nicht wirklich viel ahnung aber was du meinst kann nicht stimmen



  • CarstenJ: Woran machst du fest, dass der 2. rekursive Aufruf niemals erfolgen wird?



  • Hallo,

    weil die Funktion ja quasi nach dem ersten Aufruf verlassen und dann mit den neuen Werten aufgerufen wird. Also wird doch alles, was nach dem ersten Aufruf der Funktion steht, ignoriert?! Oder hab ich was übersehen?



  • alsoso weit ich das versteh wird die funktion verlassen und nachdem alles ausgefuehrt wurde wird an der stelle weitergemacht

    so ist das doch allg bei funktionen

    aber meine frage ist ja ob dasd break wirklich schlecht ist da?

    ich finde den umweg ueber einen bool nicht wirklich besser



  • CarstenJ schrieb:

    weil die Funktion ja quasi nach dem ersten Aufruf verlassen und dann mit den neuen Werten aufgerufen wird. Also wird doch alles, was nach dem ersten Aufruf der Funktion steht, ignoriert?! Oder hab ich was übersehen?

    Wenn da jetzt return fermat_zerlegung(... stünde, hättest du recht. Aber so ist das ein normaler Funktionsaufruf, der auch irgendwann mal zurückkommt, falls keine Endlosrekursion vorliegt. Und dann geht es dahinter weiter.



  • CarstenJ schrieb:

    Oder hab ich was übersehen?

    Also nach deinem Verständnis hast du nichts übersehen, aber du hast das mit den Rekursionen nicht ganz verstanden 😉 . Die Funktion geht nach einem Selbstaufruf selbstverständlich weiter falls der Selbstaufruf irgendwann terminiert (wovon ich ausgehe, denn sonst wäre es sicher ein Programmfehler).



  • ich finde break deswegen auch am sinnvollsten



  • du könntest auch gleich return schreiben, da b ja sowieso auf false gesetzt wird und der if-Teil dann sowieso nicht betreten wird...



  • Walli schrieb:

    CarstenJ schrieb:

    Oder hab ich was übersehen?

    Also nach deinem Verständnis hast du nichts übersehen, aber du hast das mit den Rekursionen nicht ganz verstanden 😉 . Die Funktion geht nach einem Selbstaufruf selbstverständlich weiter falls der Selbstaufruf irgendwann terminiert (wovon ich ausgehe, denn sonst wäre es sicher ein Programmfehler).

    Jo, mein Fehler. Sorry.



  • Unser Prof hat damals gesagt das break nich ganz so in Dijkstra (schlagt mich wenn ichs falsch schreib) Schema für strukturierte Programmierung war passt (ich hoffe ihr wisst jetz was ich mein^^).
    Wieso es schlechter Stil sein soll weiss ich allerdings auch nicht.. man sieht ja, die schleife wird halt genau _hier_ verlassen, er springt ja nicht irgendwie wild "in der Gegend" herum 😕
    ansonsten führen wie immer viele Wege zum Ziel ...



  • Dommel schrieb:

    du könntest auch gleich return schreiben, da b ja sowieso auf false gesetzt wird und der if-Teil dann sowieso nicht betreten wird...

    ja stimmt schon

    aber dann muesste man in return 2 funktionsaufruse uebergeben(was ja nicht geht)

    oder die funktion muesste dann 2 werte aufnehemn koennen ,dann kann ich mir rekrusion auch sparen

    die fand mein prof allerdings ganz toll auch wenn das vom speicher eher unpraktisch ist



  • lookias schrieb:

    aber dann muesste man in return 2 funktionsaufruse uebergeben(was ja nicht geht)

    Wieso? Du rufst die Funktionen auf und machst dann erst dein return.



  • oh da hab ich bis jetzt nicht dran gedacht

    das waere dann die uebrloesung danke 😉



  • übrings ist sowas

    if(b==true)
    

    doppeltgemoppelt. Ein

    if(b)
    

    reicht.



  • Ist nicht doppelt gemoppelt, eher Geschmackssache. Ich lasse das "== true" aber auch ganz gerne weg.


Anmelden zum Antworten