Java programozás – 2016 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_e16maj_otszaz_tomb;
// vagy
package webotlet_e16maj_otszaz_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 Vasarlas osztály felelős az adattárolásért, és egyéb dolgokért, a Webotlet_e16maj_otszaz_tomb vagy Webotlet_e16maj_otszaz_lista pedig a vezérlőprogram, mely a forrás beolvasását, valamint a feladatok megoldását tartalmazza.

A Vasarlas osztály viszont nem csak az adattárolásért felelős. Található benne egy metódus, ertek néven, mely statikus osztálymetódus. Ez azt jelenti, hogy az osztály példányosítása nélkül meghívhatók a Vasarlas osztály nevére hivatkozva. Ezzel gyakorlatilag bármilyen termék darabszáma ismeretében megtudhatjuk az azért fizetendő összeget. A tömbös megoldás Vasarlas osztályába pedig betettem egy vettek metódust, ami azt dönti el, hogy egy adott terméket tartalmaz-e a Vasarlas osztály terméktömbje (vettek belőle).

Tömbös megoldás:

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

package webotlet_16maj_otszaz_tomb;

/**
 *
 * https://webotlet.hu
 */

import java.util.Arrays;

public class Vasarlas
{
  private String[] termekek;
  private int osszeg;
  
  public Vasarlas( String[] tomb )
  {
    for( int i = 0; i < tomb.length; i++ )
    {
      if( tomb[i] == null )
      {
        termekek = new String[i];
        for( int j = 0; j < i; j++ )
        {
          termekek[j] = tomb[j];
        }
        break;
      }
    }
    
    // azert rendezem a termekek neveit nevsorba,
    // hogy az azonos nevuek egymas melle keruljenek,
    // igy majd konnyen meghatarozhatom, melyikbol hany darab van
    String csere;
    for( int i = 0; i < termekek.length-1; i++ )
    {
      for( int j = i+1; j < termekek.length; j++ )
      {
        if( termekek[i].compareTo(termekek[j]) > 0 )
        {
          csere = termekek[i];
          termekek[i] = termekek[j];
          termekek[j] = csere;
        }
      }
    }
    
    // termekek aranak osszege (melyikbol hany darab van)
    // nem lenyeges, hogy mi az a termek,
    // csak a darabszamuk a lenyeg, pl:
    // 2, 2, 1, 3 -> (950 + 950 + 500 + 1350)
    int db = 1;
    for( int i = 1; i < termekek.length; i++ )
    {
      if( !termekek[i].equals(termekek[i-1]) )
      {
        System.out.println(db+" "+termekek[i-1]);
        
        osszeg += ertek(db);
        db = 1;
      }
      else
      {
        db++;
      }
    }
    osszeg += ertek(db);
  }

  public String[] getTermekek()
  {
    return termekek;
  }

  public int getOsszeg()
  {
    return osszeg;
  }
  
  // megkeressuk, van-e adott termek a vasaroltak kozott
  public boolean vettek( String mit )
  {
    boolean van = false;
    for( int i = 0; i < termekek.length; i++ )
    {
      if( termekek[i].equals(mit) )
      {
        van = true;
        break;
      }
    }
    return van;
  }

  @Override
  public String toString()
  {
    return "Vasarlas{" + "termekek=" + Arrays.toString(termekek) +
      ", osszeg=" + osszeg + '}';
  }

// osztalymetodus, ami akkor is meghívhato, ha nincs peldany belole
  public static int ertek( int db )
  {
    if( db == 1 )
    {
      return 500;
    }
    else if( db == 2 )
    {
      return 950;
    }
    else
    {
      return 950+(db-2)*400;
    }
  }
}

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

package webotlet_16maj_otszaz_tomb;

/**
 *
 * https://webotlet.hu
 */

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

public class Webotlet_16maj_otszaz_tomb
{
  public static void main(String[] args)
  {
        
    Vasarlas[] vasarlasok = null;
    
    try
    {
      RandomAccessFile raf = new RandomAccessFile("penztar.txt","r");
      String sor;
      int db = 0;
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        if( sor.equals("F") )
        {
          db++;
        }
      }
      
      vasarlasok = new Vasarlas[db];
      raf.seek(0);

      db = 0;
      String[] termekek = new String[20];
      int tetelszam = 0;
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        if( sor.equals("F") )
        {
          vasarlasok[db] = new Vasarlas(termekek);
          db++;
          termekek = new String[20];
          tetelszam = 0;
        }
        else
        {
          termekek[tetelszam] = sor;
          tetelszam++;
        }
      }
      
      raf.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }

    // 2. feladat
    System.out.println("2. feladat");
    System.out.println("A fizetesek szama: "+vasarlasok.length);

    // 3. feladat
    System.out.println("3. feladat");
    System.out.println("Az elso vasarlo "+
      vasarlasok[0].getTermekek().length+
      " darab arucikket vasarolt.");

    // 4. feladat
    System.out.println("4. feladat");
    Scanner sc = new Scanner(System.in);
    
    System.out.print("Adja meg egy vasarlas sorszamat! ");
    int sorszam = sc.nextInt();
    System.out.print("Adja meg egy arucikk nevet! ");

// szam utan String-et bekerni nyugos, ezert a szam utani sortorest
// beolvassuk, hogy atlepjunk rajta
    sc.nextLine();
    String cikk = sc.nextLine();
    System.out.print("Adja meg a vasarolt darabszamot! ");
    int darab = sc.nextInt();

    // 5. feladat
    System.out.println("5. feladat");
    
    for( int i = 0; i < vasarlasok.length; i++ )
    {
      if( vasarlasok[i].vettek(cikk) )
      {
        System.out.println("Az elso vasarlas sorszama: "+(i+1));
        break;
      }
    }

    for( int i = vasarlasok.length-1; i >= 0; i-- )
    {
      if( vasarlasok[i].vettek(cikk) )
      {
        System.out.println("Az elso vasarlas sorszama: "+(i+1));
        break;
      }
    }
    
    int db = 0;
    for( int i = 0; i < vasarlasok.length; i++ )
    {
      if( vasarlasok[i].vettek(cikk) )
      {
        db++;
      }
    }

    System.out.println(db+" vasarlas soran vettek belole.");

    // 6. feladat
    System.out.println("6. feladat");
    System.out.println(darab+" darab vetelekor fizetendo: "+
      Vasarlas.ertek(darab)); // osztalymetodus meghivasa

    // 7. feladat
    System.out.println("7. feladat");
    String[] termekek = vasarlasok[sorszam-1].getTermekek();
    db = 1;
    for( int i = 1; i < termekek.length; i++ )
    {
      if( !termekek[i].equals(termekek[i-1]) )
      {
        System.out.println(db+" "+termekek[i-1]);
        db = 1;
      }
      else
      {
        db++;
      }
    }
    System.out.println(db+" "+termekek[termekek.length-1]);

    try
    {
      RandomAccessFile raf = new RandomAccessFile("osszeg.txt","rw");
      for( int i = 0; i < vasarlasok.length; i++ )
      {
        raf.writeBytes((i+1)+": "+vasarlasok[i].getOsszeg()+"\n");
      }
      raf.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }
  }
}

Listás megoldás:

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

package webotlet_16maj_otszaz_lista;

/**
 *
 * https://webotlet.hu
 */

import java.util.ArrayList;

public class Vasarlas
{
  private ArrayList<String> termekek;
  private int osszeg;
  
  public Vasarlas( ArrayList<String> tmp )
  {
    termekek = tmp;
    
    // azert rendezem a termekek neveit nevsorba,
    // hogy az azonos nevuek egymas melle keruljenek,
    // igy majd konnyen meghatarozhatom, melyikbol hany darab van
    String csere;
    for( int i = 0; i < termekek.size()-1; i++ )
    {
      for( int j = i+1; j < termekek.size(); j++ )
      {
        if( termekek.get(i).compareTo(termekek.get(j)) > 0 )
        {
          csere = termekek.get(i);
          termekek.set(i, termekek.get(j));
          termekek.set(j, csere);
        }
      }
    }
    
    // termekek aranak osszege (melyikbol hany darab van)
    // nem lenyeges, hogy mi az a termek,
    // csak a darabszamuk a lenyeg, pl:
    // 2, 2, 1, 3 -> (950 + 950 + 500 + 1350)
    int db = 1;
    for( int i = 1; i < termekek.size(); i++ )
    {
      if( !termekek.get(i).equals(termekek.get(i-1)) )
      {
        System.out.println(db+" "+termekek.get(i-1));
        
        osszeg += ertek(db);
        db = 1;
      }
      else
      {
        db++;
      }
    }
    osszeg += ertek(db);
  }

  public ArrayList<String> getTermekek()
  {
    return termekek;
  }

  public int getOsszeg()
  {
    return osszeg;
  }

  @Override
  public String toString()
  {
    return "Vasarlas{" + "termekek=" + termekek +
      ", osszeg=" + osszeg + '}';
  }

// osztalymetodus, ami akkor is meghívhato, ha nincs peldany belole
  public static int ertek( int db )
  {
    if( db == 1 )
    {
      return 500;
    }
    else if( db == 2 )
    {
      return 950;
    }
    else
    {
      return 950+(db-2)*400;
    }
  }
}

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

package webotlet_16maj_otszaz_lista;

/**
 *
 * https://webotlet.hu
 */

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

public class Webotlet_16maj_otszaz_lista
{
  public static void main(String[] args)
  {
    ArrayList< Vasarlas > vasarlasok = new ArrayList<>();
    
    try
    {
      RandomAccessFile raf = new RandomAccessFile("penztar.txt","r");
      String sor;
      
      ArrayList<String> lista = new ArrayList<>();
      for( sor = raf.readLine(); sor != null; sor = raf.readLine() )
      {
        if( !sor.equals("F") )
        {
          lista.add(sor);
        }
        else
        {
          vasarlasok.add(new Vasarlas(lista));
          lista = new ArrayList<>();
        }
      }
      
      raf.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }

    // 2. feladat
    System.out.println("2. feladat");
    System.out.println("A fizetesek szama: "+vasarlasok.size());
    
    // 3. feladat
    System.out.println("3. feladat");
    System.out.println("Az elso vasarlo "+
      vasarlasok.get(0).getTermekek().size()+
      " darab arucikket vasarolt.");

    // 4. feladat
    System.out.println("4. feladat");
    
    Scanner sc = new Scanner(System.in);
    
    System.out.print("Adja meg egy vasarlas sorszamat! ");
    int sorszam = sc.nextInt();
    System.out.print("Adja meg egy arucikk nevet! ");

// szam utan String-et bekerni nyugos, ezert a szam utani sortorest
// beolvassuk, hogy atlepjunk rajta
    sc.nextLine();
    String cikk = sc.nextLine();
    System.out.print("Adja meg a vasarolt darabszamot! ");
    int darab = sc.nextInt();
    
    // 5. feladat
    System.out.println("5. feladat");
    
    for( int i = 0; i < vasarlasok.size(); i++ )
    {
      if( vasarlasok.get(i).getTermekek().contains(cikk) )
      {
        System.out.println("Az elso vasarlas sorszama: "+(i+1));
        break;
      }
    }

    for( int i = vasarlasok.size()-1; i >= 0; i-- )
    {
      if( vasarlasok.get(i).getTermekek().contains(cikk) )
      {
        System.out.println("Az utolso vasarlas sorszama: "+(i+1));
        break;
      }
    }
    
    int db = 0;
    for( int i = 0; i < vasarlasok.size(); i++ )
    {
      if( vasarlasok.get(i).getTermekek().contains(cikk) )
      {
        db++;
      }
    }
    
    System.out.println(db+" vasarlas soran vettek belole.");

    // 6. feladat
    System.out.println("6. feladat");
    System.out.println(darab+" darab vetelekor fizetendo: "+
      Vasarlas.ertek(darab)); // osztalymetodus meghivasa

    // 7. feladat
    System.out.println("7. feladat");
    ArrayList<String> lista = vasarlasok.get(sorszam-1).getTermekek();
    db = 1;
    for( int i = 1; i < lista.size(); i++ )
    {
      if( !lista.get(i).equals(lista.get(i-1)) )
      {
        System.out.println(db+" "+lista.get(i-1));
        db = 1;
      }
      else
      {
        db++;
      }
    }
    System.out.println(db+" "+lista.get(lista.size()-1));

    // 8. feladat
    try
    {
      RandomAccessFile raf = new RandomAccessFile("osszeg.txt","rw");
      for( int i = 0; i < vasarlasok.size(); i++ )
      {
        raf.writeBytes((i+1)+": "+vasarlasok.get(i).getOsszeg()+"\n");
      }
      raf.close();
    }
    catch( IOException e )
    {
      System.out.println("HIBA");
    }
  }
}

 

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

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljü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..