2020. február 6., csütörtök

Jáva programozás órai feladat

NB-es labdarúgó-bajnokság mérkőzéseinek adatait tartalmazó fájl alapján válaszolunk a kérdésekre. A program sok metódusa igényli a java.io és a java.util osztályok alosztályait, amelyek alapértelmezésben nincsenek implementálva, ezért a program elején importálni kell azokat, tömbök használatával kell megvalósítani a feladatokat.
      
1. feladat:
    Olvassuk be a meccs.txt fájlban található adatokat! Tárolásukra két tömböt fogunk használni, mivel az adatok egy része egész számokat, másik része szöveget tartalmaz. Alkalmazzuk a "tömb a tömbben" módszert, mivel adategységenként (az inputfájl egy-egy sora) 5 szám- és 2 szövegadat tárolásáról kell gondoskodnunk. A tömböket statikus osztályváltozókként definiáljuk, mivel a későbbiekben egy saját metódussal - MaxMin()- fogunk hivatkozni rájuk.

   A megoldás a mérkőzések számának beolvasásával kezdődik, majd soronként feldolgozzuk az inputfájlt. Ez a StringTokenizer osztály metódusainak segítségével (a sort a szóközök mentén feldarabolva) könnyen megvalósítható. Figyeljük meg, hogy a tömbök indexelése 0-tól kezdődik!

    A nextToken() metódus stringet ad vissza, ezért a számoknál a konvertáláshoz igénybe kell venni az Integer osztály parseInt() metódusát.

2. feladat:
    Egy forduló sorszámát bekérve írjuk ki a képernyőre az adott forduló mérkőzéseinek adatait a megadott formában.

    A billentyűzet inputhoz jól használható a Scanner osztály. A kiírás formátumának beállítása aprólékos munkát igényel, de szerencsére a System.out.println() metódus támogatja a szám- ill. szövegváltozók vegyes használatát.

3. feladat:
    Azokat a csapatokat (és a forduló sorszámát) kell kiíratni a képernyőre, amelyek megfordították a mérkőzés állását, tehát a félidőben még vesztésre állva a mérkőzést a végén megnyerték.

    Az összetett feltételvizsgálat oka az, hogy mind a hazai-, mind a vendégcsapat szempontjából meg kell vizsgálnunk a mérkőzések félidei- és végeredményét.

4. feladat:
    Egy csapat nevét kell bekérni a felhasználótól, majd (ez esetben egy csn változóban) eltárolva felhasználni a következő feladatok megoldásához.


5. feladat:
    Az adott csapat által lőtt és kapott gólokat kell összesítve megjeleníteni, tehát a lekérdezés szűrőfeltétele a csapat neve. Ne feledjük, hogy egy csapat hazaiként és vendégként is szerepelhet egy mérkőzésen, és csak a mérkőzések végeredményét kell összesíteni!

    Figyeljük meg a string matches() metódusát! Nagyon jól használható összehasonlításokhoz.

6. feladat:
    Feladatunk az adott csapatról meghatározni, hogy otthon melyik fordulóban kapott ki először, és ki volt a legyőzője. Azt is jelezni kell, ha veretlen maradt.

    A mérkőzések adatait tartalmazó tömbök feldolgozását végző while ciklus csak addig fut, amíg nem talál egy otthoni vereséget az adott csapatnál. Ezt a kikapott nevű logikai változó használatával érjük el.

7. feladat:
    Statisztikát kell készítenünk a bajnokságban előforduló végeredményekről, amelyet egy fájlban kell eltárolnunk. Fontos feltétel, hogy a fordított eredményeket egyezőknek kell tekinteni és a nagyobb számot mindig előre kell írni.
    A feladat megoldásához érdemes írni egy saját metódust, amely a végeredmények gólszámából egy olyan számot állít elő, amelynek tízes helyiértékét a nagyobb-, egyes helyiértékét pedig a kisebb gólszámok adják. Így a végeredményeket egységesítve  sokkal könnyebb a feldolgozásuk.


    A végeredmények számának tárolására a T1 tömb egy üres oszlopa szolgál. A tömb az összes végeredmény-fajtát tartalmazza, tehát külön adatstruktúrát nem szükséges létrehozni hozzájuk. Az algoritmus lényege az, hogy az egyes végeredményeket  - függetlenül attól, hogy milyen sorrendűek (pl. 2-1 vagy 1-2) - az első eredmény-előfordulás helyén tárolva számláljuk meg. A kimeneti fájl létrehozásához kiválóan alkalmas az egyszerűen használható PrintWriter osztály.

    Figyeljük meg a második - beágyazott - for ciklus felépítését, amely az eredmények eltárolását végzi! Mindig csak addig fut - a tömb elejétől kezdve a vizsgálatot -, amíg nem talál egy olyan végeredményt, mint amilyet el akar tárolni. A kiíratásnál arra kell figyelni, hogy a teljes tömböt fel kell dolgozni, mivel egy eredmény akár a tömb utolsó sorában is szerepelhet! A gólszámok sorrendhelyes megjelenítéséhez a Math osztály max() és min() függvényei hathatós segítséget nyújtanak.
    Összességében a feladatról elmondható, hogy - bár egyszerű fájlkezelő műveleteket igényel, de - néhány részfeladata magabiztos algoritmizáló képességet feltételez, és az adatok tárolásához a tömb adatstruktúra alapos ismerete feltétlenül szükséges.


 
 Meccs.txt tartalma:
112
14 1 2 0 2 Dozsa Honved
5 4 0 1 0 Erosek Dozsa
4 0 2 0 2 Vasas Hevesek
8 1 1 0 0 Vasas Nyulak
8 3 2 3 1 Lelkesek Bogarak
13 0 1 0 1 Fineszesek Csikosak
2 1 0 0 0 Pechesek Csikosak
1 4 0 2 0 Csikosak Kedvesek
9 2 0 0 0 Nyulak Lelkesek
6 0 2 0 0 Honved Nyulak
8 1 2 1 0 Gyoztesek Jelmezesek
8 1 2 1 2 Honved Pechesek
4 1 2 0 2 Kedvesek Nyulak
5 0 1 0 1 Nyulak Pechesek
12 0 2 0 0 Erosek Nyulak
4 3 1 1 1 Dozsa Jelmezesek
7 1 3 0 0 Kedvesek Honved
11 1 0 0 0 Pechesek Lelkesek
10 2 4 0 2 Gyoztesek Csikosak
11 0 1 0 1 Csikosak Hevesek
13 1 1 1 1 Pechesek Dozsa
8 1 2 1 1 Darabosak Fineszesek
3 3 0 3 0 Erosek Lelkesek
3 1 1 1 0 Jelmezesek Nyulak
5 3 4 0 3 Kedvesek Jelmezesek
9 1 0 0 0 Fineszesek Dozsa
8 2 3 0 2 Dozsa Csikosak
10 1 0 0 0 Darabosak Nyulak
14 1 2 0 0 Darabosak Mereszek
6 1 0 0 0 Darabosak Hevesek
13 2 1 1 0 Mereszek Lelkesek
6 0 0 0 0 Mereszek Bogarak
11 0 1 0 0 Jelmezesek Mereszek
11 0 0 0 0 Bogarak Erosek
2 2 0 1 0 Nyulak Bogarak
14 3 1 3 0 Erosek Pechesek
12 0 1 0 0 Dozsa Kedvesek
2 0 2 0 2 Kedvesek Fineszesek
6 2 1 2 1 Erosek Jelmezesek
7 2 0 0 0 Csikosak Darabosak
13 0 0 0 0 Jelmezesek Vasas
10 0 0 0 0 Dozsa Bogarak
1 2 0 2 0 Gyoztesek Honved
6 2 1 1 1 Vasas Fineszesek
13 1 3 0 1 Kedvesek Erosek
7 2 1 0 1 Bogarak Vasas
5 1 3 1 2 Fineszesek Mereszek
2 3 3 3 3 Mereszek Gyoztesek
5 1 0 0 0 Csikosak Vasas
1 2 3 1 3 Hevesek Pechesek
11 1 3 1 0 Honved Vasas
7 1 0 0 0 Hevesek Dozsa
9 1 0 0 0 Csikosak Erosek
8 2 2 1 2 Mereszek Kedvesek
9 4 3 0 0 Kedvesek Vasas
12 2 2 1 1 Csikosak Jelmezesek
3 2 2 0 1 Bogarak Kedvesek
3 4 1 3 0 Csikosak Honved
10 1 0 0 0 Lelkesek Kedvesek
3 3 0 0 0 Gyoztesek Vasas
6 1 5 1 3 Lelkesek Csikosak
9 2 0 1 0 Jelmezesek Honved
7 1 2 1 1 Jelmezesek Pechesek
14 2 3 1 0 Gyoztesek Kedvesek
10 1 0 0 0 Hevesek Jelmezesek
14 1 0 1 0 Csikosak Bogarak
5 4 2 3 0 Gyoztesek Darabosak
14 3 2 2 2 Hevesek Nyulak
13 2 0 1 0 Bogarak Hevesek
9 4 1 1 0 Pechesek Mereszek
1 0 1 0 1 Darabosak Lelkesek
3 0 1 0 0 Dozsa Darabosak
7 1 2 1 0 Fineszesek Lelkesek
2 2 2 0 2 Lelkesek Dozsa
4 1 0 1 0 Honved Fineszesek
4 0 1 0 1 Mereszek Csikosak
1 1 0 1 0 Fineszesek Nyulak
12 3 1 0 0 Darabosak Pechesek
12 0 0 0 0 Lelkesek Honved
10 1 1 1 1 Erosek Fineszesek
2 0 0 0 0 Vasas Erosek
9 2 0 1 0 Hevesek Gyoztesek
14 2 1 1 1 Fineszesek Jelmezesek
12 0 1 0 1 Vasas Mereszek
7 1 0 0 0 Nyulak Mereszek
13 1 0 0 0 Honved Darabosak
2 2 2 2 2 Jelmezesek Darabosak
6 2 2 0 2 Dozsa Gyoztesek
6 3 0 1 0 Pechesek Kedvesek
14 0 1 0 0 Lelkesek Vasas
11 1 0 0 0 Nyulak Dozsa
11 3 1 2 0 Fineszesek Gyoztesek
1 0 2 0 1 Dozsa Vasas
1 2 0 0 0 Bogarak Jelmezesek
9 3 1 3 1 Bogarak Darabosak
7 2 1 1 1 Gyoztesek Erosek
10 0 0 0 0 Mereszek Honved
12 2 1 2 1 Gyoztesek Bogarak
4 1 2 1 2 Darabosak Erosek
4 2 0 0 0 Lelkesek Gyoztesek
3 1 4 1 4 Fineszesek Pechesek
5 2 0 2 0 Bogarak Honved
13 2 0 2 0 Nyulak Gyoztesek
5 2 0 1 0 Hevesek Lelkesek
3 2 2 1 2 Hevesek Mereszek
2 2 1 1 0 Honved Hevesek
11 1 1 0 1 Kedvesek Darabosak
1 2 1 0 0 Erosek Mereszek
10 2 0 0 0 Vasas Pechesek
4 2 2 0 2 Pechesek Bogarak
8 3 1 3 1 Erosek Hevesek
12 2 0 0 0 Hevesek Fineszesek 
-----------txt vége 

Megolás

package foci;
/**
 *Megoldások
 */
import java.io.*;
import java.util.*;

public class Foci {

    static int[][] T1; // mérkőzések számadatai
    static String[][] T2; // mérkőzések szöveges adatai

    public static int MaxMin(int z) {
        return Math.max(T1[z][1], T1[z][2]) * 10 + Math.min(T1[z][1], T1[z][2]);
    }

    public static void main(String[] args) throws IOException {

        // 1. feladat
        int i = 0;
        int msz = 0; // mérkőzések száma
        BufferedReader br = new BufferedReader(new FileReader("meccs.txt"));
        msz = Integer.parseInt(br.readLine());
        T1 = new int [msz][6];
        T2 = new String [msz][2];
        String sor;
        while ((sor = br.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(sor," ");
            for (int j = 0; j<5; j++) {
                T1[i][j] = Integer.parseInt(st.nextToken());
            }
            T1[i][5] = 0; //statisztikához
            T2[i][0] = st.nextToken(); // hazai csapat neve
            T2[i][1] = st.nextToken(); // vendégcsapat neve
            i++;
        }
        br.close();

        System.out.println("2. feladat:");
        Scanner sc = new Scanner(System.in);
        System.out.println("Kérem a forduló számát!");
        int fsz = sc.nextInt();
        for (int j = 0; j < msz; j++)
            if (T1[j][0] == fsz)
                System.out.println(T2[j][0]+"-"+T2[j][1]+": "+T1[j][1]+"-"+T1[j][2]
                        +" ("+T1[j][3]+"-"+T1[j][4]+")" );
        System.out.println("");
       
        System.out.println("3. feladat:");
        for (int j = 0; j < msz; j++)
            if ((T1[j][3] < T1[j][4]) && (T1[j][1] > T1[j][2]))
                System.out.println(T1[j][0]+" "+T2[j][0]);
            else if ((T1[j][4] < T1[j][3]) && (T1[j][2] > T1[j][1]))
                System.out.println(T1[j][0]+" "+T2[j][1]);
        System.out.println("");

        System.out.println("4. feladat:");
        sc = new Scanner(System.in);
        System.out.println("Kérem egy csapat nevét!");
        String csn = sc.next();
        System.out.println("");

        System.out.println("5. feladat:");
        int lőtt = 0;
        int kapott = 0;
        for (int j = 0;j < msz; j++)
            if  (csn.matches(T2[j][0])) {
                lőtt += T1[j][1];
                kapott += T1[j][2];
            } else if (csn.matches(T2[j][1])) {
                lőtt += T1[j][2];
                kapott += T1[j][1];               
            }
        System.out.println("lőtt: "+lőtt+", kapott: "+kapott);
        System.out.println("");

        System.out.println("6. feladat:");
        boolean kikapott = false;
        int j = 0;
        while ((! kikapott) && (j < msz)) {
            if (csn.matches(T2[j][0]) && (T1[j][1] < T1[j][2]))
                kikapott = true;
            j++;
        }
        if (! kikapott)
            System.out.println("A csapat otthon veretlen maradt.");
        else
            System.out.println(T1[j-1][0]+" "+T2[j-1][1]);
        System.out.println("");

        // 7. feladat
        PrintWriter pw = new PrintWriter("stat.txt");
        for (i = 0; i < msz; i++)
            for (int k = 0; k <= i; k++)
                if (MaxMin(i) == MaxMin(k)) {
                    T1[k][5]++;
                    break;
                }
        // kiíratás
        for (i = 0; i < msz; i++)
            if (T1[i][5] != 0)
                pw.println(Math.max(T1[i][1], T1[i][2]) + "-" + Math.min(T1[i][1], T1[i][2])
                         + ": " + T1[i][5] + " darab");
        pw.close(); // állomány zárása
    }
}

Nincsenek megjegyzések:

Megjegyzés küldése