Java programozás – 2014 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.

A letölthető tömörített állományokban megtalálod a NetBeans-ben megnyitható projecteket. Amennyiben Geany szerkesztővel kívánod megtekinteni a megoldást, akkor töröld ki a források elejéről a következő sorokat:

package Webotlet_e14maj_cimek_tomb;
// vagy
package Webotlet_e14maj_cimek_lista;

Két megoldást is mellékelek, az egyik tömböt használ az objektumok tárolására, a másik listát. A megoldásokban két osztály található. A Cim osztály felelős az adattárolásért, a Webotlet_e14maj_cimek_tomb vagy lista pedig a vezérlőprogram, mely a forrás beolvasását, valamint a feladatok megoldását tartalmazza.

A Cim osztály viszont nem csak az adattárolásért felelős. Található benne két metódus, bevezeto0 és csoport0 néven, melyek statikus osztálymetódusok. Ez azt jelenti, hogy az osztály példányosítása nélkül meghívhatók a Cim osztály nevére hivatkozva. Ezzel gyakorlatilag bármilyen címmel tesztelhetjük, hogy a rövidítések megfelelően működnek-e. Ha main()-t tartalmazó osztályunkban semmi más nem szerepel, csak ezeknek a metódusoknak a meghívása, akkor a Cim osztályból nem is kell objektumot létrehozni ahhoz, hogy tesztelhessük a rövidítést:

public static void main( String[] args )
{
  System.out.println( "2001:0000:0000:00f5:0000:0000:0000:0123" );
  System.out.println( Cim.bevezeto0("2001:0000:0000:00f5:0000:0000:0000:0123") );
  System.out.println( Cim.csoport0("2001:0000:0000:00f5:0000:0000:0000:0123") );
}

Ilyen esetben, ha a forrástól független adatokkal ugyanazokat a műveleteket kell elvégezni, akkor célszerű ilyen metódust írni abba az osztályba, ami majd a forrásból beolvasott adatokat tartalmazza. Így tetszőleges adatokkal is tesztelhető az adott metódus, valamint a forrásadatok feldolgozását is megoldja. Lássuk akkor a megoldásokat:

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

/**
 *
 * @author http://webotlet.hu
 */

package Webotlet_e14maj_cimek_lista;

public class Cim
{
  private String cim;
  private int tipus;
  private int sorszam;
  private boolean n18;

  public Cim( String s, int db )
  {
    cim = s;
    sorszam = db;

    if( s.startsWith( "2001:0db8" ) )
    {
      tipus = 0;
    }
    else if( s.startsWith( "2001:0e" ) )
    {
      tipus = 1;
    }
    else
    {
      tipus = 2;
    }
    int nullak = 0;
    for( int i = 0; i < cim.length(); i++ )
    {
      if( cim.charAt(i) == '0' )
      {
        nullak++;
      }
    }
    n18 = nullak >= 18;
  }

  public String getCim()
  {
    return cim;
  }

  public int getTipus()
  {
    return tipus;
  }

  public int getSorszam()
  {
    return sorszam;
  }

  public boolean isN18()
  {
    return n18;
  }

  @Override
  public String toString()
  {
    return "Cim{" + "cim=" + cim + ", tipus=" + tipus +
      ", sorszam=" + sorszam + ", n18=" + n18 + '}';
  }

  public static String bevezeto0( String c )
  {
    StringBuilder sb = new StringBuilder();
    String[] tomb = c.split(":");
    for( String s : tomb )
    {
      if( s.startsWith("000") )
      {
        sb.append(s.substring(3)+":");
      }

      else if( s.startsWith("00") )
      {
        sb.append(s.substring(2)+":");
      }

      else if( s.startsWith("0") )
      {
        sb.append(s.substring(1)+":");
      }
      else
      {
        sb.append(s+":");
      }
    }
    sb.deleteCharAt(sb.length()-1);
    return sb.toString();
  }

  public static String csoport0( String c )
  {
    String c2 = Cim.bevezeto0(c);

    if( c2.contains(":0:0:0:0:0:0:0") )
    {
      c2 = c2.replaceFirst(":0:0:0:0:0:0:0", ":");
    }
    else if( c2.contains(":0:0:0:0:0:0") )
    {
      c2 = c2.replaceFirst(":0:0:0:0:0:0", ":");
    }
    else if( c2.contains(":0:0:0:0:0") )
    {
      c2 = c2.replaceFirst(":0:0:0:0:0", ":");
    }
    else if( c2.contains(":0:0:0:0") )
    {
      c2 = c2.replaceFirst(":0:0:0:0", ":");
    }
    else if( c2.contains(":0:0:0") )
    {
      c2 = c2.replaceFirst(":0:0:0", ":");
    }
    else if( c2.contains(":0:0") )
    {
      c2 = c2.replaceFirst(":0:0", ":");
    }
    else if( c2.contains(":0") )
    {
      c2 = c2.replaceFirst(":0", ":");
    }
    if( c2.endsWith(":") )
    {
      c2 += ":";
    }
    return c2;
  }
}

Oké, tudom, hogy lehetne szebb és elegánsabb is a megoldás a rövidítésekre, de most a lényeg, hogy ne kombináld túl, hiszen az érettségi időre megy, és nem az optimális megoldást keressük. Néha a faék egyszerű megoldás a leghatékonyabb.

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

/**
 *
 * @author http://webotlet.hu
 */

package Webotlet_e14maj_cimek_tomb;

import java.io.*;
import java.util.Scanner;

public class Webotlet_e14maj_cimek_tomb
{

  public static void main( String[] args )
  {
    String sor;
    RandomAccessFile raf;
    int db;
    Cim[] cimek;
    try
    {
// 1. feladat
      raf = new RandomAccessFile("ip.txt","r");
      db = 0;
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        db++;
      }
      cimek = new Cim[db];
      db = 0;
      raf.seek(0);
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        cimek[db++] = new Cim(sor, db);
      }
      raf.close();

// 2. feladat
      System.out.println("\n2. feladat");
      System.out.println(db+" sor van az allomanyban.");

// 3. feladat
      System.out.println("\n3. feladat");

      int min = 0;
      for( int i = 1; i < cimek.length; i++ )
      {
        if( cimek[i].getCim().compareTo(cimek[min].getCim() ) < 0 )
        {
          min = i;
        }
      }
      System.out.println( "Az allomanyban szereplo legalacsonyabb cim:\n"+
        cimek[min].getCim() );

// 4. feladat
      System.out.println("\n4. feladat");
      int[] tipusDb = new int[3];

      for( Cim c : cimek )
      {
        tipusDb[ c.getTipus() ]++;
      }

      System.out.println("Dokumentacios cim: "+tipusDb[0]+" darab");
      System.out.println("Globalis egyedi cim: "+tipusDb[1]+" darab");
      System.out.println("Helyi egyedi cim: "+tipusDb[2]+" darab");

// 5. feladat
      RandomAccessFile ki = new RandomAccessFile("sok.txt","rw");

// ha esetleg létezne a fájl, töröljük a tartalmát
      ki.setLength(0);
      for( Cim c : cimek )
      {
        if( c.isN18() )
        {
          ki.writeBytes(c.getSorszam()+" "+c.getCim()+"\n");
        }
      }

// 6. feladat
      System.out.println("\n6. feladat");
      Scanner sc = new Scanner(System.in);
      System.out.print("Adj meg egy sorszamot: ");
      int rcim = sc.nextInt()-1;

      System.out.println(cimek[rcim].getCim() );
      System.out.println(Cim.bevezeto0( cimek[rcim].getCim() ) );

// 7. feladat
      System.out.println("\n7. feladat");
      System.out.println(Cim.csoport0( cimek[rcim].getCim() ) );
    }

    catch( IOException e )
    {
      System.err.println("HIBA");
    }
  }
}

One Reply to “Java programozás – 2014 májusi emelt informatika érettségi programozási feladatának megoldása”

  1. A Cim osztálynak van a sorszáma, a konstruktorban ez a db paraméter, ami egyenlő a sorszámmal.
    De mitől nő db?
    Nem találom a magyarázatot, honnan tudja a program, hogy a sorszámnak egyel nőni kell.

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 .