Hilfe bei C-Programm
-
Hallo,
ich hab ein problem.
Ich hab eine Woche Zeit ein C-Programm zu schreiben und leider nicht alzuviel Ahnung davon. Ich kenn zwar die Grundlegenden dinge und kann einfache Programme schreiben.
Hab folgende Aufgabenstellung:
Entwickeln Sie ein C-Programm, das die Quersumme einer eingegebenen Dezimalzahl berechnet. Die Zahl soll als Integerzahl eingegeben werden. Beachten Sie, dass es auch negative Zahlen gibt. Eine Integerzahl hat hier 32 Bit. Achten Sie auf eine gefällige und absturzsichere Benutzerführung, was z.B. Fehleingaben überprüft. Das Programm soll solange nach Zahlen fragen, bis der Anwender q für quit eingibt. Kommentare sollen auch enthalten sein.Ich habe folgenden Code bereits:
#include <stdio.h>
int quer=0;
int zahl;int ber(void)
{
while (zahl>0)
{quer = quer + (zahl%10);
zahl = zahl/10;
}
zahl=quer;
quer=0;
return 0;
}int main(void)
{
start:
printf ("Geben sie eine Zahl ein");
scanf ("%i",&zahl);
while (zahl>9) ber();
printf ("Quersumme ist %i",zahl);
goto start;
}Mein Problem noch:
Die Zahl soll als Integer eingegeben werden. Das bedeutet doch nur Zahlen und kene Buchstaben.
wie maches ich es aber jetzt, das ich wenn q eingegeben wird, beendet wird, oder wenn sonstige Buchstaben und Zeichen eingegeben werden, eine Fehlermeldung kommt?
-
Du kannste den Rückgabewert von scanf überprüfen:
int test;
test = scanf("%i", &zahl);Wenn test 0 ist, wurde keine Zahl eingegeben, ansonsten liefert Scanf 1 zurück.
[ Dieser Beitrag wurde am 02.07.2003 um 23:30 Uhr von CarstenJ editiert. ]
-
Hallo
Vielen Dank, jetzt hab ich das Programm soweit, das es eine Fehlermeldung bringt, wenn man keine Zahl eingibt.
Wie mache ich es aber, das es NUR dann abbricht, wenn ich q eingebe? Bei den anderen Buchstaben soll, wie bekannt die Fehlermeldung kommen
-
also ich würd getchar nehmen und dann
while(zahl != 'q')
-
get auch mit scanf, vergiss getchar. hab's nur vergessen zu löschen, bevor ich auf "antwort erstellen" geklickt hab
-
Ja aber geht das, wenn ich zahl als integer definiert habe, was ich ja muß?
Kann ich getchar verwenden und dann die selbe Zahl mit scanf noch einlesen?
-
das problem mit getchar ist, dass es immer nur ein Zeichen von der Std. eingabe liest. nimm weiterhin scanf und >> 'q' << ist der int - wert der Taste q
mach einfach ein
while(key != 'q') { scanf("%d", &key); }
das müsste gehen
-
ups sorry was mach ich denn da, so kann das natürlich nicht gehen. Bitte vielmals um entschuldigung.
-
Habs mir gerade gedacht, weil es nicht funktioniert bei mir.
Bin schon am verzweifeln
-
probiers mal so, indem du den Eingabe - Wert als nen String lässt also z.b.
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { int key; char *input; while(strncmp(input, "q", 1) != 0) { scanf("%s", input); key = atoi(input); printf("In = %s\nKey = %d\n", input, key); } return 0; }
(ist blos als bsp gedacht, also nicht gleich wieder fertigmachen *g*)
-
Oh mann, ich muss zugeben, das ich noch zu sehr Anfänger bin, damit ich das verstehe.
Für was steht char *Input? Da kommt bei mir eine fehlermeldung, das die variable input nicht bekannt ist
-
char *input ist ne Variablen deklaration, geauso wie int key, nur dass der "*" "zeiger auf" bedeutet.
sieh dir mal www.pronix.de Kap Zeiger durch, dann müsste es klarer werden.
-
Wenn ich das Programm ausprobiere kommt bei mir immer eine Fehlemeldung
..das die Exe Datei beendet werden muß usw..
-
ich will dir ja auch net die ganze arbeit abnehmen, dass sollte nur als Anregung gelten, dass dass so nicht wirklich funkt ist mir auch klar. *g*
aber du willst doch auch was lernen oder ?!?
ohne fleiß kein preis, probier einfach ein bisschen damit rum, schreib dir am besten ein ganz einfaches Progi, dass dir die Eingabe von der Tastatur abfragt und wieder ausgiebt, danach überprüfe die eingabe und beende bei einer bestimmten bedingung usw... klein anfangen und groß aufhören, die Guru - progger machen das au net anders.wenn du dann immer noch net weiter weißt, können wir dir immer noch helfen, aber fertigen Code wirst du hier nie bekommen.
-
Ach so ja, was ich noch loswerden wollte, wenn du dir keine Feinde machen willst, verwende sachen wie goto möglichst gar nicht, das kann man alles in schleifen machen, weil es gibt auch befehle mit denen man quer durchs prog springen kann, und das macht dann richtig spass zum debuggen vor allem bei richtig grossen progis.
-
Hallo
Ich will ja eh gar keinen fertigen Code.
Ich bin nur unter starkem Zeitdruck, weil ich noch andere Prügungen habe.
Binh um jeden noch so kleinen Tip dankbar
Ich hab mir jetzt gedacht, das ich das mit q vielleicht über ein Extra Menü mache, das frägt, ob ich beenden will der nicht. Dann gibts halt Abzug in der Note, aber egal.Einziges Problem ist jetzt noch, warum das nicht funktioniert:
{
start:
printf ("Geben sie eine Zahl ein");
test=scanf ("%i",&zahl);
if (test ==0) goto start;
while (zahl>9) ber();
printf ("Quersumme ist %i",zahl);
goto start;
ende:
return 0;
}mit test=scanf... bekomme ich als test eine 0, wenn ein buchstabe eigegeben wird. Gebe ich ein if (test==0) goto ende, beendet er mir das Programm, wenn ich einen Buchstaben eingeben.
Geb ich aber ein goto start: weil ja wieder nach einer neuen Zahl gefragt werden soll, dann erscheint am Bildschirm unendlich oft:Geben Sie eine Zahl ein, und ich hab gar keine Möglichkeit eine Zahl einzugeben.
Ich hätt schon versucht, bevor er zurückspringt, die Zahl auf 0 oder test auf 1 zu setzten, aber ich bekomm immer eine Endlosschleife
-
mach dir mal dazwischen ein fflush(stdin) rein, aber das problem ist wie öffnest du das menü ?????? (na merkst was)
-
tut mir leid ich versteh nur Bahnhof
-
Quelle: www.pronix.de
6.2. Probleme und ihre Behandlung mit scanfEin häufiges Problem, das auftritt, wenn man scanf() für die Eingabe verwenden ist die Pufferung. Diese ist je nach System und Anwendung, Zeilen- oder Vollgepuffert. Dies gilt wiederum nicht für die Standardfehlerausgabe (stderr), die laut ANSI C, niemals vollgepuffert sein darf. Bevor ich weiter erkläre, folgendes Programm zum testen:
#include <stdio.h> int main() { char a,b,c,tmp; printf("1. Buchstabe : "); scanf("%c",&a); printf("2. Buchstabe : "); scanf("%c",&b); printf("3. Buchstabe : "); scanf("%c",&c); printf("Sie gaben ein : %c %c %c ",a,b,c); return 0; }
Was ist passiert? Warum wird der zweite Buchstabe immer übersprungen? Wie gesagt das Problem liegt hier an der Pufferung. Und C kennt nun mal keinen Befehl (wie etwa chomp bei Perl), um das letzte Zeichen zu entfernen.
In diesem Beispiel wurde als erster Buchstaben "a" eingegeben und [ENTER] gedrückt. Und dieses [ENTER] (\n = newline) befindet sich immer noch im Puffer der Standardeingabe und wird automatisch für das zweite Zeichen verwendet. Was kann man dagegen tun? Hierzu ein paar Möglichkeiten, die allerdings auch systemabhängig sind:
Möglichkeit 1
Alle 3 Buchstaben auf einmal eingeben:
include <stdio.h> int main() { char a,b,c; printf("1.2. und 3. Buchstabe : "); scanf("%c %c %c",&a,&b,&c); printf("Sie gaben ein : %c %c %c ",a,b,c); return 0; }
Möglichkeit 2
Sie benutzen die Funktion fflush() zum entleeren des Tastaturpuffers. Was aber möglicherweise nicht auf jedem Betriebssystem (speziell nicht unter Linux) so funktioniert:
#include <stdio.h> int main() { char a,b,c; printf("1. Buchstabe : "); scanf("%c",&a); fflush(stdin); printf("2. Buchstabe : "); scanf("%c",&b); fflush(stdin); printf("3. Buchstabe : "); scanf("%c",&c); printf("Sie gaben ein : %c %c %c ",a,b,c); return 0; }
Möglichkeit 3
Die wohl beste Möglichkeit. Man benutzt eine do-while-Schleife und zieht das newline-Zeichen aus dem Puffer heraus:
#include <stdio.h> int main() { char a,b,c; printf("1. Buchstabe : "); do {scanf("%c",&a);} while ( getchar() != '\n' ); printf("2. Buchstabe : "); do {scanf("%c",&b);} while ( getchar() != '\n' ); printf("3. Buchstabe : "); do {scanf("%c",&c);} while ( getchar() != '\n' ); printf("%c %c %c\n",a,b,c); return 0; }
Möglichkeit 4
Sie verwenden scanf erst gar nicht und greifen auf eine der vielen anderen Standardeingaben-Funktionen zurück. Ideal wäre es bsp. die Funktion fgets() zum Einlesen zu verwenden und die Eingabe mit der Funktion sscanf() in ein entsprechendes Format zu konvertieren.
etc etc etc...........
und das mit dem menü, dann musst do doch sowieso abrfagen ob ne bestimmte taste gedrückt wurde um es zu öffnen, dann kannst au glei nach "q" abfragen und sauber beenden, aber um gottes Willen nimm goto raus!
-
Danke das mit dem fflush(stdin) hat geholfen.
Tja da hab ich jetzt wirklich ein problem mit dem Menü
-
Hab da mal was zusammen gestellt (sorry, eigentlich sollte es nur ein kleiner Tipp werden, am Ende war's dann aber doch ein ganzes Prog. ;)):
#include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> int ber(int zahl){ int quer=0; while(zahl!=0){ quer=quer+zahl%10; zahl=zahl/10; } return quer; } int main(void){ char zahl[10]; int izahl, fehler, negativ; while(1){ do{ int i; izahl=0; fehler=0; negativ=0; printf("Geben sie eine Zahl ein: "); scanf("%s", zahl); if(!strncmp(zahl, "q", 2)) return 0; for(i=0; i<strlen(zahl) && !fehler; ++i) if(!isdigit(zahl[i]) && zahl[0]!='-') fehler=1; if(!fehler) izahl=atoi(zahl); }while((izahl>-10 && izahl<10) || fehler); printf("Quersumme von %d ist: %d\n\n", izahl, ber(izahl)); } }
[ Dieser Beitrag wurde am 03.07.2003 um 22:22 Uhr von RTC editiert. ]