2009-06-23 11 views
0

Dieses Programm nimmt 2 Zahlen von Benutzereingaben, fragt sie, ob sie die Permutationen oder Kombinationen herausfinden möchten, und gibt dann das Ergebnis aus. Hier ist der Code.Permutationen und Kombinationen - Laufzeitfehler

#include "std_lib_facilities.h" 

int permutation(int first, int second) 
{ 
int top_fac; 
int bottom_fac; 
for (int i = first-1; i >= 1; --i) 
    top_fac *=i; 
for (int i2 = (first-second)-1; i2>=1; --i2) 
    bottom_fac *= i2; 
return (top_fac/bottom_fac); 
} 

int combination(int first, int second) 
{ 
int bottom_fac; 
for (int i = second-1; i>=1; --i) 
    bottom_fac *= i; 
return permutation(first, second)/(bottom_fac); 
} 

int main() 
{ 
cout << "Enter two numbers.\n"; 
int first = 0; 
int second = 0; 
cin >> first >> second; 
cout << "Now choose permutation(p) or combination(c).\n"; 
string choice; 
cin >> choice; 
if (choice == "p") 
    cout << "Number of permutations: " << permutation(first,second) << endl; 
else if (choice == "c") 
    cout << "Number of combinations: " << combination(first,second) << endl; 
else 
    cout << "p or c stupid.\n"; 
keep_window_open("q"); 
} 

Wenn ich versuche, das Programm auszuführen, und ich wähle p oder c, erhalte ich eine Meldung „permutations_combinations.exe hat aufgehört zu arbeiten“. Ich habe versucht, einen Fehler zu finden, aber nichts kommt auf. Irgendwelche Ideen?

Vielen Dank im Voraus.

+0

Ich weiß nicht, warum das mit 'Hausaufgaben' getaggt wurde. – Alex

Antwort

4

Sie initialisieren die lokalen Variablen top_fac und bottom_fac nicht innerhalb Ihrer Funktionen. Im Gegensatz zu anderen Sprachen werden lokale Variablen NICHT speziell in C oder C++ initialisiert. Die Werte, die sie erhalten, sind der Müll, der sich beim Aufruf der Funktion auf dem Stapel befindet. Sie sollten top_fac und bottom_fac auf 1 zu Beginn der Funktionen permutation() und combination() explizit initialisieren.

Ich vermute, dass bottom_fac versehentlich auf 0 initialisiert zu werden, und dann sind Sie von 0 am Ende der Funktionsteilung, die die Laufzeitfehler verursachen Sie sehen.

1

Stellen Sie sicher, dass Sie top_fac und bottom_fac initialisieren.

+0

Gah natürlich! Vielen Dank. – Alex

+0

Nun, eigentlich müssen top_fac und bottom_fac auf die erste und zweite initialisieren, da es eine Fakultät berechnet. – Alex

+0

Ah! Ich wurde dann mit "Ihre Schleifen sind um 1" fortfahren. ;-) –

0

Nicht initialisierte Variablen.

0

Ich vermute, dass Ihre Eingaben eine Ihrer for-Schleifen zum endlosen Looping veranlassen. Überprüfen Sie diese sorgfältig.

0

Ein Vorschlag - lernen Sie, wie Sie Ihren Debugger verwenden. Selbst wenn Sie unter Linux entwickeln, haben Sie eine IDE, die Ihnen hilft, durch Ihren Code zu gehen - unter anderem http://monodevelop.com/. Wenn Sie oben in Ihren Funktionen einen Unterbrechungspunkt festlegen, wird Ihnen angezeigt, dass Ihre Variablen nicht initialisiert werden.

+0

Sie brauchen nicht einmal einen Haltepunkt zu setzen - jeder Debugger, der es wert ist, sollte Ihnen einen Stack-Trace von genau dem Punkt geben können, an dem so etwas wie eine segfault/Zugriffsverletzung aufgetreten ist. –

+0

Guter Punkt, obwohl weiß nicht, wie MonoDevelop behandelt unbehandelte Ausnahmen. Volle Debugger-Unterstützung hat es gerade erst geschafft. Und es besteht eine gute Chance, dass diese Frage von einem Schüler kommt, der möglicherweise auf Linux entwickelt. – xanadont

+0

Basierend auf dem Kommentar "permutations_combinations.exe" in der Frage, würde ich stark vermuten, dass das OP unter Windows arbeitet. Und mono ist hier irrelevant, da es sich um C++ handelt. –

Verwandte Themen