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.
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.
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.
++++++++[>++++++++<-]>++.++++.
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.
- 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*****";
-
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. -
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”.
-
Vigyázat! Ne szálljon el a programod, ha a BF program szintaktikai hibás! Például:
char programkod[] = "]["
. -
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.
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 és a pixelColor()
függvények helyett használd a stringColor()
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.
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.
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.
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.
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.
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.