Wie kann ich einen Teilablauf wiederholen, und nicht das gesamte Programm wiederholen?



  • Hallo,

    In diesem Programm werden geometrische Körper berechnet.

    ich möchte negative Werte abfangen. Als beispiel bei der Kreisberechnung habe ich als bedignung festgelegt if(radius<=0) dann soll eine Aufforderung kommen eine positive zahl einzugeben und anschließend möchte ich dass
    Case 1 (siehe zeile 30) wieder ausgeführt wird. Im moment wird dann jedoch mein Programm von Beginn an ausgeführt.

    Wie kann ich das machen?

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    float radius, Kreisumfang, Kreisflaeche;
    int hoehe, breite, laenge;
    int Rechteckumfang, Rechteckflaeche, Quadratumfang, Quadratflaeche;
    int auswahl;
    int i;
    int j;
    
    int main(void) {
    
    	char wiederholen = 'j';
    	do{
    
    		printf("Was möchten Sie berechnen?\n");
    		printf("Drücken Sie nachfolgend eine Taste zur Auswahl:\n\n");
    		printf("0 für Abbruch\n1 für Kreis\n2 für Rechteck\n3 für Quadrat\n");
    		scanf("%i", &auswahl);
    
    		switch(auswahl)
    		{
    
    		case 0:{
    			printf("Abbruch durch Benutzer\n");
    		} 	break;
    
    		case 1:{
    
    			printf("Geben Sie den Radius in meter ein:\n");
    			scanf("%f",&radius);
    			if(radius<=0){
    				printf("Fehler!\nWert größer Null eingeben!\n\n");
    				continue;
    				}
    			Kreisumfang=(2*(M_PI)*radius);
    			Kreisflaeche=((M_PI)*(radius*radius));
    			printf("Kreisumfang in m: %.2f\n", Kreisumfang);
    			printf("Kreisflaeche in m²: %.2f\n", Kreisflaeche);
    
    		}; break;
    
    		case 2:{
    
    			printf("Geben Sie die Höhe in meter ein:\n");
    			scanf("%i", &hoehe);
    			//if(hoehe<0) printf("positive Zahl eingeben\n"); break;
    			printf("Geben Sie die Breite in meter ein:\n");
    			scanf("%i", &breite);
    			Rechteckumfang=(2*(hoehe+breite));
    			Rechteckflaeche=(hoehe*breite);
    			printf("Rechteckumfang in m: %i\n", Rechteckumfang);
    			printf("Rechteckfläche in m²: %i\n", Rechteckflaeche);
    
    			for(i = 0; i < hoehe; i++){
    				for(j = 0; j < breite; j++){
    					if(laenge>50 || breite>50) break;
    					printf("*");
    				}
    				printf("\n");
    			}
    		}; break;
    
    		case 3:
    		{
    			printf("Geben Sie die Seitenlänge in meter ein:\n");
    			scanf("%i",&laenge);
    			Quadratumfang=(4*laenge);
    			Quadratflaeche=(laenge*laenge);
    			printf("Quadratumfang in m:%i\n", Quadratumfang);
    			printf("Quadratfläche in m²: %i\n", Quadratflaeche);
    
    			for(i = 0; i < laenge; i++){
    				for(j = 0; j < laenge; j++){
    
    					if(laenge>50) break;
    
    					printf("*");
    				}
    				printf("\n");
    			}
    		}; break;
    
    		default: printf("Fehler!\nEingabe einer Zahl von 0 bis 3!");
    		}
    		printf("Wollen Sie die Berechnung wiederholen?: [j/n]\n");
    		scanf ("%s", &wiederholen);
    	}
    	while (wiederholen== 'j');
    	return 0;
    }
    


  • Ich habe das continue durch ein break ersetzt-.

    dann fragt er mich direkt nach der wiederholung....man ich bin so ein noob



  • Ein else -Zweig mit der Berechnung drin, hätte es auch getan und wäre übersichtlicher.

    Das scanf ("%s", &wiederholen); ist falsch.
    Bei %s erwartet scanf einen Zeiger auf einen ausreichend großen Puffer, wo die eingelesenen Zeichen und der Nullterminator rein passen.
    Das ist bei einem einzelnen char nicht gegeben.

    Daher ein einzelnes Zeichen einlesen, aber vorher die Whitespace überlesen.

    scanf (" %c", &wiederholen); // Achte auf das Leerzeichen vor dem %
    

    Der Test auf if(laenge>50 || breite>50) wäre besser vor der for -Schleife aufgehoben.



  • ok. das mit der anderen bedinung soll in der for schleife sein, da diese begrenzung nicht für die berechnung gilt sondern nur für die ausgabe in form von sternchen.

    und danke für den anderen Tipp!



  • Frost1989 schrieb:

    ok. das mit der anderen bedinung soll in der for schleife sein, da diese begrenzung nicht für die berechnung gilt sondern nur für die ausgabe in form von sternchen.

    Hast du dein Version denn mal ausprobiert? Mit zu großen Werten?

    Und beachte mal die Compiler-Warnungen, bzw. schalte sie mal auf einen höheren (schärferen) Level.


Anmelden zum Antworten