lotto
-
Hi!
Ich soll folgendes Programm schreiben. Jedoch habe ich noch nie mit Vektoren gearbeitet und weiß überhaupt nicht wie ich vorgehen soll. Dann können mir auch nicht die Tipps aus der Aufgabenstellung helfen. Vielleicht wisst ihr ja was!?
Programm lotto soll einen Lottotipp erzeugen, also 6 Randomzahlen zwischen 1 und 49, die alle voneinander verschieden sind.
Bei jedem Aufruf von lotto soll ein neuer Tipp erzeugt werden, und die Lottozahlen sollen aufsteigend geordnet folgendermaßen ausgegeben werden:
Meine Lottozahlen sind: 3 13 24 27 34 49
Es reicht nicht, den Randomgenerator im Bereich 1 bis 49 sechs mal aufzurufen, denn es könnten Zahlen mehrfach vorkommen. Man muß also jede neue Zahl mit den bereits ''gezogenen'' vergleichen.
Gehen Sie so vor:
* Legen Sie einen Vektor zahl mit 50 Komponenten an, die alle mit 0 initialisiert werden.
* Nun erzeugen Sie in einer while- (oder for-) Schleife Randomzahlen zwischen 1 und 49:
o Benutzen Sie die Randomzahl als Index für zahl, und setzen Sie die entsprechende Komponente auf 1.
o Prüfen Sie aber zuvor, ob diese Komponente nicht schon den Wert 1 hat. Dann nämlich wurde die Zahl bereits ''gezogen'', und Sie müssen einmal mehr durch die Schleife gehen.
* Anschließend gehen Sie den Vektor zahl von vorn nach hinten durch. Die Lottozahlen sind genau die Indizes, deren Komponenten den Wert 1 haben.
Bis jetzt habe ich das hier, leider können dann noch doppelte Zahlen vorkommen.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> main() { int zahl[50]; int i; srand(getpid()); for (i = 1; i <= 7; i++) { printf("%2d ", 1+rand()%49); } }
-
Du solltest versuchen, die Aufgabenstellung Stück für Stück durchzuarbeiten. Deine Lösung hat damit ja bislang nur wenig zu tun.
Zu STL-Containern wie std::vector gibts z.B. hier was zu lesen:
http://magazin.c-plusplus.net/artikel/Aufbau der STL - Teil 1%3A Container
-
Du musst wissen, ich bin absoluter C-Anfänger.
Mit Deinem Link kann ich nicht wirklich was anfangen, da dort viel zu viel neues drin steht. Trotzdem danke für den Tipp.
-
Erstes Random- Gebot:
DU SOLLST NICHT RANDOM DURCH MODULO ERZEUGEN!Das Vektor/Komponentengefasel ist jetzt einfach etwas überkanditelte Bezeichnung, aber gemeint ist, daß Du so lange würfelst, bis Du eine Zahl "erwischt" hast, deren "Fach" in Array noch nicht belegt ist. Das ganze, bis sieben "Fächer" gefüllt sind.
Sortierte Ausgabe ist dann simpel, Du gibst einfach die Indices der belegten Fächer aus.
Eigentlich ist das eh' schon eine step-by-step Implementationsanleitung ...Genug Hinweise?
-
_matze schrieb:
Zu STL-Containern wie std::vector gibts z.B. hier was zu lesen:
mit 'vektor' ist hier einfach nur 'array' gemeint.
-
+fricky schrieb:
_matze schrieb:
Zu STL-Containern wie std::vector gibts z.B. hier was zu lesen:
mit 'vektor' ist hier einfach nur 'array' gemeint.
Jaaam habs eben auch gerafft...
-
_matze schrieb:
+fricky schrieb:
_matze schrieb:
Zu STL-Containern wie std::vector gibts z.B. hier was zu lesen:
mit 'vektor' ist hier einfach nur 'array' gemeint.
Jaaam habs eben auch gerafft...
Wirklich? Im ANSI-C- Forum mit STL- Kram loszulegen ist schon ein starker Einstieg
... Werden wohl die ungewöhnlich hohen Temperaturen sein: Das Hirn fängt an zu kochen und rinnt zu den Ohren raus ...
-
pointercrash() schrieb:
Werden wohl die ungewöhnlich hohen Temperaturen sein: Das Hirn fängt an zu kochen und rinnt zu den Ohren raus ...
Das isses. Ich sitz auch direkt am Fenster, und links und rechts von mir bilden sich schon seltsam dickflüssige Pfützen...
-
Man merkt wohl sehr schnell wie wenig Ahnung ich von C bis jetzt habe.
Mache einen "freiwilligen" C-Kurs für Anfänger, jedoch sitzen dort nur Freaks drin, die bei der Vorlesung die Aufgaben innerhalb von Sekunden lösen.Nun zu meinem Problem: Ich versteh nicht, wie ich die Randomzahlen erzeugen soll, ohne das sie doppelt vorkommen. Komme mit diesem Vektor/array nicht klar. Initialisiert habe ich den Vektor ja, nur weiß ich nicht, wie ich ihn in die Randomschleife reinbekomme?
Oder besser gesagt:
Das Vektor/Komponentengefasel ist jetzt einfach etwas überkanditelte Bezeichnung, aber gemeint ist, daß Du so lange würfelst, bis Du eine Zahl "erwischt" hast, deren "Fach" in Array noch nicht belegt ist. Das ganze, bis sieben "Fächer" gefüllt sind.
=> Wie geht das hier???
-
Hulio19 schrieb:
Komme mit diesem Vektor/array nicht klar. Initialisiert habe ich den Vektor ja, nur weiß ich nicht, wie ich ihn in die Randomschleife reinbekomme?
die aufgabe in anderen worten: du sollst für jede gezogene zahl ein array-element auf 1 setzen. ist es schon 1, dann wiederholst du die ziehung, bis du 6 einsen setzen konntest. hört sich doch einfach an, oder?
lösche array setzte zähler auf 0 schleife: solange der zähler ungleich 6 ist ziehe zufallszahl wenn array[zufallszahl] 0 ist dann setze array[zufallszahl] auf 1 und zähle zähler hoch schleife ende gib den index aller array-elemente aus die 1 sind fertig.
-
Theoretisch ist es einfach.
Ich weiß trotzdem nicht wie man es in C schreibt.
Bekomme immer nur diverse Fehlermeldungen.Könntest Du mir bitte sageb, wie ich diese Schleife in C schreibe. Versuche den Rest dann alleine zu packen. Und danach muss ich noch eine pi-Aufgabe lösen.
Das alles bei dem Wetter!!!PS: Das hier ist alles was mir zu Vektoren erklärt wurde:
2.12 Vektoren
Ein Vektor ist eine Folge von Objekten desselben Typs, die im Speicher unmittelbar hintereinander liegen.
Ein Vektor wird dadurch definiert, daß in der Variablendefinition hinter den Namen in eckigen Klammern eine Längenangabe geschrieben wird.
Z.B. definiert die Anweisung:
int vek[3];
einen Vektor mit 3 Komponenten.
Die einzelnen Komponenten werden wie Variablen benutzt, indem der Komponentenindex in eckigen Klammern dahinter geschrieben wird.
Dabei ist zu beachten:
* In C beginnen Vektoren immer mit dem Index 0.
Also können folgende Komponenten angesprochen werden:
vek[0] = 1;
vek[1] = 3;
vek[2] = 5;Will man einen Vektor mit 1 beginnen lassen, so muß man ihn um 1 größer machen und die Komponente 0 unbenutzt lassen.
Im folgenden Programm wird auf diese Art ein Vektor mit Quadratzahlen besetzt:
/*vektor.c*/
main() {
int i, v[11]; /*höchster Index: 10*/for (i = 1; i <= 10; ++i)
v[i] = i*i;
}Vektoren können auch mit Anfangswerten versehen werden. Dazu schreibt man die Werte als Liste in geschweifte Klammern. Enthält die Liste weniger Elemente als der Vektor, so werden die restlichen Vektorelemente auf 0 gesetzt:
int v[3] = {1, 2, 3}; /*v[0] = 1, v[1] = 2, v[2] = 3*/
int w[3] = {1}; /*w[0] = 1, w[1] = 0, w[2] = 0*/
-
Es reicht nicht, den Randomgenerator im Bereich 1 bis 49 sechs mal aufzurufen, denn es könnten Zahlen mehrfach vorkommen.
Ja das ist korrekt, dafuer gibt es eine Loesung:
1. Erzeuge ein Array mit den Zahlen 1 bis 49.
Erster Durchlauf:
2. Wuerfel eine Zahl zwischen 0 und 48 (Index im Array)
3. Vertausche Inhalt an Position 0 mit dem Inhalt des gerade gewuerfelten IndexesZweiter Durchlauf:
4. Wuerfel eine Zahl zwischen 1 und 48 (Index im Array)
5. Vertausche Inhalt an Position 1 mit dem Inhalt des gerade gewuerfelten Indexes
...Abschliessend: gebe die ersten fuenf Elemente aus.
Ich hoffe es wird prinzipiell klar, alternativ kannst du auch nach random shuffle suchen.
edit: ich war wohl zu langsam ...
-
Hulio19 schrieb:
Könntest Du mir bitte sageb, wie ich diese Schleife in C schreibe.
ich würde 'ne while-schleife nehmen, geht aber im prinzip mit jeder anderen auch.
hier (ab der mitte etwa), schleifen in C: http://info.baeumle.com/c06.html
-
Gebe es auf. Bringt nichts. Trotzdem danke!
-
Hulio19 schrieb:
Gebe es auf. Bringt nichts.
du gibst auf?! mit den infos hier sollte man's doch hinbekommen. zeig doch mal dein programm und wo's zickt.
-
+fricky schrieb:
Hulio19 schrieb:
Komme mit diesem Vektor/array nicht klar. Initialisiert habe ich den Vektor ja, nur weiß ich nicht, wie ich ihn in die Randomschleife reinbekomme?
die aufgabe in anderen worten: du sollst für jede gezogene zahl ein array-element auf 1 setzen. ist es schon 1, dann wiederholst du die ziehung, bis du 6 einsen setzen konntest. hört sich doch einfach an, oder?
lösche array setzte zähler auf 0 schleife: solange der zähler ungleich 6 ist ziehe zufallszahl wenn array[zufallszahl] 0 ist dann setze array[zufallszahl] auf 1 und zähle zähler hoch schleife ende gib den index aller array-elemente aus die 1 sind fertig.
1. lösche array (zahl[0]=0?)
2. setze zähler auf 0 (i=0)?
3.schleife:
while (i!=7)
...und danach geht nix mehr.
PS: Ich hatte bis jetzt 3 h C-Kurs. Und vorher noch nie programmiert!
-
Lösche Array:
/* Du musst zu jedem Element gehen und es auf 0 setzen */ for (i = 0; i < 50; i++) array[i] = 0;
Setze Zähler auf:
i = 0;
Schleife:
for (i = 0; i < 6; i++) { ... }
oder
while (i != 6) { ... i++; }
-
Hulio19 schrieb:
1. lösche array (zahl[0]=0?)
`int array[50];
memset (array, 0, sizeof(array));
`
Hulio19 schrieb:
2. setze zähler auf 0 (i=0)?
so ähnlich:
int z = 0;
Hulio19 schrieb:
3.schleife:
while (i!=7)`while (z != 6)
{
... // hier zufallszahl ziehen, array-element setzen (oder nicht) und zähler hochzählen (oder nicht)
}
`
Hulio19 schrieb:
Ich hatte bis jetzt 3 h C-Kurs. Und vorher noch nie programmiert!
dann musste noch üben. kopf hoch, das klappt schon.
-
int array[50];
memset (array, 0, sizeof(array));Geht das auch anders. So was haben wir ja nicht gelernt und wenn ich dann mit so ner Lösung komme wundert sich der Typ bestimmt.
So sieht es bis jetzt aus:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> main() { int zahl[50]; int i; srand(getpid()); for (i = 0; i < 50; i++) zahl[i] = 0; i=0; for (i = 0; i < 6; i++) { printf("%2d ", 1+rand()%49); } }
-
^^das ist doch schon mal was. der schleifenzähler sollte aber nicht automatisch weiterzählen, sondern nur, wenn du ein array-element auf 1 setzen konntest d.h. schleifenkopf abändern zu: for (i = 0; i < 6;). ach ja, und statt des printf("%2d ", 1+rand()%49); in der schleife setzt du nun die array-elemente:
if (!array[zufall]) { array[zufall] = 1; i++; }