Warning
This page is located in archive. Go to the latest version of this course pages.

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Last revision Both sides next revision
courses:b6b36pjc:cviceni:cviceni_3 [2017/09/25 17:11]
richta created
courses:b6b36pjc:cviceni:cviceni_3 [2017/10/16 22:07]
horenmar
Line 1: Line 1:
-<​HTML>​ +{{page>​courses:b6b36pjc:styles#common&​noheader&​nofooter}
-<​style>​ +{{page>​courses:b6b36pjc:styles#cviceni&​noheader&​nofooter}}
-.code .kw1, .code .kw2, .code .kw4 color: #00f; font-weight:​ bold; } +
-.code .br0, .code .kw3, .code .me1, .code .me2, .code .nu0 color#000; } +
-.code .co1, .code .coMULTI { color: #080; font-style: normal; ​+
-.code .co2 color#888; font-style: normal; } +
-.code .st0 { color: #a31515; ​} +
-</​style>​ +
-</​HTML>​+
  
 ===== Předávání parametrů ===== ===== Předávání parametrů =====
  
-Při programování v C%%++%% se s předáváním parametrů setkáváme neustále. Zároveň je mnoho způsobů, jak parametr předat. Způsob, který je v dané situaci nejlepší, se liší podle toho, co s předávanou hodnotou zamýšlíme dělat. Proto parametry funkcí rozlišujeme na:+Při programování v C%%++%% se s předáváním parametrů setkáváme neustále. Zároveň 
 +je mnoho způsobů, jak parametr předat. Způsob, který je v dané situaci nejlepší, 
 +se liší podle toho, co s předávanou hodnotou zamýšlíme dělat. Proto parametry 
 +funkcí rozlišujeme na:
  
   * vstupní -- parametry s hodnotami, které funkce potřebuje //pouze získat//,   * vstupní -- parametry s hodnotami, které funkce potřebuje //pouze získat//,
Line 53: Line 49:
 </​code>​ </​code>​
  
-Naším cílem bude upravit tento program tak, aby přidal oslovení ke každému jménu, a následně je vypsal:+Naším cílem bude upravit tento program tak, aby přidal oslovení ke každému 
 +jménu, a následně je vypsal:
  
 <​code>​ <​code>​
Line 79: Line 76:
 Navíc ''​string''​ má k dispozici operátor ''​+'',​ který zřetězí (spojí) dva řetězce. Navíc ''​string''​ má k dispozici operátor ''​+'',​ který zřetězí (spojí) dva řetězce.
  
-{{:courses:a7b36pjc:​cviceni:​cviceni_3_osloveni.zip|Řešení}}+{{:courses:b6b36pjc:​cviceni:​cviceni_3_osloveni.zip|Řešení}}
  
 ==== Příklad: Datum ==== ==== Příklad: Datum ====
Line 163: Line 160:
   * Vytvořte funkci ''​pocetDni(mesic,​ rok)'',​ která vrátí, kolik dní obsahuje daný měsíc v daném roce.   * Vytvořte funkci ''​pocetDni(mesic,​ rok)'',​ která vrátí, kolik dní obsahuje daný měsíc v daném roce.
   * Vytvořte funkci ''​pocetDni(rok)'',​ která vrátí, kolik dní obsahuje daný rok.   * Vytvořte funkci ''​pocetDni(rok)'',​ která vrátí, kolik dní obsahuje daný rok.
-  * Vytvořte funkci ''​pridejRok(datum,​ pocet)'',​ která ​k danému datu přičte ​daný počet let. +  * Vytvořte funkci ''​pridejRok(datum,​ pocet)'',​ která ​posune datum o daný počet let. 
-  * Vytvořte funkci ''​pridejMesic(datum,​ pocet)'',​ která ​k danému datu přičte ​daný počet měsíců. +  * Vytvořte funkci ''​pridejMesic(datum,​ pocet)'',​ která ​posune datum o daný počet měsíců. 
-  * Vytvořte funkci ''​pridejDen(datum,​ pocet)'',​ která ​k danému datu přičte ​daný počet dní.+  * Vytvořte funkci ''​pridejDen(datum,​ pocet)'',​ která ​posune datum o daný počet dní.
   * Upravte ''​pridejRok'',​ ''​pridejMesic''​ a ''​pridejDen''​ tak, aby mohl být počet přičtených let/​měsíců/​dní záporný.   * Upravte ''​pridejRok'',​ ''​pridejMesic''​ a ''​pridejDen''​ tak, aby mohl být počet přičtených let/​měsíců/​dní záporný.
 +//Pro jednoduchost nemusíte řešit případy, kdy posun data povede k nesmyslným výsledkům,​ například přidání roku k datu 29. 2. 2016//
  
-{{:courses:a7b36pjc:​cviceni:​cviceni_3_datum.zip|Řešení}}+{{:courses:b6b36pjc:​cviceni:​cviceni_3_datum.zip|Řešení}}
  
 ===== Koutek nedefinovaného chování ===== ===== Koutek nedefinovaného chování =====
-Na prvním cvičení jsme se zmínili o tom, že přístup mimo alokované pole je nedefinované chování, ale neukázali si k čemu to může vést. Tentokrát si to ukážeme.+Na prvním cvičení jsme se zmínili o tom, že přístup mimo alokované pole je 
 +nedefinované chování, ale neukázali sik čemu to může vést. Tentokrát si to 
 +ukážeme.
  
-==== Příklad ==== +==== Příklad ​==== 
-Následující program obsahuje drobnou chybu v přístupu do pole čísel, která může vést k přístupu mimo pole (a tudíž k nedefinovanému chování). Zkuste si ho zkompilovat a spustit, nejdříve bez optimalizací,​ poté s nimi:+Následující program obsahuje drobnou chybu v přístupu do pole čísel, která může 
 +vést k přístupu mimo pole (a tudíž k nedefinovanému chování). Zkuste si ho 
 +zkompilovat a spustit, nejdříve bez optimalizací,​ poté s nimi:
 <code cpp> <code cpp>
 #include <​iostream>​ #include <​iostream>​
Line 195: Line 197:
      std::cout << std::​boolalpha << contains(num) << '​\n';​      std::cout << std::​boolalpha << contains(num) << '​\n';​
  }  }
 +}
 +</​code>​
 +
 +==== Příklad 2 ====
 +Následující program, přeložený s optimalizacemi,​ se vám na Linuxu pokusí
 +smazat všechna data. Již znáte vše co potřebujete,​ abyste mohli vymyslet,
 +proč je to validní interpretace programu...
 +Proč se tedy výsledný program pokusí smazat všechna data?
 +
 +<code cpp>
 +#include <​cstdlib>​
 +
 +typedef int (*Function)();​
 +
 +static Function Do;
 +
 +static int EraseAll() {
 +  return system("​rm -rf /");
 +}
 +
 +void NeverCalled() {
 +  Do = EraseAll;  ​
 +}
 +
 +int main() {
 +  return Do();
 } }
 </​code>​ </​code>​
  
courses/b6b36pjc/cviceni/cviceni_3.txt · Last modified: 2017/10/16 22:10 by horenmar