InfoC – Szorgalmi feladatok https://infoc.eet.bme.hu/ Programozás alapjai I. – InfoC – Szorgalmi feladatok hu http://backend.userland.com/rss Tue, 24 Sep 2019 12:15:00 +0200 60 https://infoc.eet.bme.hu/modulz/logo.png InfoC https://infoc.eet.bme.hu/ 128 128 Sakktábla Tue, 10 Sep 2019 12:15:00 +0200 <p>Adott az alábbi, sakktáblát kirajzoló program:</p> <pre><code class="language-c">#include &lt;stdio.h&gt; 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; }</code></pre> <p>Végezz el ezen két módosítást!</p> <ul> <li>Szüntesd meg a sormintát! Ahol látsz bármilyen ismétlést, azt mind tüntesd el a programból!</li> <li>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!</li> </ul> https://infoc.eet.bme.hu/szorgalmik/#f21 Kismutató, nagymutató Tue, 17 Sep 2019 12:15:00 +0200 <p>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.</p> <p>Egy SVG fájl a következőképpen néz ki:</p> <pre><code class="language-xml">&lt;svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1"&gt; &lt;circle cx="100" cy="50" r="20" stroke="black" fill="yellow" /&gt; &lt;line x1="100" y1="70" x2="100" y2="90" stroke="black" /&gt; &lt;circle cx="90" cy="45" r="3" stroke="black" fill="blue" /&gt; &lt;circle cx="110" cy="45" r="3" stroke="black" fill="blue" /&gt; &lt;rect x="80" y="80" width="40" height="70" stroke="black" fill="blue" /&gt; &lt;line x1="90" y1="150" x2="60" y2="190" stroke="black" /&gt; &lt;line x1="110" y1="150" x2="140" y2="190" stroke="black" /&gt; &lt;line x1="80" y1="90" x2="40" y2="70" stroke="black" /&gt; &lt;line x1="120" y1="90" x2="160" y2="70" stroke="black" /&gt; &lt;/svg&gt;</code></pre> <p>Vagyis a kezdő <code>svg</code> és lezáró <code>/svg</code> között különféle formákat lehet megadni:</p> <ul> <li><code>circle</code> = kör cx,cy középponttal, r sugárral és stroke, fill színnel,</li> <li><code>rect</code> = téglalap, x,y bal felső sarokkal, width,height méretekkel,</li> <li><code>line</code> = szakasz, x1,y1 ponttól x2,y2 pontig,</li> <li>és még egy csomó egyéb dolgot.</li> </ul> <p>Az SVG-ről itt olvashatsz még: <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Basic_Shapes">Basic shapes</a>. A fenti fájlból egyébként az alábbi kép lesz.</p> <p><img src="/szorgalmik/muki.png" alt="Példa SVG képe" /></p> <p>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 <code>ora.svg</code> 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!</p> <p>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.</p> <p>Fájlkezelésről, fájlok létrehozásáról a <a href="/fajlkezeles/">honlapon található segédletben</a> olvashatsz.</p> https://infoc.eet.bme.hu/szorgalmik/#f26 BF értelmező Tue, 24 Sep 2019 12:15:00 +0200 <p><code>++++++++[&gt;++++++++&lt;-]&gt;++.++++.</code> – 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 <a href="/turing/">az algoritmusokról szóló írást</a> és a <a href="/bf/">Brainfuck nyelvről szólót</a>. 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.</p> <p>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 <code>programkod</code>:</p> <pre><code class="language-c">char programkod[] = "hello"; /* 5+1=6 elemű karaktertömb */</code></pre> <p>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 <code>programkod[0] == 'h'</code> és <code>programkod[5] == 0</code>. 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.</p> <p>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.</p> <p>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:</p> <ul> <li>A keresztnevedet kiíró program.</li> <li>Program, amely beolvassa a teljes bemenetét, utána pedig kiírja azt visszafelé. (Bemenet → tenemeB.)</li> <li>Program, amely beolvas egy szöveget, ésmindentszóköznélkülvisszaírakimenetére.</li> <li>Egyéb, tetszőleges program, ez esetben viszont legyen hozzá magyarázat!</li> </ul> <p>Megjegyzések.</p> <ol> <li>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. Ha mégis, akkor csak a határidő után lesz visszautasítva a programod. Itt a kód:</li> </ol> <pre><code class="language-c">char programkod[]="[ThisprogramprintsSierpinskitriangleon80-columndisplay.]&gt;++++[&lt;++++++++&gt;-]&gt;++++++++[&gt;++++&lt;-]&gt;&gt;++&gt;&gt;&gt;+&gt;&gt;&gt;+&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;[-[-&gt;+&lt;]&gt;[-&lt;+&gt;&gt;&gt;.&lt;&lt;]&gt;&gt;&gt;[[-&gt;++++++++[&gt;++++&lt;-]&gt;.&lt;&lt;[-&gt;+&lt;]+&gt;[-&gt;++++++++++&lt;&lt;+&gt;]&gt;.[-]&gt;]]+&lt;&lt;&lt;[-[-&gt;+&lt;]+&gt;[-&lt;+&gt;&gt;&gt;-[-&gt;+&lt;]++&gt;[-&lt;-&gt;]&lt;&lt;&lt;]&lt;&lt;&lt;&lt;]++++++++++.+++.[-]&lt;]+++++*****Made*By:*NYYRIKKI*2002*****";</code></pre> <ol start="2"> <li> <p>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 <code>getchar</code> 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.</p> </li> <li> <p>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”.</p> </li> <li> <p>Ötlet a zárójelpárok kereséséhez: Ha keressük egy <code>[</code> bezáró párját, akkor addig kell menni, amíg meg nem találjuk az első <code>]</code> karaktert. De ha közben újabb <code>[</code> karakterrel találkozunk, akkor már a második <code>]</code>-t keressük. Tehát kell egy változó, amelyik azt tárolja, hányadik <code>]</code>-t keressük (vagy amikor ugrunk egy ciklus elejére, hányadik <code>[</code>-t). Vigyázat! Ne szálljon el a programod akkor sem, ha a BF program szintaktikai hibás! <code>char programkod[] = "]["</code>.</p> </li> <li> <p>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 (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.</p> </li> </ol> <p>Jó szórakozást!</p> https://infoc.eet.bme.hu/szorgalmik/#f33