Gyakorlati alapok

Virtuális ötöslottó

 

Az előző, a Lottózzunk, avagy töltsük ki a telitalálatos szelvényt! című fejezetben megalkottunk egy olyan programot, amelyik kilistázza az összes ötös lottókombinációt, ezáltal segítve minket, hogy megnyerhessük a főnyereményt. Az elméleti előzmény a következő volt:

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

A "hagyományos" állami lottó egy olyan szerencsejáték, amelyben 1 és 90 között kell megjósolni 5 db számot. Egy lottószelvény kitöltésekor matematikailag nézve kombinatorikával kezdünk el játszadozni, pontosabban annak ismétlés nélküli kombinációs képletével, ahol adott  egy 90 elemű halmaz (1 és 90 között), amelyet mindig 5 számmal kombinálgatunk; ennek összkombinációs lehetősége 43.949.268.

 

Az alábbi implementációban az ötös lottó körüli szerencsemizériát egy másik oldalról közelítjük meg. Alkossunk egy olyan programot, amelyik tökéletesen modellezi nekünk az ötös lottó körülményeit, azaz:

A magam részéről utólag határoztam el, hogy a kódot "teljessé" téve a tippek bekérésekor számellenőrzést is implementálok, amitől az eredetileg nem oly bonyolult feladat rém bonyolulttá vált, legalábbis a módszertan jelenlegi szintjén. Ez a kód tehát valójában nehézsége miatt kilóg a Honlaptérképben követhető, felülről lefelé nagyjából szekvenciálisan haladó programozási lépéssorozatból. Ezt mindenképpen számoljuk bele a fejezet feldolgozása során!

 

A számellenőrzés elhatározásával a következő problémákat zúdítottam a nyakamba. A számtipp:

Ugyanakkor a véletlenszám-generálásnál fontos szempont volt, hogy szám többször ne forduljon elő.

 

Ráadásként a módszertan eme szintjén a kódot még nagyobbrészt szekvenciálisan kellett megoldani, amely implementáció szempontjából nem volt optimális, hiszen minél bonyolultabb egy kód, annál inkább van értelme, létjogosultsága a funkciókat különálló, logikailag jól rendszerezhető metódusokba rendezni. Ebből a szempontból az alábbi kód enyhén szólva nem megfelelő, hiszen például benne a buborékrendezés algoritmusa kétszer fordul elő. Később majd látni fogjuk, hogy a külön metódusos kódszerkesztés ezeket a problémákat kiválóan meg fogja szüntetni (Gyakorlati alapok II. (main() + külön eljárás / függvény)).

 

A kód implementációja során felhasználtam szinte az összes elérhető vezérlési szerkezetet és programozás-technikai trükköt:

Érdekes gondolat afelett elmerengni, hogy mennyire életszerűen modellezi le a program az ötös lottó körül tapasztalható valós körülményeket. Ha a szombati lottóhúzás körülményeit tökéletesen kaotikusnak ítéljük (és a közjegyzők annak ítélik, bár vegyük észre, hogy ők nem matematikusok), akkor csakis azt kell megnéznünk, hogy a program által generált véletlenszámok is ilyen kaotikusak-e.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Valóban érdekes kérdés az, hogy egy tökéletesen determinált algoritmus képes-e tökéletesen NEM determinált körülményeket teremteni?

 

Nos, a Java-dokumentációba kissé beleolvasva azt olvashatjuk, hogy a Java-implementáció a  linear congruential generator (LCG) megoldást használja fel, amely úgy tűnik, hogy "elégséges mélységű" pszeudovéletlenszámok generálására.

 

A kód programozási feldolgozása maradjon a Tisztelt Olvasó házi feladata, ha azonban úgy érzi, hogy ez még nem az ő szintje, akkor nyugodtan ugorja át, de később térjen vissza ide. Akit azonban érdekel a következő kvízkérdés, az próbálja meg magában megválaszolni:

 

miért ez a tipptömb inicializálása?

 

tombTipp[0] = -1;
tombTipp[1] = -2;
tombTipp[2] = -3;
tombTipp[3] = -4;
tombTipp[4] = -5;

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


import java.util.*;

public class Main {
public static void main(String[] args) {
    int[] tombTarolo = new int[91];
    System.out.println("A lehetséges lottószámok:");
    for(int i = 1; i < tombTarolo.length; i++) {
        tombTarolo[i] = i;
        System.out.print(tombTarolo[i] + " ");
    }

System.out.println();

Random rnd = new Random();
int[] tombVeletlenSzam = new int[5];
int szamlalo = 0;
while(szamlalo < 5) {
    int szam = rnd.nextInt(90) + 1;
    boolean benneVan = false;
    for(int j = 0; j < szamlalo; j++) {
        if(tombVeletlenSzam[j] == szam) {
            benneVan = true;
        }
    }
    if(benneVan == false) {
        tombVeletlenSzam[szamlalo] = szam;
        szamlalo++;
    }
}

boolean rendezett = false;
while (!rendezett){
    rendezett = true;
    for (int j = 1; j < tombVeletlenSzam.length; j++){
        if (tombVeletlenSzam[j-1] > tombVeletlenSzam[j]){
            int seged = tombVeletlenSzam[j-1];
            tombVeletlenSzam[j-1] = tombVeletlenSzam[j];
            tombVeletlenSzam[j] = seged;
            rendezett = false;
        }
    }
}

System.out.println("\nKérem, hogy adja meg tippjeit (5 db szám 1 és 90 között)!");
int[] tombTipp = new int[5];
tombTipp[0] = -1;
tombTipp[1] = -2;
tombTipp[2] = -3;
tombTipp[3] = -4;
tombTipp[4] = -5;

int tombTippIndexSzamlalo = 0;
boolean rosszAdat = false;
String stringTipp = new String();

for(int i = 1; i <= 5; i++){
    System.out.println("Kérem, hogy írja be a(z) " + i + ". tippet!");
    do{
        int seged = 0;
        rosszAdat = false;
            do{
                rosszAdat = false;
                Scanner in = new Scanner (System.in);
                stringTipp = in.nextLine();
                char karakter = stringTipp.charAt(0);
                for(int j = 0; j < stringTipp.length(); j++){
                    karakter = stringTipp.charAt(j);
                        if(karakter != '0'
                            && karakter != '1'
                            && karakter != '2'
                            && karakter != '3'
                            && karakter != '4'
                            && karakter != '5'
                            && karakter != '6'
                            && karakter != '7'
                            && karakter != '8'
                            && karakter != '9'){
                            rosszAdat = true;
                            break;
                            }
                        }
                if(rosszAdat == true){
                    System.out.println("Rossz bemeneti karakter(ek)!

                        Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!");
                }
        }while(rosszAdat == true);

    seged = Integer.parseInt(stringTipp);
    if(seged < 1 || seged > 90){
        rosszAdat = true;
    }
    if(rosszAdat == true){
        System.out.println("Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!");
    }

    tombTipp[tombTippIndexSzamlalo] = seged;
    label:
    for(int k = 0; k <= tombTippIndexSzamlalo; k++){
        for(int l = 1; l <= tombTippIndexSzamlalo; l++){
            if(k != l && tombTipp[k] == tombTipp[l]){
                rosszAdat = true;
                System.out.println("Számegyezés! Kérem, hogy emlékezzen arra, amit már begépelt!");
                break label;
            }
        }
    }

    }while(rosszAdat == true);

    tombTipp[tombTippIndexSzamlalo] = Integer.parseInt(stringTipp);
    tombTippIndexSzamlalo++;
}

System.out.println();
System.out.println("Az Ön által tippelt számok növekvő sorrendben:");

rendezett = false;
while (!rendezett){
    rendezett = true;
    for (int j = 1; j < tombTipp.length; j++){
        if (tombTipp[j-1] > tombTipp[j]){
            int seged = tombTipp[j-1];
            tombTipp[j-1] = tombTipp[j];
            tombTipp[j] = seged;
            rendezett = false;
         }
    }
}

for(int i = 0; i < tombTipp.length; i++){
System.out.print(tombTipp[i] + " ");
}

System.out.println();
System.out.println("\nA lottóhúzás számai:");
for(int i = 0; i < tombVeletlenSzam.length; i++){
    System.out. print (tombVeletlenSzam[i] + " ");
}

System.out.println();
int talalat = 0;

for(int i = 0; i < tombTipp.length; i++){
    for(int j = 0; j < tombVeletlenSzam.length; j++){
        if(tombTipp[i] == tombVeletlenSzam[j]){
            talalat++;
        }
    }
}
    System.out.println();
    System.out.println("Önnek " + talalat + " találata van.");
    }
}

 

Végeredmény (például):

A lehetséges lottószámok:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

Kérem, hogy adja meg tippjeit (5 db szám 1 és 90 között)!
Kérem, hogy írja be az 1. tippet!
sdsd
Rossz bemeneti karakter(ek)! Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!
34
Kérem, hogy írja be az 2. tippet!
q
Rossz bemeneti karakter(ek)! Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!
100
Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!
67
Kérem, hogy írja be az 3. tippet!
456
Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!
s
Rossz bemeneti karakter(ek)! Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!
76
Kérem, hogy írja be az 4. tippet!
34
Számegyezés! Kérem, hogy emlékezzen arra, amit már begépelt!
55
Kérem, hogy írja be az 5. tippet!
78

Az Ön által tippelt számok növekvő sorrendben:
34 55 67 76 78

A lottóhúzás számai:
9 28 50 65 78

Önnek 1 találata van.