Problem mit Ausgabe
-
Hallo,
Ich bringe mir zur Zeit selbst C++ bei und hatte eigentl. bis jetzt keine Probleme damit. Jedoch bin ich in meinem Buch gerade beim Kapitel Vektoren angekommen und versuche gerade einen Kleinen Zufallszahlengenerator zu schreiben. Das Problem ist aber das mir keine Zahlen generiert werden, obwohl der Compiler keine Fehler beim Übersetzen des Codes anzeigt. Vielleicht kann mir ja jemand von euch sagen was ich falsch mache.
#include <iostream> #include <vector> #include <random> using namespace std; int main() { //mt19937 zufall(time(0)); int minimal, maximal, anzahl, summe = 0, kleinste, groeste; double durchschnitt; vector<int> zahlen; cout << "\n\n\n"; cout << "\tZufallszahlengenerator\n\n"; cout << "Anzahl: "; //wie viele Zahlen sollen generiert werden cin >> anzahl; cout << endl; cout << "min: "; //was soll die kleinstmöglichste Zahl sein cin >> minimal; cout << endl; cout << "max: "; //was soll die größtmöglichste Zahl sein cin >> maximal; cout << endl; cout << endl; maximal-=minimal; //minimal wird von maximal subtrahiert for(int i = 0; i == anzahl; i++) { //zahl = zufall(); zahlen.at(i) = rand() %maximal + minimal; summe+=zahlen.at(i); } durchschnitt = summe/anzahl; //durchschnitt der generierten Zahlen wird gebildet for(int i = 0; i == anzahl; i++) //hier soll aus den generierten Zahlen die kleinste ermittelt werden { kleinste = zahlen.at(i); if(zahlen.at(i) < kleinste) { kleinste = zahlen.at(i); } } for(int i = 0; i == anzahl; i++) //hier soll aus den generierten Zahlen die größte Zahl ermittelt werden { groeste = zahlen.at(i); if(zahlen.at(i) > groeste) { groeste = zahlen.at(i); } } cout << endl << "Es wurden " << zahlen.size() << " Zahlen generiert. Die kleinst vorkommenste war " << kleinste << ". Die Größte " << groeste << ". Der Durchschnitt der generierten Zahlen ist " << durchschnitt << endl; return 0; }
Schon mal vielen Dank im voraus.
Mit freundlichen Grüßen
Schlange
-
Schlange schrieb:
Vielleicht kann mir ja jemand von euch sagen was ich falsch mache.
das "==" in den for-Schleifen
-
Hallo,
vielen Dank für deine schnelle Antwort. Wenn ich den Vergleichsoperator "==" durch "<" ersetzte, dann bekomme ich folgende Fehlermeldung:
Terminate called after throwing an instance of ‘std::out_of_range‘ what(): vector::_M_range_check: __n (which is 0) >= this→size() (which is 0)
. Ich denke aber das dies dann eigentlich der richtige Operator sein müsste, da ich Ihn auch schon mal in einen fast identischen Programm ohne fehler benutzen konnte.
-
Schon, aber dein vector ist doch leer, d.h. er hat 0 Elemente, du greifst aber einfach wild auf das erste bis anzahl-te Element zu.
Sieh dir mal an:
vector::resize
oder
vector::reserve und vector::push_backWie du am besten Zufallszahlen im Bereich von minimum bis maximum erzeugst, findet du auf http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution - dort wird von 1 bis 6 erzeugt.
-
wob schrieb:
Schon, aber dein vector ist doch leer, d.h. er hat 0 Elemente, du greifst aber einfach wild auf das erste bis anzahl-te Element zu.
Sieh dir mal an:
vector::resize
oder
vector::reserve und vector::push_backWie du am besten Zufallszahlen im Bereich von minimum bis maximum erzeugst, findet du auf http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution - dort wird von 1 bis 6 erzeugt.
Vielen Dank für die Hilfe. Jetzt geht alles. Werde mir gleich noch die von dir verlinkte Seite zum Thema Zufallszahlen ansehen. Das sieht zwar momentan für mich vom Code her noch ein bisschen Kompliziert aus, aber ich denke das werde ich schon hinbekommen.
-
Schlange schrieb:
Werde mir gleich noch die von dir verlinkte Seite zum Thema Zufallszahlen ansehen. Das sieht zwar momentan für mich vom Code her noch ein bisschen Kompliziert aus, aber ich denke das werde ich schon hinbekommen.
Schau dir lieber nochmal GRÜNDLICH die Kapitel BIS zu den Vektoren an. Hier liegt offenbar noch ein mangelndes Verständnis in Sachen Zugriffen vor...
-
Und unbedingt die for-Schleife.
Damit du begreifst, warum == nicht funktioniert.
-
Und die Division, damit du verstehst, warum
durchschnitt = summe/anzahl; //durchschnitt der generierten Zahlen wird gebildet
nicht den gewünschten Wert liefert. Tipp: der Typ von
durchschnitt
(double) ändert nichts an der Berechnung rechts vom Gleich-Zeichen. Du teilst int durch int, das ergibt int. Um eine double-Division zu erhalten, musst du bereits bei der Division doubles verwenden. (siehestatic_cast
oder multipliziere summe mit 1.0)
-
Noch ein Tip zur
anzahl
-Variable: Eine gute Faustregel fürs Software-Design ist, dass es für jede Information ein einem Programm immer nur eine einzige "autoritative" Instanz geben sollte, welche diese vorhält. In deinem Fall macht es daher Sinn, die Variableanzahl
nur zum einlesen der Anzahl viastd::cin
zu verwenden, und im weiteren stattdessenzahlen.size()
zu verwenden. Die Größe des Vektors ist dann die maßgebende Instanz für die Anzahl der Elemente. Wer sollte es schliesslich besser wissen als der Vektor? Immerhin verwaltet der den Speicher wo die Elemente abgelegt sind und auf den du später zugreifst ;). In diesem Fall wäre den Vektor nicht zu füllen zwar immer noch ein Bug, aber ein deutlich weniger schwerwiegender, als auf einen uninitialisierten Speicherbereich zuzugreifen, der deinem Programm nicht zgewiesen wurde.Analog dazu sollte es auch für jede Problemklasse (oder auch einzelne Probleme) immer nur einen einzigen Algorithmus geben, der das Problem löst - ein schönes Beispiel, wo das nicht der Fall ist, sind so manche IDEs, deren selbstgestrickter Parser manchmal Fehler in Programmen anzeigt, die der Compiler dennoch klaglos schluckt.
Auch deine Schleifen sind eine solche Problemklasse, für den Anfang ist es jedoch völlig in Ordung, das so umzusetzen. Halte aber mal im Hinterkopf, dir Beizeiten mal die Algorithmen der Standardbibliothek im
<algorithm>
-Header anzusehen, wenn du dich sicher genug in den Grundlagen fühlst. Dort gibt es Funktionen, mit denen sich dieses Programm sehr kurz und elegant schreiben lässt.