Vzdělávání

Sekce vzdělávání nabízí články o různých vzdělávacích programech, včetně front end developer kurzů a kurzů jako kurz Excel, které vám pomohou získat praktické dovednosti. Objevte nejlepší způsoby, jak se vzdělávat online a posunout své schopnosti na vyšší úroveň.

OOP v C++: třída reprezentující válec a něco víc
Vzdělávání
05.11.2020
Skillmea

OOP v C++: třída reprezentující válec a něco víc

V úvodu tohoto blogu bych chtěl pozdravit všechny nadšence vyššího programovacího jazyka C++. V tomto blogu jsem si pro vás připravil téma z objektově orientovaného programování. Z aplikačního hlediska jsem si pro vás připravil implementaci třídy, která reprezentuje válec jako 3D geometrický útvar. To znamená, že se znovu budeme bavit v intencích analytické geometrie. To není z toho důvodu, že bych vás chtěl zatěžovat vyšší matematikou, ale z toho důvodu, že geometrické objekty lze pěkně reprezentovat třídami a objekty implementovanými v jazyce C++. Už v předchozím kurzu jsem rozvinul myšlenku objektově orientovaného programování a mimo jiné jsem tvrdil, že objekt v jazyce C++ odráží vlastnosti a schopnosti objektu reálného světa. Za takový objekt můžeme považovat také válec, který si nemusíte skutečně sestrojit z nějakého materiálu, ale stačí se na něj dívat z pohledu analytické geometrie. Takže na začátek si představíme trochu teorie, kterou musíme dotáhnout do konce právě proto, abyste rozuměli zdrojovému kódu, který jsem si pro vás připravil. Potom vás ještě pověřím vyřešením logického úkolu, který když chcete úspěšně splnit, musíte mít dobré poznatky ze základů analytické geometrie. Ale o tom pak... Je třeba se tedy připravit a zvládnout pojmy jako jsou kartézský souřadnicový systém, bod, vektor, přímka, rovina, jejich algebrický popis, až po skalární či vektorový součin vektorů. Pojďme ale pěkně popořádku. Na začátku vám položím otázku: Jak jsi ty představuješ válec v prostoru? Určitě bys věděl, jak vypadá jeho tvar, popřípadě bys ho uměl nakreslit. No dobře, z hlediska geometrie může být, ale za těmi čarami se skrývá i konkrétní matematický popis. Začněme tedy bodem. Bod je základní geometrický útvar, který je ve 3D kartézském prostoru reprezentován třemi souřadnicemi. Souřadnice bodu mohou nabývat jakoukoli hodnotu z oboru reálných čísel. Proč mluvím právě o bodě? Je to z toho důvodu, abych vám usnadnil práci. Válec můžeme definovat právě dvěma body. Konkrétně jsou to body, které leží ve středu dvou podstav válce. To znamená, že střed dolní podstavy a střed horní podstavy válce jasně vymezují výšku válce. Když k tomu přidáme poloměr podstavy, máme přesnou představu, o který válec se jedná. S tím usnadněním práce jsem to myslel opravdu vážně, asi byste přece nechtěli, kdybych vám definoval rovnici dvou kružnic, které by reprezentovaly podstavy válce, byť tato reprezentace by byla správná. K vysvětlení reprezentace válce, která je vlastní analytické geometrii, vám nabízím následující obrázek:[Image] Na obrázku máte znázorněn 3D kartézský souřadnicový systém, který je vlastní výpočtem v analytické geometrii. Na okraj jen podotknu, že se jedná tedy o systém, který je ortogonální a zároveň ortonormální. V tomto souřadnicovém systému je zobrazen válec, který je jednoznačně určen dvěma body a poloměrem podstav válce. Zmíněné dva body reprezentují právě středy podstav válce. Vraťme se nyní na chvíli do světa objektově orientovaného programování. Už víme, že chceme reprezentovat válec třídou. Definujme tedy vlastnosti a schopnosti válce. Z kurzů víte, že vlastnosti objektu jsou reprezentovány datovými členy třídy.  Já jsem položil požadavek na datové členy třídy následovně: • mějme datový člen, který bude reprezentovat střed dolní podstavy válce, • mějme datový člen, který bude reprezentovat střed horní podstavy válce, • mějme datový člen, který bude reprezentovat poloměr podstav válce. Uvedené tři atributy jsou dostatečné k tomu, aby byl válec reprezentován jednoznačně. Já však kladu ještě další požadavky na datové členy třídy válec. Přestože další parametry válce jsou jasně určeny předchozími třemi, chci, aby byly explicitně dopočítány a uloženy do datových členů následující údaje:  • výška válce, která je jasně určena vzdáleností středů podstav, • obsah povrchu válce, který je determinován poloměrem a výškou válce, • objem válce, který je také jasně určen poloměrem a výškou válce. • výchozí konstruktor, který bude užitečný při vytváření nové instance třídy a bude inicializovat všechny datové členy na nulové hodnoty, • druhý uživatelem definovaný konstruktor, který se také použije při vytváření nové instance třídy a bude inicializovat hodnoty datových členů na argumenty předávané přes parametry konstruktoru. Tento konstruktor bude tedy parametrický. Kromě inicializace základních tří atributů (středy podstav, poloměr podstav válce) bude dopočítávat atributy výška, obsah a objem válce, • destruktor, který bude dealokovat paměť vyhrazenou pro novou instanci této třídy, • členskou metodu, která bude sloužit k přestavování hodnot datových členů, to znamená, že z válce s původními rozměry a souřadnicemi vznikne jiný válec, který má nové souřadnice a nové rozměry, • členskou metodu, která bude vracet hodnotu souřadnic bodu, který reprezentuje střed dolní podstavy válce, • členskou metodu, která bude vracet hodnotu souřadnic bodu, který reprezentuje střed horní podstavy válce, • členskou metodu, která bude vracet hodnotu poloměru podstav válce, • členskou metodu, která bude vracet hodnotu obsahu povrchu válce, • členskou metodu, která bude vracet hodnotu objemu válce, • členskou metodu, která bude vracet informaci o tom, zda libovolně zvolený bod definovaný třemi souřadnicemi patří do prostoru (objemu válce) nebo ne. Právě požadavek na poslední členskou metodu je analyticko-logická hádanka, kterou je třeba vyřešit, vyžaduje však širší znalosti z analytické geometrie. Této úloze se budu tedy podrobněji věnovat a to z toho důvodu, abyste řešení pochopili a neztratili se ve spleti matematických vztahů a implementačních detailech. V úvodu jsme si tedy vysvětlili, že uvedu příklad z objektově orientovaného programování, který bude aplikován na oblast analytické geometrie a to konkrétně na geometrický objekt válec. Dále jsme si ukázali obrázek pro jasnější představu a pochopení úlohy, definovali jsme si požadavky na třídu, kterou lze implementovat a jako poslední jsem zadal úkol, který řeší problém průniku libovolně zvoleného bodu a prostoru válce. Bez dalších okolků vám na následujících řádcích nabízím zdrojový kód, který v sobě skrývá implementaci třídy reprezentující válec, třídu reprezentující bod ve 3D kartézském prostoru, členskou metodu třídy válec, která odpovídá na otázku, zda libovolný bod patří do prostoru válce nebo ne. No ak tomu funkci main(), ve které budeme novou instanci třídy válec používat. 001: #include <iostream> 002: #include <cmath> 003: using namespace std; 004: 005: const double pi = 3.14159; 006: 007: class cPoint3D 008: { 009: public: 010: cPoint3D(); 011: cPoint3D(double x, double y, double z); 012: ~cPoint3D(); 013: double x; 014: double y; 015: double z; 016: }; 017: 018: cPoint3D::cPoint3D() 019: { 020: this->x = 0.0; 021: this->y = 0.0; 022: this->z = 0.0; 023: } 024: 025: cPoint3D::cPoint3D(double x, double y, double z) 026: { 027: this->x = x; 028: this->y = y; 029: this->z = z; 030: } 031: 032: cPoint3D::~cPoint3D() 033: { 034: 035: } 036: 037: class cCylinder 038: { 039: public: 040: cCylinder(); 041: cCylinder(cPoint3D V1, cPoint3D V2, double radius); 042: ~cCylinder(); 043: void SetCylinder(cPoint3D V1, cPoint3D V2, double radius); 044: cPoint3D GetV1(); 045: cPoint3D GetV2(); 046: double GetRadius(); 047: double GetHeight(); 048: double GetContent(); 049: double GetVolume(); 050: bool BelongToCylinder(cPoint3D X); 051: 052: private: 053: cPoint3D V1; 054: cPoint3D V2; 055: double radius; 056: double height; 057: double content; 058: double volume; 059: }; 060: 061: cCylinder::cCylinder() 062: { 063: this->V1 = cPoint3D(0.0, 0.0, 0.0); 064: this->V2 = cPoint3D(0.0, 0.0, 0.0); 065: this->radius = 0.0; 066: this->height = 0.0; 067: this->content = 0.0; 068: this->volume = 0.0; 069: } 070: 071: cCylinder::cCylinder(cPoint3D V1, cPoint3D V2, double radius) 072: { 073: this->V1 = V1; 074: this->V2 = V2; 075: this->radius = radius; 076: this->height = sqrt(pow(this->V1.x - this->V2.x, 2.0) + pow(this->V1.y – this->V2.y, 2.0) + pow(this->V1.z - this->V2.z, 2.0)); 077: this->content = 2 * pi * pow(this->radius, 2.0) + 2 * pi * this->radius * this->height; 078: this->volume = pi * pow(this->radius, 2.0) * this->height; 079: } 080: 081: cCylinder::~cCylinder() 082: { 083: 084: } 085: 086: void cCylinder::SetCylinder(cPoint3D V1, cPoint3D V2, double radius) 087: { 088: this->V1 = V1; 089: this->V2 = V2; 090: this->radius = radius; 091: this->height = sqrt(pow(this->V1.x - this->V2.x, 2.0) + pow(this->V1.y - this->V2.y, 2.0) + pow(this->V1.z - this->V2.z, 2.0)); 092: this->content = 2 * pi * pow(this->radius, 2.0) + 2 * pi * this->radius * this->height; 093: this->volume = pi * pow(this->radius, 2.0) * this->height; 094: } 095: 096: cPoint3D cCylinder::GetV1() 097: { 098: return this->V1; 099: } 100: 101: cPoint3D cCylinder::GetV2() 102: { 103: return this->V2; 104: } 105: 106: double cCylinder::GetRadius() 107: { 108: return this->radius; 109: } 110: 111: double cCylinder::GetHeight() 112: { 113: return this->height; 114: } 115: 116: double cCylinder::GetContent() 117: { 118: return this->content; 119: } 120: 121: double cCylinder::GetVolume() 122: { 123: return this->volume; 124: } 125: 126: bool cCylinder::BelongToCylinder(cPoint3D X) 127: { 128: bool flag = true; 129: 130: double u1 = this->V2.x - this->V1.x; 131: double u2 = this->V2.y - this->V1.y; 132: double u3 = this->V2.z - this->V1.z; 133: 134: double d1 = -(u1 * X.x) - (u2 * X.y) - (u3 * X.z); 135: double t = (-(u1 * this->V1.x) - (u2 * this->V1.y) - (u3 * this->V1.z) - d1) / (u1 * u1 + u2 * u2 + u3 * u3); 136: 137: cPoint3D XT = cPoint3D(V1.x + u1 * t, V1.y + u2 * t, V1.z + u3 * t); 138: 139: double dist_01 = sqrt(pow(X.x - XT.x, 2.0) + pow(X.y - XT.y, 2.0) + pow(X.z – XT.z, 2.0)); 140: 141: double d2 = -(u1 * this->V1.x) - (u2 * this->V1.y) - (u3 * this->V1.z); 142: double d3 = -(u1 * this->V2.x) - (u2 * this->V2.y) - (u3 * this->V2.z); 143: 144: double dist_02 = abs(u1 * X.x + u2 * X.y + u3 * X.z + d2) / sqrt(u1 * u1 + u2 * u2 + u3 * u3); 145: double dist_03 = abs(u1 * X.x + u2 * X.y + u3 * X.z + d3) / sqrt(u1 * u1 + u2 * u2 + u3 * u3); 146: 147: if ((dist_01 <= this->radius) && (dist_02 <= this->height) && (dist_03 <= this->height)) 148: { 149: flag = true; 150: } 151: else 152: { 153: flag = false; 154: } 155: 156: return flag; 157: } 158: 159: int main() 160: { 161: cPoint3D V1 = cPoint3D(0.0, 0.0, 0.0); 162: cPoint3D V2 = cPoint3D(0.0, 0.0, 4.0); 163: cCylinder Cylinder = cCylinder(V1, V2, 1.5); 164: 165: cout << Cylinder.BelongToCylinder(cPoint3D(0.0, 0.0, 2.0)) << endl; 166: cout << Cylinder.BelongToCylinder(cPoint3D(0.0, 1.0, 2.0)) << endl; 167: cout << Cylinder.BelongToCylinder(cPoint3D(1.0, 1.0, 2.0)) << endl; 168: cout << Cylinder.BelongToCylinder(cPoint3D(1.5, 0.0, 0.0)) << endl; 169: cout << Cylinder.BelongToCylinder(cPoint3D(1.5, 0.0, 4.0)) << endl; 170: 171: cout << Cylinder.BelongToCylinder(cPoint3D(2.0, 1.0, 2.0)) << endl; 172: cout << Cylinder.BelongToCylinder(cPoint3D(1.0, 2.0, 2.0)) << endl; 173: cout << Cylinder.BelongToCylinder(cPoint3D(10.0, 5.0, 7.0)) << endl; 174: 175: cout << endl; 176: 177: V1.~cPoint3D(); 178: V2.~cPoint3D(); 179: Cylinder.~cCylinder(); 180: 181: return 0; 182: }Na řádku 001 je zavolána direktiva preprocesoru #include, která přidává hlavičkový soubor iostream do zdrojového kódu. Část této standardní knihovny potřebujeme, protože chceme používat objekt cout, pomocí kterého budeme zapisovat informaci do okna konzolové aplikace. Podobně je na řádku 002 opět použita direktiva preprocesoru #include. Tentokrát ovšem kvůli přidání hlavičkového souboru cmath. Tento hlavičkový soubor je také součástí standardní knihovny jazyka C++ a potřebujeme jej, protože budeme používat funkce pow() a sqrt(). Jen pro ozřejmení funkci pow() budeme používat pro výpočet druhé mocniny námi zadaného argumentu a funkci sqrt() pro výpočet druhé odmocniny zadaného argumentu. Na řádku 003 pomocí klíčového slova using definujeme, že budeme používat jmenný prostor std. Tento řádek jsem do kódu umístil proto, abychom nemuseli ke objektům, třídám a funkcím, které do tohoto prostoru patří, přistupovat přes std a operátor přístupu :: . Kromě toho, že funkce pow(), sqrt(), objekt cout a manipulátor endl přísluší nějakým hlavičkovým souborům, patří i do jmenného prostoru std. Na řádku 005 je definována konstanta s identifikátorem pi. Ta reprezentuje Ludolfovo číslo a má hodnotu 3,14159. Tuto konstantu potřebujeme k výpočtu obsahu povrchu a objemu válce. Pokračujeme řádkem 007, na kterém pomocí klíčového slova class deklarujeme třídu s identifikátorem cPoint3D. Tato třída nám bude v programu reprezentovat bod ve 3D karteziánském souřadnicovém systému. Deklaraci zmíněné třídy začínáme na řádku 008 levou programovou závorkou, za kterou na řádku 009 následuje klíčové slovo public, kterým definujeme, že následujícím členům bude přidělen veřejný přístup. Na řádcích 010 až 012 jsou tedy deklarovány tři členské metody třídy cPoint3D, přičemž jsou to speciální členské funkce a to konkrétně dva konstruktory a destruktor. Na řádku 010 je deklarován výchozí konstruktor, kterému nepřísluší žádné parametry. Tento konstruktor slouží k vytvoření nové instance třídy cPoint3D s tím, že inicializuje datové členy na nulové (výchozí) hodnoty. Na řádku 011 je deklarován uživatelem definovaný konstruktor, který slouží také k vytvoření nové instance třídy, přičemž pomocí svých parametrů, přes které se předávají konkrétní argumenty (souřadnice bodu), inicializuje datové členy třídy. Rozdíl mezi prvním a druhým konstruktorem je ten, že první nepotřebuje parametry, protože inicializuje datové členy na 0, které lze pak přestavit jinou členskou metodou na konkrétní hodnoty, zatímco druhý konstruktor přiřazuje datovým členům nenulové hodnoty prostřednictvím argumentů předávaných přes parametry konstruktoru. K úplnosti textu uvádím, že druhý konstruktor má tři parametry x, y, az právě proto, že bod ve 3D prostoru má tři souřadnice ak tomu přísluší také tři členské proměnné třídy cPoint3D. Jsou to proměnné se stejným identifikátorem jako parametry konstruktoru, tedy x, y, z. Existují informační zdroje, které zpochybňují a nedoporučují totožnost identifikátorů parametrů konstruktorů a členských proměnných třídy. Já však toto názvosloví považuji za běžné a správné z toho důvodu, že existuje klíčové slovo this, které reprezentuje uvnitř objektu ukazatel na objekt a lze jeho prostřednictvím přistupovat k datovým členům. Tímto zápisem (syntaxou) se dá odlišit identifikace parametru a členské proměnné objektu. Je přece jasný rozdíl mezi x a this->x. První je parametr konstruktoru a druhé datový člen, ke kterému přistupujeme pomocí ukazatele. Na řádku 012 je deklarován destruktor, který nám bude sloužit k dealokaci paměti vyhrazené pro novou instanci třídy cPoint3D po jejím vytvoření. Destruktory jsou speciální členské funkce tříd, které slouží právě ke zmíněnému účelu, jednoduše řečeno, mají za úkol uklidit po objektu v paměti. Na řádcích 013 až 015 jsou deklarovány tři datové členy x, y az, kterým je přidělen typ double. Tyto reprezentují souřadnice bodu ve 3D kartézském souřadnicovém systému. Na řádku 016 se uzavírá deklarace třídy cPoint3D pravou programovou závorkou a středníkem. Jen připomenu, že středník tam musí být uveden, je to jeden z ojedinělých případů v jazyce C++, kdy se používá středník za programovou závorkou. Na řádku 018 začíná definice výchozího konstruktoru třídy cPoint3D. Jedná se o bezparametrický konstruktor, který inicializuje datové členy na řádcích 020 až 022 na nulu. Po tomto přiřazení se konstruktor ukončuje pravou programovou závorkou na řádku 023. Na řádku 025 začíná definice druhého uživatelem definovaného konstruktoru téže třídy, který na rozdíl od prvního má tři parametry, jehož prostřednictvím se předávají argumenty reprezentující souřadnice bodu ve 3D karteziánském souřadnicovém systému. Tyto se na řádku 027 až 029 přiřazují jednotlivým datovým členům. Konstruktor končí na řádku 030 pravou programovou závorkou. Na řádcích 032 až 035 je uvedena definice destruktoru třídy cPoint3D. Jeho tělo je prázdné a neobsahuje žádný kód tak, jak to bývá u většiny destruktorů. Pro zopakování úlohou destruktora je dealokovat (uvolnit) paměť, která byla konkrétní instanci třídy vyhrazena. Ve zdrojovém kódu se na řádku 037 dále pokračuje deklarací třídy cCylinder, která nám bude reprezentovat právě geometrický objekt válec. Na řádku 038 je uvedena levá programová závorka, která otevírá zmiňovanou deklaraci. Za ní je uvedeno klíčové slovo public, které slouží k přidělení veřejného přístupu k datovým členům a členským metodám, které jsou dále deklarovány. Zatímco třída cPoint3D měla pouze veřejné datové členy a členské metody, třída cCylinder obsahuje také členy soukromé. To znamená, že při této třídě budeme využívat techniku skrývání některých datových členů. Obor platnosti veřejného přístupu platí ve zdrojovém kódu po klíčové slovo private, tedy po klíčové slovo, které nastavuje jiný typ přístupu ke členům třídy. Pro úplnost informace dodám, že členům třídy může být přidělen ještě třetí typ přístupu protected, což v překladu znamená chráněný přístup. Tento typ přístupu však v tomto úkolu využívat nebudeme. Vraťme se ale zpět ke zdrojovému kódu. Na řádcích 040 až 050 jsou deklarovány všechny členské metody, kterým je přidělen veřejný přístup. Tyto si postupně rozebereme. Na řádku 040 je uvedena deklarace výchozího konstruktoru, který má za úkol inicializovat všechny datové členy třídy na nulové hodnoty. Jako poznámku uvedu, že nevidím moc smysl těchto konstruktorů, ale v praxi se volí právě zmiňovaný postup. To znamená, že se vytvoří dva konstruktory, jeden bez parametrů, jehož funkcionalita byla zmíněna výše a druhý konstruktor s parametry, přes které můžete datovým členům přiřadit již konkrétní nenulové hodnoty. Ke výchozímu konstruktoru je třeba potom doprogramovat implementaci metody (tzv. setter), která má stejnou funkci jako konstruktor s parametry. Rozdíl oproti použití parametrického konstruktoru je ten, že inicializujete datové členy třídy ve dvou krocích. V prvním kroku definujete objekt s inicializací datových členů výchozími nulovými hodnotami a ve druhém kroku se pak tyto členy inicializují na uživatelem zadanou hodnotu. Pro úplnost doplním, že smysl používání výchozích konstruktorů vidím při pointrové aritmetice, to znamená v případech, kdy jsou datové členy deklarovány jako směrníky základních vestavěných typů nebo typů, které jsou definovány uživatelem. Tehdy slouží výchozí konstruktor kromě vytvoření objektu pro alokaci paměti (konkrétně haldy) pro daný typ pomocí operátora new. Na řádku 041 je deklarován druhý konstruktor, který má tři parametry. První a druhý parametr jsou typu cPoint3D, ty reprezentují souřadnice středů podstav válce. Třetí parametr reprezentuje poloměr podstav válce. To jsou tři parametry, pomocí kterých lze jednoznačně definovat válec. Na řádku 042 je deklarován destruktor třídy cCylinder. Stejně jako u předešlé třídy má za úkol dealokovat paměť, která je vyhrazena pro novou instanci této třídy. Pokračujeme deklarací členské metody SetCylinder() na řádku 043. Jedná se o tvz. setter, neboli metodu, která má za úkol nastavit hodnoty členských dat třídy. Na řádcích 044 a 045 jsou deklarovány členské metody GetV1() a GetV2(). Tyto metody nemají žádné parametry a vracejí typ cPoint3D. Úkolem první z nich je vracet informaci o souřadnicích středu dolní podstavy válce, druhá z nich vrací informaci o souřadnicích středu horní podstavy válce. Na řádcích 046 až 049 jsou deklarovány členské metody GetRadius(), GetHeight(), GetContent() a GetVolume(). Jsou to gettery, které mají návratový typ double. V takovém pořadí, jak byly jmenovány, slouží k tomu, aby vraceli hodnotu členských dat, která reprezentují poloměr, výšku, obsah a objem válce. Na řádku 050 je deklarována členská metoda BelongToCylinder(). Jako návratový typ vrací bool. Tato metoda slouží ke zjištění toho, zda libovolně zvolený bod ve 3D karteziánském souřadnicovém prostoru patří do prostoru (objemu) válce nebo ne. Podotýkám, že vyřešení tohoto logického úkolu je nejnáročnější, protože musíte znát hlubší souvislosti z analytické geometrie. Ostatní implementace třídy cCylinder je poměrně jednoduchá záležitost oproti zmiňovanému úkolu. Na řádku 052 je uvedeno klíčové slovo jazyka C++ private, které zajistí, že dále deklarované datové členy budou mít soukromý přístup. Na řádcích 053 a 054 jsou pak deklarovány datové členy V1 a V2, které reprezentují střed dolní a horní podstavy válce. Právě proto jim byl přidělen datový typ cPoint3D. Dále jsou na řádcích 055 až 058 deklarovány datové členy radius, height, content a volume. Je jim přidělen datový typ double a ve stejném pořadí reprezentují poloměr, výšku, obsah a objem válce. Na řádku 059 je uvedena pravá programová závorka a středníkem, které uzavírají deklaraci uživatelem definovaného typu (třídy) cCylindr. Implementační detaily (definice) této třídy pokračuje na dalších řádcích zdrojového kódu. Na řádcích 061 až 069 je uvedena definice výchozího konstruktoru cCylinder. Konstruktor nemá žádné parametry, jeho úkolem je vytvářet novou instanci třídy cCylinder a inicializovat všechny datové členy této třídy na nulové hodnoty. Na řádcích 071 až 079 je uvedena definice druhého uživatelem definovaného konstruktoru, která má tři parametry. První dva jsou typu cPoint3D, pomocí nichž se předávají souřadnice středů dolní a horní podstavy válce. Přes třetí parametr, který je typu double, se předává hodnota poloměru válce. Datovým členům V1, V2 a radius jsou přímo přiřazeny hodnoty příslušejících parametrů konstruktoru. Hodnota datového členu height, která reprezentuje výšku válce, je vypočtena ze souřadnic bodů podstav. Výše válce se totiž rovná vzdálenosti těchto bodů, která je geometricky dána jako druhá odmocnina součtu mocnin rozdílu jednotlivých souřadnic dvou bodů. Vztah pro výpočet vzdálenosti dvou bodů je následující:[Image]Hodnota datového členu content, který reprezentuje obsah povrchu válce, je determinován výškou válce a poloměrem podstavy válce. Vztah pro výpočet obsahu povrchu válce je následující:[Image] Podle uvedeného vztahu se vypočítá obsah povrchu válce, jehož hodnota je přiřazena do členské proměnné content na řádku 077. Na řádku 078 je vypočtená hodnota objemu válce a přiřazena do členské proměnné volume. Objem válce je determinován také poloměrem a výškou válce podobně, jako tomu bylo při výpočtu obsahu povrchu válce. Vztah pro výpočet objemu válce je následující:[Image] Na řádku 079 je uvedena pravá programová závorka, která uzavírá definici uživatelem definovaného konstruktoru třídy cCylinder. Na řádcích 081 až 084 je uvedena definice destruktoru třídy cCylinder. Tělo destruktora je prázdné, jeho úkolem je dealokovat paměť, která byla vyhrazena pro novou instanci třídy cCylinder. Na řádcích 086 až 094 je uvedena definice členské metody SetCylinder, která má návratový typ void, čili vrací absenci informace. Tato metoda je tzn. setter, který má za úkol nastavit (přestavit) hodnoty datových členů třídy cCylinder. Jeho funkcionalita je stejná jako u uživatelem definovaného konstruktoru s tím rozdílem, že tato metoda není volána při vytváření nové instance. Může být však aplikována na instanci, která již byla vytvořena. Při jejím volání se změní parametry válce, čili lze jí definovat jiný válec ve 3D kartézském prostoru. Na řádcích 096 až 099 je definována členská metoda GetV1(). Má návratový typ cPoint3D, přičemž je to getter, který má za úkol vrátit souřadnice středu dolní podstavy válce, který je objektem třídy cCylindr reprezentován. Na řádcích 101 až 104 je definována členská metoda GetV2(). Má také návratový typ cPoint3D a podobně jako předešlá metoda má za úkol vrátit souřadnice středu podstavy válce, v tomto případě se však jedná o horní podstavu. Na řádcích 106 až 109 je definována členská metoda GetRadius(). Vrací návratový datový typ double, který reprezentuje poloměr podstavy válce. Na řádcích 111 až 114 je definována členská metoda GetHeight(). Jejím úkolem je vrátit hodnotu datového člena height, který reprezentuje výšku válce. Na řádcích 116 až 119 je definována členská metoda GetContent(). Tato metoda má za úkol vrátit hodnotu datového člena content, který reprezentuje vypočtený obsah povrchu válce. Na řádcích 121 až 124 je definována členská metoda GetVolume(). Tato metoda má za úkol vrátit hodnotu datového člena volume, který reprezentuje vypočtený objem válce. Na řádcích 126 až 157 je definována členská metoda BelongToCylinder(). Úkolem této metody je rozhodnout o tom, zda bod zadaný přes parametr patří do prostoru (objemu) válce nebo ne. Návratový typ této metody je bool, který reprezentuje právě pravdivostní hodnotu zmiňovaného rozhodnutí. Pokud bod se souřadnicemi zadanými přes parametr metody patří do prostoru válce, metoda vrací hodnotu true, ne-li, vrací hadnotu false. Na první pohled se zadaný úkol zdá jednoduchý, není tomu však tak. Právě proto uvedu následující předpoklady, které budeme potom analytickým postupem (výpočtem dokazovat): • patří-li bod do prostoru válce, musí být kolmá vzdálenost tohoto bodu od osy válce menší nanejvýš rovna poloměru podstavy válce, • patří-li bod do prostoru válce, musí být kolmá vzdálenost tohoto bodu od jeho dolní podstavy menší nanejvýš rovna výšce válce, • patří-li bod do prostoru válce, musí být kolmá vzdálenost tohoto bodu od jeho horní podstavy menší nanejvýš rovna výšce válce. K uvedeným předpokladům ještě dodám, že nestačí splnění jednoho nebo dvou z nich. Pokud chceme potvrdit výrok, že konkrétní bod patří do prostoru válce, musí být splněny všechny tři uvedené podmínky. Úspěšné vyřešení úkolu, má následující postup: 1. Vypočítáme souřadnice směrového vektoru přímky, která prochází středy obou podstav válce. Této přímce říkáme osu válce, která je jasně definována zmíněnými dvěma body (střed dolní a horní postavy válce). Souřadnice vypočítáme odečtením dvou bodů, což znamená, že provedeme rozdíl příslušných souřadnic bodů podle následujících vztahů:[Image] 2. Dále sestrojíme rovinu, která je kolmá na osu válce a zároveň prochází bodem, o kterém rozhodujeme, zda patří do prostoru válce nebo ne. Jelikož směrový vektor osy válce je totožný s normálovým vektorem zmíněné roviny, umíme vyjádřit koeficienty a, b, c, které jsou součástí obecného tvaru rovnice roviny. Z uvedeného vyplývá, že potřebujeme dopočítat už jen koeficient d obecného tvaru rovnice roviny. Obecný tvar rovnice přímky je tedy následující:[Image] Když z uvedené rovnice vyjádříme koeficient d, dostaneme následující matematický vztah:[Image] Po vypočtení koeficientu d, pokračujeme následujícím krokem, ve kterém počítáme souřadnice bodu, který vznikne průnikem osy válce a rovinou, která je na ni kolmá a prochází bodem, o kterém rozhodujeme, zda patří do prostoru válce nebo ne. 3. Mějme tedy osu válce (přímku), která je dána následujícím parametrickým vyjádřením[Image] Po rozvinutí pro jednotlivé souřadnice, vzniknou následující rovnice:[Image] Protože počítáme průnik přímky a roviny, dosaďme rovnice 3.2, 3.3 a 3.4 do rovnice 2.1, vznikne nám následující matematický vztah.[Image] Protože koeficienty a, b, c jsou souřadnice směrového vektoru osy válce, můžeme napsat:[Image] Po úpravě rovnice 3.6 a vyjádření parametru t, dostaneme následující vztah:[Image] 4. Po vypočtení koeficientu t, můžeme vypočítat souřadnice bodu, který vznikne průnikem osy válce a zmíněné roviny podle následujících vztahů[Image] 5. Označme bod, o kterém rozhodujeme, zda patří do prostoru válce identifikátorem A, dále označme bod, který vznikne průnikem osy válce a zmiňované roviny jako bod B, vzdálenost těchto dvou bodů pak vypočítáme podle následujícího vztahu[Image] Jak již bylo řečeno, je-li tato vzdálenost menší nanejvýš rovna poloměru podstavy válce, máme splněn první předpoklad, že zadaný bod patří do prostoru válce. 6. V tomto kroku budeme pokračovat analytickým způsobem, kterým budeme dokazovat, že bod splňuje druhý předpoklad, to znamená, že vzdálenost bodu od dolní podstavy válce je menší než výška válce. Budeme vycházet ze vztahu 2.2 a vypočítáme koeficient d pro rovinu, která je kolmá na osu válce, prochází však středem dolní podstavy válce. Tato rovina má stejný normálový vektor jako rovina, která procházela tím bodem, o kterém rozhodujeme, jestli patří do prostoru válce nebo ne. Koeficienty a, b, c, které vystupují v obecném tvaru rovnice roviny, přísluší tedy hodnotám souřadnic směrové vektoru osy válce. Z uvedené vyplývá, že když známe souřadnice normálového vektoru roviny a známe bod, který v ní leží (střed dolní podstavy válce), umíme vyčíslit hodnotu koeficienta d. 7. Po předchozím kroku nám už stačí dopočítat vzdálenost bodu od podstavy přímým vztahem, který je následující:[Image] Pokud je tato vzdálenost menší nanejvýš rovna výšce válce, máme splněn druhý předpoklad, abychom mohli tvrdit, že bod patří do prostoru válce. 8. Pokračujeme výpočtem vzdálenosti bodu od horní podstavy válce. Sestrojíme tedy rovinu, která je kolmá na osu válce a prochází středem horní podstavy válce. K tomuto přijedeme stejným způsobem jako v kroku 6. Obdobně podle vztahu 7.1 vypočítáme předmětnou vzdálenost. Pokud je tato menší nanejvýš rovna výšce válce, máme splněn poslední předpoklad, pro tvrzení výroku, že zadaný bod patří do prostoru válce. Právě tento postup je zachován při implementaci řádků zdrojového kódu 128 až 156. K označení jednotlivých parametrů, které byly součástí průběžného výpočtu se pouze použily v některých případech jiné identifikátory. Na řádku 128 je deklarována proměnná typu bool s identifikátorem flag. Do ní se uloží informace, která bude reprezentovat pravdivostní hodnotu výroku o tom, zda bod do prostoru válce patří či nikoli. Na začátku ji inicializujeme hodnotou true. Na řádku 130 je deklarována proměnná u1, která reprezentuje x složku směrového vektoru osy válce, vypočtená je jako rozdíl x souřadnic bodu V2 a V1. Na řádku 131 je deklarována proměnná u2, která reprezentuje y složku směrového vektoru osy válce, vypočtená je jako rozdíl y souřadnic bodu V2 a V1. Na řádku 132 je deklarována proměnná u3, která reprezentuje ze složku směrového vektoru osy válce, vypočtená jako rozdíl ze souřadnic bodů V2 a V1. Pro doplnění informace, identifikátory V1 a V2 patří datovým členům třídy cCylinder, které reprezentují souřadnice středů podstav válce. Na řádku 134 je vypočtena hodnota proměnné d1, která reprezentuje koeficient d v obecném tvaru roviny, která je kolmá na osu válce a prochází bodem X (bod, o kterém rozhodujeme). Tento koeficient je potřebný k tomu, aby byla kompletní rovnice roviny v prostoru. Potom lze vypočítat parametr t podle vztahu 3.7. Právě tento vztah modeluje přiřazovací příkaz na řádku 135. Po výpočtu parametru t můžeme definovat bod XT (bod, který je kolmým průmětem bodu X na osu válce), který je typu cPoint3D. Ten je definován na řádku 137 tak, že se zavolá konstruktor třídy cPoint3D, kterému se předají hodnoty argumentů. Tyto hodnoty se vypočítávají podle vztahů pro výpočet souřadnic bodu ležícího na přímce, která je dána svým parametrickým vyjádřením (vztahy 4.1 až 4.3). Na řádku 139 je deklarována proměnná dist_01, které se přiřazuje výpočet vzdálenosti bodu X od osy válce. Ta se vypočítá jako geometrická vzdálenost dvou bodů ve 3D kartézském prostoru, a to konkrétně bodu X a XT podle vztahu 5.1. Na řádcích 141 a 142 jsou vypočteny hodnoty proměnných d2 a d3, které reprezentují koeficient d rovin, které procházejí středy podstav válce a jsou kolmé na osu x. Z těchto koeficientů, směrového vektoru a souřadnic bodů X se vypočítávají vzdálenosti bodu od horní a dolní postavy válce. Tyto vzdálenosti se ve zdrojovém kódu počítají na řádcích 144 a 145. Na řádku 147 je uveden příkaz if, ve kterém je vyhodnocena pravdivost výrazu, který je tvořen třemi jednoduchými výroky. První z nich tvrdí, že vzdálenost bodu od osy válce je menší nebo rovna poloměru válce. Druhý z nich tvrdí, že vzdálenost bodu od dolní podstavy válce je menší nebo rovna výšce válce. A poslední z výroků obdobně tvrdí, že vzdálenost bodu od horní podstavy válce je menší nebo rovna než výška válce. Výroky jsou pospojovány logickým operátorem and, což znamená, že jsou-li současně všechny pravdivé, složený výrok je také pravdivý a řízení programu přejde na řádek 149, kde se hodnotě flag přiřadí pravdivostná hodnota true. Je-li jen jeden ze tří výroků nepravdivý, složený výrok je nepravdivý také, což znamená, že bod nepatří do prostoru válce a řízení programu přejde na řádek 153 do klauzule else, kde se přiřadí hodnotě flag pravdivostná hodnota false. Na řádku 156 se vrací hodnota proměnné flag pomocí klíčového slova return. Na řádku 159 začíná definice funkce main(), kterou volá operační systém. V těle této funkce jsou na řádku 161 a 162 vytvořeny nové instance třídy cPoint3D, které reprezentují středy podstav válce. Na řádku 163 je vytvořena nová instance třídy cCylinder, kde se pomocí parametrů konstruktoru předávají argumenty reprezentující středy podstav a poloměr válce. Na řádcích 165 až 173 jsou do okna konzolové aplikace zapsány informace o tom, zda body, jejichž souřadnice zadané jako argumenty členské metody BelongToCylinder(), patří do prostoru válce nebo ne. Celkově jsme volali tuto členskou ve zdrojovém kódu 8krát. To znamená, že jsme prověřovali osm bodů. Jen pro informaci prvních pět patřilo do prostoru válce a další tři ne. Pro správnost programu si výsledky můžete ověřit analytickým postupem, který je v předchozím textu uveden. Na řádku 175 se pouze přechází v okně konzolové aplikace na další řádek. Na řádcích 177 až 179 jsou již jen zavolány destruktory definovaných objektů z důvodu dealokace paměti. Na řádku 181 je vrácena hodnota 0 operačnímu systému. Na řádku 182 se ukončuje tělo funkce main() pravou programovou závorkou. V závěru vám chci poděkovat za přečtení blogu. Doufám, že vás článek, který se týkal objektově orientovaného programování a příkladu z analytické geometrie zaujal. Podstatnou přidanou hodnotou zdrojového kódu byla členská funkce, která rozhodla o tom, zda bod zadaný jako argument této funkce patří do prostoru válce či nikoli. Byl to skutečně náročnější úkol a proto jsem rád, že jste řešení pochopili a spolu se mnou tento úkol rozlouskli. Autorem tohoto článku je Marek Šurka.
Digitální svět v G-Suitu
Vzdělávání
13.10.2020
Skillmea

Digitální svět v G-Suitu

Žijeme v době, kdy jsou technologie již povinnou součástí našich životů. Postupně jak jsme do tohoto světa vstupovali, tak jsme si nebyli ani vědomi, do jakých rozměrů to naroste a stane se to naší součástí. Pro naše pohodlí jsme zkoušeli různé technologie, které nám usnadňují život a pomáhají řešit problémy. Dostali jsme se do stavu, že využíváme řady programů, které jsou online nebo offline a odebíráme různé novinky či newslettery od různých firem. Najednou jsme se ocitli ve stavu, kdy nás začaly tyto technologie a informace zahlcovat a vyžaduje to z naší strany více času na jejich organizaci. Není důležité, jak to bylo, ale je důležité, co bude a jak s tím naložíme dnes. Z tohoto důvodu vám chci představit G-Suite, mix nejlepších aplikací od Google, který vytvořil léty tvrdé práce s lidmi. Představení G SuiteG Suite nám nabízí řadu nástrojů pod jednou střechou, pod jedním přístupem, vše krásné pohromadě. Usnadňuje organizaci dat, souborů, mailů a ostatních věcí. Kdo G Suite nezná, tady je krátké představení: G Suite je předplatné cloudových služeb a kancelářských aplikací. K tomuto musím zmínit samozřejmě samotný Gmail, který nabízí základní služby G Suite. G-suite je vhodný jak pro jednotlivce, tak pro malé, střední a velké firmy. Gmail a G Suite obsahuje: • Gmail - Mailový server, mailová pošta • Hangouts / Meet - Videokonference • Kalendář • Google Disk • Google Dokumenty • Google Tabulky • Google Formuláře • Google Prezentace Toto vše je v základním balíčku pro Gmail a G Suite. Hlavní rozdíl je v tom, že v G Suite můžete mít vlastní doménu emailu, v Gmailu máte příponu @gmail.com[Image] Přednosti G Suite se objevují při nasazení ve firemním prostředí. Obsahuje: • Archivace emailů a konverzací • Google Sejf  Vault • Google Cloud Search • Správa prostředí • Správa mobilních zařízení Jednoduše vše, co je zapotřebí ve firemním prostředí, ve kterém pracuje více lidí a je důležité mít společné kalendáře, nastavení přístupů do pracovních složek, sdílení jednotlivých dokumentů, plánování, kontrola. Největší výhody G SuiteSpolupracování v reálném čase V dokumentech či tabulkách může pracovat najednou více lidí a to zároveň upravovat dokument, psát k němu komentáře, opravovat jej, editovat. Ukládat a sdílet soubory Ukládáte soubory na Google Disk, který je zálohován a zabezpečen a sdílíte soubory pouze s tím, kým potřebujete, vše máte přesně pod kontrolou. Zabezpečení dat Obsahuje bezpečnostní opatření, dvoufázové ověření, jednotné přihlášení. Při ztrátě zařízení nepřijdete o data. Archivace emailů. a mnoho dalšího. Implementace G SuiteG Suite je ideální řešení pro každého, kdo má rád jednoduchost a potřebuje pracovat v digitálním světě. Vytvářet dokumenty, být propojen s kolegy a sdílet soubory a to vše je možné z jakéhokoli místa na světě, kde máte připojení k internetu. Pokud byste si chtěli takové řešení vybudovat sami, stálo by Vás to mnohem více peněz, než platíte měsíčně Google produktem G Suite. G Suite posouvá své hranice dál a vždy se snaží dodat to, co je zapotřebí. Vzniká mnoho dalších nástrojů jako například: • Apps Script, což je vytváření vlastních příkazů, které se mají zpracovávat či na úrovni makra v tabulkách nebo jiných částí, • Weby, • Google Cloud Platform, který se postará o chod aplikací napojených na mobilní zařízení nebo webové stránky, Google AI, který pomáhá automatizaci, technologie budoucnosti, a mnoho dalšího. Podívejte se na naše videotutoriály a naučte se základy práce s G Suite, pokud máte dotazy napište nám. Pokud uvažujete o implementaci G Suite, oslovte nás a jsme schopni vám pomoci od začátku po úplnou implementaci G Suite do vašeho prostředí. Vyškolíme vás, jak s G Suite nejlépe pracovat.
Java Files, Path, čtení ze souboru
Vzdělávání
17.09.2020
Skillmea

Java Files, Path, čtení ze souboru

File I/O (Featuring NIO.2)Ve verzi 7 přišel nový balík java.nio, ve kterém je nově uděláno to, co bylo v java.io. Chceš vědět, jak číst soubory (java read file)? Tak musíš vědět, co je to Path a Files. Můžeš používat oba balíčky. Musíš si ale dávat pozor na to, že pokud pracuješ na projektu, kde se používá java 6 a případně níže, tak ti nepůjdou tyto nové věci. Ale uvažujme, že na takových starých projektech nepracujeme a budeme si vysvětlovat věci s použitím tohoto nového balíčku. Budeme si mluvit o základních třídách Path a Files, budeme manipulovat se soubory a složkami a tak podobně. Zde je zajímavý link porovnání funkcionality zmíněných balíků a jaké chyby měla java.io: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html#mapping PathJednoduše řečeno je to linka na soubor nebo na složku v daném operačním systému. Soubory jsou hierarchicky uloženy. Ve windowsu je na vrchu označení disku například C:\home\skuska. V linuxových systémech je root začínající lomítkem / například /home/skuska. Zde můžeme vidět, že ve windowsu a v linuxu se používají úplně jiné oddělovače. Na to je třeba pamatovat. Relativní a absolutní cestaAbsolutní cestu můžeme chápat jako úplnou celkovou adresu nebo cestu na soubor nebo složku. C:\home\skuska je absolutní cesta, která vždy obsahuje root, tedy v tomto případě označení disku C:. Pokud bych ale napsal jen home\skuska\text.txt - tak vidím, že se snažím přistoupit na soubor text.txt, který je umístěn ve složce home a skuska. Ale kde se nachází složka home? Bez dalších informací to nevím a to je relativní cesta. Třída PathZákladní třída v tomto balíčku – používá se aby uchovávala informace o názvu souboru, složkách které jsou použity ke zkonstruování cesty aby bylo možné lokalizovat dané dokumenty nebo složky. Path na windowse je bude odlišná od Path na unixu. Pokud mluvíme o třídě Path, tak můžeme v jednoduchosti říci, že můžeme manipulovat s cestou, která vede ke složkám nebo souborům. Třída FilesTato třída slouží k manipulaci se složkami a soubory. Používá třídu Path. Když přistupujeme k souborům nebo celkově ke zdrojům na disku – tak jsou „otevřené“. Potom s nimi pracujeme a když už s nimi nepracujeme tak musíme zavolat „uzavření“ práce s těmito zdroji, aby je mohl používat někdo jiný. K automatickému uzavření můžeme použít try-with-resources. Práce se souboryMáš Path instanci, která reprezentuje soubor nebo složku. Teď ale stále nevíš, jestli reálně tento soubor nebo složku existuje, jestli se dá z něj číst, zda se do něj dá zapisovat a podobně. Existuje soubor nebo neexistuje, můžu k němu přistoupit? Path path = Paths.get("C:\work\tools\Apache Software Foundation\Tomcat6\logs\service-install.log"); System.out.println(Files.exists(path)); System.out.println(Files.notExists(path)); isReadable(Path) isWritable(Path) isExecutable(Path) Jsou to stejné soubory? isSameFile(Path, Path) mazání souboru Files.delete(path); Vyhodí to výjimku proč se to nepodařilo, pokud se to nepodařilo. Metoda deleteIfExists(Path) také smaže soubor ale pokud soubor neexistuje tak se nevyhodí výjimka.   kopírování souboru Files.copy(source, target, REPLACE_EXISTING);Do metody lze dát varargs options. StandardCopyOption a LinkOption enums jsou podporovány. Všimni si, že pokud dáš ctrl a click na copy metodu, tak je tam CopyOption... options. Potom klikni ctrl na copy option a zjistíš, že je to jen interface, ale v popisu máš napsáno, že umíš použít StandartCopyOption, což implementuje CopyOption.[Image] Tady si můžeš prohlédnout implementace CopyOption rozhraní. Pokud kopíruješ soubor na místo kde se takový soubor již nachází, tak se soubor nepřepíše pokud nezadáš option REPLACE_EXISTING. Složky lze také kopírovat ale zkopírují se prázdné i když v nich byl nějaký soubor. Čtení jsou souboru (read from file)Konečně jsme přišli na kus kódu, díky kterému můžeš číst ze souboru (read from file): Path path = Paths.get("C:\\work\\tools\\Apache Software Foundation\\Tomcat6\\logs\\service-install.log"); List<String> lines = Files.readAllLines(path);
Matematické operace v Excelu
Vzdělávání
28.07.2020
Skillmea

Matematické operace v Excelu

Funkce a vzorce jsou možná nejvyužívanější částí Excelu a v tomto blogovém příspěvku se podíváme na nejdůležitější matematické operace. Pomocí matematických operací umíme vypočítat například průměr, maximální či minimální hodnoty, součty. Funkce SUM (Součet)Je to pravděpodobně nejpoužívanější matematická funkce, která jednoduše spočítá hodnoty ve vybraných buňkách, viz obrázek níže. Funkci SUM můžeme použít i pro sčítání normálních čísel. =SUM(9;2;8)funkcia nám dá výsledok 19.[Image] Funkce SUMIF (Součet na základě podmínky)Zajímavou součtovou matematickou funkcí je SUMIF, která spočítá hodnoty s nějakou podmínkou. Například z tabulky níže chceme spočítat „Cenu po slevě“ spolu za všechny objednávky z města Martin. V argumentech funkce SUMIF nás samotný Excel navádí na to, co máme zadat. Boldem jsou zvýrazněny argumenty Kritéria a Rozsah, které spolu souvisí. Kritériem je to, co je naší podmínkou - tedy konkrétně Martin. Rozsah jsou ty buňky, ve kterých umíte najít svá kritéria. Čili označíme sloupec Město. Rozsah souhrnu je to, co chci spočítat - označíme tedy sloupec 'Cena po slevě'. Klepneme OK a dostaneme výsledný součet.[Image] Funkce ROUND (Zaokrouhlování)Funkce Round zaokrouhluje matematicky. Argumenty funkce je číslo, které chceme zaokrouhlit a druhý argument je na kolik desetinných míst chceme dané číslo zaokrouhlit.[Image] Funkce SUBTOTAL (Součtová řádka)Tato funkce se využívá při tvorbě součtových řádků v tabulkách. Jedná se o praktickou funkci, která dokáže nahradit několik dalších funkcí. SUM, COUNT, MIN, MAX a podobně. Její velkou výhodou je, že pokud použijete např. filtr, umožní ti rozhodnout se, co se skrytými řádky. Prohlédněte si obrázky níže, v prvním nemáme použito žádné filtrování a výsledky funkcí SUM i SUBTOTAL jsou shodné. Když se však podíváme na obrázek číslo dvě, ve kterém jsou již použita filtrování, výsledky funkcí SUM a SUBTOTAL jsou rozdílné a správný výsledek nám dává právě funkce SUBTOTAL. Je to právě kvůli tomu, že spočítává jen viditelné hodnoty v buňkách, nikoli hodnoty v buňkách, které jsou skryty.[Image][Image] Funkci subotal si vyvoláme jako každou jinou funkci a její argumenty jsou následující: • Číslo funkce: pokud neznáte přesné číslo funkce, je vhodné si otevřít pomocníka a vyhledat si tu správnou funkci. V našem případě je to číslo funkce 109, protože se jedná o funkci SUM a ignorujeme skryté hodnoty. • Odk1: rozsah, se kterým má naše funkce pracovat, tedy označíme všechny buňky, které má funkce spočítat nebo provést jinou matematickou operaci. Čísla funkcí pro funkci SUBTOTAL: Číslo funkce (zahrnuje skryté hodnoty)Číslo funkce (ignoruje skryté hodnoty)Funkce1101AVERAGE 2102COUNT3103COUNTA4104MAX5105MIN6106PRODUCT7107STDEV8108STDEVP9109SUM10110VAR11111VARP  Average (Průměr)Matematická funkPrůměrce Average (Průměr) vypočítá průměrnou hodnotu z rozsahu buněk. Vyvoláme si funkci a do syntaxe označíme všechny hodnoty, ze kterých chceme vypočítat průměr.[Image] I tuto funkci můžeme modifikovat pomocí IF a tedy použít funkci s podmínkou AVERAGEIF. OdmocninaV Excelu umíte velmi rychle a jednoduše odmocňovat. Existuje k tomu matematická funkce SQRT, která má jen jeden argument a tedy číslo, ze kterého chceme druhou odmocninu vypočítat. Funkci SQRT lze použít pouze pro druhou odmocninu. Chcete-li vypočítat jinou, je třeba použít matematický vzorec Y(1/x) případně funkci POWER(). Pokud se chceš zdokonalit v Excelu, podívejte se na některý z našich Excel online kurzov pro začátečníky alebo pokročilé. Pokud se chceš naučit používat Excel ještě efektivněji, přečti si i náš článek o klávesových zkratkách v Excelu. V dalším blogovém příspěvku se podíváme na dalí zajímavosti z Excelu, zaměříme se na vyhledávací funkce VLOOKUP a HLOOKUP.
Již 4 000 dětí se zúčastnilo webinářů STEM Kindloteka
Vzdělávání
30.06.2020
Skillmea

Již 4 000 dětí se zúčastnilo webinářů STEM Kindloteka

Společnost Amazon začala ve spolupráci se sdružením Learn2Code v dubnu, během pandemie a povinné karantény, bezplatné online webináře STEM Kindloteka pro děti. Tato iniciativa probíhala současně v Česku i na Slovensku. Amazon chtěl touto iniciativou pomoci dětem, jejich rodičům a učitelům v náročném období, během kterého byly školy zavřené. Od konce dubna až do konce června sdružení Learn2Code s podporou společnosti Amazon připravilo 39 bezplatných webinářů, kterých se v obou zemích zúčastnilo 4 000 dětí v přímém přenosu. Dodatečně měli webináře na kanálu YouTube téměř 6 500 vidění. Odezva od rodičů i dětí byla velmi pozitivní. „Syn je nadšený, Scratch-u se věnuje každý den a vaše webináře jsou super. Nestíhá je sice dívat živě ale druhý den je dívá na youtube a moc ho to baví!“ Říká paní Lenka, máma 9 letého účastníka. Vyjádření syna bylo velmi stručné ale výstižné: "Je to zábava a chci se přihlásit i na další kurz." Webináře probíhaly dvakrát týdně až do konce června. Během webinářů se děti učily programovat v programovacím jazyce Scratch i velké hry. Flappy Bird, Pacman, Super Mario a další. Děti se na nich učily vše od začátku až po složitější příkazy. Po každém webináři obdrželi účastníci jeho videozáznam, zdrojové kódy, obrázky i řešení. Naše webináře sledovali i učitelé, pro které se staly pomůckou. „Já jsem byla velmi spokojená s webináři, hodně jsem se naučila a účastí na nich jsem získala nové dovednosti a cenné metodické materiály,“ hodnotí webináře Mária Vitikáčová, učitelka ze ZŠ Bukovecká v Košicích. „Super je archiv a videonahrávky, ke kterým se můžeme kdykoli vrátit,“ dodává. Účastníci měli možnost připojit se přes nástroj Zoom, v případě, že se chtěli aktivně zapojovat, nebo přes YouTube, pokud chtěli webinář jen online sledovat. Všechny webináře si mohou i nadále prohlédnout na YouTube kanálu Learn2Code. „Spolu bylo zrealizováno téměř 40 webinářů, které si děti hned oblíbily. Aktivně se do našich online setkání zapojovali. Kladli spoustu zvědavých otázek,“ řekl Marián Kristeľ marketing & operations z Learn2Code. „Každé lekce se zúčastnilo průměrně přes 100 dětí.” Spolupráce mezi Learn2Code a společností Amazon zahrnovala také poskytnutí všech online kurzů pro děti od Learn2Code od poloviny dubna do konce června bezplatně. I tato aktivita zaznamenala velký úspěch. Na tyto kurzy se od spuštění spolupráce přihlásilo více než 2000 uživatelů. Jelikož spolupráce mezi Learn2Code a Amazonem zaznamenala úspěch, připravili společně i další formát, tentokrát pro rodiče a učitele. V speciálním videu s Lucií Šickovou, spoluzakladatelkou světově úspěšné slovenské firmy Pixel Federation, která tvoří počítačové hry vysvětlili, jaký význam může mít programování ve výchově a rozvoji dětí. Lucie Šicková je zároveň mámou tří malých dětí. Zabývali se tedy i tématy, jakou školu a proč navštěvují její děti, zda a kolik se s dětmi učí a jak se to změnilo během domácí karantény, zda ověřené tipy, co ve výchově funguje. „Jelikož koronakrize odhalila různé nečekané otázky ohledně vzdělávání a výchovy dětí, rozhodli jsme se podpořit i takový formát pro rodiče a učitele. Věříme, že to bude pro rodiče užitečné,“ řekla Miroslava Jozová, PR manažerka Amazon pro ČR a Slovensko.
Studijní plán pro budoucího Java programátora
Vzdělávání
19.06.2020
Skillmea

Studijní plán pro budoucího Java programátora

Rozhodl ses, že se staneš Java programátorem. Dobrá volba. V následujících řádcích si přečti, kde začít, co budeš potřebovat a jak dosáhnout své vysněné mety. V tomto článku se nebudeme věnovat definici programování ani tomu, který programovací jazyk si zvolit. Budeme předpokládat, že ses z jistých důvodů rozhodl právě pro Javu. Těmi důvody může být například: • popularita Javy v programátorském světě • poptávka po Java programátorech na trhu práce • chceš naprogramovat Javovskou webovou nebo desktopovou aplikaci slyšel jsi, že Java je vhodná pro začátečníky v programování Popularita jazyka JavaPodle indexu PYPL je Java druhým nejpopulárnějším jazykem na světě. Žebříček PYPL je sestavován podle toho, jak často jsou tutoriály daného programovacího jazyka vyhledávány na Googlu. I podle jiného indexu, TIOBE je Java druhá v žebříčku popularity, takže vybral sis správně.[Image] Poptávka po Java programátorechPoptávku po Java programátorech zjistíš z pracovních portálů, například. na Profesia.cz, robime.it nebo dalších. V době psaní tohoto článku bylo na Profesi více než 120 nabídek při zadání pozice "Java programátor" (z celkových 480 programátorských pozic). Když si tedy vybíráš programovací jazyk, je důležité, aby i firmy v něm dělaly své projekty, abys měl z dlouhodobého hlediska dostatek příležitostí. Java tuto podmínku bez problémů splňuje. Co chceš programovat?V Javě lze programovat desktopové i serverové aplikace, vytvářet dynamické webové stránky, lze je používat pro přístup k datům, umožňuje realizovat složité distribuované výpočty a mnoho dalšího. Jevu využiješ i při programování Android aplikací, takže její využití je téměř neomezené. Jazyk vhodný pro začátečníky?Java je tady s námi už pěkně dlouho, takže existuje mnoho zdrojů ke studiu, ať už ve formě online kurzů, knih nebo jiných možností. Java programátorů je také dostatek, takže pravděpodobně nebudeš mít problém sehnat někoho na mentoring, rozhodnete-li se jít touto cestou. Java odvozuje svou syntaxi z jazyka C a mnoho dalších jazyků také odvozuje svou syntaxi z jazyka C. Takže když se naučíš Javu, ovládnout jazyky jako C#, C++ nebo JavaScript bude jednodušší. Java je objektově orientovaný jazyk, tyto základní koncepty tedy umíš přenést i do jiných jazyků. V Javě existuje spousta různých knihoven - grafika, sockety, a mnoho dalšího. Naučit se Javu je relativně jednoduché, umíš ji využívat ve světě desktopových nebo webových Java aplikací, ale také ve světě mobilních Android aplikací. Jevovský kód jednou zkompiluješ a běží všude (díky JVM!). Java má i své nevýhody, jako například. to, že píšeš velmi mnoho kódu. Příklad, když chceš něco vypsat, v Javě to zapíšeš: System.out.println(“Hello”); V Pythonu by stačilo napsat jen print(“Hello”). PeniazeKolik vydělávají Java programátoři? Podle portálu platy.sk je to v rozmezí 1350 až 2765 Eur. Záleží na tvých znalostí, let praxe, projektů za sebou, regionu a dalších proměnných. Studijní Java plánJava základyNejprve se nauč úplné základy jazyka Java. Potřebuješ vědět, co je to třída, co je to metoda, co je proměnná, jak se píší příkazy, co je terminál, výpis, podmínka, cyklus, jak pracuje Java s pamětí a jiné základní znalosti. S těmito základy umíš psát jednoduché příkazy a trénovat. Doporučujeme ti vyzkoušet náš online kurz Java pro začátečníky, který máš k dispozici zdarma. Java pokročilýPo zvládnutí základů přistoupíš k pokročilým částem jazyka jako jsou výjimky, OOP (objektově orientované programování), práce s Java třídami, rozhraní, rekurze, funkcionální programování pomocí Lambda výrazů, stream API, anotace, reflexe, kolekce, generické programování a podobně. Je toho dost, pro úspěšné zvládnutí zákoutí Javy si namixuj tento koktejl našich kurzů: 1. Java a OOP pro začátečníky 2. Java pro pokročilé SQLVelké množství aplikací pracuje se databázemi. Abys i ty v aplikacích uměl správně používat databázi, musíš se naučit základy jazyka SQL. Pomocí SQL příkazů umíme z databáze číst data, zapisovat data, měnit data, nebo je mazat. Když budeš studovat jak pracovat v aplikacích s databázemi, setkáš se s pojmem CRUD. To není nic jiného než create, read, update a delete. Tedy základní operace. Yablko udělal online kurz na SQL databázy MySQL a SQLite, jsou v něm vysvětlovány i základy samotného SQL-ka, tak si to nastuduj. GitPři práci na projektech musíš mít přehled o změnách ve tvém nebo kolegovém kódu. V průběhu času budeš mít určitě spoustu verzí svého programu. Jako programátor budeš pracovat v týmu. Každý bude pracovat na své části programu a poté si tyto své verze sloučíte dohromady. Nejen pro tyto úkoly budeš používat Git. Git je nejrozšířenější verzionovací nástroj a určitě stojí za to naučit se jej používat. Každý programátor musí umět pracovat s Gitem, nauč se to i ty pomocí tohto online kurzu. Java junior programátorNa závěr tvého vzdělávání v Javě nesmíš vynechat témata jako Maven, Servlety a ORM - JPA (Hibernate). Když se ti do hlavy dostanou i tyto pojmy, je z tebe junior programátor. Online kurz pro aspirující Java junior programátory najdeš zde. Bonus: Spring framework + Spring BootAby se ti se vším pracovalo snadněji a chceš přeskočit pár kroků v přípravě aplikace, chceš mít po ruce spoustu pomocných technologií, tak určitě sáhneš po Spring frameworku. Spring je nejpoužívanější javovský vývojářský framework současnosti. Pokud si otevřeš pracovní nabídky zaměřené na Javu, tak tam téměř určitě najdeš požadavek, abys ovládal Spring. Spring usnadňuje enterprise java vývoj, což jej činí první volbou u projektů libovolné velikosti. Vývoj Springu začal, když bylo velmi komplikované začít vyvíjet enterprise aplikace v enterprise edici jevy. Tvůrci Springu toto využili a vytvořili nástroj, který je vysoce používaný a usnadňuje spoustu věcí. Tento blog měl za cíl představit ti jazyk Java a ukázat, co všechno potřebuješ jako příští Java programátor vědět. Kromě Javy je to SQL, Git a ideální také Spring framework. Stát se Java programátorem se ti může jevit jako nedosažitelná meta, opak je ale pravdou. Java od začátku navrhovaná tak, aby tvá křivka učení byla pokud možno co nejstrmější.
Eratostenovo síto
Vzdělávání
30.05.2020
Skillmea

Eratostenovo síto

V předchozím blogujsme se zabývali prvočísly. Ukázali jsme si ukázku programu, který rozeznal, zda zadané číslo je prvočíslem nebo ne. Dnes bych vám chtěl na konkrétním příkladu ukázat, jak řeší podtitulek tohoto blogu a tedy zjistit prvočísla na definovaném intervalu přirozených čísel, přičemž horní hranici intervalu bude zadávat uživatel. Spodní hranicí intervalu bude 0, která samozřejmě není prvočíslem a to z toho důvodu, že prvočíslo je dělitelné číslem 1 a sebou samým. Z toho vyplývá, že 0, i když je dělitelná číslem 1, není dělitelná 0, protože výraz 0/0 není definován. Přestože by si někdo myslel, že výsledek by mohl být roven číslu 1, není tomu tak. Nula prostě nemůže dělit žádný výraz. Pojďme teď trochu dál. Už v minulém blogu jsem vyvodil závěr, že ani 1 není prvočíslo a to proto, že je dělitelné 1 a sebou samým, což je opět číslo 1. A 1 a 1, nejsou dva různé faktory. Podmínka, která vylučuje, že 0 a 1 nejsou prvočísla, je samozřejmě v mém programu ošetřena. Co ale ostatní čísla, která se nacházejí na intervalu, jehož horní hranici zadal uživatel. Na tuto otázku nám přímo dá odpověď jednoduchý algoritmus, který nese název Eratostenovo síto. Eratostenes z Kyrény byl mimo jiné řeckým matematikem, který působil v dávné Alexandrii přibližně 280 let. před Kristem. Kromě toho, že vypočítal obvod země, definoval také algoritmus, který jsem pro vás implementoval ve vyšším programovacím jazyce C++. Předtím, než si detailně rozebereme program napsaný v jazyce C++, si algoritmus ukážeme na následujících přirozených číslech: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19. Máme tedy posloupnost, která je na začátku definována číslem 0 včetně a na konci číslem 20, které se nachází již mimo intervalu posloupnosti. A to je právě ta horní hranice, která byla výše zmíněna. Umístíme tuto posloupnost do jednořádkové tabulky, která v mém programu bude reprezentována vektorem celých čísel (vektor typu int). Jako poznámku chci dodat, že budeme tedy používat třídu knihovny STL, kterou je vektor. Vektor je entita, z níž se lépe manipuluje než s polem. Právě proto je tento článek určen těm čtenářům, kterým je alespoň poněkud známá problematika vektorů. Těm, kteří nejsou obeznámeni s problematikou vektorů, doporučuji nejprve prostudovat typ size_t, třídu vector a členskou metodu třídy vector push_back(). Potom se s elánem mohou tito čtenáři pustit do tohoto blogu. Ale zpět k našemu definovanému problému. Mějme tedy zmiňovanou posloupnost:[Image] V této tabulce vyznačme modrou barvou skutečnost, že 0 a 1 nejsou prvočísla:[Image]K indexům, na kterých se nacházejí čísla 0 a 1 se už tedy nebudeme vracet. Pojďme se podívat na číslo 2. O tomto čísle víme, že je nejmenší prvočíslo na tomto intervalu, což je prvotní podmínkou k tomu, abychom vyřešili podtitulek tohoto blogu. Ostatní prvky (čísla) posloupnosti budeme testovat Eratostenovým sítem – to znamená, že budeme nyní odstraňovat násobky čísla 2. Jelikož číslo 3 není násobkem čísla 2, projde Eratostenovým sítem. Zaznačme tedy do tabulky násobky čísla 2 červenou barvou.[Image]Vidíme, že v jednom kroku odstranil algoritmus (Eratostenovo síto) čísla 4, 6, 8, 10, 12, 14, 16 a 18. Zároveň se již nebudeme žádným způsobem vracet k indexu čísla 2. S předchozí tabulky je také očividné, že číslo 3 je prvočíslem. Pojďme nyní odstranit z tabulky jeho násobky a zaznačme tuto skutečnost zelenou barvou.[Image] V dalším kroku nám algoritmus odstranil číslo 6, 9, 12, 15, 18, které prvočísly nejsou. Ano, zelenou barvou jsme označili i některá čísla, která byla v předchozím kroku odstraněna násobkem čísla 2. To však nemění nic na skutečnosti, že tento krok nám odstranil z posloupnosti další čísla, kterými jsou čísla: 9 a 15. Po provedení zmiňovaného kroku vidíme , že číslo 5 zůstalo vyznačeno žlutou barvou. Číslo 5 je tedy prvočíslo, protože prošlo Eratostenovým sítem. Když bychom v následujícím kroku odstranili násobky čísla 5. zjistíme, že již byla čísla 10 a 15 odstraněna násobkem jiného čísla. Kdy tedy algoritmus skončí? Bude to tehdy, dokud se skutečně nedostaneme k číslu 19. Číslo 19 už nemá za úkol odstraňovat žádný násobek, protože se za ním v naší tabulce nic nenachází. Dosažení jeho indexu určitou interační proměnnou je podmínkou pro skončení algoritmu, ačkoli se již ve stavu prvočísel nebo odstraněných čísel nic nemění. Vyberme nyní všechna čísla označená žlutou barvou z naší tabulky:[Image] Zůstanou nám čísla, která jsou zajisté prvočísly. A tak jsme se dostali k výsledku našeho algoritmu, kterými jsou čísla 2, 3, 5, 7, 11, 13, 17 a 19. Pro kontrolu si můžete porovnat tato čísla s prvočísly uvedenými v jiných zdrojích, ale určitě dostanete tentýž výsledek. Pojďme nyní do detailu rozebrat následující zdrojový kód napsaný v jazyce C++, který je implementací verbálního vysvětlení algoritmu uvedeného výše. Jazyk C++ nám nabízí další možnosti, jak zefektivnit výpočet. Jsou to například. skoky v programu, které můžeme provést pomocí klíčových slov break a continue. Ale k tomu později. Pojďme pěkně popořadě od prvního řádku. Na řádku 1 máme direktivou preprocesoru přidaný hlavičkový soubor iostream.h. To znamená, že do tohoto řádku se vloží obsah souboru iostream.h. Podobně máme na řádku 2 a 3 vloženy stejnou direktivou hlavičkové soubory vector.h a string.h. Na řádku 4 je deklarováno, že budeme v celém zdrojovém kódu, který tvoří jeden soubor používat jmenný prostor std a tudíž jej nemusíme explicitně ve funkci main volat, když budeme z něj potřebovat nějakou třídu nebo objekt. Příkladem mohou být objekt cin nebo cout. Na řádku 6 definujeme funkci main a následně na řádku 7 začíná její tělo. Na řádku 8 deklarujeme proměnnou integrálního typu a to konkrétně char s identifikátorem proměnné c_end. Tato proměnná reprezentuje jeden znak, který rozhodne o tom, zda se vnější smyčka po provedení vlastního algoritmu Eratostenova síta ukončí nebo ne. Právě proto je na řádku 89 vyzván uživatel, aby stiskl klávesu a nebo n. Pokud potlačí n, program pokračuje dalším cyklem while smyčky. Pokud potlačí jinou klávesu program skončí. Na řádku 9 je definována nová instance třídy string s identifikátorem sz, která je inicializována na prázdnou hodnotu. Za touto inicializací je na řádku 10 uvedena deklarace proměnné iSZ na typ int bez další inicializace. Na řádku 11 deklarujeme proměnnou typu bool, která bude v programu uchovávat informaci, zda uživatel na výzvu programu odpověděl zadáním validní hodnoty (tedy hodnoty integer), která se bude uchovávat v proměnné iSZ. Pokud uživatel zadá platnou vstupní informaci z okna konzolové aplikace, proměnná is_size_t se nastaví na true, v opačném případě (pokud tedy uživatel nezadá platnou hodnotu z rozsahu integer) proměnná is_size_t se nastaví na hodnotu false. Proměnná is_size_t je na řádku prvotně inicializována na hodnotu false. To reprezentuje stav, že proměnná iSZ nebyla ještě inicializována a to je ve skutečnosti pravda. Na řádku 13 je uvedeno klíčové slovo do. To znamená, že začíná tělo smyčky do while, ve které je jako podmínka uvedena komparace obsahu proměnné c_end se znakem n (viz. řádek 95). Když program přejde dál, dostane se na řádek 14, které otevírá tělo zmíněné smyčky do while, za kterou na řádku 15 začíná smyčka while, což znamená smyčka s podmínkou na začátku každého cyklu. Právě zde se program ptá (srovnává), zda je v proměnné uložena hodnota false. Pokud ano, program pokračuje kladnou větví a vyzve na řádku 17, aby uživatel zadal horní hranici Eratostenova síta. Tato hodnota nebude brána v úvahu při testování čísla na prvočíslo. Na řádku 18 se vstup zadaný uživatelem načte do proměnné (objektu) sz, která je novou instancí třídy string. Načtení proběhne pomocí metody getline(), která má dva parametry a to objekt cin a objekt sz. Na řádku 20 následuje blog kódu try a catch, které slouží k rozpoznání validity hodnoty zadané uživatelem do objektu sz. Ve větvi try se program pokouší konvertovat hodnotu v objektu sz na hodnotu celého čísla, které reprezentuje délku intervalu, na kterém hledáme Eratostenovým sítem všechna prvočísla. Pro tuto konverzi se použije funkce stoi, což ve zkratce znamená string to integer (v českém jazyce string na integer). Po konverzi se na řádku 24 ještě testuje, zda uživatel nezadal na vstupu číslo 0. Pokud ano program nastaví proměnnou is_size_t na hodnotu false a skočí pomocí příkazu continue na opětovně vyhodnocené podmínky dalšího cyklu smyčky while. Jelikož v proměnné is_size_t je opět false program pokračuje ve smyčce while, kdy na řádku 17 je uživatel znovu vyzván k zadání horní hranice intervalu Eratostenova síta. Takto může být program zacyklen, dokud uživatel nezadá platnou hodnotu na vstupu konzolové aplikace. Pojďme se podívat nyní na to, když uživatel nezadá hodnotu z rozsahu integrálního typu (např. neplatnou hodnotu „hsfu“). Již asi tušíte, že se nejedná o hodnotu integrálního typu, ale o nesmyslné znaky, které sice může uživatel zadat, protože tyto hodnoty lze přiřadit typu string, ale konverze této hodnoty na hodnotu typu integer se nezdaří. Právě proto je v našem programu umístěn na řádku 34 blok catch, kteří tuto výjimku zachytí. A co se vlastně stane dál? No totéž, co v případě zadání 0, to znamená, že se nastaví hodnota false do proměnné is_size_t a program skočí pomocí příkazu continue na začátek smyčky while, kde sa znovu v podmínce vyhodnotí, zda má pokračovat výzvou uživatele k zadání validní hodnoty horní hranice Eratostenova síta, a jelikož je negace hodnoty v proměnné is_size_t true, program i tak učiní. A takto bude program dokola vyzývat uživatele k zadání platné hodnoty. V případě, že uživatel zadá platnou hodnotu, program skočí do větve try, kde pak skočí do záporné větve příkazu if (klauzule else na řádku 29), kde se již hodnota is_size_t nastaví na true. Tím pádem program v tomto cyklu vyskočí ze smyčky while, protože již nesplňuje podmínku pro další provedení cyklu. Když uživatel zadal platnou horní hranici Eratostenova síta, může se tato informace použít k alokaci vektoru o délce iSZ (alokace vektoru s identifikátorem vNumberVektor), což je implementováno na řádku 41. Na řádku 42 je alokován vektor o délce 0 (vektor s identifikátorem) . Do tohoto vektoru budeme ukládat prvočísla, která projdou Eratostenovým sítem. Délku 0 má vektor proto, že je možné do něj přidávat prvočíslo po prvočísle, až když část algoritmu učiní rozhodnutí, zda číslo, které se vybírá z vektoru vNumberVektor je prvočíslem nebo ne. Na řádku 44 začíná for smyčka, která je ve svých jednotlivých cyklech řízena iterační proměnnou i, která se v každém cyklu inkrementuje, dokud nedosáhne hodnoty iSZ. Tato for smyčka ve svém těle naplňuje vektor vNumberVektor čísly od 0 po 19 (protože horní hranice, kterou jsme vymezili v ukázce je 20). Vlastní algoritmus Eratostenova síta začíná na řádku 49, kde je iterační proměnná na začátku cyklu inicializována na hodnotu 2. Proč je tomu tak? Protože na prvních dvou indexech vektoru (index 0 a 1) jsou uložena čísla 0 a 1 a ta nepatří do množiny prvočísel. Toto je základní idioma, kterou je třeba si uvědomit. Kdybychom totiž dělili nulou, program by vyhlásil chybu. Kdybychom dělili jedničkou, nedostali bychom nic jiného než původní číslo. Právě proto se testují pouze čísla od hodnoty 3. Proč od 3, když iterujeme od 2? Jedná se o prvotní podmínku, kterou jsem zmiňoval. Pokud tedy číslo na indexu 2 se bude rovnat 2, přidáme toto číslo do vektoru vPrimeVektor, protože o něm víme, že je nejmenší prvočíslo. Ostatní čísla už budeme testovat, to znamená, že pokud bude index větší nebo roven 3, program testuje konkrétní číslo tak, že dělí toto číslo čísly uloženými ve vektoru vPrimeVektor (což jsou prvočísla) se zbytkem. To znamená, že bere v úvahu zbytek po dělení čísla prvočíslem. Pokud je tento zbytek po dělení různý od nuly, našli jsme další prvočíslo a to uložíme za vnitřním cyklem řízeným iterační proměnnou j (k tomu nám poslouží proměnná typu bool, do které při nalezení prvočísla uložíme hodnotu true, která indikuje tento stav), do vektoru vPrimeVektor, který reprezentuje hledaná prvočísla. Uložíme jej na poslední index pomocí metody push_back, což nám zároveň zaručuje uspořádání hledaných prvočísel od nejmenšího po největší. Pokud by byl zbytek po dělení roven nule, testované číslo není prvočíslem a to znamená, že nastavíme proměnnou flag na false, skočíme pomocí klíčového slova break na konec for smyčky (iterační proměnná j). Do vektoru vPrimeVektor se v tomto případě nic neuloží, protože v proměnné flag je uložena hodnota false. vnější smyčka for se ukončí, když jsou otestována všechna čísla uložená ve vektoru vNumberVektor. Posledním testovaným číslem je tedy číslo 19. Po otestování všech čísel následuje zápis prvočísel do okna konzolové aplikace (viz. řádek 78 až 83), k čemuž využijeme objekt cout a smyčku for. K zápisu samozřejmě patří také přechod kurzoru na nový řádek na řádku 85. Potom se do okna konzolové aplikace zapíše výzva, kterou se program uživatele ptá, zda chce program ukončit nebo ne. Pokud uživatel stiskne klávesu n, program pokračuje a uživatel je vyzván k opětovnému zadání horní hranice Eratostenova síta s tím, že do proměnné is_size_t se opět uloží hodnota false. Pokud by uživatel potlačil jinou klávesu (což znamená ukončení programu), program skočí za vnější smyčku while na řádek 97, funkce main vrátí operačnímu systému 0 a celý program končí. Připomínám, že na řádku 98 je pravá programová závorka, která uzavírá tělo funkce main. Výpis programu main.cpp 1: #include <iostream> 2: #include <vector> 3: #include <string> 4: using namespace std; 5: 6: int main() 7: { 8: char c_end; 9: string sz = ""; 10: int iSZ; 11: bool is_size_t = false; 12: 13: do 14: { 15: while (!is_size_t) 16: { 17: cout << "Nacitaj hornu hranicu Eratostenovho sita: "; 18: getline(cin, sz); 19: 20: try 21: { 22: iSZ = stoi(sz); 23: 24: if (iSZ == 0) 25: { 26: is_size_t = false; 27: continue; 28: } 29: else 30: { 31: is_size_t = true; 32: } 33: } 34: catch (const std::exception&) 35: { 36: is_size_t = false; 37: continue; 38: } 39: } 40: 41: vector<int> vNumberVector(iSZ); 42: vector<int> vPrimeVector(0); 43: 44: for (int i = 0; i < (int)vNumberVector.size(); i++) 45: { 46: vNumberVector.at(i) = i; 47: } 48: 49: for (int i = 2; i < (int)vNumberVector.size(); i++) 50: { 51: if (i == 2) 52: { 53: vPrimeVector.push_back(vNumberVector.at(i)); 54: } 55: else 56: { 57: bool flag = false; 58: for (int j = 0; j < (int)vPrimeVector.size(); j++) 59: { 60: if (vNumberVector.at(i) % vPrimeVector.at(j) != 0) 61: { 62: flag = true; 63: } 64: else 65: { 66: flag = false; 67: break; 68: } 69: } 70: 71: if (flag) 72: { 73: vPrimeVector.push_back(vNumberVector.at(i)); 74: } 75: } 76: } 77: 78: cout << "Vypis prvocisel:" << endl; 79: cout << "----------------" << endl; 80: for (int i = 0; i < (int)vPrimeVector.size(); i++) 81: { 82: cout << vPrimeVector.at(i) << " "; 83: } 84: 85: cout << endl; 86: 87: cout << "Chces skoncit [a/n]: "; 88: 89: cin >> c_end; 90: cout << endl << endl; 91: 92: cin.ignore(); 93: is_size_t = false; 94: 95: } while (c_end == 'n'); 96: 97: return 0; 98: }Okno konzolové aplikace u horní hranice Eratostenova síta 20[Image]Na obrázku lze vidět, že výsledná prvočísla se ztotožňují s prvočísly, které jsme vypočítali analytickým způsobem (viz. poslední tabulka v textu). Doufám, že vás příklad a program s Eratostenovým sítem zaujal, stačí už jen, abyste si to implementovali na svém počítači. Tento blog napsal lektor C++ kurzů Marek ŠURKA. Pokud máš nějaké dotazy, napiš je do komentářů.
Jak se tvoří JavaScript
Vzdělávání
02.05.2020
Lubo Herkoo

Jak se tvoří JavaScript

Letos nám frajeři z TC-39 (nevíš-li co TC-39 je, čti dále) naservírují novou verzi ECMAScript specifikace - novinky, které můžeme jako vývojáři používat při programování v JavaScriptu. BigInt, optional chaining, Promise.allSettled, String.matchAll, globalThis a další. O tom, jaké problémy řeší tyto nové funkcionality, si povíme v dalším blogu. Tento text je věnován specifikaci ECMAScript a mimo jiné se dočteš: • proč potřebujeme specifikaci na to, jak implementovat JavaScript Engine v prohlížeči • proč se specifikace nevolá JavaScript, ale ECMAScript a co je to vlastně ta ECMA • jak dlouho trvá, než se nápad nové funkcionality jazyka JavaScript stane jeho součástí ECMAScript?V roce 1995 vyhrál oscar Tom Hanks s filmem Forrest Gump, v rádiích fičel Gansta's Paradise od Coolia a web BBC vypadal takto:[Image] 80% uživatelů internetu surfovalo v prohlížeči Netscape Navigator a Microsoft teprve končil vývoj Internet Exploreru. Pokud ho vůbec někdy dokončili. Ne všichni byli spokojeni s tím, jak web tehdy fungoval: statický obsah, sdílení dokumentů a žádný pohyb. Softwarový inženýr z Netscape - Mark Andreessen - chtěl vytvořit jazyk, který by s lehkostí používali nejen vývojáři, ale také designéři a do webů přinesli špetku interaktivity. Buttony a tak. Brendan Eich (jméno je třeba si zapamatovat - je to frajer) je člověk, který tento programovací jazyk začal tvořit. Prvním pokusem byla implementace jazyka SCHEME do prohlížeče Netscape. Mimochodem - jevisté v SUN Microsystems přemýšleli nad způsobem, jak spouštět Java kód v prohlížeči, čímž také přinesli interaktivitu do webových stránek. Tato implementace však nebyla jednoduchá na používání, a proto zůstala volbou korporátních mastičů. Mocha (takto se jmenovala první verze dnešního JavaScriptu) byla vytvořena jako alternativa pro designéry a vývojáře. Mocha » LiveScript » JavaScript vs JScriptVytvoření první verze Mocha trvalo jen 10 dní. Později byl tento jazyk přejmenován na LiveScript a poté na finální JavaScript. Fun fact: slovo „Java“ se tam nedostalo náhodou – byl to však jen marketingový způsob, jak se svést na popularitě jazyka Java. Internet Explorer chtěl také držet krok s dobou, a proto začali iv MS pracovat na implementaci čehosi, což bylo velmi podobné JavaScriptu. Finální jazyk se jmenoval JScript. Implementace však byla natolik odlišná od JavaScriptu, že tyto implementace nebyly navzájem kompatibilní! Výsledkem byla skutečnost, že nebylo možné vytvořit jeden web, který by fungoval v obou prohlížečích. Tak vznikly tehdy slavné nálepky do footerů: „Best viewed in Internet Explorer“ a „Best viewed in Netscape Navigator“.[Image]Tvořit weby v té době nebyla žádná legrace, vývojáři volali po standardu, který sjednotí implementace JavaScriptu a JScriptu. Proto byl vytvořen standard ECMAScript, který zastřešila organizace ECMA International. Ta fungovala už dávno předtím a jejím úkolem bylo právě vytvářet standardy pro informační a komunikační systémy. Od listopadu 1996 existuje tedy standard ECMAScript, který popisuje, jak má být implementován JavaScript Engine. Fun fact: standard nemůže nést ikonický název JavaScript, neboť na toto slovo až do dnešního dne vlastní copyright firma Oracle. ECMA-262 a TC-39 - whaaat?ECMA International zastřešuje mnoho standardů, ten, který se týká implementace JavaScriptu obdržel číslo 262. ECMA-262 je tedy název standardu, který popisuje implementaci JavaScriptu. Není to žádné příjemné čtení, aha. Komise (rozuměj: živé bytosti, lidé), která rozhoduje o tom, jaké nové funkce bude nová verze JavaScriptu obsahovat, dostala zase název TC-39. Členem této komise není leckdo. Jsou to frajeři – vybraní lidé, kteří zastupují velké firmy působící na online trhu (Facebook, PayPal, Google, Amazon, Mozilla...)[Image] Nová funkcionalita v JS - schvalovací procesČlenové TC-39 organizují meetingy (většinou online) každé dva měsíce. Cílem těchto meetingů je dopodrobna rozkecat a zanalyzovat, které funkce bude obsahovat nová verze ECMAScript, nebo jaké opravy budou v této verzi provedeny. Zajímavé je, že tato komise funguje na principu shody – téměř všichni členové komise musí souhlasit s návrhem, aby se jím byť jen začali zabývat. Zcela zajímavé je například sledovat, jak se dostala do JavaScriptu podpora pro BigInt – brutálně velká čísla. Protože v JavaScriptu jsme dosud mohli používat jen strašně velká čísla. Stage 0Každý návrh začíná na takzvané nulté úrovni – Stage 0. Některý z členů TC-39 vytvoří dokument, který popisuje danou funkcionalitu a jaký problém řeší. Na meetingu členů TC-39 tento problém přednese a členové rozhodli, že např. BigInt je super věc a posunul ho do dalšího Stage-u. Stage 1Stage 1 je parádní úspěch a zároveň to znamená, že někdy v budoucnu bude pravděpodobně dána funkcionalita součástí JavaScriptu. Všem (nebo téměř všem) členům TC-39 se tento nápad líbí a souhlasí s ním. Může to však trvat roky. BigInt funkcionalita musí být ještě podrobněji popsána, musí obsahovat příklady, jak se bude používat a analýzu, zda to nepřinese i nějaké problémy. Stage 2Takzvaný Draft. V této fázi je víceméně jisté, že funkcionalita bude součástí JavaScriptu a proto musí být ještě podrobněji popsána. Toto je také stage, kdy se přemýšlí nad vhodnou syntaxí a různými detaily používání nové funkcionality. V případě BigInt funkcionality např. členové rozhodli, že bude vhodné, pokud BigInt číslo bude obsahovat na konci znak n - aby prohlížeč (engine) věděl, že pracuje s brutálně velkým číslem, a ne jen strašně velkým číslem. const bigIntCislo = 12345n; const obycajneCislo = 12345; Stage 3Funkcionalita je téměř hotová a potřebuje feedback od vývojářů a vnějšího světa. Všichni testují BigInt ve svých programech. Tvůrci internetových prohlížečů se předbíhají, kdo z nich bude podporovat BigInt jako první – protože implementovat BigInt už má smysl. Stage 4Vše je otestováno a BigInt je součástí specifikace ECMAScript. Hotovo. ZáverCelý proces např. v případě BigInt trval 2 roky. Umím si představit, že schvalování některých ještě komplexnějších funkcionalit může trvat ještě déle. Frajerům z TC-39 ale můžeme děkovat za to, že do JavaScriptu se dostávají opravdu jen věci, které dávají smysl.
Amazon a Skillmea přinášejí bezplatné webináře a online kurzy pro děti
Vzdělávání
21.04.2020
Skillmea

Amazon a Skillmea přinášejí bezplatné webináře a online kurzy pro děti

Dokud jsou školy zavřené, prožívají nelehký čas rodiče, učitelé i děti. Ale díky jednoduchým nástrojům se domácí vzdělávání může stát zajímavým a kreativním zážitkem. Tuto myšlenku si osvojili také ve společnosti Amazon a rozhodli se nabízet bezplatné online webináře pro děti. Amazon navázal partnerství se sdružením Learn2Code, které pro širokou veřejnost poskytuje kurzy tvorby webstránek, programování webových a mobilních aplikací a další témata. Jejich cílem je zpřístupnit mladé generaci digitální vzdělávání, učí je rozumět marketingu, pracovat s grafikou a videem. V rámci partnerství společnost Amazon zastřešuje sérii webinářů Code Jungle Česko pod taktovkou zkušených odborníků z praxe z Learn2Code. Všechny webináře, které se budou konat dvakrát do týdne, vždy v pondělí a čtvrtek budou pro všechny účastníky díky spolupráci s Amazonem zcela zdarma až do konce června 2020. Webináře jsou určeny pro děti přibližně od 10 let. Během webinářů se seznámí s programováním v jazyce Scratch a vytvoří si několik atraktivních her. První se bude konat ve čtvrtek 23. 4. 2020, od 15:00. Každý z webinářů bude trvat 75 minut a lze je absolvovat i jednotlivě. Záznam všech webinářů bude dostupný na Learn2Code YouTube kanálu. „Prostřednictvím těchto bezplatných online webinářů, chceme oslovit děti, které zůstávají doma, a podělit se s nimi o znalosti a dovednosti budoucnosti kreativním a poutavým způsobem,“ řekla Blanka Fijołek, CEE PR & komunitní manažerka společnosti Amazon. Druhou částí této spolupráce je poskytnutí všech online kurzů pro děti od Learn2Code účastníkům od teď až do konce června 2020 bezplatně. Jedná se o 15 online kurzů, které sestávají z 30 vyučovacích hodin a účastníci dostávají i domácí úkoly k procvičení probírané látky. Kurzy slouží také jako podklad pro učitele informatiky. „Jsme velmi rádi, že díky spolupráci s Amazonem můžeme poskytnout všechny probíhající online kurzy pro děti až do konce června zdarma“, řekl Marián Kristel marketing & operations z Learn2Code a dodal: „žijeme v mimořádné situaci a takto chceme pomoci rodičům a také naučit zábavným způsobem děti něco nového a užitečného“. Kompletní seznam kurzů a přihlašování najdete zde. O webinářích Code Jungle Česko:Webináře budou probíhat 2x týdně online, přes nástroj na webináře ZOOM. Zaměřeny jsou na programování her v prostředí Scratch. Rozsah vyučovací jednotky je 60 minut plus 15 minut prostor vyhrazený pro otázky. Během webinářů se budou programovat velké hry. Flappy Bird, Pacman, Super Mario a další. Věk účastníků se doporučuje minimálně 10 let. Potřebný je vlastní laptop nebo počítač. Do konce června 2020 zorganizujeme téměř 20 webinářů. Jednotlivé webináře budou zveřejněny na YouTube a budou dostupné pro všechny zdarma. Kompletní seznam webinářů a veškeré informace naleznete zde. Jak se můžete zúčastnit webinářů?UPDATE: Webináře Code Jungle byly ukončeny.
Úvod do Data Science a Machine Learning
Vzdělávání
18.04.2020
Miroslav Beka

Úvod do Data Science a Machine Learning

Na začátku, kdy člověk vstupuje do Data Science je velmi důležité pochopit, co se skrývá za různými označeními. Lidé si umějí některé pojmy mýlit a proto bych v tomto článku rád velmi zrychleně prošel přes některé základní součásti. Data Science je procesZa tímto výrazem se skrývá celá posloupnost úkolů, které musí datascience inženýr provést. První fáze je silně propojena s byznysem. Používají se zde proto různé byznys výrazy (Business Intelligence). Jak efektivně umíme využít software k dosažení cílů firmy? Pracovat pro firmu jako data scientist vyžaduje pochopení potřeb byznysu. V této fázi je také velmi důležité odkomunikovat, jaké jsou možnosti Data Science a čeho lze reálně dosáhnout a co ne. Spousta manažerů totiž nerozumí technické stránce věci a ty jako datascience inženýr jsi tam na to, abys jim to vysvětlil lidskou řečí. Druhá fáze je příprava dat. Nějaká data může mít firma již nasbíraná, jiná je třeba koupit nebo najít nový způsob jak sesbírat to, co potřebuješ. Takže tady se budeš hrabat v databázích, vytahovat různá data, spojovat všechno dohromady do nějakého smysluplného celku. Také musíš umět vizualizovat tato data, abys viděl, co máš na ruce. Třeba si ověřit, že data mají tu kvalitu, jakou očekáváš. Často se totiž stává, že data jsou vadná, nekvalitní, v jiných jednotkách a podobně. Na to si musíš dávat velký pozor. Ve třetí fázi začneme pracovat na modelu. To, co jsme zjistili v předchozích krocích, musíme „přeložit“ do řeči machine learning. Jaký model použít (vzhledem k tomu, jaká máš data), jaké informace se z modelu umíme dozvědět a jak to souvisí s byznysem. Čtvrtá fáze by nám měla vyplivnout hotový model připravený k používání. Tady všechny ty naše úvahy a předpoklady musíme přetavit do kódu a natrénovat model na datech. Zní to jednotuše, ale není to úplně easy. Hlavně to záleží na tom, jak kvalitní data máš k dispozici. Pátá fáze se opět dotýká silně byznysu. V první řadě musíme umět zhodnotit, zda model skutečně řeší náš problém, který jsme chtěli vyřešit a zda je v tom dobrý. Zde zvykneme vytáhnout další data, která model ještě neviděl (testovací data) a otestovat úspěšnost modelu. Výstupem by měla být krásná prezentace se všelijakými grafy a vysvětlivkami, aby to ti "shora" pochopili a dali ti palec nahoru. Machine LearningMachine Learning je součástí Data Science a věnuje se algoritmům, programování a trénování modelu. Tento výraz si lidé zaměňují s umělou inteligencí. Abychom v tom měli jasno, umělá inteligence využívá techniky machine learning, aby napodobila lidskou inteligenci obecně. Umělá inteligence se zabývá také tím, jak lidé interagují s inteligentním agentem a aby se lidé cítili pohodlně, když interagují se strojem. Čili je tam toho zahrnuto mnohem více (např. i psychologie). Machine Learning je tady a nyní a dennodenně se používá. Jsou to pokročilé algoritmy a techniky, které zpracují nějaká data a vyplivují výsledek. Jsou úzce specializovány na jeden a jediný úkol. ML technik a algoritmů je mnoho a každý řeší určitý malinký podíl té umělé inteligence. SlovníkToto odvětví se jen tak hemží různými výrazy. Tyto stránky obsahují základní výrazy, na které určitě narazíš a je dobré vědět, co znamenají: • https://towardsdatascience.com/the-new-data-scientist-glossary-4a2c14bf550 • http://www.datascienceglossary.org/ • https://developers.google.com/machine-learning/glossary/ DatasetyExistuje několik stránek, které nabízejí svá data veřejně a zdarma. Jinak je většinou třeba za data tvrdě platit a kopec firem si na shromažďování dat vytvořily byznys. Googlene jistě pomůže najít mnohé stránky, které nabízejí svá data. Zde je seznam několika populárních stránek: • https://www.kaggle.com/datasets • https://data.world/ • https://archive.ics.uci.edu/ml/index.php • http://academictorrents.com/ • https://www.reddit.com/r/datasets/ • https://datasetsearch.research.google.com/ Pokud chceš vědět více o Data Science a Machine Learningu, přihlas se do mého online kurzu Python Data Science.Pokud máš připomínky nebo dotazy k článku, směle se ptej v komentářích.
Konstruktory v Javě
Vzdělávání
03.04.2020
Skillmea

Konstruktory v Javě

V tomto článku se podíváme, co je to konstruktor v Javě (constructor in java). K čemu se používá? Co je to? Třída slouží k popisu a výrobě objektů. Zkusme nyní popřemýšlet nad reálným objektem – například auto. Pokud chceme popsat auto do programu, tak k popisu auta použijeme třídu. Co má auto? Jaké vlastnosti? Má počet dveří, značku, RZ, objem kufru a dalších xy věcí. Ne všechny budeme používat. V našem projektu si vytvoříme novou třídu:[Image] Pojmenujeme ji Auto a napíšeme tam globální proměnné. public class Auto { int doorCount; String brand; String plateNumber; }Nyní si vytvoříme objekt typu Auto. K výrobě objektů budeme používat konstruktor. Konstruktor jako název naznačuje slouží ke zkonstruování nového objektu. Aniž bys ty sám napsal nějaký konstruktor, tak máš jeden dostupný automaticky. Tento se jmenuje – bezparametrický konstruktor – je to jakoby metoda, která na vstupu nemá parametry. Proto je možné vyrobit nový objekt pomocí new Auto(); public class Auto { int doorCount; String brand; String plateNumber; public static void main(String[] args) { Auto auto = new Auto(); } }V programu jsme použili new Auto() i když nic takového nemáme napsáno. Co můžeme udělat, je napsat si takový konstruktor sami. public class Auto { int doorCount; String brand; String plateNumber; public Auto() { } public static void main(String[] args) { Auto auto = new Auto(); } } Do nitra tohoto konstruktoru si nyní můžeme napsat libovolný kód. Konstruktory se nejčastěji využívají vedle výroby nového objektu ik nastavení dat. Například pokud chci vyrobit auto, které je značky Škoda, tak vyrobím nový – druhý konstruktor, jehož vstupní parametr bude právě počet dveří. Volat chceme Auto auto = new Auto(“Škoda”); public Auto(String brand) { }Co ale uděláme s touto proměnnou brand, kterou máme jako parametr? Pokud uvažujeme, tak chceme nastavit globální proměnnou brand pro tento nový objekt. Ale jak řeknu, že globální proměnná brand ať se rovná tomu, co je v parametru metody brand? Udělám to pomocí klíčového slova this. Slovo this se odkazuje na právě tento nový objekt, který konstruujeme. Tedy this se váže na nově vyrobený objekt ze třídy Auto. Po správnosti bych měl říci, že this odkazuje na instanci (instance) objektu. Pomocí konstruktoru vyrobíme novou instanci třídy Auto. Pokud vyrobím 5 objektů, tak jsem vyrobil 5 instancí třídy Auto. Takže this.brand ukazuje kam? Slovo this ukazuje na danou instanci objektu a přes tečku přistupuji k věcem dostupným v dané instanci auta. Co je tam k dispozici? Nyní jsou dostupné globální proměnné. Tak udělám: public Auto(String brand) { this.brand = brand; }public static void main(String[] args) { Auto auto = new Auto("Škoda"); }Po zavolání tohoto konstruktoru mám v proměnné auto odkaz na objekt Auto s nastevním brandem na Škoda. Takto si nyní můžu vytvářet nové instance typu Auto. public static void main(String[] args) { Auto auto = new Auto("Škoda"); Auto auto2 = new Auto("Škoda"); } Jsou tato dvě auta stejná? Ne, nejsou, i když mají stejný brand. Proč? Neboť voláme-li slovíčko new, tak se vytváří vždy zcela nový objekt v paměti. Ukázka konstruktoru, kde nastavujeme všechny globální proměnné. V IDEI stlač ALT+Insert a vyber konstruktor – následně označ všechny proměnné. Tyto proměnné se jinak nazývají také fieldy.[Image] public Auto(int doorCount, String brand, String plateNumber) { this.doorCount = doorCount; this.brand = brand; this.plateNumber = plateNumber; } public static void main(String[] args) { Auto auto = new Auto("Škoda"); Auto auto2 = new Auto("Škoda"); Auto auto3 = new Auto(4, "Opel", "CCdddDD"); }Nové objekty můžeš vytvářet kde chceš a kdy chceš. Teď jsem to dělal v metodě main přímo ve třídě Auto. To ale samozřejmě většinou dělat nebudeš. Více o konstruktorech v Javě a Java programování se dozvíš v našich online kurzech Java a OOP pro začátečníky a Java pro pokročilé. 
Kolekce v Javě
Vzdělávání
06.03.2020
Skillmea

Kolekce v Javě

V tomto úvodním článku do série pokročilá java se podíváme na zoubek kolekcím (collections in java). Kolekce jsou jako kontejnery, které v sobě drží další objekty. Jinak můžeme kolekce chápat také jako seznamy. Seznam telefonních čísel. Seznam osob. Seznam aut. Seznam souborů. Seznam čísel .... U kolekcí budeme hovořit o Rozhrání, Implementaci a Algoritmech. Java collection framework – Java sama o sobě poskytuje několik kolekcí. Poskytuje nám jejich implementace a také algoritmy pro vyhledávání, vkládání, třídění a podobně. Rozhraní kolekcí v tomto frameworku jsou generická. Tedy umožňují do nich vkládat různé typy objektů. Pamatujte, že Java je striktně typový jazyk a do proměnné typu String prostě int nedáš, musí tam jít pouze String. Ke generikám se ještě dostaneme v pozdějším článku.[Image] Seznam rozhraní Java collection frameworkuCollection – top v hierarchii, používá se k přesunu kolekce, manipulaci kde se požaduje aby tam přišla jakákoliv kolekce. Do Collection můžeš vložit jakýkoli typ kolekce, který tuto kolekci rozšiřuje. Set – nemůže obsahovat duplicity List – seznam, může obsahovat duplicity, pořadí elementů je zachováno pomocí indexů Queue – FIFO – first in first out, což přijde první do této kolekce tak z ní i první odejde, některé implementace mají výjimky Deque - FIFO i LIFO (last in first out) - elementy mohou být vkládány i vybírány z obou konců Map – object který mapuje objekty k jejich klíčům, nemůže obsahovat totožné klíče SortedSet a SortedMap – jsou vlastně seřazeny Map a Set Implementace (nejpoužívanější jsou zvýrazněny boldem): SetEnumSet, HashSet, LinkedHashSet, TreeSetListArrayList, LinkedList, Stack, VectorMapEnumMap, HashMap, LinkedHashMap, TreeMapSortedSet NavigableSetTreeSetSortedMap NavigableMapTreeMapQueueLinkedList, PriorityQueue  SetNeobsahuje duplicitní elementy – lépe řečeno nemůže obsahovat duplicitní elementy. HashSet – neuchovává pořadí v jakém byly elementy vloženy, ale pracuje nejrychleji LinkedHashSet – uchovává pořadí elementů v jakém byly vloženy TreeSet – pořadí elementů je seřazeno podle jejich hodnot, je pomalejší Mějme kolekci, která obsahuje elementy, které jsou duplicitní. Jak z ní nejrychleji získáme kolekci, která nemá duplicity? Collection<Type> noDups = new HashSet<Type>(c); Funguje to tak, že z kolekce se vytvoří Set. A Set už z definice nemůže obsahovat duplicity. Přidání elementů do Setu: Set<String> set1 = new HashSet<>(); String s = "e"; set1.add("element1"); set1.add("element2"); set1.add("element3"); set1.add("element4"); set1.add(s);Je element v kolekci?  System.out.println(set1.contains("e")); //true     Odstranění elementu z kolekce: set1.remove(s);Procházení přes Set: Iterator i = set1.iterator(); while (i.hasNext()){ System.out.println(i.next()); }for(String s : set1) { System.out.println(s); }Zeptám se, jestli všechny elementy ze set1 jsou iv set2 set1.containsAll(set2)); Odstraním z set1 všechny shodné elementy se set2 set1.removeAll(set2);Vše ze set2 přidám do set1 set1.addAll(set2);ListUchovává pořadí elementů. Elementy jsou přístupné i pomocí indexů. Je možné do již vytvořeného Listu přidat nové elementy i na indexy, které jsou obsazeny – elementy se posunou. Můžeme v nich vyhledávat indexOf a lastIndexOf. U dopisů si musíme dávat velký pozor na to, abychom neshodili program kvůli přístupu k neexistujícím elementům – respektive k neexistujícím indexům v listu. Například máš List se 4 elementy a chceš přistoupit k 6-tému elementu. Základní pomocné algoritmy, specifické ke List:  • sort — setřídí elementy v listu • shuffle — náhodně promíchá elementy v listu. • reverse — otočí pořadí elementů v Liste • rotate — otočí pořadí všech elementů od specifického indexu • swap — přehodí elementy z Listu na specifikovaných indexech • replaceAll — nahradí všechny výskyty specifikované hodnoty za druhou specifikovanou hodnotu • fill — přepíše všechny elementy v listu za specifikovanou hodnotu ArrayList – přizpůsobuje svou velikost, základní pole musela mít specifikovanou délku při vytvoření, nemohla růst nebo se zmenšovat LinkedList – jiná implementace, rozdílu jsou v časových zátěžích s různými operacemi nad Listy Přidání elementů do Listu: List<String> list = new ArrayList<>();          list.add("list1");          list.add("list2");          list.add("list3");          list.add("list4");          list.add("list5");  Výběr elementů z listu na indexy 1:         list.get(1);  Je prázdný?         list.isEmpty();  Přidej na pozici 2:         list.add(2,"list2b");  Odstraň element:         list.remove("list1");           list.remove(4);  Různé manipulace:         Collections.sort(list);          Collections.shuffle(list);          Collections.reverse(list);          Collections.rotate(list,2);          Collections.swap(list, 0, 1);          Collections.replaceAll(list, "list4", "new list4");          Collections.fill(list,"Jaro");  MapMapa obsahuje hodnoty vázané na klíč. Takže to máme anglicky key – value hodnoty. Klíče musí být unikátní. HashMap – nedrží si pořadí, náhodné uspořádání LinkedHashMap – drží pořadí Vložení do Mapy: Map<Integer,String> map = new HashMap<>();          map.put(10,"jaro");          map.put(1,"fero");          map.put(3,"duro");          map.put(4000,"karol");          map.put(4000,"peter"); // přepíše předchozí element Získáme a vypíšeme hodnotu elementu s klíčem 1:         System.out.println(map.get(1));  Přechod přes elementy Mapy:         for(Map.Entry m : map.entrySet()){              System.out.printf("key %d, value %s %n",m.getKey(),m.getValue());          }          for(Integer k : map.keySet()){              map.get(k);                  }