kleines Problem mit Rechnung
-
Hallo zusammen,
ich möchte gerne ein Programm schreiben, welches eine postive Zahl einliest, jede ziffer wird einzeln als Zeichen eingeben und überprüft. handelt es sich um eine 0-9, so wird die bisherige Zahl um eine Dezimalstelle nach links verschoben quasi *10und die neue ziffer hinzuaddiert. sobald die Eingabe beendet wird, soll die fertige Zahl ausgegeben werden.
Mein erstes Problem, scheint die "Rechnung zu sein"
Bis zum dritten Durchlauf, scheint es zu funktionieren, danach kommmen Werte, die sich mir nicht erschließen.Würde mich über Hilfestellung freuen.
Besten Dank im Vorraus.
pitchy
#include <stdio.h> #include <stdlib.h> int main() { char ziffer=0; int zahl=0; while (zahl<=9) { printf("Postive Zahl eingeben:\n"); scanf("%d", &zahl); if (zahl<=9) { ziffer=ziffer*10+zahl; } else { printf("Ziffer %d",ziffer); } } return 0; }
-
Hallo pitchy,
pitchy schrieb:
char ziffer=0; int zahl=0;
Das Character hat nur einen kleinen Wertebereich (-128 ... 127 oder 0 ... 255). Nimm doch einfach ein Integer, wie du es bei 'zahl' gemacht hast. Damit funktionierts einwandfrei. Warum du überhaupt ein Character genommen hast, ist mir sowieso ein Rätsel
Gez. monstermunchkin
-
hey danke erstmal,
eigentlich möchte ich das ganze nämlich mit getch() lösen, welches kein drücken der Eingabetaste und keine Ausgabe erzeugt z.b zeichen=getch();
Wie könnte ich mit der "while" buchstaben abfangen? und als Fehlermeldung einen Signalton ausgeben, müste ASCII 7 sein oder?
-
pitchy schrieb:
Wie könnte ich mit der "while" buchstaben abfangen?
Buchstaben kannst du mit isalpha() abfangen: http://www.cplusplus.com/reference/clibrary/cctype/ .
Aber was bringt das dir? Du musst auch noch Sonderzeichen abfangen.Ich würde, anstatt Buchstaben und Sonderzeichen abzufangen, einfach nur Zahlen "durch lassen". -> isdigit()
Der Signalton ist das 7. ASCII-Zeichen oder einfach nur '\a'.
-
pitchy schrieb:
hey danke erstmal,
eigentlich möchte ich das ganze nämlich mit getch() lösen, welches kein drücken der Eingabetaste und keine Ausgabe erzeugt z.b zeichen=getch();
Wie könnte ich mit der "while" buchstaben abfangen? und als Fehlermeldung einen Signalton ausgeben, müste ASCII 7 sein oder?
Guck doch mal hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-242392.html
-
hey,
danke erstmal für die nette Hilfe!Im moment habe ich irgendwie Probleme mit der getch() Funktion.
#include <stdio.h> #include <stdlib.h> int main() { int ziffer=0; int zahl=0; while (zahl<=9) { printf("Postive Zahl eingeben:\n"); ziffer=getch(zahl); if (zahl<=9) { ziffer=ziffer*10+zahl; } else { printf("Ziffer %d",ziffer); } } return 0; }
Ich kann zwar eine Taste drücken, aber er liest wohl nicht die Zahl ein, welche ich drücke! Würde mich über den einen oder anderen Ratschlaf freuen.
Die getch() Funktion, befindet sich übrigens in Zeile 15.Beste Grüße
pitchy
-
Wenn du eine '0' eingibst, dann steht in ziffer nicht 0, sondern 48 (ASCII-Code für den char '0'). Die Zahlen gehen im ASCII-Code von 48 bis 57. Du musst also einfach 48 oder besser '0' subtrahieren, um auf deine Ziffer als integer zu kommen.
-
ziffer=getch(zahl);
So geht das nicht. getch hat keine Parameter, d.h. man ruft es so auf:
ziffer=getch();
Die gedrückte Taste steht dann in ziffer.
-
Belli schrieb:
ziffer=getch(zahl);
So geht das nicht. getch hat keine Parameter, d.h. man ruft es so auf:
ziffer=getch();
Die gedrückte Taste steht dann in ziffer.
Ja, ist mir gar nicht aufgefallen. Und dann hat man erst mal ne Endlosschleife, weil zahl nie >9 wird...
-
hey,
habe das ganze nun mit ziffer=getch(); ausprobiert.. scheint aber immer noch nicht zu funktionieren.hab einfach mal die schleifen rausgenommen:
#include <stdio.h> #include <stdlib.h> int main() { char ziffer=0; int zahl=0; printf("Postive Zahl eingeben:\n"); ziffer=getch(); printf("zahl %d", ziffer); return 0; }
Einfach mal Codeauschnitt, um die getch Funktion zu testen.
-
Probier mal das:
printf("zahl %d", atoi (&ziffer));
-
hey,
danke es funktioniert.Aber verstehe immer noch nicht, warum das andere nicht richtig läuft? was bezweckt die die Funktion atoi? und der adressoperator?
Anders ist das mit getch(); nicht zu lösen?
-
pitchy schrieb:
was bezweckt die die Funktion atoi? und der adressoperator?
Die Funktion atoi (ascii to int) "wandelt" einen String in ein Integer um. Den Adressoperator benötigst du, da die Funktion eine Adresse als Argument erwartet.
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
Meine Variante mit getch() und isdigit():
int main () { char input = 0; int zahl = 0; while (isdigit (input = getch ())) zahl = zahl * 10 + atoi (&input); printf ("%i\n", zahl); return 0; }
-
also, läßt sich das ganze so verallgemeinern, wenn man getch(); benutzt?
sprich..
printf("zahl %d",atoi(&wert_aus_getch));
-
pitchy schrieb:
also, läßt sich das ganze so verallgemeinern, wenn man getch(); benutzt?
Ja.
-
monstermunchkin schrieb:
char input = 0; ... zahl = zahl * 10 + atoi (&input); ... }
das ist ein bug.
atoi
erwartet ein C-String, eine \0-terminierte Zeichenkette, nicht bloß nur einen char-Zeiger.richtig wäre:
char input[2] = {0, 0}; ... while (isdigit (input[0] = getch ())) zahl = zahl * 10 + atoi (input); ... }
und die performanteste Variante (außerdem liefer
getch
int und nichtchar
zurück)int input; ... while (isdigit (input = getch ())) zahl = zahl * 10 + input - '0'; ... }
-
supertux schrieb:
atoi
erwartet ein C-String, eine \0-terminierte Zeichenkette, nicht bloß nur einen char-Zeiger.Stimmt, die terminierende \0 hatte ich total vergessen.
supertux schrieb:
außerdem liefer getch int und nicht char zurück
Das spielt doch hier keine Rolle, da der Rückgabewert im Wertebereich eines Characters liegt, oder doch?!
-
monstermunchkin schrieb:
supertux schrieb:
außerdem liefer getch int und nicht char zurück
Das spielt doch hier keine Rolle, da der Rückgabewert im Wertebereich eines Characters liegt, oder doch?!
wenn das so wäre, würde
getchar
ein char liefern. http://en.wikipedia.org/wiki/Fopen#The_EOF_pitfall
-
Okay. Wieder etwas dazugelernt. Dankeschön
-
Hey ich bins nochmal,
bin erst jetzt dazu kommen, dass ganze zu testen.int main () { char input[2] = {0, 0}; int zahl; while (isdigit (input[0] = getch ())) zahl = zahl * 10 + atoi (input); printf("%i", zahl); return 0; }
wenn ich das ganze compiliere, kommt nicht das gewünschte Ergebnis zu stande. Doch den Adressoperator benutzen?
Beste Grüße pitchy
-
pitchy schrieb:
wenn ich das ganze compiliere, kommt nicht das gewünschte Ergebnis zu stande.
Das ist nicht gerade eine ausreichende Fehlerbeschreibung...