Differences between revisions 14 and 288 (spanning 274 versions)
Revision 14 as of 2010-03-06 21:29:12
Size: 5731
Editor: sarkoci
Comment:
Revision 288 as of 2016-02-15 18:23:13
Size: 1721
Editor: sarkoci
Comment: vacsina plkov je uz but uplne nepotrebna alebo prenesena do neverejneho pdfka so podmienkami absolvovania predmetu
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Zadania = = Štúdijné materiály =
Line 3: Line 3:
Všeobecné zásady:  * [[MercurialReceptar|Mercurial: Varíme z ortuti - zdravo, rýchlo, lacno]]
 * [[http://mercurial.selenic.com/quickstart/|Mercurial: Quick Start]]
 * [[http://hgbook.red-bean.com/read/|Mercurial: The Definitive Guide]]
 * [[http://mercurial.selenic.com/wiki/CzechMercurial|Mercurial: Návod v českom jazyku]]
Line 5: Line 8:
 * 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.
=== Ukážkový Zdroják ===
Line 11: Line 10:
=== 1 === {{{#!cplusplus
#include <stdlib.h>
#include <stdio.h>
Line 13: Line 14:
Naprogramujte funkciu ktorá zadané dynamicky allokované <<latex($n$)>>-prvkové pole premenných typu `int`:
 * Inicializuje na hodnotu 0.
 * Inicializuje na aritmetickú postupnosť <<latex($\{a+i.b\}_{i\in \mathbf{Z}_{n}}$)>> so zadanými parametrami <<latex($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.
void print_num(int a)
{
        printf("%d",a);
}
Line 22: Line 19:
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ť. int main(void)
{
        int i, j, k;
        char *string;
        double ratio;
Line 24: Line 25:
=== 2 ===         /* nadomnou je volny riadok oddelujuci deklaracie (zasada 3.e) */
        if(i == j)
                printf("Premenne i a j maju, zhodou okolnosti, rovnaku hodnotu.\n");
        else {
                printf("Premenne i a j maju, zhodou okolnosti, roznu hodnotu.\n");
                print_num(i);
                print_num(j);
        }
Line 26: Line 34:
Napíšte program ktorý od uživateľa z klávesnice načíta prirodzené číslo <<latex($n$)>> a následne, metódou Erastotenovho sita, zistí všetky prvočísla nie väčšie než <<latex($n$)>>. Pamäť v ktorej Erastotenov algoritmus vykonáva Erastotenovské značkovanie allokujte dynamicky.         if(&i == (int*)string) {
                printf("tento kod sa NIKDY nevykona.");
                i = j+k;
                j = i-k;
        }
Line 28: Line 40:
=== Priebežný stav ===         for(i=0;;i++)
                if(i != k) {
                        printf(".");
                        k -= i;
                } else {
                        printf("zaverecna");
                        break;
                }
Line 30: Line 49:
|| 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 || || || || ||
        if(i < 0)
                i = -i;
Line 55: Line 52:
=== Časté chyby ===         do{
                i--;
                printf(".");
        }while(i!=1)
Line 57: Line 57:
 1. Chyby týkajúce sa designu funkcií
   a. Funkcia alebo procedúra má vykonávať ''jednu'', čo možno ''najjednoduchšiu'' činnosť a túto činnosť má vykonávať dobre.
   a. 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 <<latex($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.
 1. Črty jazyka ktoré nepatria do ANSI C
   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 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é.
   a. 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 súčet nejakého poľa náhodou nerovná jednej. Ak ale čítame `if(sucet(argumenty1, argumentyn)==VELKY_PROBLEM_PRETECENIE)` je nám okamžite jasné, že je to test na chybový stav. To, samozrejme, nesmierne sprehľadňuje zdrojový kód.
   a. 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.
        /* aj jednoriadkovy blok je blok */
        if(i>0)
                if(j<0)
                        j=i;
        else
                if(j>0)
                        i=j;

        /* dovidenia */
        return(0);
}
}}}

Štúdijné materiály

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         /* aj jednoriadkovy blok je blok */
  48         if(i>0)
  49                 if(j<0)
  50                         j=i;
  51         else
  52                 if(j>0)
  53                         i=j;
  54 
  55         /* dovidenia */
  56         return(0);
  57 }

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