Möglichkeiten berechnen.
-
Ich habe ein Programm geschrieben das ausgeben soll wie viel Möglichkeiten es gibt mit X Kreuzen verschieden Felder auszuwählen bzw. Stellen des X.
#include <iostream> class Daten { public: double Anzahl_n; double Anzahl_k; double ergebnis; }; using namespace std; double n; double k; double New_Sub_k; double New_k; double New_n; double New_Sub_n; int main() { Daten RNG; cout << "Gebe ein wie viel Moeglichkeiten es gibt" << endl; cin >> RNG.Anzahl_n; cout << "Gebe ein wie viel Moeglichkeiten auswaehlbar sind" << endl; cin >> RNG.Anzahl_k; void Ausgabe(); { RNG.Anzahl_n = n; RNG.Anzahl_k = k; New_k = n - k; double i = New_k; while(i == 0) { double minus1 = i - 1; double New_Sub_k = k * minus1; } double j = New_n; while(j == 0) { double minus2 = j - 1; double New_Sub_n = New_k * minus2; } RNG.ergebnis = New_Sub_n / New_Sub_k; } cout << RNG.ergebnis << endl; cout << endl; cin.get(); }leider gibt es nur anstatt das Ergebnis was beispiels weiße bei 10 Feldern und 3 Kreuzen = 720 wäre.
Nichts aus es bleibt an der Schleife hängen.. und kommt in eine Endlosschleife so wie ich das sehe. Was ist falsch?
-
Also ich habe das hier:
Die Lösung der Aufgabe hängt von der Anzahl n der anzukreuzenden Felder ab (hier 10) sowie von der Anzahl k der Kreuze, die man machen darf (k muss selbstverständlich kleiner oder gleich n sein). . In der Sprache der Kombinatorik, dem zugehörigen Teilbegiet der Mathematik, nennt man ein derartiges Auswahlproblem "Variation ohne Zurücklegen". . Für die Anzahl Z der Möglichkeiten für eine solche Auswahl gilt: Z = n! / (n-k)! (! ist die übliche Schreibweise für die Fakultätsfunktion) . Habe ich also n = 10 Felder und soll k = 3 davon ankreuzen, dann ergibt sich: Z = 10! / (10-3)! = 10! / 7! = (10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1) / (7 * 6 * 5 * 4 * 3 * 2 * 1) = 720probiert in ein Programm umzusetzen.
-
Ich würde dir, nur als Tipp am Rande, dringendst davon abraten, alle deine Variablen als
doublezu deklarieren. Das sind Fließkommazahlen und die brauchst du in der Kombinatorik definitiv nicht! Da wunderst du dich nur, warum irgend wann ein ziemlicher Müll dransteht. Nimm lieberlong longals Datentyp, wenn es um sehr große Zahlen gehen soll.
-
Dein i und dein j werden in der Schleife nicht verändert. Darum werden sie auch nie ungleich 0.
Außerdem: Dein Code quillt geradezu über vor Fehlern und ungewöhlichen Konstrukten, ich weiß gar nicht wo ich anfangen soll. Da es schon spät ist, überlasse ich das mal dem nächsten Helfer.
-
while(i == 0) { i - 1; double New_Sub_k = k * i; }und
while(j == 0) { j - 1; double New_Sub_n = New_k * j; }jetzt sollte doch das j jedes mal um 1 Zahl vermindert werden und irgend wann gleich Null sein oder nicht?
und das kann ich dann ja gleich für new_k * j nutzen so wird jedes mal die Zahl um 1 verkleinert also 10 *9 (9=j)... 10 *8 (8=j).. oder klappt das so nicht?SeppJ ja ich habe probleme mit der Konstruktur
wie ich das alles am beten mache .. aber was für Fehler meinst du genau?
-
progwritter schrieb:
SeppJ ja ich habe probleme mit der Konstruktur
wie ich das alles am beten mache .. aber was für Fehler meinst du genau?Zum Beispiel dass i-1 nicht den Wert von i ändert, sondern dir den Wert von i-1 berechnet. Welcher in diesem Fall einfach im Nirvana landet.
Dann noch die schon angesprochene Verwendung von double.
Die vielen globalen einbuchstabigen Variablen schreien nach Fehlern.
Das struct hat keine ersichtliche Funktion.
Dann das hier:
void Ausgabe();
Was glaubst du, macht das?New_Sub_k und New_Sub_n in den Schleifen sind andere Variablen als die globalen. Das heißt das Ergebnis der Rechnung kommt nie aus der Schleife raus.
Exakter Vergleich bei Fließkommazahlen ist oftmals eine schlechte Idee (hier wirst du Glück haben und es wird funktionieren, aber so allgemein ist das nicht so gut).
Alle globalen Variablen werden uninitilaisiert benutzt. Außer New_k, dieses wird mit zwei uninitialiserten Werten initialisert, was natürlich viel besser ist
.Die Benutzereingabe überschreibst du ein paar Zeilen später unbenutzt mit besagten uninitialiserten Werten.
Und noch einer: Deine Frage nach der Anzahl ist grammatikalisch falsch
.Das war jetzt bloß ein erstes Überfliegen. Wie du siehst, ist da eigentlich nichts zu retten, außer erst einmal etwas mehr C++ zu lernen und dann nochmal neu machen.
So, und nun ist Schluss für heute.
-
Manchmal ist eine Zigarre einfach nur eine Zigarre.
int komb(int n,int k) { int result=1; for(int i=n;i>k-n;--i) result*=i; return result; } int main() { cout << "Gib ein, wie viel Moeglichkeiten es gibt: "; int n; cin >> n; cout << "Gib ein, wie viel Moeglichkeiten auswaehlbar: "; int k; cin >> k; cout << komb(n,k) << '\n'; }
-
volkard schrieb:
Manchmal ist eine Zigarre einfach nur eine Zigarre.
int komb(int n,int k) { int result=1; for(int i=n;i>k-n;--i) result*=i; return result; } ...for (int i = n; i>n-k; --i)
