Egy cég 10 olyan autóval rendelkezik, amelyet a dolgozók igénybe vehetnek az üzleti ügyeik
intézésére. Az autókat akár többnapos útra is elvihetik, illetve egy autót egy nap több dolgozó
is elvihet. A rendszer az autók parkolóból való ki- és behajtását rögzíti. A parkoló a hónap
minden napján 7-23 óra között van nyitva, csak ebben az időszakban lehet elvinni és
visszahozni az autókat. Az autót mindig annak a dolgozónak kell visszahoznia, amelyik elvitte.
Egyszerre csak egy autó lehet minden dolgozónál.
Az autok.txt fájl egy hónap (30 nap) adatait rögzíti. Egy sorban szóközökkel elválasztva
6 adat található az alábbi sorrendben.
nap egész szám (1-30) a hónap adott napja
óra:perc szöveg (óó:pp formátumban) a ki- vagy a behajtás időpontja
rendszám 6 karakteres szöveg
(CEG300-CEG309)
az autó rendszáma
személy azonosítója egész szám (500-600) az autót igénybe vevő dolgozó
azonosítója
km számláló egész szám a km számláló állása
ki/be hajtás egész szám (0 vagy 1) a parkolóból kihajtáskor 0,
a behajtáskor 1
A sorok száma legfeljebb 500. Az adatok a napok szerint, azon belül óra és perc szerint
rendezettek. Továbbá tudjuk, hogy a hónap első napján a cég mind a tíz autója a parkolóban
volt.
Például:
…
5 07:30 CEG300 590 30580 0
5 14:16 CEG300 590 30656 1
5 17:00 CEG300 534 30656 0
5 19:03 CEG300 534 30784 1
…
15 09:53 CEG308 543 35048 0
17 11:16 CEG308 543 35746 1
A példában látható, hogy a CEG300 rendszámú autót az 5. napon kétszer is elvitték. Először
7:30-kor vitték el és 14:16-kor hozta vissza az 590-es dolgozó. A kivitelkor a kilométerszámláló
állása 30 580 km volt, amikor visszahozta 30 656 km volt. Másodszor 17:00-kor vitte el
az 534-es dolgozó az autót és 19:03-kor hozta vissza. A CEG308 rendszámú autót pedig
a 15. napon vitte el az 543-as dolgozó és a 17. napon hozta vissza.
Készítsen programot, amely az autok.txt állomány adatait felhasználva az alábbi
kérdésekre válaszol! A program forráskódját mentse cegesauto néven! (A program
megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell
ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre
a feladat sorszámát (például: 3. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg
a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
Az eredmény megjelenítését és a felhasználóval való kommunikációt a feladatot követő
minta alapján valósítsa meg!
Informatika
emelt szint
1911 gyakorlati vizsga 11 / 12 2019. május 13.
Azonosító
jel:
1. Olvassa be és tárolja el az autok.txt fájl tartalmát!
2. Adja meg, hogy melyik autót vitték el utoljára a parkolóból! Az eredményt a mintának
megfelelően írja a képernyőre!
3. Kérjen be egy napot és írja ki a képernyőre a minta szerint, hogy mely autókat vitték ki és
hozták vissza az adott napon!
4. Adja meg, hogy hány autó nem volt bent a hónap végén a parkolóban!
5. Készítsen statisztikát, és írja ki a képernyőre mind a 10 autó esetén az ebben a hónapban
megtett távolságot kilométerben! A hónap végén még kint lévő autók esetén az utolsó
rögzített kilométerállással számoljon! A kiírásban az autók sorrendje tetszőleges lehet.
6. Határozza meg, melyik személy volt az, aki az autó egy elvitele alatt a leghosszabb
távolságot tette meg! A személy azonosítóját és a megtett kilométert a minta szerint írja a
képernyőre! (Több legnagyobb érték esetén bármelyiket kiírhatja.)
7. Az autók esetén egy havi menetlevelet kell készíteni! Kérjen be a felhasználótól egy
rendszámot! Készítsen egy X_menetlevel.txt állományt, amelybe elkészíti az adott
rendszámú autó menetlevelét! (Az X helyére az autó rendszáma kerüljön!) A fájlba
soronként tabulátorral elválasztva a személy azonosítóját, a kivitel időpontját (nap.
óra:perc), a kilométerszámláló állását, a visszahozatal időpontját (nap. óra:perc), és
a kilométerszámláló állását írja a minta szerint! (A tabulátor karakter ASCII-kódja: 9.)
Megoldás
Ez a megoldás tömbbel dolgozik.
Adattároló osztály:
/** * * @author https://webotlet.hu */ package webotlet_19maj_ceges_autok; public class AutoAdat { private int nap; private String ido; private String rendszam; private int dolgozo; private int km; private boolean be; private int sorszam; public AutoAdat(String[] tomb) { nap = Integer.parseInt(tomb[ 0 ]); ido = tomb[ 1 ]; rendszam = tomb[ 2 ]; dolgozo = Integer.parseInt(tomb[ 3 ]); km = Integer.parseInt(tomb[ 4 ]); be = tomb[ 5 ].equals( "1" ); sorszam = Character.getNumericValue(rendszam.charAt( 5 )); } public int getNap() { return nap; } public String getIdo() { return ido; } public String getRendszam() { return rendszam; } public int getDolgozo() { return dolgozo; } public int getKm() { return km; } public boolean isBe() { return be; } public int getSorszam() { return sorszam; } @Override public String toString() { return "AutoAdat{" + "nap=" + nap + ", ido=" + ido + ", rendszam=" + rendszam + ", dolgozo=" + dolgozo + ", km=" + km + ", be=" + be + ", sorszam=" + sorszam + '}' ; } } |
A feladat megoldásai:
/** * * @author https://webotlet.hu */ package webotlet_19maj_ceges_autok; import java.io.IOException; import java.io.RandomAccessFile; import java.util.Scanner; public class Webotlet_19maj_ceges_autok { public static void main(String[] args) { // 1. feladat RandomAccessFile raf; String sor; AutoAdat[] adatok = null ; try { raf = new RandomAccessFile( "autok.txt" , "r" ); int db = 0 ; for ( sor = raf.readLine(); sor != null ; sor = raf.readLine() ) { db++; } adatok = new AutoAdat[db]; raf.seek( 0 ); int hely = 0 ; for ( sor = raf.readLine(); sor != null ; sor = raf.readLine() ) { adatok[hely] = new AutoAdat(sor.split( " " )); hely++; } raf.close(); } catch ( IOException e ) { System.out.println( "HIBA" ); } // for( AutoAdat adat : adatok ) // { // System.out.println(adat); // } // 2. feladat System.out.println( "2. feladat" ); for ( int i = adatok.length - 1 ; i > - 1 ; i-- ) { if ( !adatok[i].isBe() ) { System.out.println(adatok[i].getNap() + ". nap rendszam: " + adatok[i].getRendszam()); break ; } } // 3. feladat System.out.println( "3. feladat" ); Scanner sc = new Scanner(System.in); System.out.print( "Nap: " ); int nap = sc.nextInt(); System.out.println( "Forgalom a(z) " + nap + ". napon:" ); for ( int i = 0 ; i < adatok.length; i++ ) { if ( adatok[i].getNap() == nap ) { System.out.print(adatok[i].getIdo() + " " + adatok[i].getRendszam() + " " + adatok[i].getDolgozo() + " " ); if ( adatok[i].isBe() ) { System.out.println( "be" ); } else { System.out.println( "ki" ); } } } // 4. feladat System.out.println( "4. feladat" ); int [] napok = new int [ 10 ]; for ( int i = 0 ; i < adatok.length; i++ ) { if ( adatok[i].isBe() ) { napok[adatok[i].getSorszam()]--; } else { napok[adatok[i].getSorszam()]++; } } int osszeg = 0 ; for ( int i = 0 ; i < napok.length; i++ ) { osszeg += napok[i]; } System.out.println( "A honap vegen " + osszeg + " autot nem hoztak vissza." ); // 5. feladat System.out.println( "5. feladat" ); for ( int i = 0 ; i < adatok.length - 1 ; i++ ) { for ( int j = i + 1 ; j < adatok.length; j++ ) { // 3 szempont szerint rendezek // rendszam szerint // azon belul nap szerint // azon belul ido szerint if( adatok[i].getRendszam().compareTo(adatok[j].getRendszam()) > 0 || (adatok[i].getRendszam().compareTo(adatok[j].getRendszam()) == 0 && adatok[i].getNap() > adatok[j].getNap()) || (adatok[i].getRendszam().compareTo(adatok[j].getRendszam()) == 0 && adatok[i].getNap() == adatok[j].getNap() && adatok[i].getIdo().compareTo(adatok[j].getIdo()) > 0 ) ) { AutoAdat csere = adatok[i]; adatok[i] = adatok[j]; adatok[j] = csere; } } } int [] kmosszeg = new int [ 10 ]; for ( int i = 1 ; i < adatok.length; i++ ) { if ( adatok[i].getSorszam() == adatok[i - 1 ].getSorszam() ) { kmosszeg[adatok[i].getSorszam()] += adatok[i].getKm() - adatok[i - 1 ].getKm(); } } for ( int i = 0 ; i < kmosszeg.length; i++ ) { System.out.println( "CEG30" + i + " " + kmosszeg[i] + " km" ); } // 6. feladat System.out.println( "6. feladat" ); int maxhely = 0 ; int max = 0 ; for ( int i = 1 ; i < adatok.length; i++ ) { if ( adatok[i].getSorszam() == adatok[i - 1 ].getSorszam() ) { if ( adatok[i].getKm() - adatok[i - 1 ].getKm() > max ) { max = adatok[i].getKm() - adatok[i - 1 ].getKm(); maxhely = i; } } } System.out.println( "Leghosszabb ut: " + max + " km, szemely: " + adatok[maxhely].getDolgozo()); // 7. feladat System.out.println( "7. feladat" ); sc = new Scanner(System.in); System.out.print( "Rendszam: " ); String rendszam = sc.nextLine(); RandomAccessFile ki; try { ki = new RandomAccessFile(rendszam + "_menetlevel.txt" , "rw" ); ki.setLength( 0 ); for ( int i = 0 ; i < adatok.length; i++ ) { if ( adatok[i].getRendszam().equals(rendszam) ) { if ( !adatok[i].isBe() ) { ki.writeBytes(adatok[i].getDolgozo() + "\t" + adatok[i].getNap() + ". " + adatok[i].getIdo() + "\t" + adatok[i].getKm() + " km" ); } else { ki.writeBytes( "\t" + adatok[i].getNap() + ". " + adatok[i].getIdo() + "\t" + adatok[i].getKm() + " km\n" ); } } } System.out.println( "Menetlevel kesz." ); ki.close(); } catch ( IOException e ) { System.out.println( "HIBA" ); } } } |
Nincsenek megjegyzések:
Megjegyzés küldése