Java programozás – 2019 októberi emelt informatika érettségi – eUtazás (1. verzió)

A feladat leírását, melynek a megoldását közzéteszem innen töltheted le. Ez a megoldás tömbbel dolgozik. Az adattároló osztályban több új tulajdonságot is felveszek.
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;
  }
  
}

Ha hibát találsz benne, kérlek jelezd!

4 Replies to “Java programozás – 2019 októberi emelt informatika érettségi – eUtazás (1. verzió)”

  1. utak[hely] = new Ut(sor.split(” “));

    A következő hibát írja ki:

    non static variable cannot be referenced from a static context

  2. Tiszteletem minden olvasónak és a szerzőnek. Egy talán buta kérdésem lenne:
    Ha split-tel az „utak” tömb egy sorát földaraboljuk a szóközök mentén, akkor ugye annyi tömbelem keletkezik, ahány szóközzel elválasztott szövegrész volt a sorban, tehát:
    utak[0] =”0 20190326-0700 4170861 NYB 20190404”, amit fölbont szóközök mentén:
    int hely = 0;
    for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
    {…
    utak[hely] = new Ut(sor.split(” “));
    hely++;
    }
    De akkor az első sor az adatok tömbben 5 elemet jelent.
    utak[0] =0
    utak[1]= 20190326-0700
    utak[2]= 4170861
    utak[3]= NYB
    utak[4]= 20190404

    és a következő sor

    utak[5]= 0
    utak[6]= 20190326-0700

    De nyilván tévedek, mivel a kód jó. Mégis, hogy teheti be a splittel földarabolt szövegtöredékeket egyetlen tömbhelyre, ha egyszer elválasztotta őket?

    Köszönöm a választ!

    • Az utak tömbbe Ut objektumok kerülnek. A forrás minden sorában az 5 darabolható adatot átadjuk az Ut osztály konstruktorának, ami majd azokat szétbontja azokra az adatokra, amik az egyes utakra vonatkoznak. Pl az első sor 2. eleme egy dátum ás időpont egyben, amit az Ut osztályban még kettéosztok dátumra és időpontra. Az utolsó adat pedig az előtte lévő típustól függ, mert ha JEGY, akkor a jegyek számát jelenti az utolsó adat, ha bérlet, akkor pedig a lejárat dátumát. Az Ut osztályban tárolom a tényleges adatokat, az utak tömbben pedig ezeket az objektumokat a saját konkrét adataikkal.
      Nem tudom így világosabb lett-e a dolog.

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

*

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .