C Eingabeaufforderung bis Wert gültig

[R00T]Bear

Newbie
Registriert
Okt. 2010
Beiträge
5
Hallo meine hilfsbereiten Mitmenschen,

es geht weiter mit der munteren Fragestunde.

Folgende Situation gilt es sich vorstellen:
Ein Programm soll nach Eingabe von Startkapital, Zinssatz und Laufzeit eine Tabelle ausspucken in der die Laufzeit, die Zinsen und das Kapital berechnet werden.

Das habe ich dank meiner patentierten try&error-Vorangehensweise geschafft:

Code:
#include <stdio.h>

int main(void)
{
	float Kapital, Startkapital, Zinsen, Zinssatz;
	int Jahre, i;


	printf("Startkapital (in Euro): ");
	scanf_s("%f", &Startkapital);

	printf("Zinssatz (in Prozent): ");
	scanf_s("%f", &Zinssatz);

	printf("Laufzeit (in Jahren): ");
	scanf_s("%d", &Jahre);

	printf("\n");


	printf("Jahre |   Zinsen |    Kapital \n");
	printf("----------------------------- \n");

	Kapital = Startkapital;


	i = 1;
	while (i <= Jahre)
	{

		Zinsen = Kapital * Zinssatz / 100;
		Kapital = Zinsen + Kapital;

		printf("%5.0d | %8.2f | %10.2f \n",i,Zinsen,Kapital);

		i++;
	}

	system("PAUSE");
	return 0;
}
Es sollte zwar gedoublet werden aber dankenswerterweise funktioniert es wunderprächtig auch mit float :).

So, jetzt kommt der spannende Teil an dem ich grade hängengeblieben bin:

Das Programm soll bei fehlerhafter Eingabe von Werten den Benutzer erneut fragen. Heißt konkret: Gibt der Benutzer einen Buchstaben statt einer Zahl ein, soll in der nächsten Zeile die Eingabeaufforderung neu erscheinen. Gibt er einen Buchstaben und anschließend Zahlen ein, das selbe Spiel nochmal und gibt er erst Zahlen danach Buchstaben und dann wieder Zahlen ein, nochmal das ganze.

Startkapital: Y
Startkapital: 300X
Startkapital: 99x12
Startkapital: 12000 //<-- soll eingelesen werden, da nur Zahlen eingegeben worden sind

U get the point, eh?

Natürlich soll das ganze für alle 3 Eingabemöglichkeiten gelten (Startkapital, Zinssatz, Laufzeit).

Ich habe mich natürlich munter auf die Aufgabe gestürzt, bin aber nicht weit gekommen.

Mein Ansatz lautet wie folgt:

Code:
#include <stdio.h>

int main(void)
{
	float Kapital, Startkapital, Zinsen, Zinssatz;
	int Jahre, i, test;


	printf("Startkapital (in Euro): ");

        if (scanf("%f", &Startkapital) == 1)
        {
                int test = 0;
                scanf("%c", &test);
                         if (test == '\n') {}

                         else {}

         else {}
         }

Ich bin mir sehr sicher das es so geht, es stellen sich mir - vorausgesetzt das stimmt so - dann 3 Fragen.

1. Wie erweitere ich das Programm das es erneut fragt ( die Einträge in den {} ).
2. Wie bringe ich es danach dazu, den korrekten Wert einzulesen und mit ihm zu rechnen.
3. Sollte nach jeder 'großen' if-Anweisung ein fflush kommen oder erledigt sich das ganze wenn im nächsten "if" die Variable "test" mit 0 initialisiert wird (siehe Versuch)?

Für zielführende hilfreiche Anregungen wäre ich danbar, am liebsten wäre es mir wenn sich jemand dem Programmcode kurz annimmt und ihn ensprechend ergänzt.

Thanks!

Nachtrag:

Inzwischen hab ich die Aufgabe mangels "Hilfe" in Eigenregie gelöst.

Da ich es hasse wenn Threads - ohne die Fragen beantwortet zu haben - enden, hier meine Lösung (es geht vielleicht eleganter, aber who cares?!)

Code:
#include <stdio.h>

int main (void)
{
	double Kapital, Startkapital, Zinsen, Zinssatz;
	int Jahre, i, test=0;

	printf("Startkapital (in Euro): ");
	while(1)
	{
		fflush(stdin);
		if (scanf_s("%lf%c", &Startkapital,&test) == 2)
		{
			if (test == '\n')
			{
				break;
			}
			else
			{
				printf("Startkapital (in Euro): ");
			}
		}
		else
		{			
			printf("Startkapital (in Euro): ");
		}
	}

	printf("Zinssatz (in Prozent): ");
	while(1)
	{
		fflush(stdin);
		if (scanf_s("%lf%c", &Zinssatz,&test) == 2)
		{
			if (test == '\n')
			{
				break;
			}
			else
			{
				printf("Zinssatz (in Prozent): ");
			}
		}
		else
		{			
			printf("Zinssatz (in Prozent): ");
		}
	}
	
	printf("Laufzeit (in Jahren): ");
	while(1)
	{
		fflush(stdin);
		if (scanf_s("%d%c", &Jahre,&test) == 2)
		{
			if (test == '\n')
			{
				break;
			}
			else
			{
				printf("Laufzeit (in Jahren): ");
			}
		}
		else
		{			
			printf("Laufzeit (in Jahren): ");
		}
	}

	printf("\n");


	printf("Jahre |   Zinsen |    Kapital \n");
	printf("----------------------------- \n");

	Kapital = Startkapital;

	i = 1;
	while (i <= Jahre)
	{
		Zinsen = Kapital * Zinssatz / 100;
		Kapital = Zinsen + Kapital;

		printf("%5.0d | %8.2f | %10.2f \n",i,Zinsen,Kapital);

		i++;
	}

	system("PAUSE");
	return 0;
}
 
Zuletzt bearbeitet: (Beispiele verbessert und Lösung hinzugefügt)
Dein Programm schreiben werde ich nicht :)

zu 1.:
Da beliebig viele Fehleingaben möglich sind, brauchst du wohl eine Schleife, in die du deinen Abfragecode bringst.
zu 2.:
Eingelesen ist der Wert ja schon nach scanf(). Du willst den eingelesenen String eigentlich nur noch überprüfen und nach float (oder double) casten. Dazu verwendet man üblicherweise atof (atod). Das liest auch Strings "passend" (quasi fehlertolerant) ein. Vllt ist das ja was für dich...
http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
zu 3.
fflush dient dazu, einen Buffer zu leeren, üblicherweise stdin oder stout. Hat mit Bedingungen gar nix zu tun...

Gruß.
misu
 
Wenn du doch etwas als float deklarierst kannst du doch gar keine Buchstaben eingeben.
 
Du könntest über einen String gehen. Lies einen String ein, überprüf jedes Zeichen ( strchr kann dir da behilflich sein , oder isdigit() ). Falls alles Zahlen sind könntest du mit atof() oder sscanf() den String in eine Float umwandeln.

Den Rest hat Misu schon gesagt.
Ergänzung ()

Eine andere variante wäre: getch() statt scanf() verwenden. Bei jedem Zeichen ( '0' <= x <= '9' ) den Character mit '0' subtrahieren und dein Float-Resultat aktualisieren. Bei '\r' übernehmen...
 
while (scanf("%f", &Startkapital) != 1){
printf("\nStartkapital (in Euro): ");
}
 
Damit würde er aber auch 2. und 3. als 12000 gewandelt bekommen, was er meiner Meinung nach nicht wollte.
Ergänzung ()

Also ich meinte die Beispiele:

"Startkapital: 12000Affen
Startkapital: 12000Affen12"

bei dem 'A' würde er abbrechen und die 12000 übernehmen. Das könnte aber dann schon der falsche Wert sein.
 
Das mit den Beispielen habe ich mal lieber abgeändert da das Affen-Beispiel wohl für verwirrungen gesorgt hat, sorry :).

Diese Anweisungen die Ihr bis jetzt genannt habt kenne ich bis auf eine Ausnahme noch gar nicht, ich wüsste jetzt auch aus dem Text nicht zu entnehmen was ich wie machen sollte (Anfänger....), daher sind Code-Beispiele wie von DonnyDepp (obwohl, wie vanilla auch schon sagte, leider nicht ganz richtig) für mich verständlicher - wahrscheinlich ist die Lösung dieser Aufgabe aber viel einfacher. Der Code in meinem Versuchsbeispiel überprüft doch auch darauf ob jetzt nur Zahlen dort stehen oder Buchstaben, vielleicht könnte man ja damit weiterarbeiten.
 
Schau Dir mal die Funktionen an, die die <stdio.h> dir bietet.

Versuch als erstes mal einen String einzulesen.

So ungefähr:

// Puffer & Hilfsvariablen anlegen

char bValid;
char StrInput[11];
int iStrLen , i ;
float fValue;

do
{

// Bei jedem Versuch neu initialisieren
bValid = 1;

// Konsolenausgabe
printf("\nStartkapital: ");

// String von der Konsole mit maximaler Länge 10 einlesen
scanf("%10s",&StrInput);

// Stringlänge bestimmen
iStrLen = strlen(StrInput);

// String auf Non-Numbers testen
for ( i = 0 ; i < iStrLen ; i++ )
{
if ( (StrInput < '0') || (StrInput > '9' ) )
{
// Abbruch der Schleife wenn das Zeichen keine Zahl ist
bValid = 0;

printf("\nEs sind nur Zahlen erlaubt!\n");
break;
}
}
} while ( 0 == bValid );

// Umwandlung String->Float -> geht auch über: fValue = atof(StrInput);
sscanf(StrInput,"%f",&fValue);

// ...


So in die Richtung könnte das gehen ...
 
Zuletzt bearbeitet:
Zurück
Oben