Mathematikprobleme

kannaum

Mitglied
hi,

Ich habe einen Turm-Generator in C++ gemacht.
Aber es gibt Probleme.
Gleich vorweg ich bin c++ - neuling.

Das Programm fragt einem zuerst nach der Zahl, dann wie weit der Turm gerechnet werden soll.
Es geht auch normalerweise alles ganz normal, aber wenn man höhere Zahlen eingibt dann kommt eine Endlosschleife.
Und wenn man bei der Zeile wo man gefragt wird wie hoch er rechnen soll eine größere zahl als 9 eingibt dann steht vor einigen Zahlen ein - und er wird auch komplett falsch gerechnet.

Hier ist der Code der Funktion:
Code:
void turm(int zahl, int hoch = 9) {
     int i = 1;
     int zahlausgerechnet = zahl*i;
     for (i; i <= hoch; i++) {
        zahlausgerechnet = zahlausgerechnet*i;       
        cout << i << "x | " << zahlausgerechnet << endl;
     } 
     for (i=2; i <= hoch; i++) {
        zahlausgerechnet = zahlausgerechnet/i;    
        cout << i << "/ | " << zahlausgerechnet << endl;
     }   
}


Und für alle die den ganzen Code sehen möchten habe ich noch eine Text-File mit dem ganzen Code hochgeladen.
Sind glaube ich nicht einmal 40 Zeilen ;-)
 

Anhänge

Hallo,

dass bei großen Zahlen plötzlich das Ergebnis negativ wird, liegt daran, dass ein Überlauf auftritt. Das Verhalten mit der Endlosschleife kann ich allerdings nicht nachvollziehen. Egal was ich eingebe, das Programm terminiert immer.

Grüße, Matthias
 
Ok könnte ich das Problem lösen wenn ich eine double-Variable nehme?

mfg

Nur wenn du Gleichkommazahlen brauchst. Sonst versuchs mal mit "long int" oder "long long int". Wenn du nur einen positiven Zahlenbereich benötigst dann versuche es mit "unsigned int", "unsigned long int" oder "unsigned long long int". Bei unsigned hast du immerhin ein Bit mehr für deinen Zahlenbereich.
 
Ich hab das jetzt mit einer unsigned long long int probiert aber man kann trotzdem nur 5 stellige Zahlen oder so eingeben und keine 1 Stelligen.
Außerdem kommt wenn ich zb. 12345 ein falscher Turm.
Da ist der Anfang und Endwert auf einmal anders.

mfg
 
Hi.
Ich hab das jetzt mit einer unsigned long long int probiert aber man kann trotzdem nur 5 stellige Zahlen oder so eingeben und keine 1 Stelligen.
Versuch doch mal bitte dein Problem genauer zu beschreiben. Was soll das bedeuten? Was gibst du ein, was kommt raus und was sollte deiner Meinung nach rauskommen?
Außerdem kommt wenn ich zb. 12345 ein falscher Turm.
Da ist der Anfang und Endwert auf einmal anders.
Es wird eine Integerdivision durchgeführt, Nachkommastellen werden abgeschnitten. Ansonsten: Was gibst du ein, was kommt raus und was sollte deiner Meinung nach rauskommen?

Gruß
 
Hi.
Versuch doch mal bitte dein Problem genauer zu beschreiben. Was soll das bedeuten? Was gibst du ein, was kommt raus und was sollte deiner Meinung nach rauskommen?

Es wird eine Integerdivision durchgeführt, Nachkommastellen werden abgeschnitten. Ansonsten: Was gibst du ein, was kommt raus und was sollte deiner Meinung nach rauskommen?

Gruß
Wenn ich 1234567 angebe dann steht bei mal 8 eine zahl mit einem Minus.
Also ist anscheinend der Wertebereich zu klein.
Gibt es noch einen größerem Typ?


Wenn ich die Zahl 12345 eingebe steht bei x1 12345, das ist ja richtig, aber zum SChluss steht 509, obwohl ja eigentlich 12345 herauskommen sollte.
Wenn ich zum Beispiel mit 123 rechne steht am Anfang 123 und am Ende auf 123 wie es auch sein sollte.



mfg
 
Wenn ich 1234567 angebe dann steht bei mal 8 eine zahl mit einem Minus.
Also ist anscheinend der Wertebereich zu klein.
Gibt es noch einen größerem Typ?


Wenn ich die Zahl 12345 eingebe steht bei x1 12345, das ist ja richtig, aber zum SChluss steht 509, obwohl ja eigentlich 12345 herauskommen sollte.
Wenn ich zum Beispiel mit 123 rechne steht am Anfang 123 und am Ende auf 123 wie es auch sein sollte.
Von welchem Programm sprichst du? Bei dem Programm aus deinem ersten Beitrag muss man 2 Zahlen eingeben. Also: was gibst du ein? Kopier doch einfach den Text aus der Eingabeaufforderung, dann kann jeder sehen was eingegeben und was ausgegeben wurde.

Code:
Mit dieser Zahl soll gerechnet werden: 12345
Bis so weit soll er gerechnet werden: 8
1x | 12345
2x | 24690
3x | 74070
4x | 296280
5x | 1481400
6x | 8888400
7x | 62218800
8x | 497750400
2/ | 248875200
3/ | 82958400
4/ | 20739600
5/ | 4147920
6/ | 691320
7/ | 98760
8/ | 12345
Gruß
 
Sorry dass cih so lange nciht geschrieben habe.

Der derzeitige Code ist im Anhang.
Ein bisschen etwas hat sich verändert.

Jetzt zu meinem Screen:
screenshot.jpg


Wo liegt das Problem?
 

Anhänge

Hi.

Warum kopierst du denn nicht einfach den Text aus dem Kommandofenster hier rein? Der Screenshot ist kaum zu lesen.

Warum hängst du deinen Quelltext als Anhang an und fügst ihn nicht einfach in Code-Tags hier ein?

Warum formatierst du deinen Quelltext nicht ordentlich?

Das Problem wurde ja schon erläutert. Es kommt zu einem Überlauf. Dagegen kannst du nichts machen. Du könntest höchstens den Typ "unsigned long long" verwenden, dann tritt das Problem erst später auf.

Oder du verwendest eine Bibliothek (wie z.B. GMP) die das Rechnen mit Zahlen beliebiger Genauigkeit ermöglicht.

Gruß
 
Zurück