Differences between revisions 23 and 56 (spanning 33 versions)
Revision 23 as of 2010-03-09 20:07:37
Size: 7645
Editor: jenca
Comment:
Revision 56 as of 2010-03-29 21:59:35
Size: 11591
Editor: sarkoci
Comment:
Deletions are marked like this. Additions are marked like this.
Line 37: Line 37:
Funkcie implementujte tak, aby výsledok výpočtu reprezentovali a odovzdali opäť ako zlomok.
Line 39: Line 40:

K riešeniu úlohy 1. doprogramujte funkciu ktorá zadané pole premenných typu int preusporiada vzostupne. To znamená, že výsledné pole obsahuje presne tie isté prvky ako zadané pole, ale hodnoty v ňom uložené su neklesajúcou funkciou indexu. <!> Aspoň približné riešenie zaslať do 21.Marca a to aj v prípade, že ste ešte úspešne neodovzdali zadanie 1.

##=== 5 ===
##
##Navrhnite datový typ reprezentujúci maticu (v matematickom zmysle slova) čísel typu double. Taký datový typ by mal niesť informáciu o počte riadkov, počte stĺpcov
##a, samozrejme, o hodnotách jednotlivých prvkov takej matice. Je jasné, že tu hovorím o nejakej štruktúre. Okrem týchto vecí môže taký datový typ zastrešovať aj
##rôzne servisné a obslužné informácie - to už závisí od vašeho programátorského vkusu a rôznych implementačných nutností na ktoré cestou narazíte.
##
##Pre tento datový typ potom naprogramujte funkciu ktorá:
## * vytvorí a pripraví všetky potrebné štruktúry pre neinicializovanú maticu typu <<latex($m\times n$)>>
## * uvolní pamäť po štruktúrach reprezentujúcich zadanú maticu
## * zadanú maticu skopíruje do inej, tiež zadanej matice
## * zadanú maticu inicializuje na nulovú maticu
## * zadanú maticu inicializuje na jednotkovú maticu
## * zadanú maticu inicializuje na matice náhodných hodnôt
## * vypočíta euklidovskú normu zadanej matice
## * vypočíta súčin dvoch matíc a uloží ho do zadanej matice
## * Gausovou eliminačnou metódou prevedie zadanú maticu na subdiagonálny tvar a zodpovedajúce elementárne riadkové operácie súbežne aplikuje na inú, tiež zadanú maticu
## * nad zadanou maticou vykoná Gramm-Schmidtovu ortogonalizáciu
## * maticu na mieste (!) transponuje

##=== 6 ===
##
##Navrhnite datový typ reprezentujúci rastrový čierno-biely obrázok. Čiže, matematicky, maticu čísel typu `uint` (hodnota 0 reprezentuje čiernu a hodnota 255
##bielu farbu, ostatné hodnoty reprezentujú rôzne stupne šedi medzi bielou a čiernou). Podobne ako v predchádzajúcej úlohe, takýto dátový typ by mal obsahovať
##informáciu o výške a šírke obrázku (čiže, vlastne, o počte riadkov a stĺpcov matice) a potom, samozrejme, o stupňoch šedi jednotlivých pixlov. Okrem toho môže
##niesť aj rôzne pomocné informácie, to opäť závisí od vašeho programátorského vkusu ako aj od rôznych nutností na ktoré v priebehu implementácie narazíte.
Line 43: Line 72:
## Cifra Štefan
Line 44: Line 74:
|| 67640 || || || || ||
|| 67644 || || || || ||
|| 67654 || <!> || <!> || || ||
|| 67660 || || || || ||
|| 67667 || || || || ||
|| 67674 || <!> || (./) || || ||
|| 67678 || || || || ||
## Kandová Andrea
|| 67640 || <!> || || || :\ ||
## Húska Martin
|| 67644 || <!> || || <!> || (./) ||
## Zboranova Maria
|| 67654 || (./) || (./) || || (./) ||
## Kleinová Viera
|| 67660 || || || || <!> ||
## Kurajová Jana
|| 67667 || || || || (./) ||
## Brázdilová Veronika
|| 67674 || <!> || (./) || (./) || (./) ||
## Tješšová Mária
|| 67678 || || (./) || <!> || (./) ||
## Barboríková Lucia
Line 52: Line 90:
## Juhász Dávid
Line 53: Line 92:
|| 67692 || || || || ||
|| 67698 || <!> || <!> || || ||
|| 67705 || || || || ||
|| 67708 || || || || ||
## Rentka František
|| 67692 || || || || (./) ||
## Trubač Martin
|| 67698 || <!> || (./) || || <!> ||
## Medľa Matej
|| 67705 || <!> || (./) || <!> || (./) ||
## Kmeťo Tibor
|| 67708 || <!> || (./) || || <!> ||
## Kalina Jakub
Line 58: Line 102:
|| 67720 || || || || ||
|| 67725 || || || || ||
|| 67728 || || || || ||
## Bohumel Tomáš
|| 67720 || || || || <!> ||
## Miklašová Monika
|| 67725 || <!> || || || <!> ||
## Kottáš Peter
|| 67728 || <!> || || || :\ ||
## Tücsök Nikolett
Line 62: Line 110:
|| 67737 || <!> || || || || ## Petkaničová Jana
|| 67737 || (./) || (./) || <!> || <!> ||
## Kollár Michal
Line 64: Line 114:
|| 67746 || || ||      ||      || ## Lacko Vladimír
|| 67746 || || || (./) || (./) ||
## Frolkovič Richard
Line 85: Line 137:
  a. Medzi definíciami funkcií ako aj medzi inštrukciami preprocesora na začiatku zdrojového kódu a kódom samotným sa nachádzajú voľné riadky. Prečo? Opticky to oddeluje veci ktoré spolu súvisia od vecí ktore spolu nesúvisia čo, opäť, zvyšuje čitateľnosť kódu.
  a. Pri funkciach sa explicitne uvadza datovy typ a navratovy typ aj vtedy, ak tieto nemaju argumenty alebo ziadnu hodnotu nevracaju. Prečo? Dáva nám to dopredu vedieť, čo možno od tej ktorej funkcie očakávať, čo oepäť sprehľadňuje zdroják.
Line 89: Line 143:
#include <stdlib.h>
#include <stdio.h>

void print_num(int a)
{
        printf("%d",a);
}
Line 98: Line 160:
        else         else {
Line 100: Line 162:
                print_num(i);
                print_num(j);
        }
Line 116: Line 181:
        if(i < 0)
                i = -i;

        do{
                i--;
                printf(".");
        }while(i!=1)

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".

  • Pred odovzdaním riešenia skontrolujte, či sa nedopúšťate niektorej spomedzi často sa vyskytujúcich chýb.

  • 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.

3

Budeme pracovať s racionálnymi číslami reprezentovanými v tvare zlomku. Za účelom reprezentácie takéhoto zlomku si zavedieme zavedieme datový typ zlomok a to bude štruktúra o dvoch členských premenných: čitateľ bude reprezentovať premenná typu int, menovateľ bude reprezentovať premenná typu unsigned int. Implementujte nasledujúce funkcie:

  • funkciu ktorá porovná dva takto reprezentované zlomky a cez návratový typ referuje, ktorý z nich je väčší.
  • funkciu ktorá vypočíta súčet dvoch zlomkov
  • funkciu ktorá vypočíta rozdiel dvoch zlomkov
  • funkciu ktorá vypočíta súčin dvoch zlomkov
  • funkciu ktorá vypočíta podiel dvoch zlomkov

Funkcie implementujte tak, aby výsledok výpočtu reprezentovali a odovzdali opäť ako zlomok.

4

K riešeniu úlohy 1. doprogramujte funkciu ktorá zadané pole premenných typu int preusporiada vzostupne. To znamená, že výsledné pole obsahuje presne tie isté prvky ako zadané pole, ale hodnoty v ňom uložené su neklesajúcou funkciou indexu. <!> Aspoň približné riešenie zaslať do 21.Marca a to aj v prípade, že ste ešte úspešne neodovzdali zadanie 1.

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 sa píšu 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é.
    4. Návratové chybové stavy funkcií sa realizujú ako symbolické konštanty. Prečo? Pri letmom pohlade na kondicionál
      • if(sucet(argumenty1, argumentyn) == 1)

      by sa mohlo zdať, že testujeme, či sa výsledok nejakého výpočtu (ktorý realizuje funkcia sucet) náhodou nerovná jednej. Ak ale čítame

      • if(sucet(argumenty1, argumentyn) == PROBLEM_PRETECENIE_ROZSAHU_INT)

      je nám okamžite jasné, že je to test na chybový stav. To, samozrejme, nesmierne sprehľadňuje zdrojový kód.
    5. Medzi deklarácie premenných na začiatku tela funkcie a jeho zvyšok sa vkladá prázdny riadok. Prečo? Programátor čítajúci zdrojový kód preskakuje deklarácie premenných a vracia sa k nim až neskôr, keď sa chce dozvedieť akého typu tá ktorá premenná je. Prázdny riadok na konci deklarácií výrazne ulahčuje takýto spôsob čítania zdrojáku.
    6. Medzi definíciami funkcií ako aj medzi inštrukciami preprocesora na začiatku zdrojového kódu a kódom samotným sa nachádzajú voľné riadky. Prečo? Opticky to oddeluje veci ktoré spolu súvisia od vecí ktore spolu nesúvisia čo, opäť, zvyšuje čitateľnosť kódu.
    7. Pri funkciach sa explicitne uvadza datovy typ a navratovy typ aj vtedy, ak tieto nemaju argumenty alebo ziadnu hodnotu nevracaju. Prečo? Dáva nám to dopredu vedieť, čo možno od tej ktorej funkcie očakávať, čo oepäť sprehľadňuje zdroják.

Ukážkový Zdroják

   1 #include <stdlib.h>
   2 #include <stdio.h>
   3 
   4 void print_num(int a)
   5 {
   6         printf("%d",a);
   7 }
   8 
   9 int main(void)
  10 {
  11         int i, j, k;
  12         char *string;
  13         double ratio;
  14 
  15         /* nadomnou je volny riadok oddelujuci deklaracie (zasada 3.e) */
  16         if(i == j)
  17                 printf("Premenne i a j maju, zhodou okolnosti, rovnaku hodnotu.\n");
  18         else {
  19                 printf("Premenne i a j maju, zhodou okolnosti, roznu hodnotu.\n");
  20                 print_num(i);
  21                 print_num(j);
  22         }
  23 
  24         if(&i == (int*)string) {
  25                 printf("tento kod sa NIKDY nevykona.");
  26                 i = j+k;
  27                 j = i-k;
  28         }
  29 
  30         for(i=0;;i++)
  31                 if(i != k) {
  32                         printf(".");
  33                         k -= i;
  34                 } else {
  35                         printf("zaverecna");
  36                         break;
  37                 }
  38 
  39         if(i < 0)
  40                 i = -i;
  41 
  42         do{
  43                 i--;
  44                 printf(".");
  45         }while(i!=1)
  46 
  47 
  48         /* dovidenia */
  49         return(0);
  50 }

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