ist break wirklich schlechter programmierstil?
-
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?
-
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).