Java programozás – 2018 májusi emelt informatika érettségi programozási feladatának megoldása

A feladat leírását, melynek a megoldását közzéteszem innen töltheted le. Ez az első saját megoldásom, nagyjából nettó 40 perc alatt készült, nem garantálom, hogy hibamentes. Arra mindenképp jó lesz, hogy megnézd, mihez hogyan kellett volna hozzányúlni. Később még letisztázom, és megcsinálom listával is. Ez most csak tömbökkel dolgozik.

A megoldást letöltheted innen.

Ember osztály az adattárolásra és rövidítésre:

package tarsalgo;

public class Ember
{
  private int ora;
  private int perc;
  private int azon;
  private String irany;
  private boolean be;
  
  public Ember( String[] tomb )
  {
    ora = Integer.parseInt(tomb[0]);
    perc = Integer.parseInt(tomb[1]);
    azon = Integer.parseInt(tomb[2]);
    irany = tomb[3];
    be = tomb[3].equals("be");
  }

  public int getOra()
  {
    return ora;
  }

  public int getPerc()
  {
    return perc;
  }

  public int getAzon()
  {
    return azon;
  }

  public String getIrany()
  {
    return irany;
  }

  public boolean isBe()
  {
    return be;
  }

  @Override
  public String toString()
  {
    return "Ember{" + "ora=" + ora + ", perc=" + perc +
      ", azon=" + azon + ", irany=" + irany + ", be=" + be + '}';
  }
}

A main()-t tartalmazó osztály, mely a fájlkezelést és a feladatokat tartalmazza:

package tarsalgo;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;

public class Tarsalgo
{
  public static void main(String[] args)
  {
    // 1. feladat
    Ember[] emberek = null;
    
    try
    {
      RandomAccessFile raf = new RandomAccessFile("ajto.txt","r");
      String sor;
      int db = 0;
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        db++;
      }
      
      emberek = new Ember[db];
      raf.seek(0);
      db = 0;
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        emberek[db] = new Ember(sor.split(" "));
        db++;
      }
      raf.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }
    
//    for( Ember e : emberek )
//    {
//      System.out.println(e);
//    }

    // 2. feladat
    System.out.println("2. feladat");
    System.out.println("Az elso belepo: "+emberek[0].getAzon());
    
    int hely = -1;
    for( int i = emberek.length-1; i >= 0; i-- )
    {
      if( !emberek[i].isBe() )
      {
        hely = i;
        break;
      }
    }
    
    if( hely != -1 )
    {
      System.out.println("Az utolso kilepo: "+emberek[hely].getAzon());
    }
    else
    {
      System.out.println("Senki nem ment ki a tarsalgobol.");
    }
    
    // 3. feladat
    int max = 0;
    for( int i = 0; i < emberek.length; i++ )
    {
      if( emberek[i].getAzon() > max )
      {
        max = emberek[i].getAzon();
      }
    }

    int[] darabok = new int[max+1];
    
    for( int i = 0; i < emberek.length; i++ )
    {
      darabok[emberek[i].getAzon()]++;
    }
    
    try
    {
      RandomAccessFile ki = new RandomAccessFile("athaladas.txt","rw");
      for( int i = 1; i < darabok.length; i++ )
      {
        if( darabok[i] != 0 )
        {
          ki.writeBytes(i+" "+darabok[i]+"\n");
        }
      }
      ki.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }
    
    // 4. feladat
    System.out.println("4. feladat");
    
    int[] bent = new int[max+1];
    
    for( int i = 0; i < emberek.length; i++ )
    {
      if( emberek[i].isBe() )
      {
        bent[emberek[i].getAzon()]++;
      }
      else
      {
        bent[emberek[i].getAzon()]--;
      }
    }
    System.out.print("A vegen a tarsalgoban voltak: ");
    for( int i = 1; i < bent.length; i++ )
    {
      if( bent[i] > 0 )
      {
        System.out.print(i+" ");
      }
    }
    System.out.println();

    // 5. feladat
    System.out.println("5. feladat");

    int[] bentvannak = new int[emberek.length];
    
    int elozo = 0;
    for( int i = 0; i < emberek.length; i++ )
    {
      if( emberek[i].isBe() )
      {
        bentvannak[i] = elozo + 1;
      }
      else
      {
        bentvannak[i] = elozo - 1;
      }
      elozo = bentvannak[i];
    }
    
    max = 0;
    for( int i = 1; i < bentvannak.length; i++ )
    {
      if( bentvannak[i] > bentvannak[max] )
      {
        max = i;
      }
    }
    
    System.out.println("Peldaul: "+emberek[max].getOra()+":"+
        emberek[max].getPerc()+"-kor voltak a legtobben a tarsalgoban.");
    
    // 6. feladat
    System.out.println("6. feladat");
    System.out.print("Adja meg egy szemely azonositojat: ");
    Scanner sc = new Scanner(System.in);
    int azon = Integer.parseInt(sc.nextLine());

    // 7. feladat
    System.out.println("7. feladat");
    for( int i = 0; i < emberek.length; i++ )
    {
      if( emberek[i].getAzon() == azon )
      {
        if( emberek[i].isBe() )
        {
          System.out.print(emberek[i].getOra()+":"+
            emberek[i].getPerc()+"-");
        }
        else
        {
          System.out.println(emberek[i].getOra()+":"+
            emberek[i].getPerc());
        }
      }
    }
    System.out.println();
    
    // 8. feladat
    System.out.println("8. feladat");
    
    int osszeg = 0;
    int be = 0;
    int ki = 0;
    boolean bentvan = false;
    for( int i = 0; i < emberek.length; i++ )
    {
      if( emberek[i].getAzon() == azon )
      {
        if( emberek[i].isBe() )
        {
          be = emberek[i].getOra()*60+emberek[i].getPerc();
          bentvan = true;
        }
        else
        {
          osszeg += (emberek[i].getOra()*60+emberek[i].getPerc()) - be;
          bentvan = false;
        }
      }
    }
    
    // ha a legvegen nem jott ki, akkor az utolso bemenetel
    // es a 15:00 kozotti idot hozzaadjuk az ossz idejehez
    if( bentvan )
    {
      osszeg += (15*60)-be;
    }
    
    System.out.print("A(z) "+azon+". szemely osszesen "+osszeg+
      " percet volt bent");
    
    if( bentvan )
    {
      System.out.println(", a megfigyeles vegen a tarsalgoban volt.");
    }
    else
    {
      System.out.println(".");
    }
  }
}

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

6 Replies to “Java programozás – 2018 májusi emelt informatika érettségi programozási feladatának megoldása”

  1. Kedves Csaba!

    Lenne kedved esetleg az informatika ismeretek programozási feladatokat is megoldani? 🙂 Ott már van objektumorientált java is, az emelt szintű feladatban.

    Köszi, üdv,
    Lili

  2. Nagyon szépen köszönöm az összefoglalót,rendkívül nagy segítség nekem ez a topic és úgy az egész oldal,most hogy próbálok felkészülni az emelt szintű informatikai érettségire(előrehozott). Viszont miközben gyakoroltam támadt bennem pár kérdés. Ezek az alábbiak:

    1,
    A 2. feladat B részénél nem jobb megoldás simán az alábbi..?

    for (int i = 0; i < adatbazis.length; i++) {
    if (!adatbazis[i].Isbe()) {
    max=i;
    }
    }

    2,

    A 3. feladatnál a feladat azt írja hogy létező azonosítókhoz kell darabszám,viszont a megadott módszerrel olyan azonosítókhoz is kiír darabszámot,ami a fájlban nem létezik. Én ezt az alábbi módon oldottam meg (Pl.: Nincs kilences azonosító)

    if (darabok[i] != 0) {
    ki.writeBytes(i+" "+darabok[i]+"\n");
    }

    3,
    A hatodik feladatnál,a feltételezheti hogy olyan azonosítót adnak meg ami szerepelnél pont jár,ha az érettségiző nem feltételezi hogy tudják hogy mi szerepel és mi nem 😀
    Én az alábbi módszerrel oldottam meg 😀

    boolean match=false;
    for (int i = 0; i < emberek.length; i++) {
    if (azonosito==emberek[i].getAzon()) {
    match=true;
    }
    }
    if (!match) {
    System.out.println("Kérem válasszon egy olyan azonosítót,amely szerepel a listán!");
    azonosito=0;
    System.out.print("Adja meg a személy azonosítóját!");
    azonosito=Integer.valueOf(sc.nextLine());
    }
    Kidolgoztam teljesen a témát,nagyon sokat jelentene ha tudna vetni rá egy pillantást hogy valóban jól-e oldottam meg a dolgokat az érettségi feladatokhoz hívően.

    Még egyszer nagyon szépen köszönöm a cikkeket a programozásról JAVA környezetben,rendkívül sokat segítettek és magabiztosabban fogok neki kezdeni az érettséginek májusban! 😀

    Köszönettel,
    Márk

    • Részenként válaszolnék, mert most erre van időm 🙂

      Az én megoldásomból hibás, mert hiányzik az, hogy a végéről indulva ha megvan az első kilépő (aki az utolsó), akkor meg kellene állni, mert felesleges tovább keresni. (valamiért elfelejtettem)

      A Te megoldásod ilyenformán egyszerűbb, mert nem mindenkinek egyértelmű, hogyan kell a ciklussal a vége felől bejárni egy tömböt. Ott viszont nem szabad megállni találatkor, mert az utolsóra van szükség.

      Ez a megoldás viszont pazarló, mert minek menjünk végig az egész tömbön az utolsót keresve, ha a végéről indulva az első találat egyben az utolsó (feltételezve, hogy akkor meg is állunk).

      Végszóként mindkét megoldás helyes, nézőpont kérdése, hogy melyiket tekintjük jobbnak. Kezdőknek a tied egyszerűbb, hatékonyság szerint az enyém jobb.

    • A 3. feladattal kapcsolatban igazad van, elnéztem, javítom 🙂 A 8-as azonosító pl hiányzik, és a feladatból következik, hogy csak olyan emberrel kell foglalkozni, aki vagy bement, vagy kijött. Akinek nincs mozgása, az nem létezik.

    • 6. A feladatban ahogy én látom, nem jár pont azért, ha megoldja a nem létező azonosító megadását és ellenőrzését.

      A megadott megoldással az a gond, hogy csak egy hibásan megadott azonosítót kezel. És ha kétszer adja meg rosszul? Írja meg ennek megfelelően, addig nem adnám meg itt a megoldást a problémára 🙂

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

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

*

Ez a weboldal az Akismet szolgáltatását használja a spam kiszűrésére. Tudjunk meg többet arról, hogyan dolgozzák fel a hozzászólásunk adatait..