Felder vergleichen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bluejuce

Betreff: Felder vergleichen

BeitragMo, Okt 05, 2009 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo erstmal,


Um mich besser mit BlitzBasic vertraut zu machen, hatte ich mir gedacht, versuche ich mich an einem Lottoprogramm, da ich versuche den Umgang mit Schleifen , Vergleichen, Feldern und Dateien besser zu verstehen und zu lernen.

Mein Problem:

Bei jedem Programmstart, werden vom Nutzer 6 Zahlen eingegeben. Diese werden mit 49 anderen Zahlen aus einem Feld, die vorher aus einer Datei eingelesen wurden, verglichen. Bei gleichen Zahlen wird der Häufigkeitswert um 1 erhöht und in der Datei wieder abgespeichert. Bis hier klappt alles sehr gut.
Jetzt soll aber das Programm alle 49 Felder miteinander Vergleichen und die 6 Zahlen mit dem höchsten Häufigkeitswert ausgeben, ohne das zweimal die gleiche Zahl vorkommt.
Bis jetzt ist mir keine Lösung dazu eingefallen. Ich hatte es mit einer For/Next Schleife probiert. Bei den ersten Durchgängen klappte auch das. Aber später wurden nur noch zwei und dann keine Zahl mehr angezeigt. Ich hoffe, jemand kann mir weiterhelfen.
Grüsse

M0rgenstern

BeitragMo, Okt 05, 2009 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne Code glaube ich, wird dir hier niemand helfen können.
Hier im Forum gibts Leute die programmieren können, aber hellsehen können wir nicht^^

Lg, M0rgenstern
 

Bluejuce

BeitragMo, Okt 05, 2009 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh natürlich, tut mir Leid.
Hier der Code:

Code: [AUSKLAPPEN]

Dim feld(98)
datei = OpenFile("C:\lotto\lottozahlen.txt")

Global top1$=0
Global top2$=0
Global top3$=0
Global top4$=0
Global top5$=0
Global top6$=0


For i=1 To 49
zeile$=ReadLine(datei)
zahl1 = zahlausstring(zeile$, 1)
zahl2 = zahlausstring(zeile$, 2)
feld(i)= zahl1
feld(i+49)= zahl2
Next


For i=1 To 9
Print feld(i) + " " + feld(i+49) + " " + "mal gezogen"
Next

WaitKey:Cls:Locate 0,0


Print "Möchtest du neue Lottozahlen eintragen?: (j/n)"
WaitKey
If KeyHit (36) Then
Print
nzahl1$=Input("Zahl 1:")
nzahl2$=Input("Zahl 2:")
nzahl3$=Input("Zahl 3:")
nzahl4$=Input("Zahl 4:")
nzahl5$=Input("Zahl 5:")
nzahl6$=Input("Zahl 6:")

EndIf



For i=1 To 49

If nzahl1 = feld(i) Then feld(i+49)=feld(i+49)+1
If nzahl2 = feld(i) Then feld(i+49)=feld(i+49)+1
If nzahl3 = feld(i) Then feld(i+49)=feld(i+49)+1
If nzahl4 = feld(i) Then feld(i+49)=feld(i+49)+1
If nzahl5 = feld(i) Then feld(i+49)=feld(i+49)+1
If nzahl6 = feld(i) Then feld(i+49)=feld(i+49)+1

Next

SeekFile datei,0
For i = 1 To 49
WriteLine datei, feld(i) +"," +feld(i+49)
Next

CloseFile datei


Cls:Locate 0,0
Print "Die besten Zahlen:"
Print
For i=1 To 49
If feld(i+49)< feld(i+49) Then  Print feld(i)
Next

WaitKey

If KeyHit (49) Then

Color 255,0,0
Print "Press Return"
WaitKey
EndIf

End

Function zahlausstring(zahlstring$, stelle)
anzahl = 1
letzteskomma = 1
For i = 1 To Len(zahlstring$)
If Mid(zahlstring$, i, 1) = "," Or i = Len(zahlstring$) Then
If anzahl = stelle Then zahl = Mid(zahlstring$, letzteskomma, i)
letzteskomma = i + 1
anzahl = anzahl + 1
EndIf
Next
Return zahl
End Function

M0rgenstern

BeitragMo, Okt 05, 2009 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
ALso, ich muss ehrlich sagen, dass ich teilweise wirklich nicht weiß, was du mit deinem Code bezwecken willst.
Achso, und die Abfrage Code: [AUSKLAPPEN]
Print "Möchtest du neue Lottozahlen eintragen?: (j/n)"
WaitKey
If KeyHit (36) Then
Print

ist irgendwie schlecht gewählt.
Denn wenn man ne andere Taste drückt, dann springt er sofort zur For SChleife.

Dann: Warum deklarierst du Variablen, die du nicht benutzt? Code: [AUSKLAPPEN]
Global top1$=0
Global top2$=0
Global top3$=0
Global top4$=0
Global top5$=0
Global top6$=0




Also, mal ne Lösung wie ichs machen würde, mit Pseudocode (Zufallszahlen. Also ohne ne Datei auszulesen und jetzt einfach alle Zahlen von 0 bis 100):

Code: [AUSKLAPPEN]

Dim Gezogen(48)
Dim Spielerwahl(5)
Dim Haeufigkeit(5, 1)

for i = 0 to 48
          Gezogen(i) = rand(0,100)
next

for a = 0 to 5
          Print "Bitte gib deine " + a + ". Zahl ein: "
          Spielerwahl(a) = Input$()
          Haeufigkeit(a, 0) = Spielerwahl(a)
          Haeufigkeit(a, 1) = 0
next

for a = 0 to 5
 for i = 0 to 48
          If Spielerwahl(a) = Gezogen(i) then Haeufigkeit(a,1) = Haeufigkeit(a,1) + 1
 next
next



Als Denkanstoß^^

TimBo

BeitragMo, Okt 05, 2009 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

wenn du schon weißt, welche Zahl, welche Häufigkeit hat, dann musst du diese doch nur noch der Häufigkeit nach Sortieren.

Such mal nach Suchalgorithmen
Quicksort soll ganz gut sein, von Bubblesort ist eher abzuwenden.

SuFu hilft dabei auch Smile

Hoffe ich konnte dir helfen.

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Midimaster

BeitragSa, Okt 10, 2009 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn es nur darum geht, aus einem Feld mit 49 Elementen, die 6 herauszupicken, die am häufigsten vorkommen, ist es einfach dadurch möglich, dass ein bereits "auserwähltes Feld" in seiner Häufigkeit auf -999 gesetzt wird und dann bei der nächsten Suche nicht mehr "stört". War es das, was Dir Schwierigkeiten bereitst hatte? Ganz klar ist mir nicht, wieso bei den weiteren Durchgängen nicht mehr 6 Ergebnisse angezeigt werden konnten. Hab ich die Frage verstanden?

Beispiel:
Du kopiert zuerst das Original-Feld auf ein 2.Feld, damit du eines zum kaputtmachen hast. Dann durchsuchst Du das 2. Feld und zerstörts immer den max-Wert. So durchläufst Du das ganze 6x:

Code: [AUSKLAPPEN]

' zufalls-häufigkeiten simulieren deine Datei:
For i%=1 To 49
   OriginalFeld%[i]=Rand(0,100)
Next


'jetzt geht es los

' Schritt 1:     Kopie auf ein 2.Feld
For i%=1 To 49
   Feld%[i]=OriginalFeld%[i]
Next

' Schritt 2 :   Durchsuchen

For I%=1 To 6
   Maxi=-1
   For J%=1 To 49
   'suchlauf nach der größten zahl
      If Feld[j]>Maxi Then
         Maxi=Feld[j]
         Wo=j
      EndIf
   Next
   ' jetzt merken
   WieOftWarEs[i]=Maxi
   WoWarEs[i]=Wo
   
   'Dieses Feld heruntersetzen
   Feld[Wo]=-999
   
   Print "Platz " + i + " ist die Zahl " WoWarEs[i] + "  mit " + WieOftWarEs[i] + " mal"
Next

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group