2020. szeptember 2., szerda

Buszjáratok - Felkészülés a Középszintű Szakmai informatikai érettségi feladat mintapélda és megoldása

Egyre több országban fordul elő, hogy a közlekedési eszközökön használatos bérleteket és
jegyeket valamilyen elektronikus eszközön (például: chipes kártya) tárolják. Egy nagyváros
ilyen rendszert szeretne bevezetni a helyi közlekedésben, amelyet néhány buszjáraton
tesztelnek. Ezekre a buszokra csak az első ajtónál lehet felszállni, ahol egy ellenőrző eszközhöz
kell érinteni a kártyát, amelynek chipje tartalmazza a jegy vagy bérlet információkat.
A busz ellenőrző eszköze statisztikai és fejlesztési célból rögzíti a felszállók kártyájának
adatait. Az utasadat.txt szóközökkel tagolt állomány egy, a tesztelésben részt vevő busz
végállomástól-végállomásig tartó útjának adatait tartalmazza.
Az utasadat.txt állomány legfeljebb 2000 sort tartalmaz és minden sorában 5 adat
szerepel. Ezek:
• a megálló sorszáma (0-29; 0 az indulás helye és a 30 a végállomás, ahol már nem lehet
felszállni.)
• a felszállás dátuma és időpontja (ééééhhnn-óópp formátumban, kötőjellel elválasztva
a dátum és az idő)
• a kártya egyedi azonosítója (hétjegyű szám), egy utas a járaton legfeljebb egyszer utazik
• a jegy vagy bérlet típusa:
Azonosító Megnevezés
FEB Felnőtt bérlet
TAB Tanulóbérlet (kedvezményes)
NYB Nyugdíjas bérlet (kedvezményes)
NYP 65 év feletti bérlet (ingyenes)
RVS Rokkant, vak, siket vagy kísérő bérlet (ingyenes)
GYK Iskolakezdés előtti gyerekbérlet (ingyenes)
JGY Jegy
• a bérlet érvényességi ideje, vagy a felhasználható jegyek száma. A bérlet esetén a dátum
ééééhhnn formátumban szerepel, jegy esetén egy 0-10 közötti szám szerepel.
Például:
0 20190326-0700 6572582 RVS 20210101
0 20190326-0700 8808290 JGY 7
0 20190326-0700 1680423 TAB 20190420
12 20190326-0716 3134404 FEB 20190301
12 20190326-0716 9529716 JGY 0
A fenti példában szereplő adatoknál látható, hogy az induló állomáson (0. állomás)
2019. 03. 26-án 7:00-kor a 1680423 kártyaazonosítójú utas tanulóbérlettel szállt fel, amely
2019. 04. 20-ig érvényes. A 12. állomáson 2019. 03. 26-án 7:16-kor a 9529716
kártyaazonosítójú utas jeggyel szállt volna fel, de már elhasználta az összes jegyét (0).
Készítsen programot, amely az utasadat.txt állomány felhasználásával a következő
kérdésekre válaszol! A program forráskódját eutazas néven mentse! (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 2. feladat)! A részfeladatok eredményeit a mintán látható
formában jelenítse meg! Az ékezetmentes kiírás is elfogadott.
1. Olvassa be és tárolja el az utasadat.txt fájl tartalmát! 
Informatika
emelt szint
1821 gyakorlati vizsga 11 / 12 2019. október 22.
Azonosító
jel:

2. Adja meg, hogy hány utas szeretett volna felszállni a buszra!
3. A közlekedési társaság szeretné, ha a járművőn csak az érvényes jeggyel vagy bérlettel
rendelkezők utaznának. Ezért a jegyeket és bérleteket a buszvezető a felszálláskor ellenőrzi.
(A bérlet még érvényes a lejárat napján.) Adja meg, hogy hány esetben kellett
a buszvezetőnek elutasítania az utas felszállását, mert lejárt a bérlete vagy már nem volt
jegye!
4. Adja meg, hogy melyik megállóban próbált meg felszállni a legtöbb utas! (Több azonos
érték esetén a legkisebb sorszámút adja meg!)
5. A közlekedési társaságnak kimutatást kell készítenie, hogy hányszor utaztak valamilyen
kedvezménnyel a járművön. Határozza meg, hogy hány kedvezményes és hány ingyenes
utazó szállt fel a buszra! (Csak az érvényes bérlettel rendelkező szállhatott fel a buszra!)
6. Készítsen függvényt napokszama néven az alábbi algoritmus alapján. Az algoritmus
a paraméterként megadott két dátumhoz (év, hónap, nap) megadja a közöttük eltelt napok
számát! (A MOD a maradékos osztást, a DIV az egészrészes osztást jelöli.) Az algoritmust
a fuggveny.txt fájlban is megtalálja. A függvényt a következő feladat megoldásához
felhasználhatja.
Függvény napokszama(e1:egész, h1:egész, n1: egész, e2:egész,
 h2: egész, n2: egész): egész
 h1 = (h1 + 9) MOD 12
 e1 = e1 - h1 DIV 10
 d1 = 365*e1 + e1 DIV 4 - e1 DIV 100 + e1 DIV 400 +
 (h1*306 + 5) DIV 10 + n1 - 1
 h2 = (h2 + 9) MOD 12
 e2 = e2 - h2 DIV 10
 d2 = 365*e2 + e2 DIV 4 - e2 DIV 100 + e2 DIV 400 +
 (h2*306 + 5) DIV 10 + n2 - 1
 napokszama:= d2-d1
Függvény vége
7. A közlekedési társaság azoknak az utasoknak, akiknek még érvényes, de 3 napon belül lejár
a bérlete, figyelmeztetést szeretne küldeni e-mailben. (Például, ha a felszállás időpontja
2019. február 5., és a bérlet érvényessége 2019. február 8., akkor már kap az utas levelet,
ha 2019. február 9. az érvényessége, akkor még nem kap levelet.) Válogassa ki és írja a
figyelmeztetes.txt állományba ezen utasok kártyaazonosítóját és a bérlet
érvényességi idejét (éééé-hh-nn formátumban) szóközzel elválasztva! 

Megoldása

Adattároló osztály:

/**
 *
 * @author https://webotlet.hu
 */
package webotlet_19okt_eutazas;
 
public class Ut
{
  private int megallo;
  private String datum;
  private int ev;
  private int honap;
  private int nap;
  private int ora;
  private int perc;
  private int azon;
  private String tipus;
   
  private int jegyszam;
  private String eDatum;
  private int eEv;
  private int eHonap;
  private int eNap;
   
  public Ut(String[] tomb)
  {
    megallo = Integer.parseInt(tomb[0]);
    datum = tomb[1].split("-")[0];
    String[] tmp = tomb[1].split("-");
    ev = Integer.parseInt(tmp[0].substring(0,4));
    honap = Integer.parseInt(tmp[0].substring(4,6));
    nap = Integer.parseInt(tmp[0].substring(6));
    ora = Integer.parseInt(tmp[1].substring(0,2));
    perc = Integer.parseInt(tmp[1].substring(3));
    azon = Integer.parseInt(tomb[2]);
    tipus = tomb[3];
    if( tipus.equals("JGY"))
    {
      jegyszam = Integer.parseInt(tomb[4]);
    }
    else
    {
      eDatum = tomb[4];
      eEv = Integer.parseInt(tomb[4].substring(0,4));
      eHonap = Integer.parseInt(tomb[4].substring(4,6));
      eNap = Integer.parseInt(tomb[4].substring(6));
    }
  }
 
  public int getMegallo()
  {
    return megallo;
  }
 
  public String getDatum()
  {
    return datum;
  }
 
  public int getEv()
  {
    return ev;
  }
 
  public int getHonap()
  {
    return honap;
  }
 
  public int getNap()
  {
    return nap;
  }
 
  public int getOra()
  {
    return ora;
  }
 
  public int getPerc()
  {
    return perc;
  }
 
  public int getAzon()
  {
    return azon;
  }
 
  public String getTipus()
  {
    return tipus;
  }
 
  public int getJegyszam()
  {
    return jegyszam;
  }
 
  public String geteDatum()
  {
    return eDatum;
  }
 
  public int geteEv()
  {
    return eEv;
  }
 
  public int geteHonap()
  {
    return eHonap;
  }
 
  public int geteNap()
  {
    return eNap;
  }
 
  @Override
  public String toString()
  {
    return "Ut{" + "megallo=" + megallo + ", datum=" + datum 
      + ", ev=" + ev + ", honap=" + honap + ", nap=" + nap 
      + ", ora=" + ora + ", perc=" + perc + ", azon="
      + azon + ", tipus=" + tipus + ", jegyszam="
      + jegyszam + ", eDatum=" + eDatum + ", eEv=" + eEv 
      + ", eHonap=" + eHonap + ", eNap=" + eNap + '}';
  }
   
}
A feladat megoldásai:

/**
 *
 * @author https://webotlet.hu
 */
package webotlet_19okt_eutazas;
 
import java.io.IOException;
import java.io.RandomAccessFile;
 
public class Webotlet_19okt_eutazas
{
 
  public static void main(String[] args)
  {
    Ut[] utak = null;
    try
    {
      RandomAccessFile raf = new RandomAccessFile("utasadat.txt", "r");
      String sor;
      int db = 0;
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        db++;
      }
       
      utak = new Ut[db];
      raf.seek(0);
       
      int hely = 0;
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        utak[hely] = new Ut(sor.split(" "));
        hely++;
      }
      raf.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }
     
//    for( int i = 0; i < utak.length; i++ )
//    {
//      System.out.println(utak[i].toString());
//    }
 
 
    System.out.println("2. feladat");
    System.out.println("A buszra " + utak.length + " utas akart felszallni.");
     
    System.out.println("3. feladat");
    int elutasit = 0;
     
    for( int i = 0; i < utak.length; i++ )
    {
      if( utak[i].getTipus().equals("JGY") )
      {
        if( utak[i].getJegyszam() == 0 )
        {
          elutasit++;
        }
      }
      else if(utak[i].getDatum().compareTo(utak[i].geteDatum()) > 0 )
      {
        elutasit++;
      }
    }
     
    System.out.println("A buszra " + elutasit + " utas nem szallhatott fel.");
     
    System.out.println("4. feladat");
    int[] megallok = new int[30];
     
    for( int i = 0; i < utak.length; i++ )
    {
      megallok[utak[i].getMegallo()]++;
    }
     
    int max = 0;
    for( int i = 1; i < megallok.length; i++ )
    {
      if( megallok[i] > megallok[max] )
      {
        max = i;
      }
    }
     
    System.out.println("A legtobb utas (" + megallok[max] + ") a " + max
      + ". megalloban probalt felszallni.");
     
    System.out.println("5. feladat");
    int kedvezmenyes = 0;
    int ingyenes = 0;
    for( int i = 0; i < utak.length; i++ )
    {
      if( ( utak[i].getTipus().equals("TAB")
        || utak[i].getTipus().equals("NYB") )
        && utak[i].getDatum().compareTo(utak[i].geteDatum()) <= 0 )
      {
        kedvezmenyes++;
      }
      else if( ( utak[i].getTipus().equals("NYP")
        || utak[i].getTipus().equals("RVS")
        || utak[i].getTipus().equals("GYK") )
        )
      {
        ingyenes++;
      }
    }
     
    System.out.println("Ingyenesen utazok szama: " + ingyenes + " fo");
    System.out.println("A kedvezmenyesen utazok szama: "
      + kedvezmenyes + " fo");
     
    try
    {
      RandomAccessFile ki = new RandomAccessFile("figyelmeztetes.txt", "rw");
      ki.setLength(0);
       
      for( int i = 0; i < utak.length; i++ )
      {
        int kulonbseg = napokszama(utak[i].getEv(), utak[i].getHonap(), utak[i].getNap(),
          utak[i].geteEv(), utak[i].geteHonap(), utak[i].geteNap() );
        if( !utak[i].getTipus().equals("JGY") && kulonbseg >= 0 && kulonbseg <= 3 )
        {
          ki.writeBytes(String.format("%s %d-%02d-%02d\n", utak[i].getAzon(),
            utak[i].geteEv(), utak[i].geteHonap(), utak[i].geteNap()));
        }
      }
      ki.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }
     
  }
   
  public static int napokszama( int e1, int h1, int n1, int e2, int h2, int n2 )
  {
    h1 = (h1 + 9) % 12;
    e1 = e1 - h1 / 10;
    int d1 = 365 * e1 + e1 / 4 - e1 / 100 + e1 / 400 + (h1 * 306 + 5) / 10 + n1 - 1;
    h2 = (h2 + 9) % 12;
    e2 = e2 - h2 / 10;
    int d2= 365 * e2 + e2 / 4 - e2 / 100 + e2 / 400 + (h2 * 306 + 5) / 10 + n2 - 1;
    return d2 - d1;
  }
   
}

Nincsenek megjegyzések:

Megjegyzés küldése