Elakadtam a 2015-ös emelt szintű infó érettségi programozási feladatával. Hogy oldanátok meg?
link: [link]
Sajnos már problémám volt az első faladattal is. Méghozzá az, hogy nem jöttem még rá, hogy hogyan kéne a sorokat hatékonyan számolni. BufferedReaderrel olvastam be a szöveget. Azt még nem sikerült elérnem, hogy kiválasszam az első illetve az utolsó elötti sort és abból kiválasszam a megfelelő számot.
Feltöltöttem a próbálkozásom:
pastebin(PONT)com/tyjsMVJc
Tedd az identifikációs sorokat egy tömbbe, az üzeneteket egy másikba. (Szótár még jobb lenne, Javában nem tudom, hogy működik).
Keresésnél egyszerűen keress rá a "%nap% %amatőr%" stringre az identifikációs tömbben. (nincs ilyen -> hibaüzenet) Az indexének megfelelő stringet másold ki az üzenetek közül (ugyan az az indexe az összetartozó adatoknak). Így már csak a megfigyelt egyedeket kell kiolvasnod.
A sor első szóközig terjedő részét veszed. Ennek a perjel előtt lévő része szám-e?. A perjel utáni része szám-e? Ha igen-igen, írd ki.
Ha már adott egy OOP-t ismerő nyelv, szerintem használjuk ki:
class Vetel {
private int nap;
private int amator;
private int felnottfarkasok;
private int kolyokfarkasok;
private String uzenet;
//konstruktort és getter-t nekik
//esetleg még egy:
//public static Vetel parseInput(String line1, String line2) throws IllegalArgumentException {*}
}
*:
1) line1.split szóköz mentén, majd a kapott tömb két elemét int-té alakítod
2) line2.split szóköz mentén, az első elemét split / mentén...
3) ha valami nem stimmelne, throw IllegalArgumentException
Innentől csinálhatsz olyat, hogy:
List<Vetel> adatok = new LinkedList<>();
Innentől az első feladat nagyjából ennyi:
try (Scanner sc = new Scanner(new FileInputStream("veetel.txt")) {
..while (sc.hasNextLine() {
.. ..String line1 = sc.nextLine();
.. ..String line2 = sc.nextLine();
.. ..adatok.add(Vetel.parseInput(line1, line2));
..}
}
catch (IOException | IllegalArgumentException e) {
..System.err.println("Hiba történt beolvasás közben");
}
A második feladat pedig:
Vetel elso = adatok.get(0);
Vetel utolso = adatok.get(0);
for (int i = 1; i < adatok.size(); i++) {
.. Vetel current = adatok.get(i);
.. if (current.getNap() < elso.getNap()) elso = current;
.. if (current.getNap() > utolso.getNap()) utolso = current;
}
System.out.println(String.format("Első: %d\nUtolsó: %d", elso.getAmator(), utolso.getAmator()));
És így tovább...
Tök jó lenne, ha máskor a nyelvet is ideírnád. Nekem lassú gépem van, és fölöslegesen nem szórakozom vele, hogy csak ezért megnyissak másik fülön egy ilyen pastebint, amit még félig kézzel is kell beírni. AZ utolsó válaszból úgy látom, Java lehet. Nem hasznosak azok a válaszok, amelyek a teljes adatmennyiség beolvasásával kezdik, mert a feladat kifejezetten azt kéri, hogy lemezről soronként olvasva dolgozzuk fel az adatokat. Ez egy ilyen feladat, érdemes elolvasni.
Feltételezem azt is, hogy első feladatnak a harmadik feladatot nevezed, mert az elsőnél még nincs file.
Ha teljesen elakadtál, akkor érdemes megnézni a megoldásokat is, ott C# nyelven oldották meg, és az is a tanulásnak egy érdekes módja, hogy megértesz egy C# programot kód alapján, és átírod Javába. A hu.sulipython.wikia.com oldalon pedig találsz Python nyelvű megoldást, azzal is megteheted ugyanezt.
Ha figyelmesen elolvasod a feladatokat, akkor rá fogsz jönni, hogy érdemes a 3-4-5-6. feladatot egyben megoldani, és mindegyik a programozási tételek ismeretét kéri számon. Valószínűleg azért, mert a készítők szeretnék tudni, hogy el tud-e szakadni a vizsgázó a modern programnyelvek egyszavas metódusaitól, és tudja-e alkalmazni a tételeket. Ezek mind azon alapulnak, hogy kezdőértéket adsz egy változónak, aztán csinálsz egy ciklust, és a végén nézed a változók értékét.
A beolvasást soronként végezd, ne karakterenként, mivel akkor összezavarják a sorvégjelek. Programnyelvenként változó módon tudod eltüntetni a sorvégjelet, pl. valami strip vagy trim függvénnyel, de én ebben a feladatban egyszerűen vettem minden sor 1. karakterét, és azzal dolgoztam.
A 3. és a 4. feladat a legközönségesebb megszámlálási tétel, tehát lenullázol két változót, az egyiehez minden sor beolvasásakor egyet adsz, a másikhoz csak akkor, ha fej volt, és máris kész van két feladatod egyben.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!