switch case, römische zahlen, while schleife



  • @razor Eigentlich müsste bei deinem Programm zwischen Zeile 5 und 6 das Abbruch stehen.



  • ok danke ich werd mir das noch ansehen! dankesehr!
    ich möchte mich da einlernen.

    Geben Sie eine roemische Ziffer ein:
    ö
    Abbruch
    Geben Sie eine roemische Ziffer ein:
    Abbruch
    Geben Sie eine roemische Ziffer ein:
    

    ja so sieht die andere variante aus
    wie bekomme ich das noch so hin dass es so wie bei @swordfish läuft nur in diesem programm mit der while schleife?

    ich weis dass ich hier im default zweig die schleife abbrechen möchte ,aber unter rücksichtnahme der while schleife . wie würde es gehen ohne das ich bei #include <stdio.h>
    #include <stdlib.h> etwas hinzufüge?

    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main () 
    {		
    	char a;
    	 
    	 while(1) {
    	
    
    	printf("Geben Sie eine roemische Ziffer ein:\n");
    	scanf("%c",&a);
    	
    	
    			switch (a) {	
    		case 'I':
    			printf("Der Dezimalwert der Eingabe ist: 1\n");
    			break;
    		case 'V':
    			printf("Der Dezimalwert der Eingabe ist: 5\n");
    			break;
    		case 'X':
    			printf("Der Dezimalwert der Eingabe ist: 10\n");
    			break;
    		case 'L':
    			printf("Der Dezimalwert der Eingabe ist: 50\n");
    			break;
    		case 'C':
    			printf("Der Dezimalwert der Eingabe ist: 100\n");
    			break;
    		case 'D':
    			printf("Der Dezimalwert der Eingabe ist: 500\n");
    			break;
    		case 'M':
    			printf("Der Dezimalwert der Eingabe ist: 1000\n");
    			break;
    		default:
    			printf("Sie haben keine roemische Ziffer eingegeben. Bye.\n", stderr);
    			return 0;  // oder return 0; oder return 42; oder ...
    				
    		}
    		
    	
    				
    	}
    	return 0;  // oder return 0; oder return 42; oder ...
    }
    


  • Ähm. Für den letzten Code den Du gezeigt hast brauchst Du <stdlib.h> garnicht. Im default-Zweig hast Du printf() mit dem Aufruf von fputs() in meinem Beispiel vermischt. printf() printed immer nach stdout, da kannst Du keinen anderen Stream wie stderr angeben.



  • ok also stderr mach ich weg, aber wie vervollständige ich das programm mit der der while schleife, was muss ich im default zweig reinschreiben?

    default:  ??????
    		printf("Sie haben keine roemische Ziffer eingegeben.\n");
    		return 0;  // oder return 0; oder return 42; oder ...


  • @razor reicht das return nicht?



  • @razor wie wäre es mit

    int continue_loop = 1;
    
    while(continue_loop)
    {
         switch(blabla)
         {
              default:
                   continue_loop = 0;
                   break;
         }
    }
    


  • @Wade1234 sagte in switch case, römische zahlen, while schleife:

    wie wäre es mit

    Das meinte ich im „oder“ Vorschlag.

    (aber mit continue_loop = 0; im default)



  • @DirkB sagte in switch case, römische zahlen, while schleife:

    @Wade1234 sagte in switch case, römische zahlen, while schleife:

    wie wäre es mit

    Das meinte ich im „oder“ Vorschlag.

    (aber mit continue_loop = 0; im default)

    war wohl nicht so verständlich.

    ich hatte zuerst "end_loop = 1" und "while(!end_loop)" geschrieben und dann fiel mir ein, dass das irgendwie unsinn ist.



  • @Wade1234 sagte in switch case, römische zahlen, while schleife:

    ich hatte zuerst "end_loop = 1" und "while(!end_loop)" geschrieben und dann fiel mir ein, dass das irgendwie unsinn ist.

    Hatte ich gesehen, den gleichen Gedanken gehabt.
    Ist mir auch schon passiert.
    (Hättest du das wortlos korrigiert, hätte ich die Klammer auch gelöscht - oder durchgestrichen 😉)



  • @Wade1234 sagte in switch case, römische zahlen, while schleife:

    continue_loop = 0;

    ok habs mal eingegeben

    ```cpp
    Geben Sie eine roemische Ziffer ein:
    I
    Der Dezimalwert der Eingabe ist: 1
    
    Geben Sie eine roemische Ziffer ein:
    Sie haben keine roemische Ziffer eingegeben.
    
    --------------------------------
    Process exited after 2.401 seconds with return value 0
    Drücken Sie eine beliebige Taste . . .
    
    
    ```cpp
    int main () 
    {		
    	char a;
    	int continue_loop =1;
    	
    	 while(continue_loop)
    	  {
    	
    
    	printf("Geben Sie eine roemische Ziffer ein:\n");
    	scanf("%c",&a);
    	
    	
    ''''
    			switch (a)
    			 {	
    		case 'I':
    			puts("Der Dezimalwert der Eingabe ist: 1\n");
    			break;
    		case 'V':
    			puts("Der Dezimalwert der Eingabe ist: 5\n");
    			break;
    		case 'X':
    			puts("Der Dezimalwert der Eingabe ist: 10\n");
    			break;
    		case 'L':
    			puts("Der Dezimalwert der Eingabe ist: 50\n");
    			break;
    		case 'C':
    			puts("Der Dezimalwert der Eingabe ist: 100\n");
    			break;
    		case 'D':
    			puts("Der Dezimalwert der Eingabe ist: 500\n");
    			break;
    		case 'M':
    			puts("Der Dezimalwert der Eingabe ist: 1000\n");
    			break;
    			
    			default:  
    				continue_loop = 0;
    				printf("Sie haben keine roemische Ziffer eingegeben.\n");
    				break;  // oder return 0; oder return 42; oder ...
    				
    		}
    		
    	
    				
    	}
    	return 0;  // oder return 0; oder return 42; oder ...
    }
    

    nur leider gelingt es mir nocht das programm zu wiederholen bei einer römischen zahl



  • @razor sagte in switch case, römische zahlen, while schleife:

    nur leider gelingt es mir nocht das programm zu wiederholen bei einer römischen zahl

    Das liegt daran, dass du die Hinweise nicht richtig gelesen/umgesetzt hast.

    Du kannst ja mal mehrere römische Ziffern direkt hintereinander eingeben MMXDI und am Ende einmal die Entertaste drücken.

    Das Zeichen von der Entertaste steht noch im Eingabestrom und wird auch eingelesen, ist jedoch keine römische Ziffer.

    Umgehen kannst du das Problem durch das Leerzeichen bei scanf
    (siehe letzte Zeile von meiner ersten Antwort)



  • @DirkB sagte in switch case, römische zahlen, while schleife:

    @Wade1234 sagte in switch case, römische zahlen, while schleife:

    ich hatte zuerst "end_loop = 1" und "while(!end_loop)" geschrieben und dann fiel mir ein, dass das irgendwie unsinn ist.

    Hatte ich gesehen, den gleichen Gedanken gehabt.
    Ist mir auch schon passiert.
    (Hättest du das wortlos korrigiert, hätte ich die Klammer auch gelöscht - oder durchgestrichen 😉)

    vielleicht ist das gar nicht so verkehrt, wenn es weiterhin drin steht.



  • hallo es funnzt!

    ich habe den hinweis von dir berücksichtigt Dirk, aber durchs herumkobieren und tüfteln usw... is das leerzeichen leider nicht mehr berücksichtigt worden.

    zum verständnis
    die variable continue_loop ist mit 1 deklariert worden
    wird in der while schleife solange wiederholt bis über default die variable auf den wert 0 gesetzt und daurch die schleife nicht mehr wiederholt wird??



  • @Wade1234 sagte in switch case, römische zahlen, while schleife:

    vielleicht ist das gar nicht so verkehrt, wenn es weiterhin drin steht.

    deswegen durchgestrichen.



  • @razor sagte in switch case, römische zahlen, while schleife:

    die variable continue_loop ist mit 1 deklariert worden

    Die Variable wird bei der Definition mit 1 initialisiert.
    (in C ist eine Definition auch eine Deklaration, aber nicht umgekehrt. Bei einer Deklaration kannst du nicht initialisieren)

    Solange die Bedingung der while-Schleife wahr ist - das Ergebnis zwischen den ( ) muss ungleich 0 sein - wird die Schleife durchlaufen. Der Test findet am Anfang der Schleife statt.



  • @razor sagte in switch case, römische zahlen, while schleife:

    zum verständnis
    die variable continue_loop ist mit 1 deklariert worden
    wird in der while schleife solange wiederholt bis über default die variable auf den wert 0 gesetzt und daurch die schleife nicht mehr wiederholt wird??

    im grunde kannst du dir merken, dass werte gleich 0 immer als "unwahr" und werte ungleich 0 immer als "wahr" interpretiert werden, weshalb du nicht while(continue_loop == 1), if(irgendeine_bedingung_ist_wahr == 1) oder so schreiben musst. du solltest nur irgendwelche negierungen wie if(!alles_in_ordnung) vermeiden und lieber if(irgendein_fehler_ist_aufgetreten) verwenden.



  • ok danke!

    wie koennte ich in dem programm noch eine sinnvolle Funktion über der Main aussehen?



  • @razor sagte in switch case, römische zahlen, while schleife:

    wie koennte ich in dem programm noch eine sinnvolle Funktion über der Main aussehen?

    Bitte nochmal in verständlich. 🤔



  • "ihr programm soll eine funktion enthalten, die einzelne römische ziffern in die entsprechende dezimalzahl umwandelt. lesen sie dafür einen einzelnen buchstaben von der tastatur mit scanf() ein(...)"

    so sieht die uebung aus ..
    in der übung ist doch gemeint dass ich neben der int main
    eine funktion verwende
    https://de.wikibooks.org/wiki/C-Programmierung:_Funktionen



  • Dann packe den gesamten switch-Block in eine Funktion und gib ihr als Parameter die römische Ziffer mit.

    Noch besser wäre es, wenn du nach dem EVA-Prinzip auch die Ausgabe getrennt von der Umwandlungsfunktion halten würdest, so daß die obige Funktion nur den Dezimalwert (als int) zurückgibt.
    Und die Ausgabe führst du dann passend formatiert mit printf durch (orientiere dich einfach an dem Beispiel in dem von dir gezeigten Link).


Anmelden zum Antworten