warum endlos schleife ?



  • hallo liebe, Forumsgemeinde ich habe folgende Frage , ich habe ein Programm geschrieben das durch eine If anweisung abgefangen werden soll wenn man negative Zahlen eingibt. Doch das passiert nicht ich lande immer in einer Endlosscheife , kann mir bitte jemand sagen wo der Fehler in der if Anweisung sein könnte. Danke.

    int main()
    {
    double y_alt = 0.0,y_neu = 0.0,zahl = 0.0;
    int grenze = 0;
    double wurzel=0.0,vergleichswert = 0.0;
    char antwort;
    double differenz;
    int i=0;

    do {

    printf("Bitte geben Sie eine Zahl ein, aus der die Wurzel gezogen werden soll: ");
    scanf("%lf", &zahl);
    fflush(stdin);
    printf("\nBitte geben Sie den Genauigkeitswert ein: ");
    scanf("%d", &grenze);
    fflush(stdin);

    y_alt=zahl/2.0;
    printf("\nNaeherungsverfahren zur Berechnung der Wurzel...\n\n");

    if (zahl==0){
    if (zahl<=0){

    printf("\n\n Fehler da 0 oder kleiner als 0\n\n");

    }
    }



  • int main()
    {
    double y_alt = 0.0,y_neu = 0.0,zahl = 0.0;
    int grenze = 0;
    double wurzel=0.0,vergleichswert = 0.0;
    char antwort;
    double differenz;
    int i=0;

    do {

    printf("Bitte geben Sie eine Zahl ein, aus der die Wurzel gezogen werden soll: ");
    scanf("%lf", &zahl);
    fflush(stdin);
    printf("\nBitte geben Sie den Genauigkeitswert ein: ");
    scanf("%d", &grenze);
    fflush(stdin);

    y_alt=zahl/2.0;
    printf("\nNaeherungsverfahren zur Berechnung der Wurzel...\n\n");

    if (zahl==0){
    if (zahl<=0){

    printf("\n\n Fehler da 0 oder kleiner als 0\n\n");

    }
    }
    do {

    y_neu=0.5*((zahl/y_alt)+y_alt);
    differenz=fabs(y_neu-y_alt);
    vergleichswert= pow(10, grenze*(-1));
    i++;
    printf("%d .Durchgang: ", i);
    printf("\nDer neue Wert von y ist: %.*lf\n", grenze, y_neu);
    printf("Die Differenz zwischen y_neu und y_alt ist: %.*lf\n\n", grenze, differenz);
    y_alt=y_neu;
    }
    while(vergleichswert<differenz);
    printf("Das Ergebnis des Naeherungsverfahrens lautet: %.*lf\n\n", grenze, y_neu);

    wurzel = sqrt(zahl);
    printf("Die Wurzel berechnet mit SQRT aus '%2lf' ist: %.*lf\n\n", zahl, grenze, wurzel);
    printf("Wollen Sie eine weitere Wurzel ziehen? J/N: ");
    scanf("%c", &antwort);
    fflush(stdin);
    }

    while(antwort =='j' || antwort =='J');

    return 0;



  • if (zahl==0){ 
    if (zahl<=0){
    ...
    

    Das wird nie ausgeführt, denn wenn zahl==0 gilt kann zahl<=0 nicht stimmen.

    Deine while-schleifen funktionieren auch nicht.

    while(vergleichswert<differenz);
    

    Das tut entweder garnichts oder landet in einer Endlosschleife.

    Und benutze bitte die [cpp][/cpp]-tags.



  • while(vergleichswert<differenz);
    printf("Das Ergebnis des Naeherungsverfahrens lautet: %.*lf\n\n", grenze, y_neu);
    
    while(vergleichswert<differenz)
    {
    printf("Das Ergebnis des Naeherungsverfahrens lautet: %.*lf\n\n", grenze, y_neu);
    
    }
    

    so abändern
    + etwas das die schleife auch wieder beendet...sonst schreibt er dir einfach unendlich oft das ergebnis.....



  • Das wird nie ausgeführt, denn wenn zahl==0 gilt kann zahl<=0 nicht stimmen.

    Doch natürlich... wenn zahl==0 ist, ist zahl immer kleiner oder GLEICH 0 😉



  • hab es jetzt so gemacht

    aber sobald ich jetzt eine negative Zahl eingebe kommt die Ausagabe bestätige ich dann springt er mir wieder in die endlosschleife und versucht was gar nicht geht, kann ich das umgehen sprich wenn ich eine negative Zahl eingebe das mir das programm dann wieder in die Anfangszeile springt ?

    if (zahl==0 || zahl<=0) {
    		 printf("\n\nFehler da 0 oder kleiner als 0\n\n\n");
    		 getch();
    	 }
    
    		 do {
    


  • habs rausbekommen. 😃



  • Ändere es doch bitte in

    if (zahl<0){
    	printf("\nFehler: Eingegebene Zahl ist kleiner als 0\n");
    	getch();
    }
    do{ ...
    

    Dieses zahl==0||zahl<=0 irritiert mich, und aus 0 lässt sich super die Wurzel ziehen.

    An den Anfang springen solltest du lassen. Stattdessen schreibe besseren Code.
    Jetzt habe ich glaube ich auch dieses do while verstanden, nehme alles zurück und behaupte das Gegenteil.

    Versuche es mit Strukturieren.

    Schreibe eine Funktion Wurzel die du dann verwendest.

    Sowas wie

    char wurzelberechnung = 'j'; //gibt an ob die wurzel berechnet werden soll
    double Wurzel(int Zahl, double Genauigkeit){ //berechnet die Wurzel von Zahl bin zur angegebenen Genauigkeit mithilfe eines Näherungsverfahrens
    	...
    }
    while (wurzelberechnung=='j'){
    	//lese eingaben
    	...
    	//berechnung:
    	printf("Ergebnis: %lf\n", Wurzel(zahl, Genauigkeit));
    	printf("noch eine Wurzel berechnen?\n");
    	scanf("%c", &wurzelberechnung);
    }
    

    timeisup schrieb:

    habs rausbekommen. 😃

    Ich hoffe du hast nichts gefunden was mit go anfängt ....



  • ich machs mal so wie du danke, jepp habs mit goto umgangen da ich nicht wusste wie sonst ^^ , naja bin ja noch ein Anfänger gerade mal 6 wochen machen wir das mehr nicht. Steck also noch in den Kinderschuhen 😃



  • Finger weg von GoTo[isbn]:P



  • Seryoga19 schrieb:

    Finger weg von GoTo[isbn]:P

    Blödsinn! Es gibt sehr wohl Fälle in denen ein goto jede Menge Bloatcode spart und übersicht schafft.
    Richtigerweise jedoch nicht in diesem Fall.


Anmelden zum Antworten