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"); } } }
A feladat leírásának helyes linkje:
http://dload.oktatas.educatio.hu/erettsegi/feladatok_2016tavasz_emelt/e_inf_16maj_fl.pdf
Úgy tűnik variáltak a linkekkel. Javítottam.