Szorgalmi feladatok

A feladatok megoldásai az admin portálon adhatók be. A szorgalmi feladatokkal egy pontversenyben is részt lehet venni. Alapbeállítás szerint anonim módon jelensz meg a táblázatban. Ha szeretnél névvel megjelenni vagy teljesen eltűnni, az admin portálon beállíthatod.

A verseny állásának megtekintéséhez is be kell jelentkezni.

Kismutató, nagymutató (94 megoldás)

Ha a szorgalmi feladatok versenyében névvel szeretnél megjelenni, állítsd be a személyes menüpontban.

Az SVG (scalable vector graphics) egy szöveges fájlformátum, amellyel vektorgrafikus rajzok adhatók meg. Ez azt jelenti, hogy a fájlban geometriai formák, körök, egyenesek stb. leírása van. Elterjedten használják weboldalakon (mi is az InfoC-n), mert a böngészőprogramok is meg tudják nyitni.

Egy SVG fájl a következőképpen néz ki:

<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="100" cy="50" r="20" stroke="black" fill="yellow" />
  <line x1="100" y1="70" x2="100" y2="90" stroke="black" />
  <circle cx="90" cy="45" r="3" stroke="black" fill="blue" />
  <circle cx="110" cy="45" r="3" stroke="black" fill="blue" />
  <rect x="80" y="80" width="40" height="70" stroke="black" fill="blue" />
  <line x1="90" y1="150" x2="60" y2="190" stroke="black" />
  <line x1="110" y1="150" x2="140" y2="190" stroke="black" />
  <line x1="80" y1="90" x2="40" y2="70" stroke="black" />
  <line x1="120" y1="90" x2="160" y2="70" stroke="black" />
</svg>

Vagyis a kezdő svg és lezáró /svg között különféle formákat lehet megadni:

  • circle = kör cx,cy középponttal, r sugárral és stroke, fill színnel,
  • rect = téglalap, x,y bal felső sarokkal, width,height méretekkel,
  • line = szakasz, x1,y1 ponttól x2,y2 pontig,
  • és még egy csomó egyéb dolgot.

Az SVG-ről itt olvashatsz még: Basic shapes. A fenti fájlból egyébként az alábbi kép lesz.

Példa SVG képe

Specifikáció:

A feladat egy C program írása, amely három számot vár a szabványos bemenetén, szóközzel elválasztva. Ezek egy időpontot mutatnak: óra, perc és másodperc. A program az ora.svg nevű SVG fájlt hozza létre kimenetként, amelyben minden koordinátát a program maga számolt ki (sin, cos). Az órán legyen meg mindhárom mutató! A mutatók ne mindig pontosan az egész órára és percekre mutassanak! (Ha pl. fél kilenc van, a kismutató a nyolcas és a kilences között van középen. De ilyet a percmutató is csinál.) A számlapról ne hiányozzanak a percenkénti osztások sem, sőt az egész órákhoz tartozó osztások legyenek különbözőek, mint a többi!

A díszes, színes órákat szeretjük (választhatsz saját színeket, vonalvastagságokat stb.), programozóként azonban legfontosabb a specifikáció pontos követése. Figyelj arra, hogy a program kimenete szabályos, szintaktikai hibától (pl. hiányzó idézőjelek) mentes SVG fájlt legyen! Ilyen szempontból is nagyon szigorú a megoldások értékelése. A helyes SVG fájlokat meg tudják nyitni a böngészők is (bár ha ez sikerül, attól még nem biztos, hogy teljesen helyesek). Legyél kritikus a neten talált írásokkal is: az M_PI konstans nincs már benne a C nyelv szabványában!

Fájlkezelésről, fájlok létrehozásáról a honlapon található segédletben olvashatsz.

egy pont a helyes kód

+1 pont az apróságok

Tiltott szavak: system; malloc; transform

Elfogadott megoldások: 94 darab.
Szerezhető: 2 pont. Leadási határidő: 2024-09-15 04:00:00.

BF értelmező (56 megoldás)

++++++++[>++++++++<-]>++.++++. Ez egy Brainfuck (BF) nyelvű program, amelyik kiírja a szabványos kimenetére, hogy „BF”. Ha még nem olvastad volna, akkor nézd meg az algoritmusokról szóló írást és a Brainfuck nyelvről szólót. Ezek kellenek a feladat megértéséhez. Ugyanis a feladat egy BF értelmező írása C-ben: egy olyan programot kell írni, amely le tud futtatni egy BF nyelven írt programot.

Specifikáció:

Az értelmezőnek mind a nyolc utasítást ismernie kell. A végtelen hosszú szalag helyett 32768 bájtosat kell venni, amely a gép indításakor nullákkal van feltöltve. A cellák egy bájtos, előjeles egész számokat tárolnak. Ezen az olvasó- és írófej bekapcsoláskori pozíciója a nulladik cella. A szalagról egy szabályosan megírt BF programnak nem szabad lelépnie. Ha ilyen pozíciót olvasna vagy írna, akkor a program futását meg kell szakítani. Az értelmezendő programot a C forráskódban kell eltárolni, karaktertömb formájában, amelynek a neve programkod:

char programkod[] = "hello";

A futtatott programnak akkor van vége, amikor az értelmező eléri a programszöveg végét. Az értelmezőnek helyesen kell tudnia kezelni az egymásba ágyazott ciklusokat is.

A BF program kapja meg a C program szabványos bemenetére érkező karaktereket, olyan módon, hogy a fájl vége jelet a szalagra írt −1-es értékre kell lefordítani számára. A C program szabványos kimenete legyen a BF program kimenete. Azon kívül legfeljebb hibaüzenetet írhat ki.

Programozd is a képzeletbeli gépet, amelyet életre keltett az értelmeződ! A C forráskódnak beépítve tartalmaznia kell az alábbi BF programok közül valamelyiket:

  • Program, amely beolvassa a teljes bemenetét, utána pedig kiírja azt visszafelé. (Bemenet → tenemeB.)
  • Program, amely beolvas egy szöveget, ésmindentszóköznélkülvisszaírakimenetére.
  • Egyéb, tetszőleges program, ez esetben viszont legyen hozzá magyarázat!

Megjegyzések.

  1. Ha nem fut a Sierpiński-háromszög programja az értelmeződben, akkor biztos nem jól csináltál valamit. Olyan megoldást ne küldj be, amin ez a program nem működik. Ha mégis, akkor csak a határidő után lesz visszautasítva a programod. Itt a kód:
char programkod[]="[ThisprogramprintsSierpinskitriangleon80-columndisplay.]>++++[<++++++++>-]>++++++++[>++++<-]>>++>>>+>>>+<<<<<<<<<<[-[->+<]>[-<+>>>.<<]>>>[[->++++++++[>++++<-]>.<<[->+<]+>[->++++++++++<<+>]>.[-]>]]+<<<[-[->+<]+>[-<+>>>-[->+<]++>[-<->]<<<]<<<<]++++++++++.+++.[-]<]+++++*****Made*By:*NYYRIKKI*2002*****";
  1. Ellenőrizd a fájl vége jel kezelését; ne küldj be olyan megoldást, ahol ez nincs a fentiek szerint elvégezve. Ha kísérletet sem teszel annak a feladatrésznek a megoldására, akkor csak a határidő után lesz visszautasítva a programod. Ha nem tiszta, inkább kérdezz! A getchar függvénnyel lehet jó megoldást csinálni, de mivel az ezzel beküldött megoldások 90%-a hibás szokott lenni, tiltólistán van.

  2. Az Internet tele van BF értelmezőkkel, amelyek forráskódban is elérhetőek. Ezeket ne nézd meg, mert akkor nincs semmi értelme a feladatnak. Megoldásként végképp ne küldj be ilyet! BF nyelvű programokat viszont letölthetsz, és kipróbálhatsz a saját értelmeződdel. Vigyázz, akad pár „nem szabványos”.

  3. Vigyázat! Ne szálljon el a programod, ha a BF program szintaktikai hibás! Például: char programkod[] = "][".

  4. Ne használj globális változókat! A feladat megoldása olyan rövid, hogy ebben globális változóra támaszkodni gyakorlatilag rosszul használt függvényeket jelent. Ne használj rekurziót sem – ellentmondana a feladat mondanivalójának; a rekurzió által olyan, mintha megjelenne egy harmadik szalag, a verem. Ugyanígy, a programon és az adaton kívül további tömbre nincs szükség.

Tiltott szavak: sizeof;malloc;free;calloc;realloc;fopen;fclose;dup2;strlen;szallag;getchar;fgetc;getc

Elfogadott megoldások: 56 darab.
Szerezhető: 2 pont. Leadási határidő: 2024-09-29 04:00:00.

Azon pontok mértani helye... (73 megoldás)

Ez az első grafikus szorgalmi. A megoldás előtt tanulmányozd az SDL-ről szóló írást, azon belül is az „Első program” fejezetet!

A feladat a következő. Egy olyan programot kell írnod, amely megnyit egy 640×480 pontból álló ablakot. Ezután végigpásztázza ennek összes képpontját, az alábbiak szerint színezi őket.

  • Pirosra színezi azokat, amelyek kb. 200 képpontnyira vannak a (320;240) ponttól.
  • Zöldre színezi azokat, amelyek távolságösszege a (240;200) és (400;280) pontoktól kb. 250 képpontnyi.
  • Kékre azokat, amelyeknél a (240;240) ponttól és a (400;240) ponttól vett távolságok különbségének abszolút értéke kb. 100 képpont.
  • Végül pedig fehérre azokat, amelyeknél a távolság a (320;240) ponttól, illetve az x=400 egyenestől kb. ugyanakkora.

A „kb. valahány képpont”-nál az egyenlőség határát nevezd epszilonnak, és add meg a programban egy eps nevű változóval! Az egyes alakzatoknak neve is van (középiskolában tanult alakzatok), ezeket írja ki a program az ablakban valahova!

Fontos: az SDL2_gfx egyes verziói hibásak, és rosszul kezelik a színeket. Ezért inkább a pixelColor() és a stringColor() függvények helyett használd a pixelRGBA() és stringRGBA() függvényeket! Abszolút értéket kell használni a feladatban, de nem az abs()-ot, hanem egy másikat. Járj ennek utána, miért!

Tiltott szavak: abs;TTF_OpenFont;pixelColor;stringColor;malloc

Elfogadott megoldások: 73 darab.
Szerezhető: 2 pont. Leadási határidő: 2024-10-13 04:00:00.

Világtérkép 🌍 (48 megoldás)

Adott az alábbihoz hasonló formátumban két tömb: vilag.c és tavak.c. De lehetne még több, pl. hegyek.

float const vilag[] = {
    -59.6, -80.0, -62.3, -80.9, -64.5, -80.9, -61.9, -80.4, -59.6, -80.0, 0, 0, 
    -159.2, -79.5, -162.4, -79.3, -160.2, -78.7, -159.2, -79.5, 0, 0, -45.2, 
    ..............
    -48.0, 82.1, -44.5, 81.7, -46.9, 82.2, -43.4, 83.2, -39.9, 83.2, -35.1, 83.6,
    -27.1, 83.5, 0, 0, -1, -1
};

Ezek a világtérképet tartalmazzák nem túl strukturált formában. Igazából struktúrák tömbjei lehetnének, mert minden számpárjuk egy GPS pozíciót ad meg. A párok első tagja a hosszúsági érték (longitude; -180...+180 fok nyugatról keletre), második tagja pedig egy szélességi érték (latitude; -90...+90 fok délről északra). A számpárok sora sokszögeket ír le, a kontinensek és nagyobb szigetek, illetve tavak körvonalaival. Minden sokszöget egy 0 0 számpár követ, végül az utolsó 0 0 számpár után egy -1 -1 zárja a tömböt. A 0 0 GPS pozíció az egyenlítőn, Közép-Afrika nyugati partjától nyugatabbra található, az Atlanti-óceánon, tehát ott nincs semmi, és ezért lehet végjel.

világtérkép

A feladatod egy olyan SDL2-es programot írni, amely kirajzolja a világtérképet. Ehhez az SDL_gfx filledPolygonRGBA() és aapolygonRGBA() függvényeit kell használni, amelyek tetszőlegesen bonyolult, akár konkáv sokszögeket is tudnak rajzolni. A paraméterezéséhez a koordinátákat előbb át kell másolnod egy másik tömbpárba: a függvény két külön tömbben, a Sint16 vx[]-ben és a Sint16 vy[]-ban várja az x és y koordinátapárokat, ahol Sint16 az SDL által definiált egész szám típus (az int16_t-vel egyenértékű).

Tehát: rajzold ki a programban a világtérképet, az általad választott színekkel egy 1080×540-es vagy 720×360 méretű ablakban! A területek ne csak kitöltve legyenek, hanem körberajzolva is! A programot ne írd tele képletekkel, mágikus számokkal: kell egy függvény, amely GPS koordináta → képernyőkoordináta átalakítást végez, és természetesen kell egy függvény, amely egy ilyen tömb alapján rajzolni tud. A világtérképre rajzolj halványan koordinátarácsot is, 15 vagy 30 fokonként! Jelöld be a BME-t a térképen! A program az ablak bezárására vagy a rajzra kattintásra fejeződjön be.

Beadás előtt ellenőrizd:

  • Nem duplikáltál-e kódot.
  • Nem pazarló vagy hibás-e a memóriakezelésed.
  • Rendeltetésszerűen használtad-e a nyelvi elemeket.

Tiltott szavak: realloc

Elfogadott megoldások: 48 darab.
Szerezhető: 2 pont. Leadási határidő: 2024-10-27 04:00:00.

Rekurzió – stílusgyakorlat 👔 (74 megoldás)

Tetszőlegesen hosszú szöveget beolvasni: ez nem könnyű feladat. Amíg nem láttuk az egész szöveget, nem tudjuk, mennyi memóriát kell foglalni. Amíg nem foglaltuk le a memóriaterületet a sztring számára, addig viszont nem olvashatjuk a szöveget, mert nem tudjuk eltárolni a karaktereket.

Vagy mégis? Tudjuk, hogy a függvények lokális változóiból minden függvényhíváskor létrejön egy új példány. Így, ha egy rekurzív függvénynek egy karakter a lokális változója, akkor egy rekurzív hívással létrehozunk egy újabb karaktert, meg még egyet és még egyet, amíg a szöveg végére nem értünk. Ha ez megtörtént, akkor pedig lefoglalhatjuk a memóriaterületet, mert addigra látjuk, hány karakter volt.

A feladatod egy ilyen függvényt írni:

/* A függvény beolvas egy teljes sort (enterig vagy fájl vége jelig) a
 * szabványos bemenetről, és visszaadja egy dinamikusan foglalt sztringben.
 * A sztring nullával van lezárva, az entert nem tartalmazza. A hívó
 * felelőssége a free()-t meghívni a kapott pointerre. */
char* sort_beolvas(void);

A szöveg beolvasását a fenti módszerrel kell megvalósítanod. Amit használhatsz:

  • tetszőleges saját segédfüggvény,
  • egyetlen egy malloc hívás.

Amit pedig nem:

  • statikus élettartamú változó (azaz globális és függvénybeli statikus),
  • tömb átméretezés, bármilyen egyéb tároló.

Figyelem: ennek a feladatnak elméleti jelentősége van csak! A gyakorlatban az okos átméretezés (pl. a méret duplázása) célravezetőbb, hatékonyabb.

Tiltott szavak: realloc;calloc;strcpy;strncpy;10

Elfogadott megoldások: 74 darab.
Szerezhető: 2 pont. Leadási határidő: 2024-11-10 04:00:00.

Palacsintarendezés (8 megoldás)

Nem csak olyan helyben rendezések léteznek, mint amilyenek előadáson szerepeltek – amelyekben az elemi lépés két elem cseréje.

Ha egy palacsintatornyot szeretnénk rendezni (felülre a kicsik, alulra a nagyok), akkor nagyon nehéz lenne két palacsintát megcserélni benne. Egyszerű művelet viszont a torony egy részének átfordítása: csak benyúlunk egy lapáttal valamelyik két palacsinta közé, és egy ügyes mozdulattal átfordítjuk az egészet.

palacsintarendezés

A programozásban az ilyen elven működő rendezést, mily meglepő, palacsintarendezésnek nevezik (pancake sorting). Külön elmélete van, több algoritmust is kitaláltak hozzá. A legkevesebb szükséges átfordítás számát meghatározó képlet (n függvényében, ahol n a torony mérete), máig ismeretlen.

A legegyszerűbb algoritmus a közvetlen kiválasztásos rendezéshez hasonlít. Ebben megkeressük a legnagyobb palacsintát, aztán a fölötte lévő résszel együtt átfordítjuk. Így a legnagyobb felülre kerül, és a teljes tornyot átfordítva betehetjük azt alulra. A feladat: írd meg a palacsintarendezést láncolt listára, alkalmazva a gyakorlaton tanult listamegfordító algoritmust! A lista álljon 10 egész számból, és minden megfordítási lépés után írd ki a listát, hogy látszódjon a rendezés! Ügyelj arra, hogy az algoritmus lépésenként két megfordítást használ; mindkettő után meg kell jeleníteni a számsort.

Mielőtt nagyon nekiugranál a kódolásnak, gondold át, milyen listát implementálsz! A torony teteje vagy az alja legyen a lista eleje? Szimplán láncolt vagy duplán láncolt a lista? Van strázsa? Ha igen, hol? Értékelési szempont, hogy olyan megoldásokat választasz-e, amik egyszerűsítik a kódot. Figyelj arra, hogy tényleg átfordítást végezz (listaelemek átláncolását), ne pedig új listát építs!

Specifikációt teljesítő megoldás: 1p; ha szép is: még 1p.

Elfogadott megoldások: 8 darab.
Szerezhető: 2 pont. Leadási határidő: 2024-11-24 04:00:00.