Prüfen: Natürliche Zahl, größer null, kleiner null, reell, =0



  • Schönen guten Abend,

    ich hab C in der zweiten Informatik Vorlesung an der Hochschule und im Praktikum bestand die Aufgabe darin, eine Primzahlenberechnung durchzuführen.

    Die erste Teilaufgabe besteht darin, die fehlerfreie Benutzereingabe abzufragen.

    Gibt der Benutzer statt einer natürlichen Zahl eine negative Zahl, ein ungültiges Zeichen oder eine reelle Zahl ein, soll eine Fehlermeldung erfolgen und die Möglichkeit bestehen, die Eingabe in einem neuem Konsolenfenster zu wiederholen. Dieser Vorgang wiederholt sich, solange der Benutzer keinen zu verarbeitenden Wert eingegeben hat. Allein die Eingabe der Zahl 0 beendet das Programm.

    Okay, hier mein Ansatz, der für
    kleiner 0, also negativ
    gleich 0
    ungültiges Zeichen

    (Abfrage des Rückgabewertes auf 1, also ein, zum Formatstring passendes, Zeichen erfolgreich eingelesen.)

    funktioniert. Das mit der reellen Zahl krieg ich nicht hin.

    Meine Idee war es jetzt, in Zeile 21 (und 28) noch eine ODER Bedingung einzubringen, in der die eingabe mit Modulo geteilt wird.

    also quasi so

    check = scanf("%d", &eingabe); 
    fflush(stdin);
    
    if(eingabe < 0 || check != 1 || eingabe&1 != 0)  
    		{								
    			system("cls");
    			printf("Fehler bei der Eingabe. Bitte neu eingeben.\n\n");
    			system("pause");
    		}
    

    Das funktioniert aber nicht, wenn ich "5.3" oder "5,3" eingebe, lande ich trotzdem in der Primzahlenbrechnung.

    Wenn ich

    eingabe%1 == 0
    

    schreibe, lande ich immer in der Fehlermeldung.
    Wahrscheinlich gibt es einen Befehl der das direkt abfragt, aber da wir den laut Vorlesung nicht kennen, dürfen wir den auch nicht benutzen. Heißt ich muss das mit Modulo machen, zumindest ist das der einzige Ansatz den ich bis jetzt habe.

    Wo ist mein Fehler? Wie mach ich das richtig?

    Gruß und danke fürs Reindenken
    Auctor 🙂

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    
    {
    	int eingabe, check;
    	char antwort;
    
    do // Schleife, die die Abfrage über die Programmwiederholt beinhaltet
    {
    	do //Programmstart, Eingabe der Grenze (natürliche Zahl grösser 1)
    	{
    		fflush(stdin);
    		system("cls");
    		printf("\nGeben Sie eine nat\x81rliche Zahl gr\x94sser 1 ein.\n(mit 0 wird das Programm beendet): ");
    		check = scanf("%d", &eingabe); 
    		fflush(stdin);
    
    		if(eingabe < 0 || check != 1)  // Ist check != 1, passte die Eingabe nicht zum Formatstring %d -> Fehlermeldung
    		{								// Ist eingabe < 0, wurde eine negatives Zahl eingegeben -> Fehlermeldung
    			system("cls");
    			printf("Fehler bei der Eingabe. Bitte neu eingeben.\n\n");
    			system("pause");
    		}
    	}
    	while (eingabe < 0 || check != 1);
    
    		if(eingabe > 0) // Hauptprogramm zur Berechnung der Primzahlen
    		{
    			printf("\n\nPRIMZAHLENBERECHNUNG\n\n");
    			system("pause");
    		}
    		else // Eingabe == 0, Programmende
    			printf("\n\Eingabe von '0' erfolgt.");
    }
    while (antwort == 'j' || antwort == 'J');
    printf("\nProgramm wird beendet.\n\n");
    system("pause");
    return 0;
    }
    


  • Wenn du scanf sagst, es soll nur Ganzzahlen einlesen, dann macht es das auch.
    Zu einer Ganzzahl gehören nun mal keine Buchstaben und Dezimaltrenner. Die werden nicht eingelesen.

    Du kannst aber das Zeichen hinter der Zahl testen. Das muss, wenn du nur eine Ganzzahl eingegeben hast, '\n' sein.

    Es gint übrigens auch den Typ unsigned int . Der Formatspecifier dafür ist %u. Da kannst du schon mal keine negativen Zahlen eingeben.

    unsigned int eingabe;
    char zeichen;
    
    scanf("%u%c", &eingabe, &zeichen);
    if (zeichen != '\n') {
      puts("Fehler bei der Eingabe");
    // Fehlerhafte Zeichen einlesen.
    }
    

    Schau mal bei http://www.c-plusplus.net/forum/p1146014#1146014 wegen Zeile 7



  • Danke für die Antwort!
    Das mit dem unsigned int kann ich noch nicht ganz nachvollziehen, wie würde ich dann auf eine negative Zahl reagieren können ? Also mit einer Fehlermeldung. Wenn die negativ eingegebene Zahl einfach positiv gemacht wird.

    Ich hab jetzt mal
    Zeile 19

    check = scanf("%d%c", &eingabe, &zeichen);
    

    und Zeile 22 und 29 geändert.

    if(eingabe < 0 || check != 2 || zeichen != '\n')
    

    Jetzt kommt immer die Fehlermeldung, wenn ich irgendwas anderes außer einer ganzen positiven Zahl eingebe.
    Die Idee mit der Zeichenabfrage nach der Zahl ist clever, danke dafür !



  • Auctor schrieb:

    Das mit dem unsigned int kann ich noch nicht ganz nachvollziehen

    Da ein - als Vorzeichen nicht zu einer positiven Zahl passt, liest scanf nicht weiter ein.
    Der Rückgabewert von scanf ist dann 0 (bei dir check).

    ⚠ Formatspecifier und Variablentyp müssen zusammenpassen. Du solltest nicht %u für einen (signed) int nehmen.


Anmelden zum Antworten