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.
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
}
}
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