Programozás 2/2007

A MathWikiből
(Változatok közti eltérés)
(A Ruby nyelvhez)
10. sor: 10. sor:
 
===A Ruby nyelvhez ===
 
===A Ruby nyelvhez ===
  
Az [[SZIMP2|Informatika 2]] tárgy wiki oldala, és az ott található linkek.
+
Az [[SZIMP2_Ruby|Informatika 2]] tárgy wiki oldala, és az ott található linkek.
 
+
  
 
==Gyakorló feladatok==
 
==Gyakorló feladatok==

A lap 2007. november 23., 18:01-kori változata

Tartalomjegyzék

Segédanyag

A C nyelvhez

Juhász István-Kósa Márk-Pánovics János: C példatár, 2005, PANEM.
A feladatok megoldásai megtalálhatóak a http://infotech.inf.unideb.hu/konyvek/cpeldatar/ oldalon. Minden kód HTML-ben van, ezért vagy szövegfájlként kell menteni (save as), vagy ki kell másolni egy fájlba (copy-paste). Az összes forráskód tömörítve letölthető innen.

Az Informatika 2 tárgy wiki oldala.

A Ruby nyelvhez

Az Informatika 2 tárgy wiki oldala, és az ott található linkek.

Gyakorló feladatok

Feladatok

Az alábbi feladatok részben a példatár példáinak kis módosításai vagy pontosításai, részben a tavalyiak ismétlései, de szerepel egy-két egyéb feladat is (néhol a feladat után kerek zárójelben az ismétlendő anyag szerepel). A SIO használatának felevenítésére egy-egy feladatot ott is kitűzünk.

  1. (2.3) Írjunk programot, mely egy beolvasott évszámról eldönti, hogy szökőév-e. Ha a beolvasott szám nem pozitív, írja ki, hogy nem évszám. (if, else if, else, printf, scanf, logikai műveletek: &&, ||..., %)
  2. (2.11 a) Írjunk programot, mely összeadja az egészeket 1-től n-ig az n(n + 1) / 2 képletet használata nélkül. (for, i++, +=)
  3. (2.17 b) Írjunk nem rekurzív programot egyetlen while-ciklussal két pozitív egész szám legnagyobb közös osztójának meghatározására, azaz az Euklideszi algoritmusra. (while)
  4. (2.20) Olvassunk be egy karakterláncot, és számoljuk meg a kisbetűk számát az első olyan karakterig, amely nem az angol ábécé egy betűje, majd írjuk ki ezt a számot. (do while, char, getchar, islower, isalpha)
  5. (3.3) Írjunk olyan programot, mely egy tömbbe beolvas 10 egész számot, majd eldönti, hogy van-e köztük két olyan, amelyek szorzata 48. (egymásba ágyazott for ciklusok)
  6. (3.7) Írjunk olyan függvényt, mely egy adott c < 10\,000\,000 pozitív egészhez meghatározza azt a legnagyobb egész n számot, melyre léteznek olyan x és y pozitív egész számok, hogy xFn − 1 + yFn = c, ahol Fn az n-edik Fibonacci-szám (F0 = 0, F1 = 1).
  7. ismétlés: tavalyi honlapról bombaz.c
  8. (3.7 Nyolc királynő probléma - jeles szint) Írjunk programot, mely egy n \times n-es sakktáblán megkeresi n királynő összes olyan elhelyezéseit, ahol egyik királynő sem üti semelyik másikat, és azokat kiírja a képernyőre!
  9. (13.2) Szerelvényrendezés
  10. (9.1) NyargaLó feladat
  11. (SET! játék) A SET! egy 81 kártyából álló játék. Minden kártyán lévő jelet 4 tulajdonság jellemez, ezek mindegyikéből 3-3 változat fordul elő (így a kártyák maximális száma 34 = 81 lehet). A 4 tulajdonság:
    (a) a kártyán lévő figurák száma (1, 2 vagy 3);
    (b) a kártya figuráinak színe (piros, zöld, lila);
    (c) a figurák telítettsége (üres, félig kitöltött, kitöltött);
    (d) a figurák alakja (Rombusz, Téglalap, Hullám).
    Pl. az egyik kártyán van 3 piros félig kitöltött rombusz (3PFR). Azt mondjuk, hogy 3 kártya ,,set"-et alkot, ha a 3 kártya minden tulajdonság szerint vagy azonos, vagy különböző. Pl. setet alkot az 1PKR, 2PKT, 3PKH, mert szám szerint mind különböző (123), szín szerint mind azonos (P), kitöltöttség szerint mind azonos (K), alak szerint mind különböző (RTH). Írjunk programot, mely beolvas 3 és 81 közé eső számú kártyaleírást, és kiírja az ezekből kiválasztható összes setet. A helyes kártyaleírás 4 karakterből áll, az első az 1,2 vagy 3 valamelyike, a második a P, Z, L, a harmadik az U, F, K, a negyedik az R, T, H karakterek valamelyike. Pl. egy lehetséges input:
    3LKT
    1PUR
    3PKR
    2PFR
    3ZKH
    amire a helyes válasz:
    1PUR 2PFR 3PKR
    3PKR 3ZKH 3LKT
    A játék leírása megtalálható a wikipédián is, de van online változata, több is, sőt beviszek egy valódi példányt, úgyhogy ,,élőben" is ki lehet próbálni.

    Ruby

  12. (fill – sokszög kitöltése)
    Egy fekete-fehér kép egy rácsnégyzetekből álló téglalap, melyben minden kis négyzetnek saját színe van: fekete (1) vagy fehér (0). A téglalap szélessége és magassága is egy pozitív egész szám. A bal alsó sarok a (0,0). A kis négyzeteket más néven képpontnak vagy pixelnek nevezzük. Az üres kép csupa fehér képpontból áll.

    Egy fekete-fehér képet az alábbi módon kell PBM-fájlba írni:

    1. a "P1 " string
    2. a kép szélessége 10-es számrendszerben (pl. "30")
    3. szóköz (" ")
    4. a kép magassága 10-es számrendszerben (pl. "20")
    5. soremelés (a "\n" string)
    6. Minden sorra (felülről lefele):
    7. A soron belül minden képpontra (balról jobbra): "0", ha a képpont fehér, és "1", ha fekete
    8. soremelés (a "\n" string)

    Megjegyzés: Ha egy, a fenti tartalmú fájlnak .pbm kiterjesztést adunk, akkor a benne levő képet (Linux alatt) sok képnézegető programmal meg tudjuk nézni (Windows alatt is vannak ilyenek), például a GQview programmal így: gqview fájlnév.pbm

    Megjegyzés: A PBM fájlformátum a fentinél kicsit bővebb szintaxist is megenged, ezek a bővítmények a feladat megoldásához nem szükségesek.

    Egy útvonal (angolul path) képpontok listája. Az útvonal azt a sokszöget jelöli ki a síkon, melynek csúcsai a listában szereplő képpontok a listabeli sorrendben. Élnek tekintjük a lista két szomszédos eleme közti szakaszt, továbbá az első és utolsó csúcspontja közötti szakaszt. A lista legalább három csúcspontból áll. Csak konvex sokszögek megengedettek, és az élek meredeksége 45 foknak többszöröse kell legyen.

    Egy útvonalat konvexnek nevezünk, ha bármely két szomszédos élére igaz, hogy az általuk bezárt előjeles szög 0-nál nagyobb és 180 foknál kisebb; vagy bármely két szomszédos élére igaz, hogy az általuk bezárt előjeles szög 0-nál kisebb és -180 foknál nagyobb. Szomszédosnak tekintünk két élt, ha van közös csúcspontjuk. (A konvexség fenti definíciójának intuitív magyarázata: egy útvonal konvex, ha körbemenve rajta mindig balra vagy mindig jobbra kell fordulni.)

    Egy útvonal kitöltött képének azt a fekete konvex sokszöget nevezzük (belső pontokkal együtt), melyet az útvonal határol. Pontosabban, egy útvonal kitöltött képének kirajzolásakor az alábbi képpontokat kell befeketíteni:

    1. az útvonal csúcspontjai;

    2. az útvonal élei, mint szakaszok képpontjai (hogy pontosan mely képpontok érintettek, az egyértelmű, mivel a szakaszmeredekség 45 fok többszöröse);

    3. az összes olyan képpontot, amely az előző pontban felrajzolt szakaszok által definiált konvex sokszög belsejében található.

    A feladat:
    Írjon egy programott Ruby nyelven, amely a bemenetről beolvasott csúcspontok által definiált sokszöget kitöltve kirajzolja, és az eredményt PBM formátumban kiírja a fenti módon. (Könnyítés: első lépésként olyan program írása, mely a sokszöget kirajzolja, de nem tölti ki, és esetleg a konkávot is megengedi.)

    A program bemenetének első sorában két egész szám található szóközzel elválasztva. Az első a kép szélessége (w), a másik a kép magassága (h). A kép kezdetben teljesen fehér.

    A bemenet további sorai (legalább 3 db) egy konvex útvonal csúcspontjait tartalmazzák sorrendben. Minden sor egy x koordinátát, egy szóközt és egy y koordinátát tartalmaz. A sorokat egy "-1 -1\n" sor zárja. Teljesül, hogy 0 ≤ x < w és 0 ≤ y < h.

    Ha a bemeneten megadott útvonal élei között van olyan, melynek meredeksége nem 45 fok többszöröse, akkor a program "ANGLE\n"-t ír ki. Ellenkező esetben, ha a bemenetben megadott útvonal nem konvex sokszöget határoz meg, akkor a program "NOT_CONVEX\n"-et ír ki. Ellenkező esetben a program a megadott szélességű és magasságú fehér képre feketével felrajzolja a bemeneten megadott útvonal kitöltött képét, és a kapott képet a fenti módon PBM formátumban kiírja.

    A program ezután új képpel folytatja a bemenet beolvasását mindaddig, amíg nincs vége.
    Mintabemenet

    4 4
    0 0
    3 0
    0 3
    -1 -1
    4 3
    0 0
    3 0
    0 2
    -1 -1
    11 5
    1 4
    9 4
    9 1
    1 1
    -1 -1

    Mintakimenet

    P1 4 4
    1000
    1100
    1110
    1111
    ANGLE
    P1 11 5
    01111111110
    01111111110
    01111111110
    01111111110
    00000000000

Személyes eszközök