Variationen ohne Wiederholungen berechnen
-
Hallo,
ich bin neu hier, und weiß nicht ob das hierher gehört.
Ich soll einen c++ code schreiben der Variationen ohne Wiederholungen berechnen kann. Ich wollte es folgendermaßen lösen:#include <iostream> using namespace std; int main() { int fakultaet = 1, eingabe; int eingabe1; cout << "Der Wert n " << endl; cin >> eingabe; cout << " Der Wert k " << endl; cin >> eingabe1; int klammer = eingabe - eingabe1; cout << "n - k " << klammer << endl; int fakultaet1 = klammer; for (int k = klammer; k > 0; k--) int fakultaet1 = klammer * k; cout << "(n -k )! " << fakultaet1 << endl; for (int i = eingabe; i > 0; i--) fakultaet = fakultaet * i; cout << "Das Ergenbis 1 ist " << fakultaet << endl; cout << "Das Endergebnis ist " << fakultaet / fakultaet1 << endl; return 0; }so jetzt die fragen
also der compiler macht ohne murren und rechnet aber das richtige ergebnis bekomme ich nur bei n= 4 und k = 2 ansonsten kommt ein falsches ergebnis.
Die zweite frage ist warum funktioniert nichts mehr wenn ich die variablen ganz am anfang deklariere?MfG
und danke im voraus
-
MMA-E schrieb:
Die zweite frage ist warum funktioniert nichts mehr wenn ich die variablen ganz am anfang deklariere?
Tja, da du ja nur diese fehlerhafte Version zeigst, kann man nur raten: vermutlich nimmst du an, du könntest die Variablen als Formel deklarieren. Das ist falsch. Wenn du a=b*c schreibst, wird das genau in der Zeile mit den dann bekannten Werten ausgerechnet.
Was denkst du passiert hier?
for (int k = klammer; k > 0; k--) int fakultaet1 = klammer * k;
-
Eine bessere Benennung deiner Variablen wäre sehr hilfreich.
Insbesondere könntest du "eingabe" in "n" und "eingabe1" in "k" umbenennen. Diese solltest du sinnigerweise dann an eine Funktion übergeben, die dir das gewünschte Ergebnis berechnet.
Also schreibst du am besten eine Funktion
int variationen_ohne_wdh(int n, int k)(ggf. unsigned long long als Rückgabetyp nehmen, ggf. sogar double, aber int geht auch erstmal, wenn die Zahlen klein genug bleiben).So und dann: ist mit "Variationen ohne Wh" gemeint, dass wie beim Lotto auch die Reihenfolge der gezogenen Zahlen keine Rolle spielen soll? Oder soll die wichtig sein? Wenn die irrelevant ist, musst du noch durch k! teilen.
Jedenfalls solltest du vor der Berechnung der Fakultät ZUERST so viel wie möglich kürzen. D.h. wenn du berechnest, dann berechne NICHT n!, sondern berechne n \times (n-1) \times \dots \times (n-k+1). Die Fakultät wird ansonsten schnell viel zu groß für einen int (oder auch long).
-
MMA-E schrieb:
also der compiler macht ohne murren[...]
Dann schalt mal Warnungen in Deinem Compiler an.
Siehe auch manni66s Posting.
-
okay vielen dank für die Antworten haben mir sehr geholfen, war auf dem Schlauch gestanden. . ... bin ganz neu in der Materie und bitte um Nachsicht

-
Also ich habe es jetzt so gelöst:
#include <iostream> using namespace std; int fakultaet_berechnung(int wert) { int fakultaet = 1; for(int i = wert; i > 0; i--) fakultaet = fakultaet * i; return fakultaet; } int main() { int n,k; cout << "geben sie n ein " << endl; cin >> n; cout << "geben sie k ein " << endl; cin >> k; int klammer = n -k; cout << "die moeglichen variationen " << fakultaet_berechnung(n) / fakultaet_berechnung(klammer) << endl; return 0; }es funktioniert auch alles . ... wollte nur mal eure meinung hören ob man da noch was verbessern könnte? danke

-
MMA-E schrieb:
Also ich habe es jetzt so gelöst: wollte nur mal eure meinung hören ob man da noch was verbessern könnte? danke

Ja. Kleinkram.
- Die Fakultät könnte man constexpr machen (ab C++14 - bei C++11 müsste man dann zur rekursiven Variante gehen). Hat keine Auswirkungen auf dein Programm, aber falls du das mal irgendwo anderweitig einsetzen möchtest, könntest du dann die Fakultät von einem constexpr-Ausdruck schon zur Compilezeit ausrechnen.
- Das return im main (und nur dort) ist überflüssig (schadet aber nicht)
- Wichtig: Das return aus fakultaet_berechnung ist falsch eingerückt
- Benennung. Das ist eher ein genereller Punkt, den ich für etwas relevanter halte. Die Funktion braucht den Namenszusatz "_berechnung" nicht. Nenne sie einfach "fakultaet" oder "factorial". Die Variable, in der du das Ergebnis aufmultiplizierst, würde ich "result" nennen. Den Parameter "wert" hätte ich wahrscheinlich "n" genannt (macht irgendwie klarer, dass es eine natürliche Zahl ist) und die Scheife wäre ich wohl vorwärts durchgelaufen.
- Auf die Variable "klammer" würde ich wohl verzichten,
n-kist einfach genug und man kann die Formel dann im ganzen lesen.