Was geht nur schief???
-
Hallo an alle,
eins kurz vornweg: Ich bin nicht so betucht was die Programmierung angeht.
Ich habe bis jetzt mit Ruby programmiert, als ich aber bei der Be- (oder Aus- ?)
rechnung von Primzahlen gelandet bin, war mir Ruby einfach zu langsam. Ruby wird nur Interpretiert und nicht Kompiliert. So bin ich also bei C++ gelandet.Nun aber zurück zum Thema.
Wenn ich das Progrämmchen ausführe und als Zahl eine 3 eingebe gibt es mir ne 0 anstatt einer 6 zurück. Wo ist mein Denk- bzw. Programmierfehler? Ich komme nicht zurecht.
#include <iostream> using namespace std; int main() { /* Beschreibung */ cout << endl << endl; cout << "Mit diesem Tool k\x94nnen Sie sich die Fakult\x84t einer" << endl; cout << "von Ihnen eingegebenen GANZEN Zahl ausrechnen lassen." << endl; cout << endl << endl; /* Benutzereingabe */ int zahl=0; cout << "Geben Sie eine GANZE Zahl ein: "; cin >> zahl; cout << endl << endl; /* Berechnung */ int zaehler=0, summe=1; for(int i=1; i==zahl; i++) { ++zaehler; summe = summe * zaehler; } /* Ausgabe */ cout << "Die Fakult\x84t von " << zahl << " ist gleich " << summe << "." << endl; return 0; }Habt Dank für eine Antwort und Rücksicht auf einen Beginner

3nt0n3
-
"i==zahl"
das heisst dein for wird nur 1 (oder 0) mal ausgeführt
sollte aber
"i<=zahl" sein in deinem FOR
koennte auch sein das ich total daneben liege ...bin auch neu
Edit:
Wenn man aber Zahl groesser als 31 eingibt(32,33) kommt eine negative Zahl raus .
Wenn man die Zahl noch mehr erhöht kommt auch "0" raus...hat IMHO etwas mit "Overflow" zu tun.
aber mit 3 und 5 funktionierts
~Misha
-
Misha schrieb:
"i==zahl"
das heisst dein for wird nur 1 (oder 0) mal ausgeführt
sollte aber
"i<=zahl" sein in deinem FOR
koennte auch sein das ich total daneben liege ...bin auch neu
Edit:
Wenn man aber Zahl groesser als 31 eingibt(32,33) kommt eine negative Zahl raus .
Wenn man die Zahl noch mehr erhöht kommt auch "0" raus...hat IMHO etwas mit "Overflow" zu tun.
aber mit 3 und 5 funktionierts
~Misha
richtig,
darum begrenze dein eingabewert auf 30 oder mach summe zu einem double bzw. long int, wobei das letztere dich nicht viel weiter bringt da fakultät zu schnell wächst.
-
Es sollte eigentlich reichen nur "summe" als double zu deklarieren.
hab aber jetzt eine Frage:
Hab jetz "summe" als Double deklariert...ausgeführt und da kamm bei eingabe"55" ein Zahl raus:
1.26964e+073
ich weiss das SO die grossen Zahlen dargestellt werden(Mein Taschenrechner tuts ja auch^^),aber gibt es eine Möglichkeit sie auch "normal" darzustellen,
Danke,~Misha
-
Danke für die Antworten, haben mir wirklich geholfen!!!
Das waren ja wirklich nur kleine Fehler... liegt wohl an der Uhrzeit
Ich fing schon an mir Gedanken zu machen ob es was bringen würde ob ich zaehler=1
aber dafür zaehler++ nehmen würde... aber nach ner Tasse Kaffe hab ich doch sein gelassen
Misha schrieb:
1.26964e+073
ich weiss das SO die grossen Zahlen dargestellt werden(Mein Taschenrechner tuts ja auch^^),aber gibt es eine Möglichkeit sie auch "normal" darzustellenWürde ich auch gern wissen.
EDIT: mit:
cout << fixed; cout << summe;funktioniert es, sieht aber hässlich aus

3nt0n3
-
ps
int summe=1; for(int i=0; i<zahl; i++) summe *= i;da spaarst du die die "zaehler" variable, ist aber geschmackssache
#include <iostream> int main() { std::cout << std::endl << std::endl; << "Mit diesem Tool k\x94nnen Sie sich die Fakult\x84t einer" << std::endl; << "von Ihnen eingegebenen GANZEN Zahl ausrechnen lassen." << std::endl; << std::endl << std::endl; int zahl=0; std::cout << "Geben Sie eine GANZE Zahl ein: "; std::cin >> zahl; std::cout << std::endl << std::endl; int summe=1; for(int i=0; i<zahl; ++i) summe = summe * zaehler; std::cout << "Die Fakult\x84t von " << zahl << " ist gleich " << summe << "." << std::endl; return 0; }
-
Mr Evil schrieb:
ps
int summe=1; for(int i=0; i<zahl; i++) summe *= i;da spaarst du die die "zaehler" variable, ist aber geschmackssache
Nur eine Kleinigkeit: Diese Schleife sollte lieber von 1 anfangen zu zählen (sonst rechnest du im ersten Schleifendurchlauf 'summe*=0' - und dann hast du als Endwert immer 0).
Zum Thema Zahlendarstellung: mit der Angabe
cout<<fixed<<summe;stellst du die Zahl in der "üblichen" Form dar - das kann bei Werten in der Größenordnung 1e73 ziemlich lang werden
(und bei so großen Werten reicht double sowieso nicht mehr aus, das Ergebnis exakt darzustellen)
-
ups #gg - stimmt ja, ich ziehe meine aussage mit "zaehler" zurueck #gg
-
Mr Evil schrieb:
for(int i=0; i<zahl; ++i) summe = summe * zaehler;CStoll schrieb:
Nur eine Kleinigkeit: Diese Schleife sollte lieber von 1 anfangen zu zählen (sonst rechnest du im ersten Schleifendurchlauf 'summe*=0' - und dann hast du als Endwert immer 0).
Aber so wie MR Evil das angeht ist es doch auch richtig. Beim initialisieren hat i zwar den Wert 0 aber durch ++i wird doch i erst iteriert und dann ausgewertet oder liege ich da falsch???
3nt0n3
-
Die Iterationsbedingung wird aber erst am Ende des Schleifendurchlaufs ausgeführt (das heißt, erst nachdem du schon einmal multipliziert hast).
-
Achso, das wusste ich nicht, aber jetzt
.
Danke3nt0n3