CourseWare Wiki
Switch Term
Winter 2021 / 2022
Winter 2020 / 2021
Winter 2019 / 2020
Winter 2018 / 2019
Older
Search
Log In
old
courses
b6b36pjc
cviceni
cviceni_3
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.
View differences:
Side by Side
Inline
Go
Link to this comparison view
2017/10/16 22:10 horenmar
2017/10/16 22:07 horenmar
2017/09/25 17:11 richta created
Go
Next revision
Previous revision
2017/10/16 22:10 horenmar
2017/10/16 22:07 horenmar
2017/09/25 17:11 richta created
Go
courses:b6b36pjc:cviceni:cviceni_3 [2017/09/25 17:11]
richta
created
courses:b6b36pjc:cviceni:cviceni_3 [2017/10/16 22:10]
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 si
,
k čemu to může vést. Tentokrát si to
+
ukážeme.
-
==== Příklad ====
+
==== Příklad
1
====
-
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>
+
+
using Function = int(*)();
+
+
static Function Do;
+
+
static int EraseAll() {
+
return system("rm -rf / --no-preserve-root");
+
}
+
+
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