| 

.NET C# Java Javascript Exception

2
Hallo allerseits!
Folgendes kleine Programm in C soll eine beliebige Reihe von Eingaben != 0 rekursiv addieren. Für gültige Eingaben klappt das auch, aber bei einer ungültigen Eingabe sollte eigentlich nur eine Fehlermeldung auftreten und die nächste Zahl eingegeben werden. In der Praxis kommt es dann aber zu einer Endlosschleife und ich frage mich: Warum?
Bei jedem neuen Aufruf der Funktion add() werden doch die Variablen (summand, k) neu initialisiert, warum wird also ohne Eingabe weiter ge-errort???
#include <stdio.h>

double add(void);

int main(void)
{
printf("Bitte geben Sie, durch <ENTER> getrennt, beliebig viele Zahlen != 0 ein.\nMit 0 beenden Sie die Eingabe!\n");
printf("Die Summe beträgt: %f", add() );
return 0;
}

double add(void)
{
double summand;
int k;
printf("Eingabe > ");
k = scanf("%lf", &summand);
if (k != 1)
{
printf("Ungültige Eingabe!\n");
return add();
}
else // k == 1
{
if (summand == 0.0) // Rekursion beenden
{
return 0.0;
}
else // nächsten Summanden anfordern
{
return summand + add();
}
}
}

Kann jemand helfen?
Vielen Dank!
Moritz
24.04.2010
moritz_schlarb 21 1
2 Antworten
1
Ich gehe mal davon aus, dass eine dermassen blödsinnige Aufgabe aus der Schule stammen muss.
Davon abgesehn, dass ich soetwas NIEMALS rekursiv lösen würde, sollte es wie folgt gehen.
Dein Problem ist, dass die eine invalide Rückgabe von scanf die Rekusrion erneut auslöst.

Ungetesteter Code:
double add(void);

int main(void)
{
printf("Bitte geben Sie, durch <ENTER> getrennt, beliebig viele Zahlen != 0 ein.\nMit 0 beenden Sie die Eingabe!\n");
double ergebnis = add();
printf("Die Summe beträgt: %f", ergebnis);
return 0;
}

double add(void)
{
double summand;
int k;
do
{
printf("Eingabe > ");
k = scanf("%lf", &summand);
if( k != 1 )
printf("Ungültige Eingabe!\n");
}while( k != 1 );

if (summand == 0.0)
return 0.0;
else
return summand + add();
}
24.04.2010
DaSpors 4,1k 1 8
0
Wenn du erreichen willst, dass bei ungültiger Eingabe wiederholt wird, musst du dies auch so implementieren:
double add(void)
{
double summand;
while ( printf("Eingabe > "), ! scanf("%lf", &summand) )
{
printf("Ungültige Eingabe!\n");
}

if (summand < 0.0001) // Rekursion beenden
{
return 0.0;
}
else // nächsten Summanden anfordern
{
return summand + add();
}
}

Außerdem bringt der Gleichheitstest von Fließkommazahlen oftmals nur Müll.
04.02.2011

Stelle deine C-Frage jetzt!