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
1 2 3 |
static void feladat6Megoldas1() { System.out.println((int)Math.pow(4, 5)); } |
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
1 2 3 4 5 6 7 |
static int ismetlesesVariacio(int n, int k) { return (int)(Math.pow(n, k)); } static void feladat6Megoldas2() { System.out.println(ismetlesesVariacio(4, 5)); } |
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
1 2 3 4 5 6 7 8 9 |
static void feladat6Megoldas3() { for(char k1='a'; k1<='d'; k1++) for(char k2='a'; k2<='d'; k2++) for(char k3='a'; k3<='d'; k3++) for(char k4='a'; k4<='d'; k4++) for(char k5='a'; k5<='d'; k5++) System.out.print(""+k1+k2+k3+k4+k5+" "); System.out.println(); } |
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ő):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
aaaaa aaaab aaaac aaaad aaaba aaabb aaabc aaabd aaaca aaacb aaacc aaacd aaada aaadb aaadc aaadd aabaa aabab aabac aabad aabba aabbb aabbc aabbd aabca aabcb aabcc aabcd aabda aabdb aabdc aabdd aacaa aacab aacac aacad aacba aacbb aacbc aacbd aacca aaccb aaccc aaccd aacda aacdb aacdc aacdd aadaa aadab aadac aadad aadba aadbb aadbc aadbd aadca aadcb aadcc aadcd aadda aaddb aaddc aaddd abaaa abaab abaac abaad ababa ababb ababc ababd abaca abacb abacc abacd abada abadb abadc abadd abbaa abbab abbac abbad abbba abbbb abbbc abbbd abbca abbcb abbcc abbcd abbda abbdb abbdc abbdd abcaa abcab abcac abcad abcba abcbb abcbc abcbd abcca abccb abccc abccd abcda abcdb abcdc abcdd abdaa abdab abdac abdad abdba abdbb abdbc abdbd abdca abdcb abdcc abdcd abdda abddb abddc abddd acaaa acaab acaac acaad acaba acabb acabc acabd acaca acacb acacc acacd acada acadb acadc acadd acbaa acbab acbac acbad acbba acbbb acbbc acbbd acbca acbcb acbcc acbcd acbda acbdb acbdc acbdd accaa accab accac accad accba accbb accbc accbd accca acccb acccc acccd accda accdb accdc accdd acdaa acdab acdac acdad acdba acdbb acdbc acdbd acdca acdcb acdcc acdcd acdda acddb acddc acddd adaaa adaab adaac adaad adaba adabb adabc adabd adaca adacb adacc adacd adada adadb adadc adadd adbaa adbab adbac adbad adbba adbbb adbbc adbbd adbca adbcb adbcc adbcd adbda adbdb adbdc adbdd adcaa adcab adcac adcad adcba adcbb adcbc adcbd adcca adccb adccc adccd adcda adcdb adcdc adcdd addaa addab addac addad addba addbb addbc addbd addca addcb addcc addcd addda adddb adddc adddd baaaa baaab baaac baaad baaba baabb baabc baabd baaca baacb baacc baacd baada baadb baadc baadd babaa babab babac babad babba babbb babbc babbd babca babcb babcc babcd babda babdb babdc babdd bacaa bacab bacac bacad bacba bacbb bacbc bacbd bacca baccb baccc baccd bacda bacdb bacdc bacdd badaa badab badac badad badba badbb badbc badbd badca badcb badcc badcd badda baddb baddc baddd bbaaa bbaab bbaac bbaad bbaba bbabb bbabc bbabd bbaca bbacb bbacc bbacd bbada bbadb bbadc bbadd bbbaa bbbab bbbac bbbad bbbba bbbbb bbbbc bbbbd bbbca bbbcb bbbcc bbbcd bbbda bbbdb bbbdc bbbdd bbcaa bbcab bbcac bbcad bbcba bbcbb bbcbc bbcbd bbcca bbccb bbccc bbccd bbcda bbcdb bbcdc bbcdd bbdaa bbdab bbdac bbdad bbdba bbdbb bbdbc bbdbd bbdca bbdcb bbdcc bbdcd bbdda bbddb bbddc bbddd bcaaa bcaab bcaac bcaad bcaba bcabb bcabc bcabd bcaca bcacb bcacc bcacd bcada bcadb bcadc bcadd bcbaa bcbab bcbac bcbad bcbba bcbbb bcbbc bcbbd bcbca bcbcb bcbcc bcbcd bcbda bcbdb bcbdc bcbdd bccaa bccab bccac bccad bccba bccbb bccbc bccbd bccca bcccb bcccc bcccd bccda bccdb bccdc bccdd bcdaa bcdab bcdac bcdad bcdba bcdbb bcdbc bcdbd bcdca bcdcb bcdcc bcdcd bcdda bcddb bcddc bcddd bdaaa bdaab bdaac bdaad bdaba bdabb bdabc bdabd bdaca bdacb bdacc bdacd bdada bdadb bdadc bdadd bdbaa bdbab bdbac bdbad bdbba bdbbb bdbbc bdbbd bdbca bdbcb bdbcc bdbcd bdbda bdbdb bdbdc bdbdd bdcaa bdcab bdcac bdcad bdcba bdcbb bdcbc bdcbd bdcca bdccb bdccc bdccd bdcda bdcdb bdcdc bdcdd bddaa bddab bddac bddad bddba bddbb bddbc bddbd bddca bddcb bddcc bddcd bddda bdddb bdddc bdddd caaaa caaab caaac caaad caaba caabb caabc caabd caaca caacb caacc caacd caada caadb caadc caadd cabaa cabab cabac cabad cabba cabbb cabbc cabbd cabca cabcb cabcc cabcd cabda cabdb cabdc cabdd cacaa cacab cacac cacad cacba cacbb cacbc cacbd cacca caccb caccc caccd cacda cacdb cacdc cacdd cadaa cadab cadac cadad cadba cadbb cadbc cadbd cadca cadcb cadcc cadcd cadda caddb caddc caddd cbaaa cbaab cbaac cbaad cbaba cbabb cbabc cbabd cbaca cbacb cbacc cbacd cbada cbadb cbadc cbadd cbbaa cbbab cbbac cbbad cbbba cbbbb cbbbc cbbbd cbbca cbbcb cbbcc cbbcd cbbda cbbdb cbbdc cbbdd cbcaa cbcab cbcac cbcad cbcba cbcbb cbcbc cbcbd cbcca cbccb cbccc cbccd cbcda cbcdb cbcdc cbcdd cbdaa cbdab cbdac cbdad cbdba cbdbb cbdbc cbdbd cbdca cbdcb cbdcc cbdcd cbdda cbddb cbddc cbddd ccaaa ccaab ccaac ccaad ccaba ccabb ccabc ccabd ccaca ccacb ccacc ccacd ccada ccadb ccadc ccadd ccbaa ccbab ccbac ccbad ccbba ccbbb ccbbc ccbbd ccbca ccbcb ccbcc ccbcd ccbda ccbdb ccbdc ccbdd cccaa cccab cccac cccad cccba cccbb cccbc cccbd cccca ccccb ccccc ccccd cccda cccdb cccdc cccdd ccdaa ccdab ccdac ccdad ccdba ccdbb ccdbc ccdbd ccdca ccdcb ccdcc ccdcd ccdda ccddb ccddc ccddd cdaaa cdaab cdaac cdaad cdaba cdabb cdabc cdabd cdaca cdacb cdacc cdacd cdada cdadb cdadc cdadd cdbaa cdbab cdbac cdbad cdbba cdbbb cdbbc cdbbd cdbca cdbcb cdbcc cdbcd cdbda cdbdb cdbdc cdbdd cdcaa cdcab cdcac cdcad cdcba cdcbb cdcbc cdcbd cdcca cdccb cdccc cdccd cdcda cdcdb cdcdc cdcdd cddaa cddab cddac cddad cddba cddbb cddbc cddbd cddca cddcb cddcc cddcd cddda cdddb cdddc cdddd daaaa daaab daaac daaad daaba daabb daabc daabd daaca daacb daacc daacd daada daadb daadc daadd dabaa dabab dabac dabad dabba dabbb dabbc dabbd dabca dabcb dabcc dabcd dabda dabdb dabdc dabdd dacaa dacab dacac dacad dacba dacbb dacbc dacbd dacca daccb daccc daccd dacda dacdb dacdc dacdd dadaa dadab dadac dadad dadba dadbb dadbc dadbd dadca dadcb dadcc dadcd dadda daddb daddc daddd dbaaa dbaab dbaac dbaad dbaba dbabb dbabc dbabd dbaca dbacb dbacc dbacd dbada dbadb dbadc dbadd dbbaa dbbab dbbac dbbad dbbba dbbbb dbbbc dbbbd dbbca dbbcb dbbcc dbbcd dbbda dbbdb dbbdc dbbdd dbcaa dbcab dbcac dbcad dbcba dbcbb dbcbc dbcbd dbcca dbccb dbccc dbccd dbcda dbcdb dbcdc dbcdd dbdaa dbdab dbdac dbdad dbdba dbdbb dbdbc dbdbd dbdca dbdcb dbdcc dbdcd dbdda dbddb dbddc dbddd dcaaa dcaab dcaac dcaad dcaba dcabb dcabc dcabd dcaca dcacb dcacc dcacd dcada dcadb dcadc dcadd dcbaa dcbab dcbac dcbad dcbba dcbbb dcbbc dcbbd dcbca dcbcb dcbcc dcbcd dcbda dcbdb dcbdc dcbdd dccaa dccab dccac dccad dccba dccbb dccbc dccbd dccca dcccb dcccc dcccd dccda dccdb dccdc dccdd dcdaa dcdab dcdac dcdad dcdba dcdbb dcdbc dcdbd dcdca dcdcb dcdcc dcdcd dcdda dcddb dcddc dcddd ddaaa ddaab ddaac ddaad ddaba ddabb ddabc ddabd ddaca ddacb ddacc ddacd ddada ddadb ddadc ddadd ddbaa ddbab ddbac ddbad ddbba ddbbb ddbbc ddbbd ddbca ddbcb ddbcc ddbcd ddbda ddbdb ddbdc ddbdd ddcaa ddcab ddcac ddcad ddcba ddcbb ddcbc ddcbd ddcca ddccb ddccc ddccd ddcda ddcdb ddcdc ddcdd dddaa dddab dddac dddad dddba dddbb dddbc dddbd dddca dddcb dddcc dddcd dddda ddddb ddddc ddddd |
4. megoldás
1 2 3 4 5 6 7 8 9 10 |
static void feladat6Megoldas4() { int db=0; for(char k1='a'; k1<='d'; k1++) for(char k2='a'; k2<='d'; k2++) for(char k3='a'; k3<='d'; k3++) for(char k4='a'; k4<='d'; k4++) for(char k5='a'; k5<='d'; k5++) db++; System.out.println(db); } |
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
1 2 3 4 5 6 7 |
static void feladat6Megoldas5(String valasz) { if(valasz.length()==5) System.out.print(valasz+" "); else for(char v='a'; v<='d'; v++) feladat6Megoldas5(valasz+v); } |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
static int db=0; //... static void feladat6Megoldas6(String valasz) { if(valasz.length()==5) db++; else for(char v='a'; v<='d'; v++) feladat6Megoldas6(valasz+v); } //... public static void main(String[] args) { feladat6Megoldas6(""); System.out.println(db); } |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
static void feladat6Megoldas7() { int n=4, k=5, nadk=(int)Math.pow(n, k); int[][] y=new int[nadk][1]; for(int i=0; i<=nadk-1; i++) { int m=i; int[] x=new int[k+1]; for(int j=1; j<=k; j++) { x[j]=m%n; m/=n; } y[i]=x; } for(int i=0; i<nadk; i++) { for(int j=k; j>=1; j--) System.out.print((char)(97+y[i][j])); System.out.print(" "); } } |
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(n–1)
- …
- 1,…,2,n → 0…001(n–1)
- n,…,n,n → (n–1)...(n–1)
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.
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)));
Ü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.Gyakoroltam a rajzolást grafikai primitívekkel. Az emelt szint 3. b) feladatához készítettem el a segítő ábrát:
Ö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?
Ö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):
fillPolygon()
metódussal kiszínezheted.Shape
alakzatokat és azok konvex vagy konkáv belseje szabadon kitölthető színnel vagy akár színátmenettel is.Csak ügyesen! 😉
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.
Ú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:
Köszi Fülöp. Régóta ismerjük egymást, de ha nem ismernénk, a didaktikus megközelítésedből akkor is tudnám :-), hogy tanár vagy.
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)
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ó.