PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Anfänger: Frage zu getchar()....



SuperCow
02.08.2004, 12:03
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
int n, x;
double produkt;
char weiter;

do {
produkt=1.0;
printf("\nBitte geben Sie eine Zahl n ein: ");
scanf("%i", &n);
for(x=1; x<=n; x++) {
produkt=produkt*x;
}
printf("%.0f\n", produkt);
printf("Weitermachen? (Y/N) : ");
weiter=getchar(); // Funktioniert nicht... Warum?
} while(weiter=='Y' || 'y');

printf("\n\n");
system("PAUSE");
return 0;
}


Das getchar() funktioniert einfach nicht... wenn ich es an den Anfang der Schleife setze wird es einmal abgefragt, dann aber nicht mehr... Es scheint als würde dem getchar, einfach return übergeben... Ich kann mir das aber nicht erklären....


thx

SuperCow

SuperCow
02.08.2004, 12:20
http://www.proglernen.de/_forum/00000053.htm

OK, hier habe ich schon eine ANtwort gefunden... Wie umgehe ich das aber, ohne dass


[...]
weiter=getchar();
weiter=toupper(getchar());
[...]
verwendet werden muss?


So siehts im Moment aus. Die zwei getchars stören mich aber. KAnn man nicht irgendwie den TAstaturpuffer löschen oder so etwas?


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


using namespace std;

int main(int argc, char *argv[])
{
int n, x;
double produkt;
char weiter;

do {
produkt=1.0;
printf("\nBitte geben Sie eine Zahl n ein: ");
scanf("%i", &n);
for(x=1; x<=n; x++) { // Bildet die Fakultät von n (!n)
produkt=produkt*x;
}
printf("%.0f\n", produkt);
printf("Weitermachen? (J/N) : ");
weiter=getchar();
weiter=toupper(getchar());
} while(weiter=='J');

printf("\n\n");
system("PAUSE");
return 0;
}

Sargnagel
02.08.2004, 14:07
Standard-Problem --> FAQ-Antworten ;)

How do I get my program to wait for a keypress? (http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1042856625&id=1043284385)

Flush the input buffer (http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1044873249&id=1043284392)

Why fflush(stdin) is wrong! (http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1052863818&id=1043284351)

SuperCow
02.08.2004, 18:16
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


using namespace std;

int main(int argc, char *argv[]) {
int n, x;
double produkt;
char weiter;

do {
produkt=1.0;
printf("\nBitte geben Sie eine Zahl n ein: ");
scanf("%i", &n);
for(x=1; x<=n; x++) {
produkt=produkt*x;
}
printf("%.0f\n", produkt);
printf("Weitermachen? (J/N) : ");
while ((weiter = getchar()) != '\n' && weiter != EOF); // flushs the input buffer cause of getchar()
weiter=toupper(getchar());
} while(weiter=='J');

printf("\n\n");
system("PAUSE");
return 0;
}


OK, anwenden konnte ich es. Aber was macht das ganze genau? Also nur diese Zeile: "while ((weiter = getchar()) != '\n' && weiter != EOF);"
Und es ist die Frage, was natürlich eleganter ist...

Seh ich das richtig, dass er zuerst mit getchar() das "return" nach weiter einliest und dann die Schleife ausführt, wenn kein EOF oder \n vorliegt? Dann gehts ja in eine Endlosschleife rein? Wäre es da nicht besser, das einfach wie vorhin über ein getchar() zu machen?

thx

SuperCow

Sargnagel
02.08.2004, 20:18
Nein, eine Endlosschleife wird das nicht. Wenn der stdin-Buffer leer ist, wird das durch ein EOF (end of file) angezeigt. Und bedenke, daß EOF eine Integer Konstante ist, d.h. char weiter und weiter != EOF sind nicht ganz korrekt.

Also, solange kein '\n' (d.h. ENTER wurde betätigt) gefunden wurde (((weiter = getchar()) != '\n') und ( && ) das Ende des stdin-Buffers noch nicht erreicht ist (weiter != EOF), wird der Schleifenkörper ausgeführt. Da dieser aber nur aus einem ';' besteht, geht's gleich mit der erneuten Evaluierung der Schleifenbedingung weiter.

Die while-Schleife bricht also ab, sobald der stdin-Buffer geleert ist. Und bedenke, daß die Bedingung der while-Schleife aufgrund des && von links nach rechts ausgewertet wird.

SuperCow
04.08.2004, 13:13
Danke :)

Noch 2 fRagen, wenn ich die Debug-Funktion des Dev-C++ nutze, und ich mir die VAriablenwerte zur LAufzeit anzeigen lassen, dann sind es nie die exakten Werte, wie ich sie eingegeben habe, also z.B:
statt 2.01 --> 2.00999999999999957
Eine mögliche Erklärung habe ich hier gefunden:
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_ieee_floating.2d.point_representation_and_microsoft_languages.asp
Wenn ich die Variablen jedoch direkt im Quelltext initialisiere (so heißt das doch?), zeigt mit die sog. Watchfunktion die korrekten Werte an. Bis jetzt habe ich noch keine Erklärung dafür gefunden.


Dann habe ich noch ein Phenomen entdeckt - jedenfalls scheint es mir so. Bei einer normalen for-Schleife, wie z.B.

for(i=1; i=10; i++);
erzeugt bei mir eine Endlosschleife. Erst wenn ich i=10 zu i<=10 abändere, funktioniert die schleife wie sie soll. i ist natürlich vom Typ int.
Wäre nett, wenn mir das jemand erklären könnte oder sagen wo man dafür eine Erklärung findet.

Devastators
04.08.2004, 13:40
"for(i=1; i=10; i++);"

Anfängerfehler ;)

vesuch mal:

for(i=1; i==10; i++); ;D

Der Vergleichsoperator ist ==!
= ist ein Zuweisungsoperator!

SuperCow
04.08.2004, 14:21
Schande über mich :) Und da hockt man dann Stunden dran :) Jetzt wird aber Französisch gelernt, dass man auch was im urlaub sagen kann... :]

Ich merk aber gerade, dass die Schleife für meine Zwecke ziemlich sinnlos idt, da sie nur bei i==10 ausgeführt wird... :)