Egy matematika érettségi feladat megoldása programozással 2022

érettségi logóA 2022-es középszintű matematika érettségi feladatsor eléggé egyszerű volt, de azért a 6. feladata inspirált arra, hogy a programozás eszköztárával oldjuk meg ezt a feladatot. Szükséges hozzá a megszámolás programozási tétel. Többféle megoldás/megközelítés (iteratív és rekurzív) is előkerül. Érdekes belegondolni, hogy mennyire más lehetne a problémamegoldás, ha programozhatnánk a matematika érettségi vizsgán. A teljes feladatsor a megoldásokkal együtt letölthető az oktatas.hu-ról.

6. feladat

Egy feleletválasztós teszt 5 kérdésből áll, minden kérdésnél négy válaszlehetőség van. Hányféleképpen lehet az 5 kérdésből álló tesztet kitölteni, ha minden kérdésnél egy választ kell megjelölni?

1. megoldás

Rögtön tudjuk, hogy ez kombinatorika, n elem k-ad osztályú ismétléses variációja, amelynek paraméterei: n=4, k=5. A hatványozás azonosságainak ismeretében fejből is tudjuk a megoldást: 45=210=1024. A Java forráskód elvégzi a hatványozást. A Math.pow() függvény általánosabb, mint amire most szükségünk van. Fogad double valós paramétereket és double típusú értékkel tér vissza. Ezért hasznos az (int) explicit típuskényszerítés.

Másképpen: négy elemű halmazból öt elemet kiválasztunk és ezeket sorba rendezzük (permutáljuk) és egy elemet egy csoportban akár ötször is felhasználhatunk. Számít a sorrend. A lehetséges variációk száma: 1024.

2. megoldás

Ha hasznos lenne egy általános metódus az ismétléses variáció kiszámítására, akkor ez egy tipikus megoldás lehet erre. Kiegészítendő még a két paraméter előjelének ellenőrzésével.

3. megoldás

Ha a megértést segíti, akkor a teljes leszámolás (brute force) módszerével, egymásba ágyazott ciklusokkal könnyen kiírathatjuk a konzolra az 1024 db különböző válaszlehetőséget. A k-val kezdődő sorszámozott ciklusváltozók jelölik az öt kérdést, azon belül az 'a'-tól 'd'-ig karakterek adják a válaszlehetőségeket. Eredményül ezt kapjuk (görgethető):

4. megoldás

Ha csak a végeredmény szükséges, akkor ez az iteratív megoldás a megszámolás programozási tétellel előállítja azt.

5. megoldás

Ez egy rekurzív megoldás. Ciklus helyett a metódus önmagát hívja meg, így valósul meg az ismételt utasításvégrehajtás. A válaszlehetőségek összefűzésével (konkatenáció) előállított válasz akkor megfelelő, ha annak hossza öt. Ez esetben kiíródik a válaszlehetőség a konzolra (mintegy mellékhatásként). Ugyanazt az eredményt kapjuk, mint a 3. megoldásnál.

6. megoldás

Szintén, ha csak a végeredmény szükséges, akkor ez a mellékhatással rendelkező rekurzív metódus előállítja azt. A mellékhatás most az, hogy a metódus eljárás és nem függvény és szükséges hozzá a db osztályváltozó (ami a metódushoz képest globálisnak is tekinthető).

7. megoldás

Ez a megoldás a válaszlehetőségeket megfelelteti n alapú számrendszerben k számjegyből álló számoknak. A kétdimenziós tömbben számokat tárol, így:

  • 1,…,1,1 → 0…0000
  • 1,…,1,2 → 0…0001
  • 1,…,1,n → 0…001(n1)
  • 1,…,2,n → 0…001(n1)
  • n,…,n,n → (n1)...(n1)

Végül a kiíró ciklus ezeket a számokat karakterekké alakítja ( 'a' ASCII kódja 97) és fordított sorrendben írja ki, hogy ugyanazt az eredményt kapjuk, mint a 3. megoldásnál.

Továbbfejlesztési lehetőségek

  • A 2. megoldáshoz: teszteljük le a lehetséges túlcsordulást és az int típus helyett szükség esetén használjunk long típust!
  • A 3. megoldáshoz: építsünk kétdimenziós tömb adatszerkezetet, amiből később az i-edik válaszlehetőség megadható!
  • Előzőhöz: állítsuk elő lexikografikus sorrendben az i-edik válaszlehetőséget adatszerkezet felépítése nélkül!
  • A 6. megoldáshoz: valósítsuk meg a rekurzív gondolatmenetet mellékhatás nélkül!
  • Teszteljünk: mennyi idő alatt hajtódik végre a 4. és a 6. megoldás? Mekkora paraméterekkel érzékelhető, hogy a rekurzió jóval lassabban fut?
  • A 7. megoldáshoz: cseréljük le az egésztömb adatszerkezetet karaktertömbre!

A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.

Ajánljuk matematika érettségi feladat címkénket, mert a témában évről-évre blogolunk.

A feladat a Java SE szoftverfejlesztő tanfolyam szakmai moduljának 5-8. óra: Vezérlési szerkezetek, valamint 21-24. óra: Objektumorientált programozás 1. rész alkalmaihoz kötődik.

“Egy matematika érettségi feladat megoldása programozással 2022” bejegyzéshez 9 hozzászólás

  1. Kedvet kaptam a közép 8. feladathoz. Több megoldást is írtam két pont távolságára. Mindegyik ugyanazt adja: 5.

    Point a=new Point(5, -3);
    Point b=new Point(1, 0);
    System.out.println("v1: "+Math.sqrt(Math.pow(b.x-a.x, 2)+Math.pow(b.y-a.y, 2)));
    System.out.println("v2: "+Point.distance(a.x, a.y, b.x, b.y));
    System.out.println("v3: "+a.distance(b));
    System.out.println("v4: "+Point2D.distance(a.x, a.y, b.x, b.y));
    System.out.println("v5: "+Math.hypot(Math.abs(b.x-a.x), Math.abs(b.y-a.y)));

    Válasz
    • Ügyes vagy András. Mindegyik jó megoldás. Az importokkal kiegészíteném, mert talán nem mindenki ismeri:
      import java.awt.Point;
      import java.awt.geom.Point2D;

      Hasznos lenne egy Point.distance(a, b) túlterhelt metódus – ha már OO -, de sajnos ilyen nincs.

      Válasz
  2. Gyakoroltam a rajzolást grafikai primitívekkel. Az emelt szint 3. b) feladatához készítettem el a segítő ábrát:
    Matematika emelt érettségi feladat 2022 3. b)
    Örökítettem a JPanel-ből a saját téglalap alakú területemet és felülírtam a rajzoló metódusát. Bízom benne :-), hogy jól fogalmaztam meg. Ez a forráskód:

    Igyekeztem mindent általánosan megadni. A nagyítást ezért skáláztam. A zöld területet utólag színeztem ki az ábrán. Java forráskódból nem tudtam megoldani. Sándor, írnál hozzá ötletet?

    Válasz
    • Örülök, hogy foglalkoztál vele Andrea. Korábban is mondtad, hogy érdekel az elemi grafika. Ehhez ajánlom grafika címkéjű blog bejegyzéseinket.
      Precízen fogalmaztál meg mindent. Az örökítés az egyik jó módszer a GUI komponensek testre szabására, egyéni kialakítására. Az utolsó utasításban “képletesíthetnéd” még a két utolsó paramétert.

      Négy úton indulhatsz el a színezés felé (swing grafikus vászont használva):

      • A téglalap és átlója helyett két háromszöget rajzolsz, a felsőt töltsd ki zölddel, majd rajzold le a fehér negyedkörívet… Az elv: rétegszerűen rajzolj alulról felfelé, figyelve a láthatóságra, átlátszóságra, lefedésre.
      • Definiáld poligonként a zöld területet. Ehhez a kör egyenlete kell a középiskolás koordináta-geometriából (vagy legalább 4-5 pontot érdemes “kézzel” felvenni a zöld területet határoló köríven). Ezután a fillPolygon() metódussal kiszínezheted.
      • Használj tetszőleges Shape alakzatokat és azok konvex vagy konkáv belseje szabadon kitölthető színnel vagy akár színátmenettel is.
      • Ha bittérképként dolgozod fel az elkészült képet (2D tömb RGB színkoordinátákkal), akkor használhatsz sík söprési algoritmust (sweep line). Ehhez adott a fehér háttérszín és a fekete határolószín a síkidomhoz. Hasonlóan működik, mint a Paintben a szétfolyó festék, vagy az Aknakeresőben az üres mezők felfedése.

      Csak ügyesen! 😉

      Válasz
      • Köszönöm Sándor. A megerősítést és az ötleteket is. A sorrendet figyelembe véve sikerült megoldani a színnel való kitöltést. Feltöltöttem a csoporttársaknak az ILIAS-ba. Talán lesz, aki másképpen is megoldja a színezést. A letölthető megoldásból sikerült általánosítani a 276, 116-ot is.

        Válasz
  3. Úgy írtam Java forráskódot a közép 16. d) feladathoz, hogy az is megértse belőle a lényeget, aki még nem ismeri a számtani sorozatokat. Kijött, hogy havi öttel kell növelnie az autókereskedőnek az eladást, hogy teljesítse az üzleti tervét.

    Forráskód:

    Eredmény:

    Válasz
    • Stream API-val lambdázva összeraktam a fejlécet. Kétféle megoldásom lett. Az órán majd megbeszéljük: mi a különbség, melyik a jobb, inkább melyiket érdemes használni.

      a)

      b)

      Válasz
      • Laci: kösz, én is kíváncsi vagyok.
        A hátultesztelő ciklusban is próbáltam Stream API-t használni, amennyire lehetett:

        Sajnos kellett hozzá konstansként a D változó.

        Válasz

Szólj hozzá!