do while schleife



  • DirkB schrieb:

    Die Zeilennummer in der der Fehler auftritt wäre nett gewesen.

    Du definierst laenge innerhalbe der {} von do-while

    In Zeile 23 benutzt du es aber außerhalb dieser Klammern.

    Gibt es eine Möglichkeit aus dieser lokalen Variable(oder?) eine zu machen die auch ausserhalb der do while Schleife gültig ist?



  • Außerhalb des Scope der do-while-Schleife definieren.
    Also vor dem do{.

    In C89 wäre das Problem nicht aufgetreten, da alle Variablen am Beginn der Funktion definiert werden müssen.
    Da hat man auch einen zentralen Ort zum nachschauen.



  • DirkB schrieb:

    Außerhalb des Scope der do-while-Schleife definieren.
    Also vor dem do{.

    In C89 wäre das Problem nicht aufgetreten, da alle Variablen am Beginn der Funktion definiert werden müssen.
    Da hat man auch einen zentralen Ort zum nachschauen.

    Also gleich zu beginn definieren und den Wert dann erst in der Schleife zuweisen richtig?



  • mestaaz schrieb:

    Also gleich zu beginn definieren und den Wert dann erst in der Schleife zuweisen richtig?

    Ja, oder halt direkt vor dem do {.

    Den Wert weist du in allen Fällen erst in der Schleife zu (Zeile 13).



  • @DirkB: Der "zentrale Ort zum nachschauen" klingt, als wäre das ein Vorteil. Ist es aber nicht.



  • Naivling.
    Es gibt noch eine Welt außerhalb deines Blickfeldes.



  • Wie bitte?



  • So nun habe ich noch hoffentlich die letzte Frage für ein paar Tage 😃 Folgendes:

    do {
    					fflush(stdin);
    					printf("Bitte Key fuer die Verschluesselung eingeben(mindestens 8 Zeichen - maximal 16 Zeichen: \n");    /* speicher den vom User eingegebenen Key in einen String Namens key */
    					scanf("%s",  &key);
    					size_t laenge;			/* speichert in die Variable laenge die Länge(Anzahl Zeichen) des Strings "key" */
    					laenge = strlen(key);
    					if ( laenge < 8 ) {
    						printf("Ihr Key ist zu kurz, bitte geben sie ihn erneut ein \n");
    
    					}else{
    						if (laenge > 16) {
    							printf("Ihr Key ist zu lang, bitte geben Sie ihn erneut ein \n");
    
    						}else{
    							printf("Ihr Key ist in Ordnung \n");
    						}
    					}	
    				}while (laenge > 16 && laenge < 8);
    

    Die Überprüfung im while hat einfach nie geklappt, es wurde zwar ausgegeben dass der Key zu kurz ist(oder zu lang), aber trotzdem ging er nicht wieder zurück zum beginn der schleife.
    Nun habe ich die && durch || ersetzt und oh wunder es klappt. Was mich aber stutzig macht ist dass die Überprüfung der 2. do-while schleife funktioniert hat mit den && Zeichen:

    }while (keyUsage != 'j' && keyUsage != 'n' && keyUsage != 'J' && keyUsage != 'N');
    

    Kann mir einder den Unterschied erklären. Ich peil das grad echt nicht 😕

    Falls notwendig der vollständige Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        char keyUsage ;
        char key[] = "testkey";
    	char laenge ;
    
        do {
            printf("Wollen Sie eine Verschluesselung benutzen(Ja/Nein)? \n");   /* soll das WLAN Netzwerk verschlüsselt sein? */
            scanf("%c", &keyUsage);
    
            switch(keyUsage) {  /* überprüft die Eingabe des Users: j/J = Ja n/N = Nein betreffend Verschlüsselung */
                case 'j': case 'J' :
    				fflush(stdin);  /* leert den Eingabepuffer */
    				printf("OK - Eine Verschluesselung wird verwendet \n");
    				do {
    					fflush(stdin);
    					printf("Bitte Key fuer die Verschluesselung eingeben(mindestens 8 Zeichen - maximal 16 Zeichen: \n");    /* speicher den vom User eingegebenen Key in einen String Namens key */
    					scanf("%s",  &key);
    					size_t laenge;			/* speichert in die Variable laenge die Länge(Anzahl Zeichen) des Strings "key" */
    					laenge = strlen(key);
    					if ( laenge < 8 ) {
    						printf("Ihr Key ist zu kurz, bitte geben sie ihn erneut ein \n");
    
    					}else{
    						if (laenge > 16) {
    							printf("Ihr Key ist zu lang, bitte geben Sie ihn erneut ein \n");
    
    						}else{
    							printf("Ihr Key ist in Ordnung \n");
    						}
    					}	
    				}while (laenge > 16 || laenge < 8);
    				break;
    
                case 'n': case 'N':
    				fflush(stdin);
    				printf("Achtung! - Sie verwenden keine Verschluesselung, dies ist sehr gefaehrlich!!! \n "); /* warnt den User dass die gewählte Option gefährlich ist */
                    break;
    
                default	:
    				fflush(stdin);
    				printf("Error - Haben sie Ja oder Nein eingegeben? \n");    /* sollte der User nicht Ja/Nein eintippen gelangt er hierhin */
                    break;
    		}
    	}while (keyUsage != 'j' && keyUsage != 'n' && keyUsage != 'J' && keyUsage != 'N'); /* führt die obengenannten Aufgaben durch bis eine der Bedingungen erfüllt ist */
    

    In meinen Augen müsste bei der 2. do-while Schleife in die Abfrage ebenfalls ein logisches oder (||)



  • do-while wird solange durchlaufen, solange die Bedingung wahr ist.

    while (laenge > 16 && laenge < 8);
    Finde mal eine Zahl die größer 16 und kleiner 8 ist.

    while (laenge > 16 || laenge < 8);
    Eine Zahl die größer 16 oder kleiner 8 ist.
    Gibt es reichlich.

    while (keyUsage != 'j' && keyUsage != 'n' && keyUsage != 'J' && keyUsage != 'N');
    Es gibt einige Zeichen die ungleich 'j' und ungleich 'J' und ... 'N' sind,
    z.B. 'A'



  • DirkB schrieb:

    do-while wird solange durchlaufen, solange die Bedingung wahr ist.

    while (laenge > 16 && laenge < 8);
    Finde mal eine Zahl die größer 16 und kleiner 8 ist.

    while (laenge > 16 || laenge < 8);
    Eine Zahl die größer 16 oder kleiner 8 ist.
    Gibt es reichlich.

    while (keyUsage != 'j' && keyUsage != 'n' && keyUsage != 'J' && keyUsage != 'N');
    Es gibt einige Zeichen die ungleich 'j' und ungleich 'J' und ... 'N' sind,
    z.B. 'A'

    Ist mir ja alles klar aber bei der 2. Abfrage genügt für mich ja auch bereits eine erfüllte Abbruchbedingung, da so oder so nur eine zeigleich erfüllt sein kann. Folglich müsste dass doch auch mit einem oder funktionieren?



  • mestaaz schrieb:

    In meinen Augen müsste bei der 2. do-while Schleife in die Abfrage ebenfalls ein logisches oder (||)

    Dann musst du auch die != in == ändern und die ganze Bedingung negieren mit !



  • DirkB schrieb:

    mestaaz schrieb:

    In meinen Augen müsste bei der 2. do-while Schleife in die Abfrage ebenfalls ein logisches oder (||)

    Dann musst du auch die != in == ändern und die ganze Bedingung negieren mit !

    Was meinst du mit negieren?



  • mestaaz schrieb:

    Was meinst du mit negieren?

    Aus wahr falsch machen und umgekehrt. Dafür gibt es den Nicht-Operator ! (das Ausrufezeichen)

    }while !(keyUsage == 'j' || keyUsage == 'n' || keyUsage == 'J' || keyUsage == 'N');
    solange (keyUsage gleich 'j' oder keyUsage gleich 'n') nicht wahr ist.


Anmelden zum Antworten