Gyakorlati alapok
Virtuális ötös lottó külön függvényeskedéssel
A fejezet gondolati és programozás-technikai előzményei a Virtuális ötös lottó című fejezetben olvashatók.
Ebben a fejezetben végre funkcionálisan szétbonthatjuk az ott publikált, nagyjából szekvenciális kódot, ezáltal "optimalizáljuk" a kódszerkezetet. Emiatt már lendületből spóroltunk 1 db buborékrendezést, hiszen az előző kódban kényszerűségből 2 db volt.
Legelőször szeretném hangsúlyozni, hogy ilyen, már viszonylag komplex feladatot rengetegféleképpen lehetséges megoldani. Az én megoldásom csupán egy közülük és még azt sem mondhatom, hogy optimális, bár a moduláris és objektumorientált programozás alapjainak azért megfelelő. Mindenesetre órákat el lehet vitatkozni afelett, hogy mit is nevezünk és milyen szempontok alapján implementálunk egy "optimális ötös lottó generátort"...
Szedjük tehát szét a már publikált kódot funkciók szerint, hiszen ennek kigyakoroltatása a jelen fejezetcsomag fő feladata!
Én az alábbi funkcionális metódusokat alkottam meg:
-
static void lottoSzamGenerator() - feltölti és kiírja lehetséges lottószámokat,
-
static int[]veletlenSzamGenerator() - véletlenszámokkal feltölt egy tömböt és visszaadja (return). Fontos, hogy 1 szám csak egyszer forduljon elő.
-
static int[]buborekRendezes(int[] tomb) - tömböt vár, amelyet buborékrendez, majd visszaadja (return),
-
static int[] szamBekeresEllenorzes() - bekéri a tipp stringet, átkonvertálja numerikus adattá, adott feltételek szerint ellenőrzi, majd ellenőrzött adattagú tömb formájában visszaadja (return). Itt természetesen el lehetett volna választani az adatbekérést és ellenőrzéstől, de úgy ítéltem meg, hogy nagyon nem lettünk volna előbbre vele, illetve akkor az egész struktúrát át kellett volna szerkesztenem. Maga az ellenőrzés is további metódusokra bontható, hiszen a bemeneti adatot stringként és numerikus integerként is ellenőrizni kell. De egyáltalán nem biztos, hogy a komplexitásnak eme szintjén ez célszerű.
-
static void kiertekeles(int[] tombTipp, int[] tombVeletlenSzam) - a 2 bemeneti tömb adattagjait hasonlítja össze. Ha van egyezés, akkor az lottótalálatot jelent. Ezt számolja és külön kiírja.
-
static void tombKiiras(int[] tomb) - bemeneti tömb tartalmát listázza ki.
A main() főprogramban 4 különböző, 5 elemű tömböt deklaráltam:
int[] tombTipp = new int[5];
int[] tombTippRendezett = new int[5];
int[] tombVeletlenSzam = new int[5];
int[] tombVeletlenRendezett = new int[5];
Ez a tömbmennyiség nem biztos, hogy szükséges. Például a kiértékelés lefuttatásához (static void kiertekeles(int[] tombTipp, int[] tombVeletlenSzam)) nem kellenek rendezett tömbök, ám így némileg átláthatóbbá vált a kódműködés.
Nézzük meg a futtatható Java-kódot:
import java.util.*;
public class Main {
static void lottoSzamGenerator(){
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] + "
");
}
}
static int[]veletlenSzamGenerator(){
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++;
}
}
return tombVeletlenSzam;
}
static int[]buborekRendezes(int[] tomb){
boolean rendezett = false;
while (!rendezett){
rendezett = true;
for (int j = 1; j < tomb.length;
j++){
if (tomb[j-1]
> tomb[j]){
int seged = tomb[j-1];
tomb[j-1] = tomb[j];
tomb[j] = seged;
rendezett = false;
}
}
}
return tomb;
}
static int[] szamBekeresEllenorzes(){
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 az " + 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++;
}
return tombTipp;
}
static void kiertekeles(int[] tombTipp, int[] tombVeletlenSzam){
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("Önnek " + talalat + " találata van.");
}
static void tombKiiras(int[] tomb){
for(int i = 0; i < tomb.length; i++){
System.out.print(tomb[i] + " ");
}
}
public static void main(String[] args) {
int[] tombTipp = new int[5];
int[] tombTippRendezett = new int[5];
int[] tombVeletlenSzam = new int[5];
int[] tombVeletlenRendezett = new int[5];
lottoSzamGenerator();
System.out.println();
tombVeletlenSzam = veletlenSzamGenerator();
tombVeletlenRendezett = buborekRendezes(tombVeletlenSzam);
tombTipp = szamBekeresEllenorzes();
tombTippRendezett = buborekRendezes(tombTipp);
System.out.println();
System.out.println("Az Ön által tippelt számok növekvő
sorrendben:");
tombKiiras(tombTippRendezett);
System.out.println("\n");
System.out.println("A lottóhúzás számai növekvő
sorrendben:");
tombKiiras(tombVeletlenRendezett);
System.out.println("\n");
kiertekeles(tombTippRendezett, tombVeletlenRendezett);
}
}
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!
w
Rossz bemeneti karakter(ek)! Kérem, hogy csak 1 és 90 közötti egész számokat
adjon meg!
2
Kérem, hogy írja be az 2. tippet!
222
Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!
28
Kérem, hogy írja be az 3. tippet!
560
Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!
r
Rossz bemeneti karakter(ek)! Kérem, hogy csak 1 és 90 közötti egész számokat
adjon meg!
48
Kérem, hogy írja be az 4. tippet!
4
Kérem, hogy írja be az 5. tippet!
0
Kérem, hogy csak 1 és 90 közötti egész számokat adjon meg!
33
Az Ön által tippelt számok növekvő sorrendben:
2 4 28 33 48
A lottóhúzás számai növekvő sorrendben:
19 28 42 71 89
Önnek 1 találata van.