Náš blog

V této kategorii naleznete komplexní přehled článků z různých oblastí, včetně IT kurzů a témat zaměřených na inovační vzdělávání. Články pokrývají širokou škálu témat, která vám pomohou získat nové znalosti a dovednosti. Chcete-li být v obraze a zlepšovat se v oblasti vzdělávání či technologií, tato sekce je pro vás.

Kotlin vs. Java - méně kódu
Vzdělávání
06.01.2020
Skillmea

Kotlin vs. Java - méně kódu

Kotlin a Java jsou kompatibilní programovací jazyky. V tom smyslu, že pokud zkompilujeme Java kód, tak se vytvoří bytecode v souboru .class. Pokud zkompiluji Kotlin kód, tak se vytvoří bytecode v souboru .class. Tedy, jestli pracuješ v Kotlině nebo v Javě, tak nakonec budeš mít kód, který si bude rozumět a který dokáže běžet tam, kde dokáže běžet JVM – java virtual machine. V tomto článku vám chci ukázat to, proč byl Kotlin vytvořen – aby nám co nejvíce zjednodušil psaní kódu. Představ si, že chceš napsat třídu Auto. Ta má fieldy název a počet dveří. Tyto fieldy budou private a final – tedy po prvním nastavení je nemůžeš změnit. Přístup k těmto fieldům můžeš udělat jen přes public get metodu. Zároveň umíš sestrojit auto tak, že mu zadáš jen název. Pokud bude zadán jen název, tak počet dveří bude automaticky 4. Pokud zadáš název a počet dveří, tak se fieldy nastaví tak, jak jsme to zadali v konstruktoru. Kód v JavěTakto bude vypadat kód napsaný v Javě: public class Auto { private final String nazov; private final int pocetDveri; public Auto(String nazov) { this(nazov,4); } public Auto2(String nazov, int pocetDveri) { this.nazov = nazov; this.pocetDveri = pocetDveri; } public String getNazov() { return nazov; } public int getPocetDveri() { return pocetDveri; } }Nejprve máme dva privátní final fieldy: private final String nazov; private final int pocetDveri;Pak konstruktor, pokud chci vytvořit objekt auto jen pomocí názvu: public Auto2(String nazov) { this(nazov,4); } Konstruktor, pokud chci vytvořit auto a nastavit název a počet dveří: public Auto2(String nazov, int pocetDveri) { this.nazov = nazov; this.pocetDveri = pocetDveri; }A nakonec get metody, abychom měli přístup k daným fieldům: public String getNazov() { return nazov; } public int getPocetDveri() { return pocetDveri; }Jak to udělám v Kotlině?Potřebuji tento kód: class Auto (val nazov: String, val pocetDveri: Int = 4) { }To je všechno, těch 20 řádků v Javě je jeden řádek kódu v Kotlině. Za Auto jsou závorky - to je primární konstruktor, ve kterém se nastavují takzvané property. První property je název, který je val – val znamená, že hodnota se nemůže později měnit. Druhá property má nastaveno = 4, to znamená, že pokud chci vytvořit auto jen zadáním názvu, tak se automaticky pocetDveři nastaví na 4. Takto vytvořím Auto zadáním obou property a pod tím je přístup k property přes tečku: val skoda = Auto("Skoda", 5) skoda.nazov skoda.pocetDveriVytvoření auta jen s názvem: val auticko = Auto("Skoda")Záver Líbí se ti tento přístup? Chceš vědět více o programovacím jazyce Kotlin? Sleduj Learn2Code a věřím, že najdeš co hledáš. Připravovaný kurz o Kotlině zveřejníme již brzy.
Testování Java aplikací s JUnit
Vzdělávání
28.11.2019
Skillmea

Testování Java aplikací s JUnit

JUnit framework úvodPředstav si naprosto jednoduchou metodu, která má za úkol spočítat dva vstupní parametry metody. public static int sum(int number1, int number2){ return number1 + number2; }Jak bys otestoval tuto metodu? Zavolal bys danou metodu, a následně bys výsledek porovnal s očekávanou hodnotou. Pokud by metoda nevrátila očekávanou hodnotu, tak bys napsal hlášku, že test neprošel, pokud by vrátil očekávanou hodnotu, tak bys napsal, že test prošel. int sumNumber = sum(1, 4); if(sumNumber!=5){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Co jsem udělal, je to, že náš kód jsem porovnal s jedním možným případem výsledku. Anglicky se setkáš s názvem test case. Tedy jsem zatím udělal jeden test case. Ty bys měl ověřit několik test časů. Svůj kód musíš vystavit „stresu“. Tedy si napíšeš několik dalších test časů. Například, jak to bude pracovat s nulou: int sumNumber = sum(1, 0); if(sumNumber!=1){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Nebo jak to bude pracovat s negativním číslem: int sumNumber = sum(1, -10); if(sumNumber!=-9){ System.err.println("Test failed."); }else{ System.out.println("Test passed."); }Toto byly takzvané pozitivní testy. Test si považoval za passed – za úspěšný – tehdy, když byla splněna podmínka. Ty umíš ale napsat i takzvané negativní testy. Kde test prošel, pokud nebude splněna podmínka. Například test projde-li částek 2 a 2 není 5 a podobně. int sumNumber = sum(2, 2); if(sumNumber!=5){ System.out.println("Test passed."); }else{ System.err.println("Test failed."); }Náš kód jsme vystavili různým testům casem. Pokud testy projdou, tak metoda je ošetřena určitě víc – je více spolehlivá než kdybychom nenapsali, žádný test case. Co jsme udělali?Připravili jsme si testy. Poskytli jsme vstupní parametry testům – různá čísla ke spočítání. Spustili jsme testy a poskytli jsme také očekávané výsledky. Následně jsme vypsali hlášky, zda testy prošly nebo ne. Pokud bychom měli další metody, které bychom museli otestovat, pak bychom napsali další testy. Udělali bychom vlastně tytéž kroky jako při testování první metody. Co mají první testy odlišné od druhých testů? Voláme jiné metody, máme jiné parametry testů a máme jiné požadované výsledky. Co mají první testy společného s druhými testy? Testy jsme spustili – ke spuštění testů není nic odlišného. Verifikovali jsme výsledky – verifikování proběhlo iv prvním i druhém případě a následně se v obou případech napsaly hlášky na konzoli. JUnit framework nám usnadní způsob, jakým budeme spouštět testy a také způsob, jakým se uživateli sdělí výsledky testů. Spuštění, verifikování a vypsání hlášek bude řídit JUnit framework. My řekneme JUnitu – tady máš můj test kód a ty ho teď spusti a postarej se o to. JUnitu řekneme, tento výsledek očekávám, tyto údaje vkládám - prověřit to. JUnit to prověří a nám sdělí v pěkné čitelné formě, zda testy prošly a pokud neprošly, tak nám řekne přesně, které testy neprošly.[Image]JUnit byl mnoho let ve verzi 4. Verze 5 není přímo kompatibilní s verzí 4, ale tvůrci JUnit 5 připravili api, přes kterou umíme komunikovat i se starými testy – ta se jmenuje Vintage. Dále nové api se jmenuje Jupiter. Tyto api pak spoléhají na core frameworku – tedy zdroj – kód, který se stará o všechno ostatní. Spouštění testů a podobně. Plus máš možnost napsat své vlastní api, které pak bude také využívat core frameworku. Pokud budeš používat Jupiter plus core, tak si do projektu musíš stáhnout tyto závislosti. My budeme používat maven pro tyto účely. Vývojová prostředí jako IntelliJ IDEA nebo Eclipse mají zabudovanou integraci s JUnit 5 frameworkem a tak můžeme testy spouštět pomocí těchto vývojových prostředí. Pokud tě toto téma zajímá víc, sleduj online kurz JUnit a TDD pro programátory.
Lektor Michal Žák: "Nedělej ošklivé věci, pak se jen tak poflakují po světě."
Rozhovory
15.11.2019
Skillmea

Lektor Michal Žák: "Nedělej ošklivé věci, pak se jen tak poflakují po světě."

Vyzpovídali jsme lektora Michala Žáka, který pro tebe na Learn2Code připravil kurz Adobe Illustrator Advanced  a finišuje další online kurz zaměřený na komunikaci s klientem – Client management. Michal se věnuje především grafice, rozjetých má však několik projektů. Jeho kariéra začala v 15-ti, kdy objevil Photoshop, k srdci mu však přirostl Illustrator. Jeho motto? "Nedělej ošklivé věci, ony se pak jen tak poflakují po světě." Proč by měl být právě Illustrator tím vyvoleným softwarem pro grafika a co připravuje v dalším kurzu se dozvíš v rozhovoru.[Image] Na jakých projektech momentálně pracuješ?Momentálně mi většinu času zabírá práce pro AR Visual. Je to malá snaživá firma. Nastoupil jsem na marketingovou pozici, momentálně dělám na product developmentu - programování, práce s klientem, demo videa. A neměnil bych. Grafike se sice věnuji pomálu, ale vždy se umím vyřádit na externích projektech - jako například tvorba kurzu pre Learn2Code. Není to tak snadné, jako když si kreslím podvědomě. Primárně se věnuji hlavně online grafice, UI designu a printu, nepřimárně fotím a kodím weby. Nepohrdnu však ničím, dokud to nejsou zvrhlé požadavky typu „dej mi do loga zkřížené pistole“ nebo „dejme tam slogan 2x, aby pochopili o co jde“. True story. A významný projekt? Například jsem nedávno nakódil .js appku, díky které nám klient odklepl megadrahý projekt na několik let. A ještě jsem jednou dělal takovou tabuli pro kebab, což visela jedno léto na Nitranském koupališti.[Na pozícii v Bistro.sk Michal pochopil, že ilustrácie mu moc nejdú] Při takovém množství aktivit, co ti v životě pomáhá udržovat balanc?Mám tu nejperfektnější a nejtolerantnější ženu, která zná rozdíl mezi helveticí a arialem a zná mě do puntíku. Když je člověk freelancer, tak je důležité, aby mu partner byl oporou. Častokrát sedím nad projektem do čtvrté rána nebo mi vyjde business trip na dceřině narodky. Prostě shit happens. Mít však u sebe někoho, kdo to umí pochopit, je k nezaplacení. Takže balanc mezi 24/7 prací a rodinou. To je významný projekt. Kromě toho máme doma brzy už 10letou slečnu, které se vedle práce nestíhám věnovat tak, jak bych chtěl. Na Vánoce mimochodem obdrží grafický tablet. Tak uvidíme. Já jsem koneckonců začínal s ilustracemi na starém Geniusu na intráku v Nitře. Proč ses rozhodl stát se lektorem v Learn2Code?Toto by ani neměla být otázka 😀 Byli jste se podívat ven? Vždyť to je strašné – nezkernované nápisy, písma typu papyrus a calibri, barevně ani nemluvím. A weby? 😀 Mordor. Lidé se musí učit dělat věci dobře. Musí se naučit, že typografie je důležitá a rozdíly mezi RGB a CMYK nejsou jen v kalibraci monitoru. Ne každý, kdo si stáhne Photoshop a naučí se v něm běhat myškou, je také grafik. Co se lidé naučí ve tvém kurzu Adobe Illustrator Advanced?V první řadě se seznámí s Adobe Illustrator. Zjistí, že to není program jen pro ilustrátory nebo že se tam dělají ikony. Podle mě v 95% případů Illustrator spokojeně nahradí InDesign a Photoshop. Kromě toho mluvím o tom, jak si udělat pořádek ve větších projektech, co je to Grid a proč používat pravítka, něco o typografii, klávesové zkratky, tabulky, štětce, scripty a nějaké speciální efekty :D Nakonec se budeme věnovat UI-čku a tomu, jak nezlobit člověka, který to bude po nás kódovat :) Na co se zaměřuješ v připravovaném kurzu?Kurz bude zaměřen na komunikaci s klientem as lidmi obecně. Jak přesedlat z full time práce na freelancera, jak si nacenit své služby (zejména ty kreativní), kde a jak získat nové klienty, sestavit si portfolio a podobně. Prostě jak to nepokašlat s klientem, je to jedno, jestli jste od grafiky, od webu nebo whataver-ingu. Pokud chce být kreativec v dnešní době úspěšný, minimálně 70% jeho energie a času musí být věnováno práci s klientem. Projedeme si tedy i konfrontační situace, které mohou při komunikaci nastat. Sám jsem si tím vším prošel a přál bych si, aby takový návod někdo vypustil do světa už dříve. A co další plány do budoucnosti?Chtěl bych se pustit do tutoriálu zaměřeného na kódování pro grafiky. Jak si tedy sestrojit vlastní web, aniž bychom táhli Wordpress, WiX a podobné bolehlavy. Navíc ten, kdo pracuje v oblasti UI/UX, by měl vědět, jak web development vlastně funguje. Dokončit bych chtěl i e-book o Typografii a jejím používání na webu, v printu a podobně. Ale nic složitého. Jednoduchá pravidla, vysvětlení hierarchie, kontrastu, párování a podobně. Prostě co nedělat, proč to nedělat a pokud dělat, jak to dělat správně. Co odkazuješ lidem, kteří se chtějí uplatnit v grafickém designu?V oboru grafiky? Jděte do toho! Specializace nevede nikam. Na Slovensku určitě ne a obzvlášť ne v korporátních strukturách. Tedy s výjimkou těch, kterým stačí práce za 700-800 v čistém pro nějakou pseudo-digitálku z horní dolní a naplňuje je logotvorba pro lokální vegan bistrá s životností 4 měsíce. Pokud chcete jít do toho, učte se a sbírejte tolik informací, kolik se jen dá. Například, jak funguje velkoformátový print, specifika mobilních typefaceů, jak zanimovat logo-reveal v After Effects, což je to inverse-square-law při fotografii, jakou uzávěrku zvolit při 30fps, jaké jsou formáty pro google bannery, jak napsat blog, na který lidé reagují, jak nakódovat online 3D product viewer atd. atd. A to vše minimálně proto, abyste měli přehled. Neříkám, že máte být profík v každé disciplíně. A určitě všechny ty znalosti a zkušenosti budete umět jednou dobře využít. :) Líbil se ti rozhovor? Věnuj mu 👍 Pokud máš na Michala nějakou otázku, napiš ji dolů do komentáře 👇
Lambda výrazy v Javě - část IV.
Tipy a triky
30.10.2019
Skillmea

Lambda výrazy v Javě - část IV.

Funkcionální rozhraníPokud chci používat lambda výraz, tak potřebuji k tomu rozhraní s jednou abstraktní metodou. Daná metoda musí odpovídat popisu našeho lambda výrazu. Pokud se nad tím zamyslíš, tak ve skutečnosti se dané rozhraní může jmenovat ledajak. Na názvu nezáleží. A i metoda v tom rozhraní může mít ledajaký název, pro logiku lambda výrazu to nemá žádný smysl. Jediné, co je důležité je, aby metoda seděla s lamba výrazem v tom, co vrací a to, co je na vstupu metody jako parametr. Bylo by naprosto super, kdybychom nemuseli vždy při psaní lambda výrazu řešit vytvoření nového rozhraní, které nám bude sloužit jako typ daného lambda výrazu. Co řekneš? Řekli jsme si, že java nevytvořila nový typ pro lambdy. Při psaní, jsme si mohli všimnout, že metody jsou často podobné. Vracím nějaký typ nebo vracím void a mám tam název metody tam jsou nebo nejsou parametry. Jsou zde nějaké paterny, nějaké vzorce, které se opakují častěji. Java nám nabízí několik takových rozhraní, která můžeme klidně použít. Tato rozhraní jsou v balíčku java.util.function. V tomto balíčku je mnoho před připravených rozhraní, které můžeš používat. Tato rozhraní používají generika, tak si tam umíš dosadit objekty jaké potřebuješ. Například Predicate je přesně stvořený k tomu, pokud potřebujeme vzít na vstupu objekt a vrátit boolean jako návratovou hodnotu. Takto můžeme použít toto rozhraní namísto toho rozhraní, co jsme si sami napsali, když jsme řešili předchádzající úlohu.  Jak ošetřit výjimkyUdělejme si příklad, který bude obsahovat seznam osob, které budu zpracovávat – vypíšeme jejich jména a dáme je na velká písmena. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba("peter", "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby); } private static void processOsoby(ArrayList<Osoba> osoby) { for (Osoba osoba : osoby){ System.out.println(osoba.getMeno().toUpperCase()); } } } Přepíšeme si to na lambda výraz. Náš kód, který chceme metodě prodat jako argument je System.out.println(osoba.getMeno().toUpperCase()). Pracuji tedy jen s objektem osoba. Výsledek napíšu na konzoli. Tím pádem mám jeden argument a tento kus kódu nevrací žádnou hodnotu. Budeme k tomu potřebovat funkcionální rozhraní, které má metodu s jedním parametrem a nevrací nic. Takovým je Consumer s jeho metodou accept. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba("peter", "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, osoba -> System.out.println(osoba.getMeno().toUpperCase())); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } } Nyní si náš seznam osob změním tak, že místo jmen dám do seznamu null. Při zpracovávání lamba výrazu nám program spadne na NullPointerException. osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba(null, "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28));Musíme si ošetřit tuto výjimku. Jak na to? Jedním ze způsobů je obalit volání consumer.accept do try catch bloku. private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ try { consumer.accept(osoba); }catch (NullPointerException e){ //... } } }Ale to je ošklivé řešení. To co přijde do consumer může být leccos možné a nemusí to dát NullPointerException, možná to bude jiná výjimka. Náš kód chceme mít jednodušší. Druhou možností je, aby byla výjimka zpracována přímo v lamba výrazu. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba(null, "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, osoba -> { try { System.out.println(osoba.getMeno().toUpperCase()); }catch (NullPointerException e){ e.printStackTrace(); } }); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } }Dosáhl jsem toho, že metoda processOsoby je krásnější, ale náš lambda výraz je nyní víceřádkový a ne pěkný - jednořádkový. Na jedné straně chceme mít pěkné jednoduché lambda výrazy, na druhé straně chceme, aby bylo postaráno o výjimky. V našem kódu se vraťme k řešení, které nepoužívá try catch blok. K odchycení výjimky použijeme wrapper metodu. Try catch blok si vyvedeme do zvláštní metody a poté obalíme náš lambda výraz, dalším lambda výrazem, který má try catch blok. Udělejme to, co jsem teď napsal. Vytvoříme novou metodu, která bude akceptovat lambda výraz. V našem případě jsme k tomu použili Consumer rozhraní. A protože je to wrapper, tak to co mi přijde na vstup tak dám i na výstup. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return consumer; }V metodě processOsoby(osoby, osoba -> System.out.println(osoba.getMeno().toUpperCase())); zavolám místo lambda výrazu, wrapper metodu, jejíž argument bude lambda výraz. Udělá to totéž, ale použil jsem wrapper metodu. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba("peter", "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, wrapperLambda(osoba -> System.out.println(osoba.getMeno().toUpperCase()))); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return consumer; } }Tady můžu udělat následující věc. Namísto toho abych lambdu přehnal přes wrapper metodu, tak ji ani nepoužiji, ale použijeme jen její vstupní parametr, což je osoba. Mohu udělat něco takového: private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> System.out.println(osoba.getPriezvisko()); }Namísto toho, abych využil vstupní lambdu, která mi přišla přes parametr consumer, jsem na ni zapomněl a jen jsem využil vstupní parametr dané lambdy a vytvořil jsem novou lambdu. Při volání consumer.accept(osoba); v metodě processOsoby se provede lambda výraz z wrapper metody. Toto není skutečný wrapper. Skutečný wrapper, vezme vstupní lambdu a provede co požaduje. Nyní máme jistotu, že se zavolá přesně náš požadovaný lambda výraz a zároveň můžeme přidávat kód kolem. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> consumer.accept(osoba); }Zde přichází nářad try catch blok v wrapper metodě. Upravíme si kód, aby nám házel výjimku. public class ExceptionHandling { public static void main(String[] args) { ArrayList<Osoba> osoby = new ArrayList<>(); osoby.add(new Osoba("jano", "beno", 3)); osoby.add(new Osoba(null, "beno", 0)); osoby.add(new Osoba("jaro", "beno", 30)); osoby.add(new Osoba("brano", "beno", 28)); processOsoby(osoby, wrapperLambda(osoba -> System.out.println(osoba.getMeno().toUpperCase()))); } private static void processOsoby(ArrayList<Osoba> osoby, Consumer<Osoba> consumer) { for (Osoba osoba : osoby){ consumer.accept(osoba); } } private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> { try{ consumer.accept(osoba); }catch (NullPointerException e){ System.out.println("Null pointer exception in wrapper lambda"); } }; } }Pokud se zastavuješ při myšlence, že jsme nic nezjednodušili, jen jsme přesunuli kód na jiné místo, tak máš pravdu, ale! Pokud si danou metodu uděláš generickou, tak si do této metody můžeš zabalit ledajakou lambdu, jejíž typ je Consumer rozhraní. Škoda, že tvůrci jevy neudělali takové wrapper metody pro všechna funkcionální rozhraní z balíku java.util.function. private static<T> Consumer<T> wrapperLambda(Consumer<T> consumer){ return osoba -> { try{ consumer.accept(osoba); }catch (NullPointerException e){ System.out.println("Null pointer exception in wrapper lambda"); } }; } Pokračovat s Lambda výrazy budeme opět v dalším článku. Mé jméno je Jaro Beňo a naučím tě programovat v Javě. Ahoj.
Jak zjistit, zda je číslo zadané ze vstupu prvočíslem?
Tipy a triky
16.10.2019
Skillmea

Jak zjistit, zda je číslo zadané ze vstupu prvočíslem?

V 15. kapitole online kurzu vyššího programovacího jazyka C++ úrovně Elementary II najdete mezi zadáními praktických příkladů pro domácí procvičení i úlohu, ve které máte najít největší společný dělitel dvou čísel a také úlohu, ve které máte najít nejmenší společný násobek dvou čísel nebo jejich největší společný dělitel.   Sáhnete-li do osnov matematiky druhého stupně základní školy někde do 6. nebo 7. ročníku, zjistíte, že klíčem k vyřešení těchto dvou úkolů je rozklad obou čísel na součin prvočísel. Úkoly patří z hlediska logiky a analytického myšlení mezi začátečnické. Přesto vím, že jsou náročnější. Právě proto jsem se rozhodl napsat tento blog. V tomto blogu nechci řešit tento úkol za vás, ale alespoň bych vám rád podal návod, jak zjistit, zda je načtené číslo ze vstupu prvočíslem. Tento úkol je jeden z dílčích úkolů, které je třeba řešit při dvou zmíněných příkladech, jejichž řešení jste dostali za úkol najít. Ti, kteří zapomněli, co je prvočíslo, ozřejmím i tento pojem. Prvočíslo je celé kladné číslo, které je dělitelné pouze jednotkou a svojí vlastní hodnotou. Budeme se tedy pohybovat pouze v množině kladných celých čísel. Příkladem prvočísla může být např. číslo 5, protože je dělitelné pouze číslem 1 a 5. dalšími příklady jsou 2, 3, 7, 11, 13, 17 atp. Samotné číslo 1 se za prvočíslo nepovažuje. Řekněme, že máme číslo 60, jeho rozklad na součin prvočísel je 2 x 2 x 3 x 5. Už z rozkladu je zřejmé, že jej můžeme vynásobit číslem 1, nic by to totiž nezměnilo na výsledku, pořád byste dostali číslo 60. Vidíte , a právě proto se matematici dohodli, že 1 prvočíslem nebude, nemá totiž již žádný vliv v součinu prvočísel, jehož výsledkem je nějaké číslo. Takže bez zbytečných dalších prázdných frází přejdu rovnou k věci. Následuje tedy zdrojový kód v jazyce C++, který řeší titulek tohoto blogu: 01: #include <iostream> 02: using namespace std; 03: 04: int main() 05: { 06: int iNumb; 07: 08: cout << "Zadaj lubovolne cele kladne cislo: "; 09: cin >> iNumb; 10: cout << endl; 11: 12: bool flag = true; 13: 14: if (iNumb == 1) 15: { 16: flag = false; 17: } 18: else 19: { 20: for (int i = 2; i <= iNumb / 2; i++) 21: { 22: if (iNumb % i == 0) 23: { 24: flag = false; 25: break; 26: } 27: } 28: } 29: 30: if (flag) 31: { 32: cout << "Cislo " << iNumb << " je prvocislo !" << endl; 33: } 34: else 35: { 36: cout << "Cislo " << iNumb << " nie je prvocislo !" << endl; 37: } 38: 39: cout << endl; 40: 41: cin.get(); 42: cin.get(); 43: 44: return 0; 45: } Na řádku 01 je uvedena direktiva preprocesoru #include, jejímž parametrem je standardní knihovna iostream. Potřebujeme ji z důvodu používání objektů cout, cin a manipulátoru endl. Na řádku 02 uvádíme v platnost jmenný prostor std pro celý zdrojový soubor .cpp. Zmíněné objekty cout, cin a manipulátor endl je zároveň součástí tohoto prostoru. Na řádku 04 je uvedena funkce main i se svým návratovým typem, kterým je int (integer). Tuto funkci volá operační systém. Na řádku 05 je uvedena levá programová závorka, kterou začíná tělo funkce main. Na řádku 06 je deklarována proměnná iNumb pro datový typ int. Tato proměnná reprezentuje hodnotu celého kladného čísla, o kterém chceme zjistit, jestli patří mezi prvočísla. Na řádku 08 je pomocí objektu cout zapsán na výstup konzolové aplikace textový řetězec, který vyzve uživatele k zadání hodnoty kladného celého čísla, jehož vlastnost prvočísla testujeme. Na řádku 09 je prostřednictvím objektu cin načtena tato hodnota do proměnné iNumb. Na řádku 10 je prostřednictvím objektu cout a manipulátoru endl přesunut kurzor konzolové aplikace na další řádek. Na řádku 12 je deklarována proměnná flag a zároveň inicializována na hodnotu true. Tato proměnná nám bude po otestování načteného čísla ukládat informaci, zda je číslo prvočíslem nebo ne. Z hlediska logiky algoritmu je nutno proměnnou flag inicializovat před testováním na hodnotu true. Algoritmem budeme totiž testovat, zda načtené číslo mezi prvočísla nepatří. Používá se zde tedy postup vylučovací. Na řádku 14 je testována podmínka, zda v proměnné iNumb není hodnota 1. Pokud ano, program pokračuje kladnou větví a do proměnné flag se na řádku 16 zapíše hodnota false, která reprezentuje stav, kdy načtené číslo prvočíslem není. Na řádcích 13 a 15 jsou pouze uvedeny programové závorky, které uzavírají blok kódu uvedený v kladné větvi. Pokud zmíněná podmínka splněna není, pokračuje se zápornou větví. Blok kódu v záporné větvi uzavřen programovými závorkami na řádcích 19 a 29. Na řádcích 20 až 27 je uvedeno jádro algoritmu, který testuje vlastnost prvočísla u čísel větších než 1. A v čem spočívá idea jádra algoritmu? V každé iteraci cyklu zjišťujeme, zda je číslo dělitelné hodnotou v proměnné i. Nejmenší číslo, kterým může být načteno testované dělitelné, je číslo 2 (viz. řádek 20 – for smyčka) a proto iterujeme od této hodnoty. Proměnnou i postupně inkrementujeme (viz. řádek 20 – for smyčka) a testujeme, zda je hodnota proměnné iNumb dělitelná beze zbytku pomocí operace modulo na řádku 22, která je umístěna v příkazu if. Pokud je číslo dělitelné hodnotou v proměnné i beze zbytku, tak se na řádku 24 uloží do proměnné flag hodnota false, což reprezentuje stav, kdy načtené číslo není prvočíslem. Proměnná i se inkrementuje po iNumb/2 (viz. řádek 20 – for smyčka). Důvodem je fakt, že žádné celé kladné číslo nemůže být přece dělitelné beze zbytku číslem větším než je jeho polovina. Nenajde-li se tedy číslo, kterým je načtená hodnota testovaného čísla dělitelná beze zbytku, neuloží se do proměnné flag hodnota false, čili po ukončení v ní bude uložena hodnota true, což reprezentuje stav, kdy je načteno testované číslo prvočíslem. Na řádku 25 je uvedeno klíčové slovo break a to z toho důvodu, že v případě nalezení jednoho čísla, které dělí načtené testované číslo beze zbytku, není nutné hledat další dělitele. Testované číslo už prvočíslo totiž být nemůže a proto násilně ukončíme smyčku for, urychlíme program, který následně přejde až na řádek 30. Zde se už jen testuje hodnota v proměnné flag. Pokud je v této proměnné uložena hodnota true, tak se zapíše na výstup konzolové aplikace pomocí objektu cout informace o tom, že je načteno testované číslo prvočíslem (viz. řádek 32), pokud false tak informace, že prvočíslem není. Na řádcích 41 a 42 je již jen načítán vstup z konzolové aplikace pomocí objektu cin, což slouží k tomu, aby se hned program neukončil a byl zobrazen výsledek v okně konzole, dokud uživatel nezatlačí libovolná klávesa. Na řádku 44 vrací funkce main operačnímu systému hodnotu 0, která indikuje stav správného ukončení aplikace. Na řádku 45 je ukončeno tělo programu pravou programovou závorkou. Algoritmus, který jsem navrhl a implementoval v jazyce C++, není ještě optimální. Je však pro účely kurzu úrovně začátečník dostačující. Mezi prvočísly lze ještě sledovat určité vlastnosti, nebudu je však tomto bloku vzpomínat, abych příliš posluchače úrovně začátečník zbytečně nadměrně nezatížil. Optimální algoritmus však budu ještě publikovat a rozebírat v dalším bloku a v kurzu, který bude zaměřen i na matematiku. Autorem blogu je Marek Šurka, lektor online kurzů jazyka C++ na Learn2Code.
EU Code Week: Evropský týden programování
Události
06.10.2019
Skillmea

EU Code Week: Evropský týden programování

Ve dnech 5.–20. října 2019 vrcholí sedmý ročník Evropského týdne programování, tzv. EU Code Week. Dobrovolníci z řad učitelů, institucí a nadšenců z více než 70 zemí se budou snažit prostřednictvím aktivit představit nové vzdělávací možnosti a materiály, aby tak zvýšily zájem o programování a zatraktivnily jeho výuku. Proč se zapojujeme i my?Hodiny informatiky na základních a středních školách jsou ne vždy vedeny zábavnou a poutavou formou. Jen si vzpomeň na ty své. Digitální gramotnost se však pro uplatnění na trhu práce stává klíčovou a o tom, jakou roli by měla hrát ve vzdělávání není třeba vést diskuse. Něco o tom víme iv Learn2Code, kde se nás denně obracejí lidé s otázkou, kde s programováním začít. Proto jsme se i my s podporou spoločnosti Google opět staly součástí iniciativy EU Code Week, abychom podpořili digitální vzdělávání na školách a pomohli dětem rozvíjet znalosti a dovednosti, které jim pomohou realizovat nápady a usnadní orientaci v digitálním světě. Pokud se v něm totiž budou správně orientovat již nyní, budou lépe připraveni využívat jeho přínosů a čelit jeho nástrahám.[Image] Tento rok sa s Learn2Code vydáváme na východ Slovenska do Košic a okolí, kde se prostřednictvím workshopů budou moci děti na více základních školách seznámit s programováním v prostředí Scratch, který se díky své jednoduchosti výborně hodí pro výuku programování, vytváření interaktivních her a animací. Kromě Scratchu máme pro děti připraveny i zážitkové hodiny s roboty Ozoboty a programování her v jazyce JavaScript pro pokročilejší. Letos jsme spojili síly is leadership programem Teach for Slovakia a některé ukázkové hodiny zorganizujeme na školách zapojených do TfS. Pokud chceš vědět, jak to na takovém našem workshopu vypadá, můžeš si prohlédnout tento sestřih z roku 2016. Jak se můžeš zapojit?Evropský týden programování je nezávislá iniciativa dobrovolníků s podporou Evropské komise, do které se může zapojit kdokoli, tedy i ty. Můžeš být učitel, vést programátorský kroužek nebo se zkrátka dobrovolně angažovat v digitálním vzdělávání. Stačí, když uspořádáš programátorskou aktivitu #CodeWeek a přidáš ji na mapu na stránce codeweek.eu. Na stránce navíc najdeš návod a propagační materiály, které ti s realizací pomohou. Pokud si na něco podobného netroufáš, můžeš tuto akci podpořit i použitím hashtagu #codeweek. 
Lambda výrazy v Javě - část III.
Tipy a triky
03.10.2019
Skillmea

Lambda výrazy v Javě - část III.

Lambda a vnitřní anonymní třídyVelmi se nám žádá říci, že lambda výrazy jsou jen zkratky jak napsat vnitřní anonymní třídy. Ale pamatuj si, není tomu tak. Vypadá to podobně, ale lambda není implementace rozhraní. Lambda je sama osobě nezávislá jiná věc. Podívejme se na příklad. Namísto toho, abychom použili implementační třídu našeho rozhraní IHelloWord, vytvoříme si vnitřní anonymní třídu. IHelloWord helloWord3 = new IHelloWord() { @Override public void sayHello() { System.out.println("HelloWord impls inner anonymous class"); } };Všechny 3 možnosti, které mají jako návratovou hodnotu rozhraní IHelloWord můžeme podsunout do metody printHelloWord(IHelloWord helloWord). helloWord.printHelloWord(helloWord1); helloWord.printHelloWord(helloWord2); helloWord.printHelloWord(helloWord3); Jak to, jak to?Jak java ví, jaký má použít typ pro lamba výraz? Abychom tomu porozuměli, vytvoříme si novou třídu, kde budeme pracovat s lambda výrazem. Vytvořme si rozhraní, které bude mít jednu metodu, která bude vracet int a na vstupu bude také int. interface Nasob{ int nasob(int a); } Ako by vyerala implementácia tohto rozhrania? class NasobPiatimi implements Nasob{ public int nasob(int a){ return a*5; } }Nyní si navrhněme lambda výraz, který odpovídá dané metodě. Nepotřebujeme návratovou hodnotu int, neboť java umí na ni přijít sama a nepotřebujeme ani název metody a ani modifikátor přístupu public. Náš lambda výraz bude vypadat takto: (int a) -> a*5;Nyní použijte tento lambda výraz: public static void main(String[] args) { Nasob nasobPiatimi = (int a) -> a*5; System.out.println(nasobPiatimi.nasob(10)); }Na výstupu bude 50. V tomto příkladu se lambda tváří jako instance rozhraní Nasob. V předchozích příkladech, kdy jsme používali HelloWord, jsme takovou proměnnou vkládali jako parametr metody printHelloWord (HelloWord3 v IDEi). Namísto toho jsme mohli tuto lambdu vložit přímo do metody. helloWord.printHelloWord(() -> System.out.println("HelloWord impls lambda");); Java kompilátor vezme tento lambda výraz a podívá se kam jde. Jedná se o metody printHelloWord a podívá se, co akceptuje na vstupu. Akceptuje rozhraní HelloWord. Pokud lambda sedí s požadavkem, že dané rozhraní obsahuje jen jednu metodu a ta vrací void a na vstupu nemá žádný parametr, tak java řekne, že daná lambda je typu HelloWord. Toto se jmenuje Type inference. Java si sama zjistí typ. Teď, když víš jak java dokáže zjistit typy, vrátíme se k příkladu, který jsme začali psát v této kapitole. V našem příkladu umíme ještě více zkrátit zápis našeho lambda výrazu. Nasob nasobPiatimi = (int a) -> a*5; System.out.println(nasobPiatimi.nasob(10));Jelikož naše lamba jde do metody rozhraní, kterou známe interface Nasob{ int nasob(int a); } Tak vieme presne povedať aký typ má vstupný paramter metódy. Je to int. interface Nasob{ int nasob(int a); }Když to víme, tak nemusíme při psaní lambda výrazu znovu specifikovat typ vstupního parametru. Nasob nasobPiatimi = (a) -> a*5; A jelikož máme jen jeden parametr, nemusíme psát ani závorky. Násob napětí = a -> a*5; Už nebudeme nic mazat, neboť by nám už nic nezbylo 😃 Nyní můžeme napsat metodu, která bude na vstupu očekávat rozhraní Nasob a když ji použijeme, tak do ní vložíme na vstup náš lambda výraz. public static void printNasob(Nasob nasob){ System.out.println(nasob.nasob(10)); } public static void main(String[] args) { printNasob(a -> a*5); }V jevu mohli klidně vytvořit nový typ pro tyto lambda výrazy. Ale neudělali to a jedním z důvodů je i zpětná kompatibilita se starším kódem. Jak už víme, tak lambda výrazy můžeme použít všude tam, kde máme vyhovující rozhraní. Ve vnitřních anonymních třídách, v metodách kde je na vstupu interface a podobně. Příklad: HelloWord helloWord3 = new HelloWord() { @Override public void sayHello() { System.out.println("HelloWord impls inner anonymous class"); } }; HelloWord helloWord3 = () -> System.out.println("HelloWord impls inner anonymous class"); Při tomto musíme pamatovat, aby rozhraní byla jedno metodová nebo aby ostatní metody rozhraní byly default. A dané metody v rozhraních, aby se shodovaly s lambda výrazem. Takové rozhraní s jednou abstraktní metodou (metoda, která poskytuje popis ne implementaci) se nazývá Functional interface. Představ si, že používáš rozhraní, které má jen jednu metodu a používáš ho pro lambda výrazy. Nyní by někdo cizí přišel a do tohoto rozhraní by přidal další abstraktní metodu, přesněji její popis bez implementace. Takové rozhraní by již více nebylo functional interface a proto by se nemohlo použít pro lambda výraz a nastala by chyba - přestože rozhraní by bylo v pořádku. Třeba na to myslet a pokud chceme něco přidat do functional interfac, tak jen jako default metody. Abychom upozornili kohokoli, kdo by chtěl něco přidat do našeho rozhraní, tak máme možnost přidat anotaci @FunctionalInterface. K anotacím se ještě dostaneme, tak se nebojte. Nyní je důležité vědět, že je to pomůcka – tato pomůcka nám udělá to, že jakmile napíšeme další metodu do našeho rozhraní, tak nastane chyba. Danou anotaci nemusíme psát, ale je to super. @FunctionalInterface public interface HelloWord { void sayHello(); }Příklady na vyzkoušení: 1. vytvoř si seznam míst 2. setřiď seznam 3. napiš metodu, která vypíše vše ze seznamu míst 4. udělej si metodu, která vypíše jen ta města, která se skládají z jednoho slova nepoužívej při tom lambda výrazy Pokračování příště 👋 Články a online kurzy o Javě pro tebe připravuje Jaro Beňo.
ReactiveConf 2019: pátý ročník konference míří opět do Prahy
Události
24.09.2019
Katarína Kučáková

ReactiveConf 2019: pátý ročník konference míří opět do Prahy

Pátý ročník konference ReactiveConf 2019 míří do Prahy, aby opět přinesla přehled nejnovějších technologií z prostředí programování a software developmentu. Chceš odkrýt tajemství společností jako jsou Zeit, Google, Brave, Cypress a další? Co pro tebe letos organizátoři připravují? Čekají tě 3 nabité dny přednášek, workshopů, panelových diskusí, které zaklíní závěrečná párty. Tentokrát se organizátoři snažili přesáhnout rámec React, Angular or Vue a rozšířit diskusi na další prvky ekosystému jako jsou ReasonML, Elm, Clojure or Nuxt.js. Dva dny konference + festivalový denReactiveConf se koná od 30.října do 1.listopadu 2019 v prostorách Forum Karlin v centru Prahy. První dva dny jsou konferenční, na 4 stazích budou probíhat přednášky, panelové diskuse a tvz. lightnings talks (krátké několikaminutové přednášky a prezentace). Ze 60 speakerů zmiňme namakaného softwarového inženýra Davida Nolena, Briana Holta z Microsoftu se svou přednáškou o základech futuristického kódu a podobně. Třetí, festivalový den, je věnován především workshopům - čeká jich na tebe více než 15, program bude doplněn o přednášky a na závěr odstartuje afterparty, která se přehoupne až do dalšího dne. Pro koho je konference určena?Je určena pro tebe, pokud programuješ nebo se zajímáš o nové technologie. Poslechneš si novinky ze světa front- a back-endu, mobilních aplikací, mezitím můžeš u kávy a občerstvení networkovat. Letos se očekává více než 1300 účastníků. Kde sehnat lístky?Lístky seženeš přímo na stránce ReactiveConf až do 29.10. 2019. Pokud navíc při platbě zadáš kód "Learn2code", získat 20% slevu na individuální lístek.[Image]
4 nové online kurzy
Novinky
03.09.2019
Skillmea

4 nové online kurzy

Tento týden ti na Learn2Code přinášíme 4 nové kurzy, ve kterých jsme dali prostor několika novým tématům. Jsou to online kurzy zaměřené především na soft skills, zpestřením je určitě šachový kurz se slovenskou jedničkou Jánem Markošem. Zaujalo? Přečti si krátké představení kurzů v článku. Prezentační dovednosti - základyPokud i ty míváš roztřesená kolena vždy, když máš vystoupit na pódium nebo prezentovat svůj nápad před skupinou lidí, měl bys zaměřit pozornost na tento kurz. Nikdo jako řečník z nebe nespadl, i ty se máš možnost osvojit si a zdokonalit své prezentační dovednosti tak, abys při vystupování působil/a sebevědomě. Co máš dělat při vystupování s rukama, kam se dívat a jak pracovat s publikem ti vysvětlí Andrej Mažáry - lídr Slovenských Toastmasters (globální organizace věnující se řečnictví) a středoevropský šampion v řečnických improvizacích.   Jak přemýšlet při fotografováníV nabídce máme mnoho kurzů zaměřených na technickou stránku fotografie. Vytvořit dobrou fotku však není jen věcí kompozice a techniky, fotka by měla být nositelem příběhu, emoce, kterou chce fotograf zachytit. Učit se budeš od tří úspěšných a oceňovaných fotografů, kteří se věnují především dokumentární a reportážní fotografii. Každý z nich ti poskytne vlastní pohled na postupy a techniky, které při focení používají, jak pracují s objektem, s různými zdroji světla, prozradí ti kompoziční tipy a nápady. Kurz je určen tobě, máš-li už zvládnuté základy práce s fotoaparátem, možná uvažuješ nad focením jako svým živobytím a hlavně chceš tvořit fotky, které budou výjimečné.  Kurz podnikání - jak začítKurzem tě bude provázet osm zakladatelů a CEO úspěšných slovenských firem. Tím myslíme značky jako Tuli, CURAPROX, daren & curtis, VISIBILITY, Be Cool a další. V tutoriálech se s tebou podělí o své zkušenosti, Know-how a zodpoví důležité otázky, nad kterými možná uvažuješ i ty. Jak myšlenku přeměnit na realitu, nápad na fungující byznys? Jak umíš odhadnout jeho úspěch? Jakou roli hrají brand, firemní kultura či hodnoty firmy? Vysvětlí ti i plusy a minusy partnerství v podnikání, jak a kdy přijímat nové zaměstnance a co dělat, kdyby to celé nevyšlo. Šachy (Coming soon)Dlouholetá šachová jednička na Slovensku Ján Markoš odhaluje své šachové mistrovství. Uč se od něj o šachových strategiích, taktikách či síle jednotlivých figur. Objevíš strategické a taktické postupy, o kterých jsi možná dosud nevěděl. Kurz je určen mírně a středně pokročilým šachistou. Ať už rozehráváš šachové partie online nebo tváří v tvář, tento kurz tě dostane na vyšší úroveň. Našel jsi kurz, který tě zaujal a bude pro tebe přínosným? Pokud máš případně návrh na další témata kurzů, které bys v Learn2Code uvítal, napiš do komentáře.
Lambda výrazy v Javě - část II.
Tipy a triky
23.08.2019
Skillmea

Lambda výrazy v Javě - část II.

Typy lambda výrazůTento článek je pokračováním první části tutoriálu o Lambda výrazech. Vraťme se k našemu příkladu na začátku, kde jsme do metody vložili implementaci rozhraní a zavolali jsme metodu. Toto si teď zkusíme spolu předělat, tak abychom použili lamba výraz. HelloWord2. Přepište metodu implementace na lambda výraz. public void sayHello() { System.out.println("HelloWord impls"); } () -> System.out.println("HelloWord impls"); Znovu ta samá otázka, jaký typ má lamba výraz pokud ho chci přiřadit do proměnné? lambdaFunkcia = () -> System.out.println("HelloWord impls");Počkat! V Javě přece máme možnost jak deklarovat, jmenovat metody a tu použijeme. Tou možností je použít rozhraní. 1. vytvoření rozhraní s jednou deklarací metody 2. vytvoření metody, která odpovídá našemu lambda výrazu 1. v našem případě nemá žádné argumenty a návratová hodnota je void  Pokud bychom vytvořili rozhraní, kde budeme uvádět několik metod, tak to bude chyba. Jedině pokud budou default - tedy implementovány. Viz sekci o rozhraních. ILambda lambdaFunkcia = () -> System.out.println("HelloWord impls"); … public interface ILambda { void metoda(); // void metoda2(String s); // bude error } Použijme lambda výraz s bezpečným dělením. Napišme si k tomu interface a proměnnou: bezpecneDelenieFunkcia = (int a, int b) -> { if(b==0) { return 0 ; } return a/b; }; public static void main(String[] args) { Hocijako hocijako = (int a, int b) -> { if(b==0){ return 0; } return a/b; }; double d = hocijako.hocico(10, 2); System.out.println(d); } interface Hocijako{ double hocico(int x, int y); }Tady si můžeme říci, že název rozhraní a název metody v rozhraní není důležitý. Důležité je, aby seděly vlastnosti. Tedy rozhraní má jen jednu metodu (mimo default metod) a metodě sedí typ návratové hodnoty a parametry metody. Implemetační třídu už tedy nepotřebujeme, neboť jakoby implementací je lambda výraz. Můžu si to nechat, pokud to potřebuji takto používat, ale v našem případě nepotřebuji implementační třídu. Lambda výraz se chová jako implemtnace rozhraní. Ale není to implementace. Tento příklad bude fungovat: HelloWord3 helloWord = new HelloWord3(); IHelloWord helloWord1 = new HelloWordImpl(); IHelloWord helloWord2 = () -> System.out.println("HelloWord impls lambda"); helloWord1.sayHello(); helloWord2.sayHello();Na výstupu bude: HelloWord impls HelloWord impls lambda Pokračování příště 😗 Mrkni prozatím moje kurzy o Java programování nebo videa, která máme na Youtube.
Tipy, triky a chyby v jazyce C++ pro začátečníky
Tipy a triky
04.08.2019
Skillmea

Tipy, triky a chyby v jazyce C++ pro začátečníky

Tímto článkem bych vám chtěl představit zajímavé tipy a triky v jazyce C++, které byste mohli použít ve vašem kódu. Jsou velmi jednoduché, protože jsou určeny pro začátečníky. Navíc bych vás chtěl upozornit na některé často se opakující chyby, které se ve vašem kódu mohou na začátku vyskytovat. Nejedná se o chybu v pravém slova smyslu, tedy ne takovou, po které by byl váš kód nepřeložitelný, spíše se jedná o obroušení vašeho programátorského stylu, či vytvoření takového kódu, který bude rychle vykonáván. Poslední zmíněnou vlastnost dosáhnete s C++ snadno, protože kódy, které navrhnete v C++ se provedou mnohem rychleji než ty, které navrhnete v jiných jazycích. Umím programovat ve více jazycích a proto to mám skutečně odzkoušené. Pamatujte, že C++ to však neprovede za vás, protože i tam lze vytvořit velmi špatný kód. Záměrně se použil termín špatný, ačkoli není odborný. Myslím tím kód, ve kterém špatným stylem a technikou nedosáhnete požadavků, které se na kód kladou. Příkladem může být právě rychlost provádění spustitelného kódu, jeho přehlednost či snadná udržovatelnost. V následujících řádcích vám to na pár příkladech ozřejmím. Příklady tipů, triků a chybJistě jste se již v programování pokoušeli naprogramovat jednoduché matematické operace. Mějme tedy následující kód: #include <iostream> int main() { int a; int b = -1; int c; int d = 4; int e = 2; int f = 3; int g; a = b + c; d = e - f; g = a * d; std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }Nejprve bych se vás chtěl zeptat, jestli se vám takto napsaný kód na první pohled líbí. Myslím tím po koncepční stránce. První chybou je, že začínající programátoři neodsazují bloky kódu. Tak například tento kód by se dal pěkně odsadit pomocí následujících pravidel. Oddělte direktivy preprocesoru od hlavičky funkci main(). Oddělte deklarace a definice proměnných od zbytku kódu. Někdy, když budete používat mnoho proměnných, můžete také jednotlivé deklarace proměnných uspořádat do logických celků. Můžete vytvořit bloky kódu podle typu proměnné. Navíc jazyk C++ vám umožňuje deklarovat a inicializovat proměnnou na místě, kde to skutečně potřebujete, tedy předtím, než ji použijete. Dále, v tomto kódu oddělte nosnou část kódu a to vytvořte blok kódu, kde se provádějí jednotlivé matematické operace. Nakonec, oddělte zápis na obrazovku a také načtení ze vstupu klávesnice. Potom už jen oddělíte klíčové slovo return s jeho návratovou hodnotou. Po zmíněných úpravách vám vznikne čitelný kód, který vypadá následovně: #include <iostream> int main() { int a; int b = -1; int c; int d = 4; int e = 2; int f = 3; int g; a = b + c; d = e - f; g = a * d; std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }Když se dále podíváme na kód, můžeme některé deklarace umístit na jeden řádek. Konkrétní provedení nechám na vás, ale já bych doporučoval deklarovat na jednom řádku proměnné, které se neinicializují hned na začátku současně s deklarací. Na druhý řádek bych umístil proměnné, které se inicializují současně s deklarací. Takto získáte ještě větší přehled v kódu a ušetříte 4 řádky kódu. Kód bude vypadat následovně: #include <iostream> int main() { int a, c, g; int b = -1, d = 4, e = 2, f = 3; a = b + c; d = e - f; g = a * d; std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; }Nyní přejdeme ke zmiňované rychlosti. Je mi jasné, že při tak krátkém kódu ušetříme relativně málo času, ale kdyby se nosná část kódu, tedy tři matematické operace s přiřazováním, prováděly v cyklu například. 1 000 000 krát, viděli byste zaručeně rozdíl. V uvedeném příkladu není nutné použít 7 proměnných a výsledek vyhodnocovat na třikrát. Výsledky b + c a e - f se vynásobí a přiřadí do další proměnné. Tak, jak to je naprogramováno, je to zbytečné. Zkuste vše vyhodnotit jako jeden výraz a přiřadit na jednom řádku. Vznikne nám kód, který bude mít o dva řádky méně a bude provádět totéž. A v čem je vlastně problém. No v operátoru přiřazení. Tato operace je příliš časově náročná. V podstatě se musí přesunout hodnota proměnné uložená na jednom paměťovém místě do paměťového místa, které je určeno pro jinou proměnnou. A po kurzu už víte, že počítač zná jen 0 a 1. Organizačně existuje nejméně jeden bajt. Nezmiňoval jsem sice, co je zásobník, ale když se pohybujeme v jeho paměti, trvá to ještě déle. Vraťme se ale zpět, po úpravě bude kód vypadat následovně: #include <iostream> int main() { int g; int b = -1, d = 4, e = 2, f = 3; g = (b + c) * (e - f); std::cout << "g = " << std::endl; std::cin.get(); std::cin.get(); return 0; } A pojďme ještě dál. K čemu vůbec v tomto kódu používáme proměnné, když je nenačítáme ze vstupu. Výsledek kombinace matematických operací můžeme přece zapsat rovnou na obrazovku, aniž bychom hodnoty přiřazovali do proměnných. Odstraníme tím i deklarace. Po konečné úpravě, bude kód vypadat následovně: #include <iostream> int main() { std::cout << "res = " << (-1 + 4) * (2 - 3) << std::endl; std::cin.get(); std::cin.get(); return 0; }Závěrem bych tedy znovu chtěl zdůraznit, jak jsou programátorský styl a technika důležité. Vidíte, že z 18 řádkového kódu, který jsme získali odsazením původního kódu, nám po několika úpravách zůstal kód, který má 8 řádků. A tento kód, ačkoli je malý, je laicky řečeno, pěkný. To znamená, že se jeho spustitelný kód provede rychle, je přehledný a snadno udržovatelný. Autorem blogu je Marek Šurka, který má na Learn2Code online kurz C++ pro začátečníky.
7 otázek na nového lektora Marka Šurku
Rozhovory
25.07.2019
Skillmea

7 otázek na nového lektora Marka Šurku

Dnes ti představíme člověka, díky kterému můžeš na Learn2Code nově studovat i programovací jazyk C++. Náš nový lektor Marek Šurka alias Kamas se jazyku C++ věnuje již od svých 20 let a v kurzu tě provede od jeho úplných základů až ke složitějším technikám. Proč se rozhodl vytvořit kurz programování a jak se k jazyku C++ vůbec dostal? Dozvíš se v rozhovoru!👇[Image] Proč ses rozhodl pro vytvoření kurzu ve spolupráci s Learn2Code?V podstatě jsem už dlouho hledal způsob, jak předávat své zkušenosti s programováním dál. V Learn2Code jsem našel ideální řešení. Mluvím právě o online kurzech, které můžete absolvovat pohodlně kdekoli, v jakémkoli čase a v dávkách, které si sami určíte. Já se tak také jako lektor nemusím omezovat na konkrétní čas a místo. Co se lidé naučí ve tvém online kurzu?V kurzu lidé získají první zkušenosti s jazykem C++. Není to však rychlokurz, během kterého se člověk naučí všechno o C++. Výstupní znalosti jsou na úrovni začátečníka, protože jsem se snažil jít víc do hloubky.   Najdete tam informace z programování a matematiky. Plánuji postupně doplnit toto téma, protože programování v jazyce C++ není totiž téma na jeden, dva kurzy. [Image] Kde a na jaké pozici v současnosti pracuješ?Pracuji jako programátor-analytik ve společnosti, která se věnuje automatizaci a diagnostice. Dlouhodobě pracuji na projektu, kde se věnuji robotice a programování průmyslových svařovacích robotů. Vyvíjím Frontend i Backend. A baví mě to :) Jak ses k programování a jazyku C++ dostal?Už na střední škole jsem se setkal s jazykem Turbo Pascal, v rámci jednoho předmětu jsme dokonce programovali mikroprocesory v jazyce Assembler. Musím se přiznat, na začátku mi to moc nešlo. Nakopl mě až programovací kroužek a nejvíc mi dala vysoká škola, kde jsem totálně drtil jazyk C++ a SQL. [Image] Co tě baví na tvé práci?I když možná nebudou všichni souhlasit, programování je i tvůrčí činnost, sám se neustále vzdělávám a učím a jen taková práce má pro mě smysl. Dnes je obrovská poptávka po programátorech. Co bys poradil všem, kdo nemají žádné zkušenosti, ale chtěli by nějak začít?Aby se nevzdávali a byli draví. Nikdo není na začátku expert. Ani Jazyk C++ se nedá teoreticky naučit na úroveň expert, to chce praxi. Hlavně doporučuji, aby byli lidé sami hladoví po znalostech. Nejlépe se něco naučíte, když vás to baví. Jsou lidé, kteří jsou výjimečně talentovaní, ale nebaví je programovat. Daleko více dosáhne méně nadaného člověka, jehož programování zajímá. Potom se učí s lehkostí. Jednoduše programujte, čtěte, dívejte kurzy, diskutujte na fórech, srovnávejte. Učíte se pro sebe. [Image] A čemu se věnuješ ve volném čase?Věnuji se manželce a dceři, chodíme na výlety. Je to nezbytné, když člověk každý den pracuje s počítačem. Kromě toho rád čtu, nejvíce odbornou literaturu. Rád se učím. A snažím se sportovat. Nejraději mám plavání a hokej, kterému se amatérsky věnuji. Marek, děkujeme za rozhovor. Líbil se ti rozhovor? Věnuj mu 👍 Pokud máš na Marka nějakou otázku, napiš ji dolů do komentáře 👇   Pokud chceš zjistit více o Marekovém kurzu C++ elementary, zkoukni intro do online kurzu!