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.
Adott az alábbi, sakktáblát kirajzoló program:
#include <stdio.h>
int main() {
printf("XX..XX..XX..XX..\n");
printf("XX..XX..XX..XX..\n");
printf("..XX..XX..XX..XX\n");
printf("..XX..XX..XX..XX\n");
printf("XX..XX..XX..XX..\n");
printf("XX..XX..XX..XX..\n");
printf("..XX..XX..XX..XX\n");
printf("..XX..XX..XX..XX\n");
printf("XX..XX..XX..XX..\n");
printf("XX..XX..XX..XX..\n");
printf("..XX..XX..XX..XX\n");
printf("..XX..XX..XX..XX\n");
printf("XX..XX..XX..XX..\n");
printf("XX..XX..XX..XX..\n");
printf("..XX..XX..XX..XX\n");
printf("..XX..XX..XX..XX\n");
return 0;
}
Végezz el ezen két módosítást!
- Szüntesd meg a sormintát! Ahol látsz bármilyen ismétlést, azt mind tüntesd el a programból!
- Jelenleg minden mező 2 egység széles: két darab X és . van vízszintesen és függőlegesen is. Oldd meg, hogy a felhasználó adhassa meg ezt a számot, vagyis hogy beállítható legyen a sakktábla mérete!
Elfogadott megoldások: 283 darab.
Szerezhető: 1 pont. Leadási határidő: 2019-09-17 04:00:00.
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.
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ámított 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 is). Legyél kritikus a neten talált írásokkal is: az M_PI konstans nincs 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.
Tiltott szavak: system; malloc; transform
Elfogadott megoldások: 199 darab.
Szerezhető: 1 pont. Leadási határidő: 2019-09-24 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.
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"; /* 5+1=6 elemű karaktertömb */
A C a sztringeket karaktertömbként kezeli, azok nagyon kényelmesen használhatóak erre a célra. Azt is ki lehet használni, hogy C-ben ezek végjeles sorozatok, nulla zárja le őket. Vagyis a fenti példában programkod[0] == 'h'
és programkod[5] == 0
. 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 −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:
- A keresztnevedet kiíró program.
- 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.
-
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”.
-
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 az a program nem működik. Itt a kód:
char programkod[]="[ThisprogramprintsSierpinskitriangleon80-columndisplay.]>++++[<++++++++>-]>++++++++[>++++<-]>>++>>>+>>>+<<<<<<<<<<[-[->+<]>[-<+>>>.<<]>>>[[->++++++++[>++++<-]>.<<[->+<]+>[->++++++++++<<+>]>.[-]>]]+<<<[-[->+<]+>[-<+>>>-[->+<]++>[-<->]<<<]<<<<]++++++++++.+++.[-]<]+++++*****Made*By:*NYYRIKKI*2002*****";
-
Ez a feladat nehéznek tűnik ELSŐRE, de a megoldás egyszerű, 30-40 sor. Egyedül a bezáró (vagy nyitó) zárójelpár megkeresésének algoritmusa nem triviális. Ötlet: Ha keressük egy
[
bezáró párját, akkor addig kell menni, amíg meg nem találjuk az első]
karaktert. De ha közben újabb[
karakterrel találkozunk, akkor már a második]
-t keressük. Tehát kell egy változó, amelyik azt tárolja, hányadik]
-t keressük (vagy amikor ugrunk egy ciklus elejére, hányadik[
-t). -
Vigyázat! Ne szálljon el a programod akkor sem, ha a BF program szintaktikai hibás!
char programkod[] = "]["
. -
Ne használj globális változókat, legfeljebb a két szalaghoz! 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 (ha már tanultál róla régebben esetleg). Az ellentmond a feladat mondanivalójának; a rekurzió által olyan, mintha egy megjelenne egy harmadik szalag, a verem.
-
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.
Jó szórakozást!
Tiltott szavak: sizeof;malloc;free;calloc;realloc;fopen;fclose;sizeof;dup2;strlen;szallag
Elfogadott megoldások: 20 darab.
Szerezhető: 1 pont. Leadási határidő: 2019-10-01 04:00:00.