ist break wirklich schlechter programmierstil?



  • also ich hatte das bei ner iterativen rekrusion benutzt

    um nicht in eine entlosschleife zu gelangen aber mir wurde angeraten das mit einer bool variable zu machen.



  • wüsste nicht, warum die bool-variable besser als break sein sollte...
    is wahrscheinlich ansichtssache



  • lookias schrieb:

    was sagt ihr?

    magst du 'continue' auch nicht?



  • net schrieb:

    lookias schrieb:

    was sagt ihr?

    magst du 'continue' auch nicht?

    für continue gibts doch afaik keine wirkliche alternative, oder irre ich mich da??



  • net schrieb:

    lookias schrieb:

    was sagt ihr?

    magst du 'continue' auch nicht?

    wie gesagt ich bin mit break sehr zufrieden schon allein weil man dann eine schleife direkt verlassen kann ohne bis an ihr ende lafuen zu muessen

    das bedeutet ja rechenaufwand 🙂



  • Ich denke es gibt, wie schon erwähnt, keine Pauschalaussage. Ein Programm ist nicht automatisch schlecht, wenn break oder goto benutzt werden, und es ist (leider) auch nicht automatisch gut, wenn sie fehlen.

    Du müsstest schon etwas mehr Code zeigen, damit man Vorschläge für eine bessere/andere Möglichkeit prüfen kann.

    wie gesagt ich bin mit break sehr zufrieden schon allein weil man dann eine schleife direkt verlassen kann ohne bis an ihr ende lafuen zu muessen

    Das geht aber auch mit beispielsweise mehreren Bedingungen im Schleifenkopf.



  • 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*/
    	}
    

    also das eine braek dort ist meinem prof nicht so angenehm



  • Das geht aber auch mit beispielsweise mehreren Bedingungen im Schleifenkopf.

    aber ob die variable false ist wrid doch erst erkannt wenn die schleife am ende ist und ein neues mal anlaufen soll oder?



  • Hi again,

    wenn dein Prof nur das Break anprangert, scheint er sehr tolerant zu sein. Die Kommentare find ich vieeeel zu lang. 😉

    iterativen rekrusion

    Das ist übrigens nen Widerspruch: Entweder rekursiv oder iterativ. Ich sehe zudem keine Anzeichen für eine Rekursion. Rekursion bedeutet, dass sich eine Funktion selbst aufruft, solange bis die Abbruchbedingung erfüllt ist.

    Wenn du Rekursion benutzen würdest, könntest du mit Return jederzeit aus der Funktion springen. Damit wäre dein break verschwunden.



  • naja die while schleife steckt ja in der funktion selbst der rest ist eher unwichtig

    nur wenn ich return benutz kann ich die fermat_zerlegung funktion nicht zweimal aufrufen



  • Hi,

    leider verstehe ich den Sinn des Ganzen nicht. Wenn fermat_zerlegung deine rekursive Funktion ist, kannst du immer noch den Rückgabewert verarbeiten. Der zweite Aufruf der Funktion findet sowieso niemals statt.



  • Dommel schrieb:

    für continue gibts doch afaik keine wirkliche alternative, oder irre ich mich da??

    Doch, man kann sich mit goto eins basteln... 🤡

    lookias schrieb:

    naja ich finde

    while()
    break;
    

    auch besser als

    bool t=true;
    while(t==true)
    t=false
    

    *g*, warum auch vorhandene Konstrukte benutzen, wenn man sie leicht selber nachbauen kann? Erhöht die Transparenz 👍 .

    Am besten vermeidet man irgendwelche Hüpfereien mit durchdachtem Code. Aber wenn es nicht einfacher geht dann spricht doch nichts dagegen die dafür vorgesehenen Sachen auch zu benutzen.

    Davon abgesehen finde ich deine Kommentierung auch irgendwie scheußlich. Bei einzeiligen Kommentaren nimmt man // und wenn du die Variablen sinnvoller benennen würdest, dann könntest du einen Haufen Kommentare einsparen.

    Btw, das hier mag ich irgendwie nicht...

    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*/
    


  • was ist mit for(;;) schleifen da kann man keine bool auf 0 oder 1 setzen,
    da brauch man break;

    ausserdem ist break; ein schlüsselwort in C!!!

    mfg GOD



  • 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?


Anmelden zum Antworten