Nil honlapja

Üdvözlet!
Magamról
Látvanyos és izgalmas
Programozási feladatok
Programming exercises
Linkek

Tetszőleges böngésző
Tetszőleges felbontás

Utolsó módosítás:

Programozási feladatok

Programod nem azt csinálja amit te akarsz, hanem amit begépeltél. - akárki

Mindaz ami az itt leírtakból kiderül a programozni tanulás egy lehetséges megközelítése, amelyet én többé-kevésbé ismerek. Hasonlíthatjuk egy szamárlétrához, amit majdnem minden programozó végigjárt. Elvileg több évre lesz szükséged a feladatok megoldásához (illetve a háttérismeretek megszerzéséhez) amennyiben most kezdesz el programozni és még élsz is amellett hogy ezt tanulod.

Ne küldjél nekem és ne kérjél tőlem semmiféle megoldást! A megoldott feladat akkor jó ha teljesíti a feladatkiírást. Adott esetben a megrendelőt sem lehet kérdezgetni, hogy "Most jó? Most jó?". Ha magányos vagy, akkor keress valakit, akinek a tudása és haladási képessége hasonló és kalandozzatok együtt! Esetleg keress magadnak egy mentort, aki vállalja, hogy egyengeti az utadat. ... az is lehet, hogy eleve egy mentor vagy ezért kerültél ide. ;-)

Programozni úgy lehet megtanulni, hogy programokat írunk. Ez egy szükséges de nem elégséges feltétel. Elég messzire el lehet így jutni, jókora programozási rutint tudunk magunkban felépíteni. Onnan továbblépni pedig elméleti tudásunk pallérozásával lehet. Csak akkor számíthatunk sikerekre, ha valóban elmélyülünk a témában. A hosszú távú boldoguláshoz az angol nyelv ismerete elengedhetetlen.

Ezek a feladatok szinte tetszőleges programozási nyelvhez jók. Egy-egy adott programozási nyelvben más és más módon lehet elindulni, ennek módját a Google/Yahoo/... segítségével kinyomozhatjuk magunknak, ennek az oldalnak nem célja konkrét programozási nyelvekkel foglalkozni. Nem minden feladat értelmezhető minden nyelven, főleg akkor nem, ha nem imperativ nyelvről van szó.

Ha valamilyen fogalom nem ismert (pl. Fibonacci számok, AVL-fa, ... ), akkor használd a tankönyveket, szakkönyveket, Wikipédiát (http://hu.wikipedia.org/, http://en.wikipedia.org/), vagy Google-t, Yahoo-t, ... (Kigyűjthettem volna én is a linkeket, de nincsen értelme, mert idővel úgyis változik, hogy melyik fogalomhoz mi a legjobb leírás a neten.) A feladatok megoldásában nem kötelező folytonosan haladni.

I. Nem interkatív, nem absztrakt feladatok

  1. Készíts programot amely kiírja, hogy Helló világ!, majd egy soremelést!
  2. Készíts programot amely kiírja az egész számokat 1-től 10-ig!
  3. Készíts programot amely kiírja az egész számokat 10-től 1-ig!
  4. Készíts programot amely kiírja a páros számokat 1-től 50-ig!
  5. Készíts programot amely kiírja az első 10 négyzetszámot!
  6. Készíts programot amely kiírja az első 25 Fibonacci számot!
  7. Készíts programot amely kiírja az első 100 prímszámot!

II. Interaktív, nem absztrakt feladatok

Ha valahol egy légből kapott változónévre - például n - hivatkozom vagy azt mondom valamire, hogy adott, akkor annak értékét a felhasználótól kell megkérdezni. Ha indexekről beszélek és külön nem tisztázom, akkor humán indexelésről van szó, azaz 1-től indul. Adott nyelven lehet, hogy a tömb indexelése nullától kezdődik, ebben az esetben - egyéb utasítások hiányában - az 1. elem alatt a programozási nyelv beli nulladik elemet kell érteni.

  1. Készíts programot amely bekér két egész számot és kiírja az összegüket!
  2. Készíts programot amely bekér két valós számot és kiírja az átlagukat!
  3. Készíts programot amely bekér egy számot! A program negatív vagy 100-nál nagyobb számot ne fogadjon el! A program mindaddig ismételje meg a szám bekérését, amíg az nem megfelelő! (A továbbiakban ha egy felhasználói adatra megszorítást alkalmazunk, akkor hasonló szellemben járjunk el!)
  4. Készíts programot amely bekér egy egész számot! Ha a felhasználó nem számot vagy nem egészet ad meg akkor a program figyelmeztesse és mindaddig kérje újra a számot, amíg az nem megfelelő! Sikeres beolvasás után páros szám esetén írja ki, hogy páros egyébként, hogy páratlan! (A továbbiakban minden felhasználó által megadott adattal kapcsolatban hasonló szellemben járjunk el!)
  5. Készíts programot amely bekéri egy háromszög három oldalának a hosszát, majd kiírja a területét és kerületét! (Területhez: Héron képlet.) Ha a háromszög nem létezik, akkor azt a program közölje azt a felhasználóval (ne pedig elszálljon)!
  6. Készíts programot amely bekéri egy másodfokú egyenlet 3 együtthatóját és kiírja az egynlet valós megoldásait. Ha az egyenlet nem megoldható a valós számok körében, akkor azt a program közölje a felhasználóval!
  7. Készíts programot amely eldönti egy beolvasott számról, hogy prím-e!
  8. (törölt)
  9. Készíts programot amely bekér n (n>=1) számot, majd kírja a legnagyobbat! (A megoldáshoz a számokat - az éppen aktuális kivételével - nem szükséges eltárolni.)
  10. Készíts programot amely bekér n (n>=1) számot, majd kiírja a legnagyobbat, a legkisebbet és az összegüket! (A megoldáshoz a számokat - az éppen aktuális kivételével - nem szükséges eltárolni.)
  11. Készíts programot amely bekér n (n>=2) számot, majd kiírja azt amelyik a legtávolabb van az őt megelőző számtól (az első nem nyerhet)! (A megoldáshoz a számokat - az éppen aktuális és az azt megelőző kivételével - nem szükséges eltárolni.)
  12. Készíts programot amely bekér n (n>=0) számot, majd kiírja őket növekvő sorrendben!
  13. Készíts programot amely bekér n (n>=0) angol nevet, majd kiírja őket az angol ábécé szerint növekvő sorrendben!
  14. Készíts programot amely bekéri egy lottószelvény számait (5 db 1 és 90 közötti szám ismétlődés nélkül) majd kiírja őket növekvő sorrendben!
  15. Készíts programot amely kiírja a Pascal háromszög első 10 sorát! A sorok kezdődjenek a képernyő-sorok elején, a számok között legyen szóköz (az első előtt ne)!
  16. Készíts programot amely gondol egy véletlen egész számra 0 és 1023 között! A felhasználónak tippelgetnie kell. A program írja, ki hogy Kisebb, Nagyobb, vagy Talált! A program mindaddig kérjen új tippet, amíg a felhasználó el nem találja a gondolt számot!
  17. Készíts programot amely az előző megfordítása, azaz a felhasználó találjon ki egy számot, a program pedig tippelgessen! Ha a program tippje jó, akkor a felhasználó nyomjon 2-es gombot (esetleg és ENTER-t)! Ha a gondolt szám kisebb, akkor 1-est, ha nagyobb, akkor 3-ast! Ha a program tudja, hogy a felhasználó hazudik, akkor a program írja ki, hogy Hazudsz!! A program legfeljebb 10 kérdésből találja ki a gondolt számot!
  18. Készíts programot amely bekér n (n>=0) számot, majd kiírja a váltakozó előjeles összegüket! (Az összeg 0-ról indul, a páratlan indexű számokat adjuk hozzá, a páros indexűeket pedig vonjuk le.)
  19. Készíts programot amely bekéri n (n>=0) diák nevét és magasságát, majd kiírja őket magasság szerint növekvő sorrendben!
  20. Készíts programot amely megtalálja a 100 millió alatti prímszámokat és kiírja, hogy hányan vannak! A program fusson 1 percen belül! Rendhagyó módon ez nem egy interaktív feladat, ráadásul a megoldást is közlöm: 5 761 455!

A fenti feladatok megoldásai közül írjál át néhányat úgy, hogy a felhasználó a program elején kiválaszthassa, hogy fájlból vagy billentyűzetről szeretne-e beolvasni. A nyelv stílusához és lehetőségeihez mérten igyekezz ezt úgy megoldani, hogy a beolvasás lényegi része ne legyen kétszer leírva a programodban!

III. Absztrakt(abb) feladatok

Ezen feladatoknál az önellenőrzés módját nem feltétlenül adom meg, azt a feladat megoldójára bízom. A feladatokban szereplő fogalmakat szakkönyvek, a Wikipédia és a Google segítségével ismerjed meg!

  1. Készíts programot amely beolvas egy számtáblázatot (mátrixot), majd kiírja azt a főátlójára tükrözve!
  2. Készíts programot amely valós mátrixokat tud összeszorozni!
  3. Készíts programot amely elhelyez egy képzeletbeli sakktáblán 8 királynőt úgy, hogy egyik se legyen a másik ütésvonalában!
  4. Készíts programot amely egy beírt szóról (szövegrészletről) eldönti hogy szűkebb értelemben véve palindrom-e!
  5. Készíts programot amely beolvas n (n>=0) egész számot, majd kiírja a legkisebb pozitívat (ha létezik)!
  6. Készíts programot amely megmondja két két-dimenziós vektor hajlásszögét!
  7. Készíts programot amely megmondja két n-dimenziós vektor hajlásszögét!
  8. Készíts programot amely megmondja két háromdimenziós vektor vektoriális szorzatát!
  9. Készíts programot amely köröket olvas be (középpont x és y koordinátája és sugár), majd megmondja, hogy egy adott pont mely körökben van benne!
  10. Készíts programot amely háromszögeket olvas be (három csúcs), majd megmondja, hogy egy adott pont mely háromszögekben van benne!
  11. Készíts programot amely téglalapokat olvas be (bal felső sarok x és y koordinátája, a felső él dőlésszöge (fokban), szélesség és magasság), majd megmondja, hogy egy adott pont melyekben van benne!
  12. Készíts programot amely szabályos sokszögeket olvas be (oldalak száma, középpont, sugár, kitüntetett csúcs szöge (fokban)), majd megmondja, hogy egy adott pont benne melyekben van benne!
  13. Készíts programot amely alakzatokat olvas be (lásd előző 4 feladat) tetszőleges sorrendben, majd kiírja azokat amelyek tartalmaznak egy adott pontot terület szerint növekvő sorrendben!
  14. Készíts programot amellyel Hanoi tornyai játékot lehet játszani! A program saját maga legyen képes ezt a játékot játszani!

IV. Teljesen absztrakt feladatok

  1. Készíts programot amely kört és vonalat rajzol pontonként, saját algoritmussal, gyorsan!
  2. Készíts programot amely a programod által generált hanghullámokból lejátsza (elcsipogja) a Birodalmi Indulót (Star Wars)!
  3. Valósítsuk meg a következő rendezéseket tömbön: gyors rendezés (quick sort), összefésüléses rendezés (merge sort), kupac rendezés (heap sort)
  4. Valósítsuk meg a következő struktúrákat: kétirányú láncolt lista (doubly-linked list), halmaz (AVL fával, AVL tree), verem (stack, az imént megírt kétirányú láncolt listádat használd!)!
  5. Készíts számológépet, amely kiszámolja a felhasználó által szövegesen megadott formula értékét (pl. 2+3*4^5+sqrt(sin(45))^ln(2))!
  6. Készíts programot amely tetszőleges nagyságú egész számokat képes tárolni, ezeket összeadni, kivonni, szorozni és osztani!
  7. Olvass be két - élei mentén tetszőleges módon, de nem teljesen szétvágott és síkba - kiterített Rubik-kockát fájlból. Döntsd el, hogy a két kocka megegyezik-e (lehet hogy más lapjuk néz felénk, de azonosak!)!
  8. Folytasd az előző feladatot és mondjad meg hogy a két kocka egyetlen szabályos forgatással átvihető-e egymásba!
  9. Készíts programot amely beolvassa egy fájlból egy irányítatlan gráf pontjainak a számát és éleit, majd megmondja hogy a gráfnak hány komponense van!
  10. Készíts programot amely kiszámolja egy mátrix determinánsát és inverzét!
  11. Készíts programot amely egy-utas labirintust generál és old meg!

Vége

  • Ismerd meg az általad választott X lehetőségeit, erősségeit és gyengéit, ahol X:
    • programozási nyelv
    • programozási környezet (szabványos eszköztár, 3rd party framework)
    • programozási eszköz (IDE)
    • együttműködést támogató eszköz (verziókövető rendszer, bug követő rendszer)
  • Soha ne legyél rest újat tanulni, mert különben elévülsz!
  • Programod akkor jó, ha a felhasználó is elégedett. Nem elég a lényegi részét megoldani a feladatnak. Programjaid kezelőfelülete soha ne legyen fapados, vagy okoskodó (kivéve célforgalom)! Mindig gondolj arra hogy scriptek-ben alkalmazható legyen a programod, amennyiben ez értelmezhető!
  • További feladatok: programozási feladatok

Ezen a ponton mindenkinek a vágya illetve elképzelése más és más. Ha eljutottál ide, akkor körülbelül sejteni fogod, hogy mit akarsz. Ezek a feladatok az "algoritmizálási" és az "absztrahálási" képességet alakították ki illetve alapozták meg. Ez csak egy csupasz váz, amely még elméleti értelemben sem teljes. Illusztrációnak álljon itt néhány hatalomszó: erős típusosság, gyenge típusosság, objektum orientált programozás, generikus programozás, operátor túlterhelés, funkcionális nyelvek, párhuzamos programozás, numerikus módszerek, adatbázisok, fordítóprogramok, osztott rendszerek, ...

Ajánlott irodalom

  • Új algoritmusok
  • The pragmatic programmer
  • Fóthi Ákos: Bevezetés a programozáshoz
  • Programtervezési minták (Design patterns)
  • Refactoring (arra az esetre ha minden kötél szakad :-D)
  • Könyvek speciálisabb témákról (grafika, hang, adatbázis kezelés, web, felhasználó felület építés, modellezés, hálózatok, ...)
  • Könyvek konkrét programozási nyelvekről

-- Darabos Edvárd Konrád <voidnil on yahoo.com> | 2009-11-22, 2009-12-09