C++ ungültige eingabe bei buchstaben verhindern, wie geht das?^

***XXX***

Banned
Registriert
Sep. 2008
Beiträge
603
ich soll ein kleines c++ programm schreiben, in dem die durchschnittsnote einer bestimmter anzahl der schüler bestimmt werden soll. das ganze ist nicht so schwer, aber sobald man eine unsinnige eingabe (z.b eine Buchstabe) tätigt , soll es erneut eingeben werden. es soll so aussehen:


note des 1. Schüler: 2
note des 2. Schüler: 5
note des 3. Schüler: 4
note des 4. schüler: a
falsche angabe, wiedeholen sie die eingabe
note des 4. SChüler: 4
....


alles funktioniert soweit bis auf der sache mit der buchstabe!!!

Code:
#include<stdlib.h>
#include<stdio.h>
#pragma warning(disable:4996)

int main()
{
	int anz,nr,n,m,;
	float m_n;

	do
	{

	printf("Anzahl der Schueler: ");
	scanf("%i",&anz);

	}
	while (anz<=0);

	for (nr=1;nr<=anz;nr++)
	{

printf("Punktzahl des %i. Schueler: ",nr);
scanf("%i",&n);
m=m+n;

	}

	m_n=(float)m/anz;

	printf("Notendurchschnitt: %2.1f",m_n);

system("PAUSE");
	return 0;

}


kann jemand mir helfen?
 
Zuletzt bearbeitet von einem Moderator: (Code-Tags statt Quote-Tags)
das hatte ich in der Übung nicht gehabt, oh je
kannst du das für diesen kronkretten fall die befehle schreiben? Ich habe c++ noch net so lange und mehr als while / for schleife, einlesen, ausgeben lassen kann ich nicht :(

ja wir haben 3 varibalen bis jetzt, integer für natürliche zahlen, float für kommazahl und character (char) für buchstaben und zeichen

wie gehe ich jetzt vor?
 
Code:
int main()
{
int anz;
char c_note;
int i_note;

printf("Anzahl: ");
scanf(%i, &anz);


printf("Note 1: ");
scanf(%s, &c_note);

if(atoi(&c_note) == 0) /* atoi() gibt 0 zurück, wenn der Input ungültig, dh. nicht in einen Int umwandelbar ist*/
{
printf("Falsche Eingabe");
}
else
{
i_note = atoi(&c_note));
}
}
Grade schnell getippt ohne zu testen. Ist vll. nicht die idealste Lösung, aber es müsste tun.
Für atoi auchnoch DAS anschauen.
 
hmm danke dir aber da ist n syntakt fehler drin :(
 
Versuche es am besten mit switch-case. Damit lässt es sich relativ einfach lösen.
Hier mal ein Beispiel
PHP:
do
{
    std::cout <<"note des "<< i++ << " Schüler: ";
    std::cin >> note;
    switch (note)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6: //Dein Anweisungen hier hin schreiben .... 
    default : std::cout <<"falsche angabe, wiedeholen sie die eingabe" << std::endl;
    }
}while (anz<=0);
Du musst es nur noch in deinen restlichen Source intergrieren.

MFG
MesserJack
 
@XXX: Du sollst ja auch nicht Copy&Paste'n sondern verstehen was der Code macht.:)
Wenn du bei jedem Syntax-Fehler kapitulierst, dann wird das nix.

Wenn dir was an meinem Code unklar ist, kannst du gern fragen, ansonsten versuch mal das selbst umzusetzen.
 
Servus,
vielleicht bringt dir dieses Programm etwas:

Code:
#include <iostream>

using namespace std;

int main()
{
    char wert;
    printf("Bitte geben sie eine Zahl ein:\n");
    for(;;) //endlosschleife
    {
        cin >> wert;
        if(atoi(&wert) == 0) /* atoi() gibt 0 zurück, wenn der Input ungültig, dh. nicht in einen Int umwandelbar ist*/
        {
            printf("Falsche Eingabe\n");
        }
        else
        break;
    }
    printf("Ihr Zahl war: %c\n",wert);
    system("PAUSE");
    return 0;
}
 
Ich glaube fast, das einfachste und naheliegenste wäre es die Eingabe darauf zu überprüfen, ob sie 1, 2, 3, 4, 5 oder 6 enthält, spezielle Funktionen oder switch-case abfragen sind dafür zwar möglich und teilweise auch komfortabler und leichter zu warten, aber so wie's aussieht hat er ja noch nicht einmal die einfache if-abfrage beigebracht bekommen, verwendet hat er sie in seinem Programm jedenfalls nicht, und ohne eine Ahnung von etwas so grundlegendem zu haben wird's schwer mit dem programmieren. So eine Abfrage könnte er sich zwar mit einer Schleife selbst zusammenbasteln, aber na ja :D ...
Eine Erklärung wie solche Abfragen auszusehen haben gibt's beispielsweise in diesem Tutorial.

Jedenfalls würde das in deinem Programm dann beispielsweise so aussehen:
PHP:
scanf("%i",&n);
if(n>=1 && n<=6) { // Dabei wird ueberprueft, ob n k groesser oder gleich 1 ist und kleiner oder gleich 6, also zwischen 1 und 6 leigt, nur dann wird der nachfolgende Block ausgefuehrt. Buchstaben koennen das schonmal nicht sein.
    m = m + n;
} else { // Und wenn das nicht der Fall ist, wird eine Fehlermeldung ausgegeben. ;)
    printf("Falsche Eingabe!");
}
 
Zuletzt bearbeitet:
Zurück
Oben