Differences between revisions 11 and 12
Revision 11 as of 2010-03-03 18:31:36
Size: 4221
Editor: sarkoci
Comment:
Revision 12 as of 2010-03-06 21:05:44
Size: 4902
Editor: sarkoci
Comment:
Deletions are marked like this. Additions are marked like this.
Line 61: Line 61:
   a. Ak deklarujete napríklad `int pole[n]` kde `n` je nejaká predtým inicializovaná premenná, devcpp, žial, nebude frflať. Lenže niečo podobné je z hladiska čistého ANSI C striktne zakázané. Keďže hodnota `n` nie je v čase kompilácie známa, to čo takouto deklaráciou vlastne hovoríte, je dynamická allokácia pamate. Lenže tá sa správne rieši cez funkciu `malloc` a jej príbuzné. Jediný dôvod prečo takýto riadok ide skompilovať je ten, že devcpp nie je dôsledný kompilátor a, aj bez toho aby o to bol požiadaný, do jazyka mieša črty neoficiálnych rozšírení a C++. Ja ale takéto tolerovať nebudem; skúste to skompilovať pod linuxom pomocou `gcc` a hneď pochopíte prečo.    a. Ak deklarujete napríklad `int pole[n]` kde `n` je nejaká predtým inicializovaná premenná, devcpp, žial, nebude frflať. Lenže niečo podobné je z hladiska čistého ANSI C striktne zakázané. Keďže hodnota `n` nie je v čase kompilácie známa, to čo takouto deklaráciou hovoríte, je vlastne dynamická allokácia pamate. Ale tá sa správne rieši cez funkciu `malloc` a jej príbuzné. Jediný dôvod prečo takýto riadok ide skompilovať je to, že devcpp nie je dôsledný kompilátor a, aj bez toho aby o to bol požiadaný, do jazyka mieša črty neoficiálnych rozšírení a C++. Ja ale takéto tolerovať nebudem; skúste to skompilovať pod linuxom pomocou `gcc` a hneď pochopíte prečo.
 1. Programátorský štýl
   a. Blok kódu začína vždy na ''novom'' riadku. Aj v prípade, že sám nemá viac než jeden riadok. Prečo? Už z letmého pohladu na zdroják je jasné aké panujú medzi časťami kódu logické vzťahy.
   a. Blok kódu je oproti okolitému kódu odsadený o jeden tabulátor doprava. Prečo? Už z letmého pohladu na zdroják je jasné, kde blok kódu začína a kde končí.
   a. Mená symbolických konštánt píšte vždy veľkými písmenami. Prečo? Táto jednoduchá konvencia ktorá programátora prakticky nič nestojí umožnuje už letmým pohladom odlíšiť symbolické konštanty od premenných, čo je viac než užitočné.

Zadania

Všeobecné zásady:

  • Vypracované zadania zasielajte na sarkoci@math.sk, prikladajte ich k e-mailu skomprimované ako prílohu a subject nastavte na "seminar z programovania".

  • Zdrojový kód odsádzajte.
  • Program rozbíjajte na zmysluplné funkčné bloky ktoré sú realizované funkciami - čím viac, tým lepšie.
  • Ošetrujte chybové stavy.
  • Programujte tak, aby kompilátor nevyhlasoval ani jedno varovanie pri pedantnom móde kompilácie.

1

Naprogramujte funkciu ktorá zadané dynamicky allokované $n$-prvkové pole premenných typu int:

  • Inicializuje na hodnotu 0.
  • Inicializuje na aritmetickú postupnosť $\{a+i.b\}_{i\in \mathbf{Z}_{n}}$ so zadanými parametrami $a,b\in\mathbf{Z}$.

  • Inicializuje na postupnosť náhodne generovaných celých čísel.
  • Analyzuje a zisťuje pozíciu a dĺžku najdlhšej klesajúcej podpostupnosti bezprostredne po sebe nasledujúcich prvkov.
  • Sčituje a vracia hodnotu súčtu všetkých prvkov v poli.
  • Analyzuje a vracia aritmetický priemer prvkov v poli.
  • Analyzuje a vracia rozptyl prvkov v poli.

Design funkcií (čiže voľba návratových typov a argumentov) je na vás. Urobte to ale tak, aby funkcie referovali všetky možné chybové stavy aké pri ich vykonávaní môžu nastať.

2

Napíšte program ktorý od uživateľa z klávesnice načíta prirodzené číslo $n$ a následne, metódou Erastotenovho sita, zistí všetky prvočísla nie väčšie než $n$. Pamäť v ktorej Erastotenov algoritmus vykonáva Erastotenovské značkovanie allokujte dynamicky.

Priebežný stav

ID

1

2

3

4

41458

67640

67644

67654

<!>

<!>

67660

67667

67674

<!>

<!>

67678

67682

67687

67692

67698

<!>

<!>

67705

67708

67718

67720

67725

67728

67733

67737

<!>

67743

<!>

<!>

67746

69782

Časté chyby

  1. Chyby týkajúce sa designu funkcií
    1. Funkcia alebo procedúra má vykonávať jednu, čo možno najjednoduchšiu činnosť a túto činnosť má vykonávať dobre.

    2. Rozmeniac na drobné predchádzajúci bod: ak žiadam implementáciu funkcie ktorá vykonáva činnosť Č tak tým myslím, bez toho aby som to explicitne zdôraznoval, že funkcia žiadnu inú činnosť nevykonáva. Napríklad ak chcem, aby funkcia inicializovala pole premenných typu int na zadanú hodnotu $h$ tak, bez toho aby som to explicitne písal, očakávam, že funkcia nebude ani nič čítať z klávesnice, ani nič písať na obrazovku a vôbec, nebude robiť nič čo bezprostredne nesúvisí s inicializáciou pola.

  2. Črty jazyka ktoré nepatria do ANSI C
    1. Ak deklarujete napríklad int pole[n] kde n je nejaká predtým inicializovaná premenná, devcpp, žial, nebude frflať. Lenže niečo podobné je z hladiska čistého ANSI C striktne zakázané. Keďže hodnota n nie je v čase kompilácie známa, to čo takouto deklaráciou hovoríte, je vlastne dynamická allokácia pamate. Ale tá sa správne rieši cez funkciu malloc a jej príbuzné. Jediný dôvod prečo takýto riadok ide skompilovať je to, že devcpp nie je dôsledný kompilátor a, aj bez toho aby o to bol požiadaný, do jazyka mieša črty neoficiálnych rozšírení a C++. Ja ale takéto tolerovať nebudem; skúste to skompilovať pod linuxom pomocou gcc a hneď pochopíte prečo.

  3. Programátorský štýl
    1. Blok kódu začína vždy na novom riadku. Aj v prípade, že sám nemá viac než jeden riadok. Prečo? Už z letmého pohladu na zdroják je jasné aké panujú medzi časťami kódu logické vzťahy.

    2. Blok kódu je oproti okolitému kódu odsadený o jeden tabulátor doprava. Prečo? Už z letmého pohladu na zdroják je jasné, kde blok kódu začína a kde končí.
    3. Mená symbolických konštánt píšte vždy veľkými písmenami. Prečo? Táto jednoduchá konvencia ktorá programátora prakticky nič nestojí umožnuje už letmým pohladom odlíšiť symbolické konštanty od premenných, čo je viac než užitočné.

KMaDGWiki: KurzSeminarZProgramovania (last edited 2019-01-28 14:51:18 by sarkoci)