[C#] Problem mit Arrays

nachtfrost23

Lieutenant
Registriert
März 2008
Beiträge
644
Hi, ich bin im Moment dran, einen Lottoautomaten zu programmieren.
Dabei funktioniert leider ein Teil nicht.
Ich hoffe ihr könnt mir erklären, was falsch ist.

Global deklariert:
Code:
int [] lotto;
Erster Button: Startet "Ziehung"
Code:
lotto= new int [7];
timer1.Enabled=true;
timer1: "Ziehung" der Zahlen
Code:
int i=0;
lotto[i]=ziehung(49);
zähler++;
i++;
if(zähler>7)
{
     timer1.Enabled=false;
}
Zweiter Button: Zum Anzeigen der "gezogenen" Zahlen
Code:
zähler=0;
label1.Text=Convert.ToString(lotto[0]+"; "+lotto[1]+"; "+lotto[2]+"; "+lotto[3]+"; "+lotto[4]+"; "+lotto[5]+"; "+lotto[6]);

Das Problem: Wenn ich Zahlen ziehe und dann auf Button2 klicke wird nur für die erste Zahl ein Ergebnis angezeigt. Für alle anderen Zahlen kommt "0" heraus (siehe Bild).
Ich hoffe ihr versteht mich, ansonsten fragt einfach, was ich noch erklären muss.
LG, nachtfrost
 

Anhänge

  • Fehler.JPG
    Fehler.JPG
    3,2 KB · Aufrufe: 177
ach ist doch klar...

Code:
int i=0;
lotto[i]=ziehung(49);
Wie soll da jemals was anderes als lotto[0] belegt werden?

Besser:
Code:
lotto[zähler]=ziehung(49);
zähler++;
if(zähler>=7)
{
     zähler = 0;  // für nächsten Lauf gleich auf 0 setzen
     timer1.Enabled=false;
}

Zähler muss halt so mit 0 initialisiert werden
 
Zuletzt bearbeitet:
Meinst du das Ernst 1668mib? Wird in deinem Beispiel denn etwas anderes als lotto[0] belegt? :)
Wie GuardianAngel gesagt hat => Zählschleife und darin dann die Lottofelder belegen.

Um das dann vollständig zu machen:

Code:
for(int i = 0; i < lotto.length; i++)
{
  lotto[i]=ziehung(49);
  
}
timer1.Enabled=false;
 
Zuletzt bearbeitet:
Oh man,... das war aber auch echt dumm. :-D
Danke für die Hilfe, mit 1668mib's Methode geht es jetzt.

Bei der Schleife brauch ich doch gar keinen Timer mehr oder?
Die läuft ja eh nur einmal durch.
 
wieso machst du mit einem timer eine schleife??? wie viel programmiererfahrung hast du?
 
@GuardianAngel: Er will nicht alle Zahlen auf einmal ziehen sondern eine nach der anderen... im Grunde ist es egal, schließlich könnte man auch lediglich die Anzeige zeitverzögern...

Dass er nicht viel Erfahrung hat, dürfte offensichtlich sein.

@ecsil: Ja, schließlich handelt es sich um die Timer-Funktion.
Bei deinem Code frage ich mich, wieso man überhaupt noch nen Timer braucht dann...
 
Ich habe sehr wenig Erfahrung, da ich es nur in der Schule, 2 Stunden die Woche und dazu noch in einem äußerst langsamen Kurs lerne. Alles was ich über Arrays weiß hat mir mein Lehrer auf Nachfrage in lediglich 10min erklärt.

Zum Thema:
Die Methode von 1668mib funktioniert,
Das mit der Schleife jedoch nicht.
Ich habe die einfach in die Funktion von Button1 mit eingefügt:
Code:
void Button1Click(object sender, System.EventArgs e)
		{
			lotto= new int [7];
			//timer1.Enabled=true; wird ja nicht benötigt
			for(int i=0; i>lotto.Length; i++)
			{
 				lotto[i]=ziehung(49);
  
			}
		}
So werden alle Zahlen 0...

Danke für alle Antworten. :daumen:
 
Zuletzt bearbeitet:
dein fehler:

for(int i=0; i>lotto.Length; i++)

das muss < heissen, der teil dient als bedienung, d.h. die schleife läuft nur so lange wie der ausdruck true zurück gibt
 
Wieder so ein dummer Fehler... Danke

Edit: Jetzt kommt wieder der gleicher Fehler, wie der, den ich schon oben beschrieben habe.
Alle Zahlen sind gleich.

Das liegt dann daran, dass random mit Hilfe der Systemzeit berechnet wird und bei einer Schleife berechnet der Computer die so schnell, dass sie alle zur gleichen Zeit (daher gleiches Ergebnis) berechnet werden, oder?
 
Zuletzt bearbeitet:
Nein, Unsinn. Zeig mal her was deine komische "Ziehung" funktion macht, da findet sicherlich die zufallszahlen generierung statt oder? zeig her und wir gucken.
 
Wow soviel Geduld und Freundlichkeit :)
Code:
int ziehung (int a)
		{
			Random zufall=new Random();
			return zufall.Next(a);
		}
 
Da hammer doch das Problem.
Dadurch das du das Random Objekt jedes mal neuerzeugst, entstehen gleiche zahlen. Du solltest das Random Objekt einmal in deklarieren und definieren und dann in der Ziehe funktion nur noch random.Next aufrufen. ;)
 
Kannst du das mal den Code dafür posten? Ich habe das gerade probiert, aber hab es nicht hinbekommen. Ich soll doch "Random zufall=new Randowm()" wo anders hinschreiben!?
 
Deine Ziehung funktioniert eh nicht wirklich... schließlich wird beim Lotto nicht zurückgelegt... eine bereits gezogene Zahl ist aus der Urne. zufall.Next(a) berücksichtigt dies nicht.

das beste wäre eigentlich eine Funktion wie diese
Code:
// zufall außerhalb der Funktion als Klassenvariable definieren
Random zufall = new Random();

int[] ziehung(int bereich, int menge)
{
  if (menge > bereich) {
    return null; // kann nicht sein dass beim Lotto z.B. 55 Ziehungen gemacht werden...
  }

  int[] result = new int[menge];
  for (int i = 0; i < menge; i++) {
    int zahl = zufall.Next(bereich)+1;
    while (result.Contains(zahl)) zahl = zufall.Next(bereich)+1;
    result[i] = zahl;
  }
  return result;
}
 
Zuletzt bearbeitet:
Über das Problem mit dem Zurücklegen, hatte ich mir am Anfang mal Gedanken gemacht, aber da ich ".Contains" noch nicht kannte, wusste ich nciht wie ich das machen soll.
Danke also dafür.
Mit der Funktion kann man jetzt aber aus einer beliebigen Anzahl ("bereich") "Kugeln" eine beliebige Menge ("menge") herrausziehen, ist das richtig so?
Für mein Programm kann ich die Werte dann doch auf 49 und 7 festlegen.

Edit:Oh, sehe gerade C# kennt ".Contains" garnicht...
 
Wenn ich das richtig gelesen habe, gibt es Listen erst ab 2.0, wir programmieren aus irgendwelchen seltsamen Gründen in der Schule mit 1.1.
Gibt es noch eine andere Möglichkeit, einen Array auf seinen Inhalt zu überprüfen?

Edit:
Habe mir jetzt was zurechtgebastelt, leider funktioniert es nicht :-D, d.h. es kommen immer noch Doppler vor.
Code:
int[] ziehung(int bereich)
		{
			bool doppelt=false;
			int zahl=0;
			for(int i=0; i<7; i++)
  			{
				zahl = zufall.Next(bereich)+1;
    			while(doppelt==false)
    			{
    				zahl = zufall.Next(bereich)+1;
    				doppelt=doppler(zahl);
    			}
    			result[i]=zahl;
  			}
  		return result;
		}
Code:
bool doppler(int zahl)
		{
			for(int i=0; i<7; i++)
			{
				if(result[i]==zahl)
				{
					return false;
				}
			}
			return true;
			
		}

Tut mir Leid, falls es wieder ein simpler Flüchtigkeitsfehler ist.
Jetzt gibts erstmal Muttertagskaffe :) schönen Sonntag euch.

Edit2:Das Problem war das wenn die erste Zahl noch nicht im Array vor kam (und das ist ja immer der Fall), wurde "doppler" nicht zurückgesetzt.
So gehts
Code:
int[] ziehung(int bereich)
		{
			bool doppelt;
			int zahl=0;
			for(int i=0; i<7; i++)
  			{
                                doppelt=false;  [COLOR="DarkOrange"]/*Das muss noch hin.*/[/COLOR]
				zahl = zufall.Next(bereich)+1;
    			while(doppelt==false)
    			{
    				zahl = zufall.Next(bereich)+1;
    				doppelt=doppler(zahl);
    			}
    			result[i]=zahl;
  			}
  		return result;
		}
 
Zuletzt bearbeitet:
Zurück
Oben