Java programozás – 2006 októberi emelt informatika érettségi programozási feladatának megoldása (1. verzió)

A feladat leírását, melynek a megoldását közzéteszem innen töltheted le. Ezzel a feladattal viszont több bajom is van.

Kezdjük az elején. A feladat a kiinduló információk között a következőt mondja: “Az állományban minden zeneszám legfeljebb egyszer szerepel.” A helyzet az, hogy még véletlenül sem. 3 olyan zeneszám is van, amely 2-szer is szerepel a forrásban. Ezek közül 2 ráadásul ugyanazon a rádión. Ezzel nyilván borulhat az összes olyan feladat, ami arra épít, hogy meg kell keresni egy konkrét zenét.

Fontosnak tartom megjegyezni, hogy a 4-es feladatot kifejezetten rossznak tartom! A feladat szerint feltételezheted, hogy a másik két adón van adás, amikor valahol az Omega:Legenda száma megszólal. Ha a megoldás során figyelembe veszed a zenék hosszát (ahogy az normális esetben elvárható lenne), akkor azt láthatod, hogy az egyik adón már nincs adás. Ekkor természetesen elkezded keresni a hibát, hogy mit rontottál el. A helyzet az, hogy semmit, mert a forrás szerint az egyik adón már tényleg nem szól semmi! Pedig az elején azt mondták, hogy ez feltételezhető. Ezzel a hibakereséssel viszont sok időd elmehet feleslegesen, hiszen maga a feladat rossz!

Az OH által közreadott Pascal forrású megoldás teljesen figyelmen kívül hagyja a zeneszámok hosszát, amit egyébként több feladatban használni is kell. A központi megoldás csak annyit tesz, hogy megnézi, mi van a forrásban a másik két adón az Omega:Legenda száma előtt. Ez teljesen értelmetlen. Mivel a forrásban csak az azonos rádión szóló zenéknek megfelelő a sorrendje, simán előfordulhat, hogy a másik rádión az Omega előtti szám bőven az Omega kezdete előtt került lejátszásra, hiszen az időt teljesen figyelmen kívül hagyták.

Más megoldások és elérhetőek online, nem néztem végig mindet. Az itt közreadott megoldások pontosan figyelembe veszik hogy az adott zenék mikor szólnak. Ez a megoldás tömbbel dolgozik.

Adattároló osztály:

/**
 *
 * @author https://webotlet.hu
 */
package webotlet_06okt_zenei_adok_java;

public class Zene
{
  private int radio;
  private int perc;
  private int mperc;
  private String azonosito;
  private String eloado;
  private String cim;
  
  
  private int hosszMp;
  private int kezd;
  private int vege;
  
  public Zene( String[] tomb )
  {
    radio = Integer.parseInt(tomb[0]);
    perc = Integer.parseInt(tomb[1]);
    mperc = Integer.parseInt(tomb[2]);
    azonosito = tomb[3];
    String[] tmp = azonosito.split(":");
    eloado = tmp[0];
    cim = tmp[1];
    
    hosszMp = perc * 60 + mperc;
  }

  public int getRadio()
  {
    return radio;
  }

  public int getPerc()
  {
    return perc;
  }

  public int getMperc()
  {
    return mperc;
  }

  public String getAzonosito()
  {
    return azonosito;
  }
  
  public String getEloado()
  {
    return eloado;
  }

  public String getCim()
  {
    return cim;
  }

  public int getHosszMp()
  {
    return hosszMp;
  }

  public int getKezd()
  {
    return kezd;
  }

  public int getVege()
  {
    return vege;
  }
  
  public void setKezd(int kezd)
  {
    this.kezd = kezd;
    this.vege = kezd + hosszMp;
  }

  @Override
  public String toString()
  {
    return "Zene{" + "radio=" + radio + ", perc=" + perc
      +", mperc=" + mperc + ", azonosito=" + azonosito + ", eloado="
      + eloado + ", cim=" + cim + ", hosszMp=" + hosszMp
      + ", kezd=" + kezd + ", vege=" + vege + '}';
  }
}

A feladat megoldása:

/**
 *
 * @author https://webotlet.hu
 */
package webotlet_06okt_zenei_adok_java;

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

public class Webotlet_06okt_zenei_adok_java
{
  public static void main(String[] args)
  {
    // 1. feladat
    Zene[] zenek = null;
    
    try
    {
      RandomAccessFile raf = new RandomAccessFile("musor.txt", "r");
      // a trim-re azárt van szükség, mert a forrásban van
      // egy szóköz a szám után, amit nem tud kezelni
      // az Integer.parseInt() metódus, a trim() ezt vágja le
      zenek = new Zene[Integer.parseInt(raf.readLine().trim())];
      String sor;
      
      int hely = 0;
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        zenek[hely] = new Zene(sor.split(" ", 4));
        hely++;
      }
      raf.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }

    
    // 2. feladat
    System.out.println("2. feladat");
    
    int[] dbRadiok = new int[4];
    
    for( int i = 0; i < zenek.length; i++ )
    {
      dbRadiok[zenek[i].getRadio()]++;
    }
    
    for( int i = 1; i < dbRadiok.length; i++ )
    {
      System.out.println(i + ". radio: " + dbRadiok[i]);
    }
    
    // 3. feladat
    System.out.println("3. feladat");
    
    int elsoEric = 0;
    int utolsoEric = 0;
    
    for( int i = 0; i < zenek.length; i++ )
    {
      if( zenek[i].getRadio() == 1 && zenek[i].getEloado().equals("Eric Clapton"))
      {
        elsoEric = i;
        break;
      }
    }

    for( int i = zenek.length - 1; i >= 0; i-- )
    {
      if( zenek[i].getRadio() == 1 && zenek[i].getEloado().equals("Eric Clapton"))
      {
        utolsoEric = i;
        break;
      }
    }
    
    int ido = 0;
    
    for( int i = elsoEric; i <= utolsoEric; i++ )
    {
      if( zenek[i].getRadio() == 1 )
      {
        ido += zenek[i].getHosszMp();
      }
    }

    System.out.println(idoFormaz(ido));
    
    // 4. feladat
    System.out.println("4. feladat");
    
    int radio1 = 0;
    int radio2 = 0;
    int radio3 = 0;
    for( int i = 0; i < zenek.length; i++ )
    {
      if( zenek[i].getRadio() == 1 )
      {
        zenek[i].setKezd(radio1);
        radio1 += zenek[i].getHosszMp();
      }
      else if( zenek[i].getRadio() == 2 )
      {
        zenek[i].setKezd(radio2);
        radio2 += zenek[i].getHosszMp();
      }
      else
      {
        zenek[i].setKezd(radio3);
        radio3 += zenek[i].getHosszMp();
      }
    }
    
    
    int omega = 0;
    for( int i = 0; i < zenek.length; i++ )
    {
      if( zenek[i].getEloado().equals("Omega")
        && zenek[i].getCim().equals("Legenda") )
      {
        omega = i;
        break;
      }
    }

    System.out.println("Az Omega:Legenda zene a "
      + zenek[omega].getRadio() + ". radion szolt.");    
    
    for( int i = 0; i < zenek.length; i++ )
    {
      if( zenek[i].getRadio() != zenek[omega].getRadio() )
      {
        if( zenek[omega].getKezd() >= zenek[i].getKezd() 
          && zenek[omega].getKezd() <= zenek[i].getVege() )
        {
          System.out.println(zenek[i].getRadio() + ": " 
            + zenek[i].getEloado() + "-" + zenek[i].getCim());
        }
      }
    }
    
    // 5. feladat
    System.out.println("5. feladat");
    
    Scanner sc = new Scanner(System.in);
    System.out.println("Add meg a felismert karaktereket!");
    String mintasor = sc.nextLine().toLowerCase();
    
    char[] minta = mintasor.toCharArray();
    try
    {
      RandomAccessFile ki =new RandomAccessFile("keres.txt", "rw");
      ki.setLength(0);
      ki.writeBytes(mintasor + "\n");
      for( int i = 0; i < zenek.length; i++ )
      {
        int talalt = 0;
        String dal = zenek[i].getAzonosito().toLowerCase();
        for( int j = 0; j < dal.length(); j++ )
        {
          if( talalt < minta.length && dal.charAt(j) == minta[talalt])
          {
            talalt++;
          }
        }

        if( talalt == minta.length )
        {
          ki.writeBytes(zenek[i].getAzonosito()+"\n");
        }
      }
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }

    // 6. feladat
    System.out.println("6. feladat");
    int musorido = 0;
    for( int i = 0; i < zenek.length; i++ )
    {
      if( zenek[i].getRadio() == 1 )
      {
        if( 3600 - (musorido % 3600) < (60 + zenek[i].getHosszMp()) )
        {
          musorido += 3600 - (musorido % 3600);
          musorido += 180;
        }
        musorido += 60 + zenek[i].getHosszMp();
      }
    }
    
    System.out.println(idoFormaz(musorido));
  }
  
  public static String idoFormaz(int hossz)
  {
    int ora;
    int perc;
    int mperc;
    
    ora = hossz / 3600;
    hossz = hossz % 3600;
    perc = hossz / 60;
    mperc = hossz % 60;
    return ora + ":" + perc + ":" + mperc;
  }
}

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

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 .