B-PROG2 Zbierka príkladov

Zbierka príkladov


Základy programovania


  • Napíšte program v jazyku C, ktorý načíta dve celočíselné premenné a vypíše ich súčet, rozdiel, súčin a podiel.
  • Napíšte funkciu v jazyku C, ktorý vypočíta najväčší spoločný deliteľ dvoch čísel (gcd). Otestujte ju v krátkom programe.
  • Napíšte program v jazyku C, ktorý načíta zlomok v tvare a/b a upraví ho na tvar: x+y/z, kde y < z, gcd(y,z)=1. Využite funkciu gcd.
  • Napíšte program v jazyku C, ktorý načíta 2 zlomky v tvare a/b a c/d a dá ich na spoločný menovateľ: vypíše x/y a z/y. Využite funkciu gcd.
  • Napíšte funkciu, ktorá nájde najbližší deliteľ čísla x väčší ako y. Otestujte ju v krátkom programe (načíta vstupy, vypíše výstupy).
  • Napíšte funkciu, ktorá nájde všetky prvočíselné delitele daného čísla pomocou funkcie z predošlého bodu. Otestujte ju v krátkom programe.

Výpočty s reálnymi číslami


  1. Napíšte program v jazyku C, ktorý načíta dve reálne premenné a vypíše ich súčet, rozdiel, súčin a podiel.
  2. Napíšte nasledovné funkcie, a program, ktorý ich umožní otestovať:
    • výpočet obsahu trojuholníka z dĺžok jeho strán: Herónov vzorec
    • dostrel pre šikmý vrh, zo zadanej počiatočnej rýchlosti a uhlu v stupňoch (pozor, potrebné previesť na rad pri výpočte): Šikmý vrh
    • ako predošlý prípad, ale pridajte parameter počiatočná výška Range of a projectile
  1. Vytvorte jednoduchú hypotekárnu kalkulačku, ktorá umožňuje:
    • Vypočítať cez funkciu mesačnú splátku hypotéky podľa amerického vzorca: Mortgage calculator
    • Načítať vstupy v používateľsky prívetivejšej forme: percentá ročne, počet rokov hypo, hodnotu úveru
    • Vypísať výstupy (veľkosť splátky) s presnosťou na dve desatiny
  1. Napíšte funkciu, ktorá umožňuje vypísať desatinné číslo (menšie ako 1) so zvolenou presnosťou (len pomocou vypisovania jednotlivých číslic)
  2. Vytvorte vlastnú funkciu na výpočet odmocniny pomocou delenia intervalu, a porovnajte ju s knižničnou funkciou sqrt.
  3. Vytvorte vlastnú funkciu na výpočet sínusu pomocou Taylorovho radu, a porovnajte ju s knižničnou funkciou sin. Sine and Cosine: Expansions

Vetvenia a cykly


Základná enumerácia

Postupne vytvorte funkciu 1E cez nasledovné medziúlohy. Tieto úlohy zväčša vyžadujú konštrukciu základného for cyklu so špecifickou inicializáciou, testovacou podmienkou a inkrementu.

  • 1A. Napíšte funkciu, ktorá vypíše všetky čísla od 1 po zadané n (vrátane, n je parameter funkcie).
  • 1B. Napíšte funkciu, ktorá vypíše všetky kladné párne čísla po zadané n (vrátane, n je parameter funkcie). Pozn.: skúste to pomocou zmeny for-cyklu, nie pomocou testu deliteľnosti
  • 1C. Napíšte funkciu, ktorá vypíše všetky kladné násobky zadaného čísla x menšie ako n (x, n sú parametre funkcie). Pozn.: úloha 1B sú násobky čísla 2…
  • 1D. Napíšte funkciu, ktorá vypíše všetky násobky zadaného čísla x v intervale [a,b] (uzavretý interval, x,a,b sú parametre funkcie). Pozn.: treba prispôsobiť začiatok cyklu, zvyšok je 1C.
  • 1E. Napíšte funkciu, ktorá vypíše všetky násobky zadaného čísla x v intervale [a,b], pričom každé číslo je na samostatnom riadku vo formáte ‚k kx‘ (uzavretý interval, x,a,b sú parametre funkcie). Pozn.: Toto je podstatou iná úloha ako 1D, lebo cyklus riadi premenná k, ale testuje sa ukončenie pomocou k*x.
  • Ako 1A-E, ale vypíše údaje od konca.

Príklady výstupov pri interaktívnom testovaní:

Spracovanie postupností načítaných zo vstupu

  • 2A. Napíšte funkciu, ktorá načítava postupnosť čísel z klávesnice, až pokým nie je zadané číslo x (parameter funkcie). Funkcia vráti počet prečítaných čísel (x nezapočítajte). Predpokladajte korektné vstupy (TZN: netreba ošetrovať scanf…). Pozn.: Na toto je asi najvhodnejší cyklus do-while, lebo sa načítať musí aspoň 1 číslo.
  • 2B. Ako 2A, ale predpokladajte možnosť nesprávneho vstupu. V takom prípade prerušte funkciu a vráťte hodnotu -1. Pozn.: Testujte úspešnosť príkazu scanf, na prerušenie s ukončením funkcie využite príkaz return.
  • 2C. Ako 2A, ale predpokladajte možnosť nesprávneho vstupu. Nesprávne vstupy preskakujte (a nezapočítajte) Pozn.: t.j. typické využitie príkazu continue.. Na vyčistenie vstupu je potrebné použiť napr. nasledujúcu konštrukciu:

  • 2D. Ako 2A, ale vypočítajte priemer čísel. HINT: zistite súčet (pripočítavajte čísla k nejakej sumačnej premennej) a počet (2A), podeľte ich.
  • 2E. Ako 2A, ale vráťte najväčšie z načítaných čísel. HINT: uchovávajte si doterajšie maximum, ak je nové číslo väčšie, tak nahraďte doterajšie maximum.
  • 2F. Ako 2A, ale vráťte minimum z načítaných čísel. HINT: podobne ako maximum, ale iná podmienka.
  • 2G. Ako 2A, ale vráťte počet čísel väčších ako zadané číslo x.
  • 2H. Ako 2A, ale zistite, či sa v postupnosti nachádza zadané číslo y (ďalší parameter funkcie). Pozn.: Zistite, či znamená, že ak podmienka platí, vráti funkcia pravdivú hodnotu (1), inak nepravdivú (0).
  • 2I. Ako 2A, ale zistite, koľkokrát sa v postupnosti nachádza zadané číslo y (ďalší parameter funkcie). Pozn.: Zistite, koľkokrát znamená, že vráti počet výskytov y.

Generované postupnosti

  • 3A. Napíšte funkciu, ktorá vypíše prvých n členov Fibonacciho postupnosti (n je parameter). Fibonacciho postupnosť je definovaná nasledovne: x_i+1_ = x_i_ + x_i-1_, x_1_=1, x_2_ = 1. Pozn.: Budete asi potrebovať aspoň dve premenné v cykle, kde sa uchovávajú predošlé 2 hodnoty v postupnosti.
  • 3B. Napíšte funkciu, ktorá vypíše prvých n členov zovšeobecnenej Fibonacciho postupnosti. Okrem parametra n sú parametrami aj x_1_ a x_2_.

Príklad výstupov pri interaktívnom testovaní:

  • 4A. Collatzova postupnosť je definovaná nasledovne: Ak x_i_ je párne číslo, potom x_i+1_ = x_i/2. Inak x_i+1_ = 3 x_i_+1. Napíšte funkciu, ktorá vypočíta nasledujúci člen postupnosti x_i+1_, ak je vstupom x_i_.
  • 4B. Napíšte funkciu, ktorá vypíše Collatzovu postupnosť pre zadaný prvý prvok x_1_. Posledný prvok je vždy číslo 1.
  • 4C. Napíšte funkciu, ktorá vráti počet prvkov Collatzovej postupnosti pre zadaný prvý prvok x_1_ (vrátane prvého prvku a poslednej jednotky)

Zložitejšie vetvenie

Zadanie: napíšte funkciu, ktorá overí, či je zadané rodné číslo platné. Rodné číslo je zadané funkcii v dvoch celočíselných parametroch. Vráti 0 ak nie je, 1 ak patrí mužovi a -1 ak žene.

  • Na testovanie napíšte vlastnú funkciu. Jednak môžete napevno zadať nejaké príklady, alebo pri testovaní funkcie môžete číslo načítať pomocou scanf("%d/%d", &c1, &c2);, kde c1 a c2 budú 2 intové premenné. Podľa výsledku funkcie na overenie RČ vypíšte výsledok (vetvenie).
  • Definícia formátu: Rodné číslo
  • Pri testovaní budete musieť rozdeliť prvé číslo na 3 časti (rok, mesiac, deň), využite operácie celočíselného delenia a zvyšku po delení (delením 10 posuniete číslice, zvyškom získate poslednú číslicu). Pri delení prvej časti čísla tiež viete zistiť, či sa jedná o muža alebo ženu.
  • Otestujte, či je dátum platným pomocou funkcie z prednášky – treba však doplniť prestupný rok
  • Podľa roku je potrebné otestovať druhú časť RČ:
    • ak je rok menej ako 53 (pozor na čísla po roku 2000 ;)), otestujte, či má tri číslice (menej ako 1000)
    • inak otestujte, či má štyri číslice (menej ako 10000), a či súčet všetkých číslic je deliteľný 11 – napíšte si osobitnú funkciu na sčítanie číslic
  • Ak je všetko splnené, vráťte príslušný výsledok

Obrázky z hviezdičiek

  • Napíšte funkciu, ktorá na výstup vypíše zadaný počet hviezdičiek.
  • Napíšte funkciu, ktorá na výstup vypíše trojuholník so zadanou šírkou podstavy. Využite predošlú funkciu.

Zložitejšie obrazce:

  • Napíšte funkciu, ktorá na výstup vypíše zadaný počet trojuholníkov so zadanou šírkou podstavy (vedľa seba).
  • Napíšte funkciu, ktorá na výstup vypíše štylizované trojvŕšie, t.j. 3 trojuholníky, kde 2 krajné majú menšiu šírku podstavy ako stredný.
  • Napíšte funkciu, ktorá na výstup vypíše štylizované trojvŕšie aj s dvojkrížom, t.j. ako predošlá úloha, ale na vrchu stredného trojuholníka je dvojkríž, spodné rameno je dlhé ako podstava väčšieho trojuholníka a vrchné ako podstava menších trojuholníkov.

Príklad výstupu (parametre 5, 3):

  • Definujte si vlastné (vhodne parametrizovateľné) obrazce, vypíšte ich na obrazovku (napr. kruh :)))

Extra príklady

  • Napíšte funkciu s 3 parametrami: from, to, step, a funkcia vypíše čísla začínajúc číslom from, s krokom step, tak aby nebola prekročená hranica to. Pozor na to, že step môže byť záporné číslo.
  • Vypíšte zoznam čísel (niektorá z predošlých úloh) oddelený čiarkami (ale nie za posledným číslom)
  • Vypíšte členy aritmetickej postupnosti \( a_{i+1} = a_{i} + d \) na základe parametrov \(a_{0}\) a d (reálne čísla).
  • Vypíšte členy geometrickej postupnosti \(a_{i+1} = a_{i} * r\) na základe parametrov \(a_{0}\) a r (reálne čísla).
  • Vypočítajte hodnotu \(\sum_{i=2}^{n} log(i)\) (n je parameter)
  • Napíšte funkciu, ktorá vypočíta hodnotu funkcie sínus na základe prvých 12 členov Taylorovho radu.
  • Napíšte funkciu, ktorá vypočíta hodnotu funkcie kosínus na základe prvých 12 členov Taylorovho radu.
  • Vypočítajte hodnotu faktoriálu n! = 1*2*…*n
  • Vypočítajte hodnotu kombinačného čísla C(n,k) = n! / [(n-k)! * k!]. Pozor: ak chcete dostatočnú presnosť, nepoužívajte funkciu faktoriál, ale počítajte iba n*(n-1)…*(n-k+1)/(k*(k-1)…*2*1))
  • Vypočítajte \(x^n\) (x, n sú parametre), bez použitia pow.
  • Vypočítajte \(\sum_{i=1}^{n} x^{i} \) (x, n sú parametre), bez použitia pow.
  • Vypočítajte \(\sum_{i=1}^{n} x^{-i}\) (x, n sú parametre), bez použitia pow.
  • Vypočítajte \(\prod_{i=1}^{n} (2i+1)\) (n je parameter, \(\prod\) znamená súčin všetkých členov postupnosti)
  • Vypíšte členy geometrickej série, kde i-ty člen série predstavuje súčet prvých i členov geometrickej postupnosti.
  • Vytvorte program, ktorý názorne demonštruje, že geometrická séria konverguje pre r v absolútnej hodnote menšej ako 1 ku \(a_0/(1-r)\).
  • Ako 2E, ale vráťte druhé najväčšie číslo. HINT: podobne ako 2E, ale toto je trochu náročnejšie :)
  • Ako 2A, ale zistite, či postupnosť je rastúca (vráťte 1), klesajúca (vráťte -1), inak vráťte 0. HINT: musíte si uchovávať predošlé načítané čítať, a porovnávať ho s aktuálne načítaným, zároveň musíte sledovať a aktualizovať doterajší smer postupnosti (rast/pokles).
  • Ako 2A, ale zistite, koľkokrát mení postupnosť smer (z rastúcej na klesajúcu a opačne).

Príklady na precvičenie polí


Pre každý príklad vytvorte funkciu, ktorá dostane na vstup ako argumenty pole, počet platných prvkov poľa, a ďalšie potrebné parametre. Ak funkcia niečo počíta/zisťuje, vráťte danú hodnotu cez return. Vo funkcii main vytvorte interaktívne testovanie, t.j. načítajte hodnoty do poľa (alebo inicializujte pole nejakou vhodnou funkciou), načítajte parametre zo vstupu, aplikujte funkciu, vypíšte výsledok/výsledky funkcie/modifikované pole. (Aspoň vybrané) Funkcie sa pokúste aj otestovať (interaktívne, alebo automatizovane) – porozmýšľajte aj nad tým, či existujú nejaké špeciálne prípady, kedy by vaše riešenie mohlo zlyhať.

  1. Inicializácia poľa
    1. Funkcia inicializuje pole hodnotami od 0 po n-1 (parameter funkcie n určuje veľkosť poľa).
    2. Funkcia inicializuje pole hodnotami od 1 po n.
    3. Funkcia inicializuje pole hodnotami od n po 1 (zostupne).
    4. Funkcia inicializuje pole n náhodnými hodnotami. Použite knižničnú funkciu rand() (deklarácia v stdlib.h).
    5. Funkcia inicializuje pole hodnotami rovnými k-násobku indexu ().
    6. Funkcia inicializuje pole n párnymi číslami väčšími alebo rovnými parametru a.
    7. Funkcia inicializuje pole intervalov. Využite štruktúru interval so zložkami a,b typu double vyjadrujúce spodnú a hornú hranicu intervalu. Intervaly generujte pomocou rand a pomocných výpočtov tak, aby pre každý interval -100 < a < b < 100.
  2. Načítanie údajov. Z každej funkcie vráťte počet čísel zapísaných do poľa (reálnu veľkosť poľa).
    1. Funkcia do zadaného poľa načíta n čísel zo štandardného vstupu (pomocou scanf).
    2. Načítavajte do poľa zo štandardného vstupu (pomocou scanf) postupne čísla, až pokým sa nenačíta 0, resp. pokiaľ sa nenačíta n čísel. Záverečnú nulu do poľa neukladajte.
    3. Načítavajte do poľa zo štandardného vstupu (pomocou scanf) n kladných čísel, záporné preskakujte. Predpokladá sa, že k dispozícii je dostatok vstupov).
    4. Načítavajte do poľa zo štandardného vstupu (pomocou scanf) postupne kladné čísla, až pokým sa nenačíta 0, resp. pokiaľ sa nenačíta n čísel. Záporné čísla preskakujte. Záverečnú nulu do poľa neukladajte.
  3. Funkcie na prácu s jedným poľom, read-only. Vstupom (parametrom) každej funkcie je pole s kvantifikátorom const a jeho dĺžka (+ ďalšie potrebné parametre).
    1. Vypíše prvých n prvkov poľa.
    2. Vypočíta (tzn. nájde hodnotu a vráti ju cez return) minimum z n čísel v poli.
    3. Vypočíta maximum z n čísel v poli.
    4. Vypočíta priemer z n čísel v poli.
    5. Vypočíta súčin všetkých n čísel v poli.
    6. Vypočíta počet čísel v poli, ktoré patria do nejakého intervalu [a,b].
    7. Nájde druhý najväčší/najmenší prvok poľa.
    8. Vypíše všetky čísla v poli, ktoré sú väčšie ako dané číslo x.
    9. Zistí počet čísel v poli, ktoré sú menšie ako dané číslo x.
    10. Zistí počet výskytov čísla x v poli.
    11. Zistí, či sa číslo x v poli nachádza. Pozn.: Ak si spravíte správne predošlú funkciu, tak túto vlastne máte tiež hotovú…
    12. Zistí, či pole je usporiadané (od najmenšieho prvku).
    13. Zistí, či pole intervalov je usporiadané (2 verzie: usporiadané podľa spodnej hranice intervalu, alebo od najkratšieho intervalu). Interval predstavujú vždy 2 po sebe idúce prvky poľa (t.j. veľkosť poľa musí byť párna).
    14. Zistí, či pole n čísel predstavuje permutáciu, t.j. je tam každé číslo od 1 po n práve raz.
    15. Zistí, či pole n čísel je množina, t.j. každé číslo je v poli práve raz.
  4. Funkcie na prácu s jedným poľom, read-write. Vstupom (parametrom) každej funkcie je pole a jeho veľkosť n (+ ďalšie potrebné parametre).
    1. Zmení hodnoty prvkov na ich absolútne hodnoty.
    2. Zapíše prvky poľa v opačnom poradí, t.j. prehodí prvý s posledným, druhý s predposledným,…
    3. Odstráni z poľa všetky hodnoty väčšie ako x. Zvyšné hodnoty poposúva tak, aby boli prvky v pôvodnom poradí bez medzier spôsobených predošlým krokom. Vráti nový počet prvkov.
    4. Usporiada prvky poľa pomocou zvoleného algoritmu.
    5. Funkcia pridá do poľa na koniec prvok x. Vráti nový počet prvkov.
    6. Funkcia pridá do poľa na začiatok prvok x (ostatné prvky teda treba poposúvať! – ako na to? skúste si poposúvať po jednej bunke v tabuľkovom procesore). Vráti nový počet prvkov.
    7. Funkcia pridá do poľa na koniec prvok x, ak také číslo už v poli nie je (ak je, tak sa s poľom nič nerobí). Vráti nový počet prvkov.
    8. Funkcia pridá do usporiadaného poľa prvok x tak, aby pole zostalo usporiadané (t.j. nájde prvý väčší prvok, vloží x a ostatné prvky poposúva). Vráti nový počet prvkov.
  5. Funkcie na prácu s viac poľami
    1. Funkcia má na vstupe 2 polia (poleA, poleB) a veľkosť n. Polia chápeme ako vektory hodnôt. Funkcia vypočíta skalárny súčin vektorov poleA a poleB (t.j. súčet poleA[i]*poleB[i] cez všetky i).
    2. Funkcia má na vstupe 2 polia (poleA, poleB) a veľkosť n. Polia chápeme ako vektory hodnôt. Funkcia zistí, či vektory poleA a poleB sú rovnaké (t.j. poleA[i] == poleB[i] pre všetky i).
    3. Funkcia má na vstupe 2 polia (poleIn a poleOut) a veľkosť n. Do poľa poleOut skopíruje prvky z poľa poleIn. Predpokladajte, že polia sa neprekrývajú.
    4. Funkcia má na vstupe 2 polia (poleIn a poleOut) a veľkosť n. Do poľa poleOut skopíruje prvky z poľa poleIn. Predpokladajte, že polia sa môžu prekrývať (pozn.: prekrytie sa dá overiť pomocou smerníkovej aritmetiky, ale nie je to nutné na riešenie úlohy).
    5. Funkcia má na vstupe 2 polia (poleIn a poleOut) a veľkosť n. Do poleOut zapíšte prvky z poleIn usporiadane (poleIn nesmiete zmeniť).
    6. Funkcia má na vstupe 2 polia (poleIn a poleOut) a veľkosť n. Do poleOut zapíšte prvky z poleIn v opačnom poradí (poleIn nesmiete zmeniť).
    7. Funkcia má na vstupe 2 polia (poleIn a poleOut) a veľkosť n. Do poleOut zapíšte prvky z poleIn usporiadane (poleIn nesmiete zmeniť). Do poleOut zapíše všetky prvky z poleIn väčšie ako x (v pôvodnom poradí). Vráti nový počet prvkov poleOut.
    8. Funkcia má na vstupe 3 polia (poleOut, poleA, poleB) a veľkosť n. Polia chápeme ako vektory hodnôt. Funkcia zapíše do poleOut súčet vektorov poleA a poleB (poleOut[i] = poleA[i]+poleB[i], pre všetky i).
    9. Funkcia má na vstupe 2 polia (poleA, poleB) a veľkosť n. Polia chápeme ako vektory hodnôt. Funkcia pripočíta k-násobok vektora poleB do vektora poleA (poleA[i] = poleA[i]+k*poleB[i], pre všetky i).
    10. Funkcia má na vstupe 3 polia (poleOut, poleA, poleB), veľkosti nA a nB. Pole poleOut musí mať dostatočnú kapacitu, t.j. min(nA, nB). Chápeme poleA a poleB ako množiny. Do poleOut napíšte ich prienik (t.j. budú tam iba prvky, ktoré sú aj v poleA aj v poleB). Vráťte počet prvkov poleOut.
    11. Funkcia má na vstupe 3 polia (poleOut, poleA, poleB), veľkosti nA a nB. Pole poleOut musí mať dostatočnú kapacitu (nA+nB). Chápeme poleA a poleB ako množiny. Do poleOut napíšte ich zjednotenie (t.j. budú tam iba prvky, ktoré sú alebo v poleA alebo v poleB). Vráťte počet prvkov poleOut.
    12. Funkcia má na vstupe 3 polia (poleOut, poleA, poleB), veľkosti nA a nB. Pole poleOut musí mať dostatočnú kapacitu (nA). Chápeme poleA a poleB ako množiny. Do poleOut napíšte ich rozdiel (t.j. budú tam iba prvky, ktoré sú v poleA a nie sú v poleB). Vráťte počet prvkov poleOut.
    13. Funkcia má na vstupe 3 polia (poleOut, poleA, poleB), veľkosti nA a nB. Pole poleOut musí mať dostatočnú kapacitu (nA+nB). Chápeme poleA a poleB ako množiny. Do poleOut napíšte ich symetrický rozdiel (t.j. budú tam iba prvky, ktoré sú v poleA a nie sú v poleB alebo sú v poleB a nie sú v poleA). Vráťte počet prvkov poleOut.
    14. Funkcia má na vstupe pole intervalov (iba na čítanie) a rovnako veľké pole čísel typu double. Funkcia vypočíta veľkosť intervalu a zapíše ju do poľa typu double na rovnakú pozíciu ako má interval v poli intervalov.

Použitie smerníkov


  1. Napíšte funkciu, ktorá vráti počet reálnych koreňov kvadratickej rovnice (vstupy a,b,c sú koeficienty rovnice).
  2. Doplňte do predošlej funkcie aj výpočet samotných koreňov. Vstupom funkcie budú adresy, kam sa majú zapísať riešenia. Ak sú tieto adresy nulové, iba vráti počet koreňov.
  3. Napíšte funkciu, ktorej vstupom sú 2 adresy celých čísel. Funkcia prehodí obsah uložený na týchto adresách. Vyskúšajte použiť túto funkciu pri usporiadaní poľa (ľubovoľným algoritmom).
  4. Napíšte funkciu, ktorej vstupom sú 2 adresy typu (void*) a size – veľkosť údaju v bajtoch. Funkcia prehodí obsah pamäte na týchto adresách.
    • Návod: pretypujte smerníky na char*, opakujte size-krát: prehahoďte bajt na danom mieste (napr. pomocou extra premennej), zvýšte hodnotu každého smerníku o 1.
  5. Upravte svoje zadanie „GOLF“ tak, aby ste mali funkciu, ktorá aktualizuje obe pozície (x,y) naraz. Využite smerníky na príslušné súradnice.
  6. Napíšte funkciu, ktorej vstupom je adresa typu (void*) a size – veľkosť údaju v bajtoch. Funkcia vypíše postupne bajty na danej adrese v hexadecimálnom tvare. Použite túto funkciu na výpis premenných rôzneho typu (napr. unsigned int i = 0xdeadbeef; double pi = 3.14), prípadne vyskúšajte aj so smerníkom na funkciu/pole.
  7. Napíšte funkciu, ktorej vstupom je adresa celého neznamienkového 64-bitového čísla (unsigned long long*). Funkcia zmení endian, t.j. poradie bajtov. Napr. keď na adrese bolo uložené: 0x0102030405060708ull, po zavolaní funkcie tam bude 0x0807060504030201ull.

Dynamické polia


  1. Vytvorte funkciu, ktorej vstupom je pole celých čísel a jeho dĺžka. Funkcia dynamicky alokuje pole dostatočnej veľkosti a prekopíruje doň obsah vstupného poľa (môžete využiť štandardnú funkciu memcpy). Vráti smerník na alokované pole.
  2. Napíšte a otestujte funkciu, ktorá načítava zo vstupu čísla do poľa typu double, ktoré dynamicky alokuje a postupne zväčšuje. Funkcia sa zastaví, keď načíta číslo 0, túto 0 ale neukladá do poľa. Funkcia vráti smerník na alokované pole a veľkosť poľa (nepriamo, pomocou smerníka).
  3. Napíšte a otestujte funkciu, ktorej vstupom je pole čísel. Funkcia pole rozdelí na úseky, pričom každý úsek je ukončený nulou. Smerníky na začiatky jednotlivých úsekov uloží do dynamického poľa smerníkov, ktoré podľa potreby rozširuje. Na koniec poľa smerníkov uloží smerník NULL. Vráti smerník na dynamické pole smerníkov (ukazujúcich na začiatky slov). Napíšte si zvlášť funkciu, ktorá postupnosti čísel z takto zadaného poľa smerníkov vypíše (viete, že každá postupnosť končí nulou), každú na iný riadok.
  4. Napíšte funkciu, ktorá vytvorí dynamicky dvojrozmerné pole požadovanej veľkosti n riadkov a m stĺpcov. Pole naplní nulami a vráti.

V príkladoch otestujte funkcie v nejakej inej funkcii volanej z main (napr. funkcia na výpis), a alokované polia korektne uvoľnite.

Využitie dynamickej pamäte

Vytvorte a otestujte nasledovné funkcie, dbajte na to, aby ste správne alokovali a uvoľnili dynamickú pamäť:

  1. Vytvorte funkciu, ktorej vstupom je pole celých čísel a jeho dĺžka. Funkcia vytvorí a vráti nové dynamické pole, ktoré bude obsahovať iba kladné prvky z pôvodného poľa, a za ne na ukončenie poľa pridá prvok -1.
  2. Uvažujme polia prefixované dĺžkou: Polia majú na začiatku jeden prvok, ktorý hovorí o dĺžke zvyšku poľa. Napr. {3,2,5,7} znamená, že v poli sú platné 3 prvky:2,5,7. Najmenšie možné pole je teda {0}.
    1. Vytvorte funkciu na výpis takéhoto poľa (dĺžku nevypisujte).
    2. Vytvorte funkciu na vytvorenie takéhoto poľa zo štandardného poľa. Parametrom funkcie je pole a počet platných prvkov. Funkcia vráti dynamicky alokované pole prefixované dĺžkou s rovnakým obsahom ako pôvodné pole.
    3. Vytvorte funkciu na pridanie prvku do prefixového poľa. Využite realloc.
    4. Vytvorte funkciu na spojenie dvoch prefixových polí. Vstupom funkcie sú dva prefixové polia a výstup je novo-alokované pole, kde budú prvky z oboch spájaných polí uložené za sebou.
    5. Vytvorte funkciu na prienik dvoch prefixových polí. Vstupom funkcie sú dva prefixové polia a výstup je novo-alokované pole, kde budú prvky, ktoré sa nachádzajú v oboch vstupných poliach.

Reťazce


Reťazec je v jazyku C pole znakov ukončené znakom '\0'. Na prácu so znakmi máme k dispozícii funkcie štandardnej knižnice deklarované v ctype.h. Na prácu s reťazcami máme k dispozícii štandardné funkcie deklarované v string.h (a plus túto reprezentáciu používajú ďalšie štandardné funkcie, napr. z stdio.h, …).

Práca so znakmi

  1. Napíšte si krátky program, ktorý v cykle načítava znaky a vypisuje ich na obrazovku (cez scanf/printf s "%c" maskou, alebo cez getchar/putchar).
  2. Naštudujte si, aké funkcie sú k dispozícii v ctype.h a odskúšajte si ich pre načítané znaky: vypíšte znak, jeho ascii hodnotu, či to je písmeno, tlačiteľný znak, číslica… skonvertujte všetky písmená na malé/veľké…
  3. Napíšte si krátky program, ktorý v cykle prejde a vypíše všetky znaky ASCII tabuľky.
  4. Napíšte (a otestujte) vlastnú funkciu na zistenie, či zadaný znak je slovenské písmeno, kde za slovenské písmená nepovažujte q,w,x,Q,W,X
  5. Napíšte (a otestujte) vlastnú funkciu, ktorá skonvertuje znak na číslicu v 36-kovej sústave (kde ‚a’/’A‘ = 10, ‚z’/’Z’=35). Funkcia má teda vstup typu char a výstup typu int. Ak znak nie je alfanumerický, funkcia vráti -1.

Parametre príkazového riadku

Odskúšajte si nasledovný program:

Keď program spustíte z príkazového riadku, mal by vypísať zoznam parametrov, každý na nový riadok:

Pomocou Google (alebo iných vyhľadávačov) zistite, ako dostanete parametre do programu v Debug móde (Google: command line arguments visual studio c). Odskúšajte si, či viete krokovať program s argumentmi.

Teória: Vstupom funkcie main je pole reťazcov (argv) a ich počet (argc). Reťazce pripraví OS pri spustení programu z konzoly. Parametre sú rozdelené medzerami, ak chcete v rámci parametra mať medzeru, musíte ho dať do úvodzoviek.

Pozn.: Ak viete používať parametre na príkazovom riadku, ušetríte si robotu s načítavaním vstupov…

Načítanie reťazca zo štandardného vstupu (klávesnice)

  1. Musíte si pripraviť pole znakov s dostatočnou kapacitou (načítané znaky + záverečný ‚\0‘).
  2. Veľa príkazov na načítavanie reťazcov je NEBEZPEČNÝCH – odskúšajte si funkcie scanf a gets/fgets s rôznymi vstupmi (AAA BBB, AAAAAAAAAAAAAAAAAAAAAA):

Úloha: Vytvorte si vlastnú funkciu, ktorej vstupom je pole znakov (smerník) a jeho kapacita max. Do poľa načítavajte znaky zo vstupu (pomocou funkcie getchar() alebo scanf("%c")), kým nenarazíte na koniec riadku '\n', koniec súboru (scanf zlyhá, getchar vráti EOF), alebo nanačítate max-1 znakov. Znak '\n' do reťazca nevkladajte, reťazec ukočte znakom '\0'.

Porovnanie a priradenie reťazcov

Vyskúšajte si nesprávne varianty priradenia/porovnania a zistite (aj pomocou debug módu), čo spraví správna a nesprávna verzia.

Štandardné funkcie na prácu s reťazcami

V string.h sú deklarované viaceré užitočné funkcie pre prípad, že v jazyku C potrebujete s reťazcami pracovať. Pozrite a odskúšajte si príklady z referenčnej časti a vyskúšajte si úlohy (väčšinou vlastné verzie štandardných funkcií alebo modifikácie).

  1. strlen
    • Vstupom funkcie je reťazec, funkcia vráti počet znakov.
    • Vyskúšajte, čo sa stane, ak v predošlej úlohe neukočíte reťazec znakom '\0' a zavoláte funkciu strlen.
    • Naprogramujte si vlastnú verziu tejto funkcie.
  2. strcmp
    • Vstupom funkcie sú dva reťazce, výstupom je 0, ak sú zhodné, kladné číslo, ak prvý reťazec je väčší (neskôr v lexikografickom poradí), záporné ak prvý je menší.
    • Vyskúšajte si túto funkciu.
    • Dokážete použiť túto funkciu v kombinácii s qsort na zotriedenie parametrov z príkazového riadku?
    • Naprogramujte si vlastnú verziu tejto funkcie.
  3. strchr
    • Nájde prvý výskyt zadaného znaku v reťazci, vráti pointer na túto pozíciu – vyskúšajte si príklad z cplusplus.com
    • Napíšte vlastnú verziu tejto funkcie, ktorá ale nevracia pointer, ale pozíciu (index) prvého výskytu písmena, alebo -1, ak sa v reťazci nenachádza.
    • Napíšte funkciu, ktorá vráti index posledného výskytu písmena, alebo -1, ak sa v reťazci nenachádza.
    • Napíšte funkciu, ktorá vráti počet výskytov písmena v reťazci.
  4. strstr
    • Nájde prvý výskyt podreťazca.
    • Vedeli by ste naprogramovať vlastnú verziu s použitím strncmp ?
    • Vedeli by ste naprogramovať vlastnú verziu bez použitia knižničných funkcií?
  5. strtok
    • Tokenizácia stringu – rozdelí ho na podreťazce, napr. keď máte čiarkami oddelené údaje, potrebujete rozdeliť text na vety, slová…
    • Vyskúšajte si spraviť program, ktorý načíta riadok z klávesnice (pomocou fgets, pripravte dosť dlhé pole na uchovanie znakov), rozdelí ho na slová (pomocou strtok) a vypíše slová v opačnom poradí (najjednoduchšie je uchovať výsledné smerníky, ktoré vráti strtok do poľa smerníkov, a to pole prejsť odzadu)

Ďalšie vhodné štandardné funkcie

  • Pozrite si funkcie v stdlib.h v časti String conversions – umožňujú skonvertovať text na číslo, napr. „123“ na 123

    • Vyrobte vlastnú funkciu btoi, ktorá skonvertuje binárny reťazec na číslo, t.j. pri vstupe „10011“ vráti číslo 17

  • Dôležitá funkcia: sprintf – umožňuje zapísať do reťazca text podobne ako by sme ho vypisovali na výstup. Funkcia je NEBEZPEČNÁ, musíte dávať pozor na dostatočnú kapacitu reťazca, kam zapisujete.

    • Vyrobte vlastnú funkciu itob, ktorá skonvertuje číslo, na binárny reťazec t.j. pri vstupe 17 naplní zadané pole znakov tak, že tam vznikne reťazec „10011“ (aká je dostatočná kapacita poľa pre 32-bitové čísla?)

  • Pre konverziu textu na čísla je vhodnejšia funkcia sscanf, pretože umožňuje otestovať úspešnosť konverzie a vstupný reťazec môže byť v rôznych formátoch.

Ďalšie príklady na reťazce

  1. Napíšte funkciu, ktorá do zadaného poľa načítava znaky, až pokým sa nenačíta znak '\n' (ten sa do poľa neuloží), pričom načíta maximálne max-1 znakov (kde max je zadaný parameter). Na koniec poľa zapíše znak konca reťazca '\0'. Výstupom funkcie je počet znakov, ktoré sa načítali.
  2. Funkcia má parametre pole znakov a jeho veľkosť. Naplní pole náhodne vygenerovanými veľkými písmenami (využite rand()%26 a „aritmetiku“ znakov). Nezabudnite ukončiť reťazec.
  3. Funkcia má parametre pole znakov a jeho veľkosť. Naplní pole náhodne vygenerovanými veľkými a malými písmenami (či sa použije veľký alebo malý znak môže rozhodnúť 1 rand()).
  4. Funkcia má parametre pole znakov out, jeho veľkosť a jeden vstupný reťazec. Naplní pole náhodne vygenerovanými znakmi z reťazca (rand() bude použitý ako index v reťazci, pozor na rozsah náhodných čísel).
  5. Funkcia má parametre pole znakov out, jeho veľkosť a dva vstupné reťazce. Naplní pole náhodne vygenerovanými znakmi z dvoch reťazcov, tak aby sa striedali (napr. fn(pole, 3+1, "EA","MV"); môže vygenerovať reťazce „EVA“, „EMA“, „AMA“…
  6. Napíšte vlastné funkcie, ktoré robia nasledujúce činnosti (každá zvlášť):
    • spočíta počet výskytov daného čísla/znaku v poli
    • prepíše všetky písmená v poli na opačnú veľkosť (uppercase <–> lowercase).
    • vynechá v reťazci medzery (prepíše sa pôvodný reťazec, ktorý je argumentom funkcie)
    • vynechá v reťazci za sebou opakované znaky (čiže z „aaabbbaa“ sa stane „aba“)
    • vynechá v reťazci zopakované znaky (čiže z „aaabbbaa“ sa stane „ab“)
    • podobne ako strcmp porovná 2 reťazce, ale je case-insensitive (t.j. ‚a‘ je to isté ako ‚A‘)
    • vypíše reťazec odzadu
    • vstupom sú dva reťazce In a Out. Do Out reťazca sa zapíše In reťazec odzadu.
    • vstupný reťazec sa prepíše „odzadu“ -> „udazdo“ (bez alokácie nového poľa)
    • zistí počet slov v reťazci s použitím strtok
    • zistí počet slov v reťazci bez použitia strtok
  7. Vstupom funkcie je pole celých čísel, počet čísel v poli a jeden znak. Funkcia vypíše čísla z poľa oddelené zadaným znakom.
  8. Vstupom funkcie je pole reťazcov, ich počet v poli a jeden znak. Funkcia vypíše reťazce z poľa oddelené zadaným znakom.
  9. Vstupom funkcie sú 2 reťazce. Funkcia prepisuje 1. reťazec: ak v ňom natrafí na znak *, dosadí namiesto neho nasledujúce písmeno z druhého reťazca. Vráti smerník na (upravený) prvý reťazec. Príklad: printf("%s", f("*-*-*", "ABC")); //A-B-C
  10. Vstupom sú 2 reťazce rovnakej dĺžky. Výstupom je počet nezhôd medzi reťazcami, t.j. počet prípadov, kedy na danej pozícii sú rôzne znaky.
  11. Vstupom sú 2 reťazce rovnakej dĺžky. Výstupom je počet nezhôd medzi reťazcami, t.j. počet prípadov, kedy na danej pozícii sú rôzne znaky. Ak v nejakom reťazci je znak ‚*‘, v druhom môže byť hocičo a nepovažuje sa to za nezhodu. Príklad: f("LA*ALA", "BAJA*A") vráti 1.
  12. Vstupom sú 2 reťazce. Funkcia zistí, či prvý reťazec obsahuje iba znaky z druhého reťazca (napr. „011001“ obsahuje iba znaky z „01“, taktiež z „012“, ale nie z „12“).
  13. Vstupom je reťazec, ktorý obsahuje iba hexa číslice. Predpokladáme, že sa jedná o zápis čísla v 16-kovej sústave od najvyššej číslice. Výstupom funkcie je toto číslo. Príklad: f("1A") vráti 26
  14. Vstupom je reťazec, ktorý obsahuje iba hexa číslice. Predpokladáme, že sa jedná o zápis čísla v 16-kovej sústave od najnižšej číslice. Výstupom funkcie je toto číslo. Príklad: f("1A") vráti 161
  15. Vstupom je reťazec a celé číslo x. Funkcia vypisuje reťazec znak po znaku, pričom ak natrafí na znak ‚*‘, vypíše nasledujúci znak (môže byť aj ‚*‘) x-krát. Príklad: f("(*.***x)", 3); vypíše: (…***xxx)
  16. Vstupom je reťazec a pole celých čísel. Funkcia vypisuje reťazec znak po znaku, pričom ak natrafí na znak ‚*‘, vypíše nasledujúci znak (môže byť aj ‚*‘) toľkokrát, aké číslo nasleduje v poli. Príklad: p={2,3,4,5,7,9}; f("(*.***x)", p); vypíše (..***xxxx)
  17. Vstupom je číslo 0-9. Funkcia vráti znak, ktorý na anglickej klávesnici získame stlačením SHIFT-zadaná_číslica. Ak číslo je mimo rozsah, vráti znak '\0'. HINT: Využite statické pole znakov.
  18. Vstupom je znak. Výstupom je 0 ak sa nejedná o písmeno, -1 ak sa jedná o samohlásku („aAeEiIoOuUyY“), a 1 ak sa jedná o spoluhlásku.
  19. Vstupom je číslo mesiaca, funkcia vráti reťazec s jeho názvom (využite statické pole konštantných reťazcov).

Štruktúry


Podobné typy úloh sa môžu objaviť na skúške:

  1. Deklarujte dátový typ komplexné číslo. Komplexné číslo má dve zložky: desatinné čísla predstavujúce reálnu a imaginárnu zložku
    1. Napíšte funkciu, ktorá vráti absolútnu hodnotu komplexného čísla (|Z| = sqrt(Z.Re2 + Z.Im2)).
    2. Napíšte funkciu, ktorá sčíta 2 komplexné čísla a vráti ich súčet (sčítava sa po zložkách).
    3. Napíšte funkciu, ktorá vypíše zadané komplexné číslo na výstup 7.31 + 2.57i
    4. Napíšte funkciu, ktorá načíta komplexné číslo zo vstupu (v tvare 7.31 + 2.57i) na miesto zadané smerníkom (nevracia štruktúru, ale podobne ako scanf sa využije odovzdávanie parametrov odkazom).
    5. Napíšte funkciu, ktorej vstupom je pole komplexných čísel. Funkcia pole zoradí podľa absolútnej hodnoty.
  2. Pozrite si, ako fungujú základné funkcie na prácu s časovými údajmi v time.h. Časové údaje sú reprezentované buď ako údaj typu time_t (počet sekúnd od referenčného času), alebo štruktúra tm, a na konverziu sa používajú funkcie mktime/localtime/gmtime. Pozrite si príklad na difftime a spravte si program, ktorý umožní zistiť, koľko dní uplynulo od používateľom zadaného dátumu alebo umožní vypočítať dátum, ktorý bude o x dní (pre záporné x: pred x dňami) od zadaného dátumu/aktuálneho dátumu.
  3. Vytvorte štruktúru reprezentujúcu bod (2D) s dvomi súradnicami x, y. Vytvorte štruktúru reprezentujúcu trojuholník, ktorá obsahuje 3 body A, B, C.
    1. Vytvorte funkciu, ktorá určí, či bod so zadanými súradnicami je vnútri alebo mimo trojuholníka. (pomerne náročná úloha, pomocou google sa dajú nájsť viaceré riešenia)
    2. Napíšte funkciu, ktorá vykreslí trojuholník na konzolovú obrazovku (vykresľujte zaradom body po riadkoch, ak je vnútri trojuholníka, dajte *, inak medzeru).
  4. Zovšeobecnite predošlé zadanie na polygón. Polygón je zadaný N bodmi (do štruktúry dajte int záznam, koľko je tam bodov, a pole bodov s nejakým definovaným maximálnym počtom bodov, napr. max. 50 bodov). Vytvorte funkcie na načítanie polygónu, funkciu na zistenie obvodu polygónu, a funkciu na vykreslenie polygónu.

Práca so súbormi


Základná práca so súborom

  1. Vytvorte si jednoduchý program, ktorý prekopíruje znak po znaku obsah zvoleného súboru do zvoleného súboru (pozor, prepíše sa) – pomocou funkcií fgetc a fputc.
    1. Zmeňte program tak, aby si používateľ vybral vstupný a výstupný súbor.
    2. Zmeňte program tak, aby kopíroval súbor binárne pomocou bufferu zvolenej veľkosti a funkcií fread a fwrite. Porovnajte výkonnosť na dlhom súbore.

Dbajte aj na správne ošetrenie chýb: vyskúšajte situáciu, keď vstupný súbor neexistuje, keď výstupný súbor je read-only.

Pokročilejšia práca so súbormi

Vytvorte si nasledovné funkcie a vyskúšajte ich vo vhodnom testovacom programe:

  1. Napíšte funkciu, ktorej parametrom je meno súboru (typ const char*). Funkcia súbor otvorí, spočíta riadky, zatvorí a vráti počet riadkov.
  2. Napíšte funkciu, ktorá spočíta počet riadkov v súbore (parameter typu FILE*) – využite kód predošlej funkcie, ale vhodne ho rozdeľte (prvá časť čo otvára a zatvára súbor zostane, zvyšok sa robí v novej funkcii). Vyskúšajte, či sa dá použiť táto funkcia dvakrát po sebe s tým istým otvoreným súborom? Vyskúšajte to opraviť pomocou príkazu rewind alebo fseek.
  3. Funkcia spočíta počet čísel v otvorenom súbore (parameter typu FILE*). Využite fscanf, kontrolujte výstup fscanf.
  4. Funkcia zistí veľkosť súboru. Využite fseek a ftell. Použite túto funkciu v demo programe, v ktorom načítate celý obsah súboru do dynamicky alokovaného poľa.
  5. Vytvorte si vhodnú štruktúru (napr. trpaslík), vložte tam číselné údaje ale aj pole znakov (a naplňte ho nejakým textom pri inicializácii). Napíšte funkciu, ktorá zapíše jej obsah do otvoreného súboru a druhú funkciu, ktorá načíta obsah z otvoreného súboru:
    1. Využite binárne súbory a fread/fwrite. Nevýhoda je, že takto vytvorené súbory nie sú (vždy) prenosné medzi rôznymi platformami, a nie sú čitateľné pre človeka (pozrite si obsah vytvoreného súboru).
    2. Využite textové súbory a fprintf/fscanf (zvoľte si vhodný formát – ako riešiť viacslovné texty?). Výhodou je čitateľnosť a prenosnosť, ale musíte k tomu viac programovať (a plus súbor je väčší).

Práca s viacerými súbormi

  1. Napíšte program, ktorý vytvorí 100 súborov so zadaným menom a meniacou sa príponou (napr. meno.001, meno.002, … – najjednoduchšie na vytvorenie názvu súboru je použiť sprintf). Do súborov zapisujte 1000000 náhodných bajtov (rand()%256, cez putc/fwrite). Porovnajte výsledné veľkosti súborov v prípade, že súbory otvoríte pomocou „wb“ a iba pomocou „w“.
  2. Napíšte program, ktorý rozdelí zadaný súbor na časti zadanej veľkosti (súbor a veľkosť časti je zadaná z príkazového riadku). Posledná časť môže byť samozrejme kratšia. Výsledné súbory číslujte podobne ako v predošlom príklade (t.j. povodny.subor.001, …)
  3. Napíšte program, ktorý spojí zadané súbory do jedného celku. Spravte ho kompatibilný s predošlým, t.j. z príkazového riadku sa dá ako parameter len názov pôvodného súboru (napr. data.txt) a program sám postupne rekombinuje čiastkové súbory (data.txt.001, data.txt.002,…), až kým nevyčerpá všetky časti (zlyhá otvorenie súboru). Využite mód otvorenia typu append.

 

Trénovacie príklady: matice

 

Ako matice môžete využívať polia pevnej veľkosti, alebo polia smerníkov, kedy príslušné rozmery sú dynamicky určené (dodatočným parametrom).

  1. Funkcia naplní NxN maticu tak, aby výsledkom bola jednotková matica (všade 0 a na hlavnej diagonále 1).
  2. Funkcia naplní MxN maticu tak, aby výsledkom bola matica, ktorá na hlavnej diagonále má 1 a všade inde 0.
  3. Funkcia zistí súčet prvkov v matici.
  4. Funkcia zistí najväčší prvok v matici.
  5. Funkcia zistí najmenší prvok v matici.
  6. Funkcia zistí počet nenulových prvkov v matici.
  7. Funkcia zistí, či je matica horná trojuholníková.
  8. Vstupom je okrem MxN matice aj pole M čísel. Funkcia naplní pole súčtami hodnôt v riadkoch matice.
  9. Vstupom je okrem MxN matice aj pole N čísel. Funkcia naplní pole súčtami hodnôt v stĺpcoch matice.
  10. Vstupom sú tri MxN matice. Po vykonaní funkcie bude prvá matica obsahovať súčet zvyšných dvoch.
  11. Vstupom sú tri NxN matice. Po vykonaní funkcie bude prvá matica obsahovať súčin zvyšných dvoch.
  12. Vstupom sú tri matice s rozmermi MxT, MxN a NxT. Po vykonaní funkcie bude prvá matica obsahovať súčin zvyšných dvoch.
  13. Vstupom sú dve NxN matice a čísla r, s. Po vykonaní funkcie prvá matica bude predstavovať submaticu druhej po vynechaní riadku r a stĺpca s (zvyšný priestor bude doplnený nulami).
  14. Vstupom je NxN matica. Výsledkom je determinant.
  15. Vstupom je matica MxN čísel a dva čísla i, j. Funkcia prehodí v matici riadok i s riadkom j.
  16. Vstupom je matica MxN čísel a dva čísla i, j. Funkcia nájde index riadku s prvým nenulový prvok v j-tom stĺpci, začínajúc od i-teho riadku (pivot). Ak taký nenájde, vráti -1.
  17. Vstupom je matica MxN čísel a dva čísla i, j a desatinné číslo r. Funkcia pripočíta k j-temu riadku r-násobok i-teho riadku.
  18. Vstupom je matica MxN čísel. Maticu program upraví do horného trojuholníkového tvaru ekvivalentnými riadkovými úpravami. Použite predošlé funkcie.
  19. Vstupom je matica A rozmerov NxN, regulárna, pole b s N hodnotami – vektor pravých strán, a prázdne pole N hodnôt x. Výsledkom je naplnené pole x také, že Ax = b.

Trénovacie príklady: bitové operácie

  1. Napíšte funkciu, ktorá dostane ako vstup kladné celé číslo (unsigned) a dostatočne veľké pole čísel. Funkcia naplní pole binárnymi číslicami zo zápisu čísla pomocou binárnych operácií, LSB je v poli na pozícii 0. Vráti počet platných binárnych číslic (pozíciu MSB).
  2. Napíšte funkciu, ktorá dostane ako vstup kladné celé číslo (unsigned) a dostatočne veľké pole znakov. Funkcia naplní pomocou binárnych operácií pole znakmi 0 a 1, tak aby výsledkom bol reťazec, reprezentujúci zápis čísla v binárnej sústave (od MSB). Vráti adresu vytvoreného reťazca.
  3. Napíšte funkciu, ktorá spočíta nenulové bity vstupného slova (kladné celé číslo) a vráti ich počet.
  4. Napíšte funkciu, ktorá dostane na vstupe adresu celočíselnej premennej, a nastaví jej bit na pozícii i na hodnotu b.
  5. Napíšte funkciu rotr, ktorá zrotuje bity v zadanom slove (unsigned číslo) doprava o daný počet miest. Rotácia znamená, že bity, ktoré by boli posunuté mimo čísla sa vrátia naspäť z opačnej strany. Príklad: rotácia 10110111011110 o 3 doprava: 11010110111011
  6. Napíšte fukciu, ktorá vypočíta skalárny súčin binárnych vektorov u, v (parametre, unsigned čísla). Skalárny súčin je definovaný ako SUM u_i * v_i, kde u_i a v_i sú jednotlivé bity (od LSB). Operácia násobenia sa počíta cez bitové AND a operácia sčítania cez bitové XOR.
  7. V poli 32 unsigned čísel M je uložená binárna matica (každé číslo v poli je riadok bitov). Funkcia dostane ako vstup túto maticu a vektor bitov u, a vypočíta súčin u*M. Opäť, násobenie bitov je cez AND, a sčítanie cez XOR. Pozn.: Pri riešení môžete využiť to, že XOR operátor dokáže sčítať celé riadky matice naraz… maximálne potrebujete 32 XORov, nie 32×32!
  8. Na vstupe je pole čísel (chápané ako pole bitov), a rozmery r, s, a súbor otvorený na výstup. Funkcia vypíše pole bitov vo forme ASCII art obrázku (namiesto nuly vypíše medzeru, namiesto 1 hviezdičku) s r riadkami a s stĺpcami.
  9. Napíšte funkciu, ktorá vygeneruje vhodný vstup (procedurálne generovaný čiernobiely obrázok) na otestovanie funkcie 8.
  10. Zistite, ako by ste vedeli zapísať obrázok vygenerovaný vo funkcii 9 do reálneho obrázkového súboru, a implementujte túto funkcionalitu (vo formáte, ktorý viete pozrieť v svojom súborovom systéme).