Zpět na blog
Tipy a triky

5 zdrojů pasivního příjmu pro designéry

Skillmea
02.11.2021
6 minut čtení
5 zdrojů pasivního příjmu pro designéry
V tomto článku ti ukážeme možnosti, jak vydělávat víc a generovat pasivní příjem. Diverzifikace zdrojů příjmu je dobrá strategie. Dnes ti přiblížíme 5 způsobů, díky kterým můžeš jako kreativec vedle svého hlavního zaměstnání vydělávat víc. Každý pasivní příjem zahrnuje úvodní investici. Tou může být čas, námaha a úsilí, peníze nebo kombinace všech prvků. Začněme pěkně popořádku.

1. Vytvářej a prodávej designové templaty / šablony

Jednou z nejpopulárnějších strategií pasivního příjmu, kterou designéři rádi využívají, je prodej různých hotových designových vzorů online. Pokud o tom přemýšlíš, mnoho nedesignérů nebo začínajících designérů pravidelně hledá hotové šablony pro různé využití od social media, přes newslettery až po design webstránek. Zkus vytvářet šablony, které jsou univerzální a využitelné širokospektrální, například:
  • vizitky,
  • různé mockupy,
  • design webstránek s různým zaměřením,
  • prezentace,
  • fotografie a ilustrace,
  • životopisy,
  • další.
Templaty mžeš prodávat na různých portálech (marketplace) jako jsou například Shutterstock, Adobe Stock, iStock, ale i Canva nedávno spustila svůj marketplace.

2. Sdílej své znalosti

Jako designér máš určitě mnoho vědomostí a zkušeností, o které se můžeš podělit. Určitě budeš mít dobrý pocit, když pomůžeš začínajícím designérům sdílením svých cenných poznatků a zároveň tím umíš vydělat peníze navíc. Jak sdílet své znalosti? Můžeš zorganizovat workshop či školení, napsat knihu (ebook), vytvořit online kurz nebo mentorovat designéry začátečníky. 
Samozřejmě, budeš muset investovat čas do přípravy a vytvoření těchto vzdělávacích zdrojů, ale když je zpřístupníš, z dlouhodobého hlediska se mohou stát zajímavým zdrojem příjmu.

3. Prodávej vlastní nástroje a assety

Mezi tyto nástroje a assety můžeme zařadit například ilustrace, PSD zdrojáky, fonty, textury, gridy, UI kity a mnoho dalšího. Jiní designéři se mohou zajímat o tyto zdroje a budou je chtít použít ve svých vlastních designových výtvorech. Pro tebe půjde o ideální pasivní příjem, protože sice vynaložíš čas na vytvoření digitálních produktů, ale potom je budeš prodávat znovu a znovu. Začít je jednoduché, existuje několik stránek, kde můžeš svá díla prodávat, například Envato Market, Vecteezy, Creative Market a další.

4. Navrhuj a prodávej merch

Prodej vlastního zboží je zajímavý zdroj příjmu zvláště pokud už máš dostatečně velké publikum, které tě sleduje. Nejprve se tedy pověnuj budování svého brandu a followerů. Prodej merchu je v současnosti poměrně jednoduchý, využij mezinárodní služby jako Printify nebo lokální GoMerch. Pokud už máš spoustu sledovatelů, za zvážení stojí i rozjet Patreon či jiné formy monetizování obsahu, například přes affiliate marketing nebo různé referral programy.

5. Vytvoř členskou webstránku

Pokud to s budováním dlouhodobého online podnikání myslíš vážně, skvělou možností je vytvoření členské webové stránky. Může to být výhodné zejména tehdy, když už máš například blog a hledáš způsob, jak ho zpeněžit.
Členská webstránka bude účtovat poplatek (obvykle je na měsíční nebo roční bázi) za přístup k prémiovému obsahu. Obsahem mohou být cokoli od designových návodů, zdroje ke stažení nebo jiný zajímavý obsah pro designéry. Případně se zaměř na úplně jiný typ uživatelů a nabídni jim přidanou hodnotu, za kterou jsou ochotni platit.
Není snadné začít a chvíli trvá, než se stránka rozjede a vybuduješ ji, ale pokud se tomu budeš věnovat dlouhodobě, může to být skvělá volba.

Tipy na závěr

Je dobré vědět, co je tvou motivací při tvorbě těchto vedlejších projektů. Pokud jsou to jen peníze, přistupuj k tvorbě organizovaněji as obchodním myšlením, vyber si vedlejší projekt s potenciálem tvorby příjmu.

Mysli i na časovou stránku věci a snaž se udělat si realistický odhad času, který můžeš vedlejším projektům věnovat. Máš na to pár hodin každý týden, nebo je to spíše sporadický volný čas? Před zahájením projektu je tedy dobré zvážit množství času, které máš k dispozici.
Určete ber v úvahu i průběžné požadavky, které také mohou spolknout nějakou porci času a námahy. Obecně by se dalo říci, že grafika, tiskoviny či e-knihy jsou dobré pro designéry, kteří neočekávají, že budou muset investovat mnoho času na průběžnou podporu a servis. A věci jako šablony, pluginy, blogy, komunitní webové stránky nebo online kurzy mají sice potenciál vysokého příjmu, ale na druhé straně vyžadují i ​​potřebu intenzivnější podpory.
Skillmea
🥇 Sme jednotka v online vzdelávaní na Slovensku.
Na našom webe nájdeš viac ako 300 rôznych videokurzov z oblastí ako programovanie, tvorba hier, testovanie softwaru, grafika, UX dizajn, online marketing, MS Office a pod. 
Vyber si kurz, ktorý ťa posunie vpred ⏩

Mohlo by tě zajímat

Změna oblohy na fotkách ve Photoshopu jediným klikem
Tipy a triky
11.03.2021
Ľudovít Nastišin

Změna oblohy na fotkách ve Photoshopu jediným klikem

Standardní postup při změně oblohy na fotkách vyžaduje jistou zručnost ve výběrech a maskování. Ovšem s novým Photoshopem je na scéně také velmi zajímavá funkce, která tyto časově náročné postupy sloučila v podstatě do jediného kliknutí. Mluvíme o „Sky Replacement Tool“, který najdeme ve Photoshopu 2021. V tomto článku se na tuto funkci podíváme a ukážeme si to i na příkladu. Sky Replacement najdeme v edit>Sky Replacement. Ihned po otevření této funkce začne software automaticky analyzovat obrázek.[Image] Okamžitě poté si sám vytvoří na daném obrázku masku oblohy a vymění ji za jinou. Jediným klikem. Tento nástroj využívá Adobe Sensei (umělou inteligenci společnosti Adobe). Je to něco podobného jako funkce „Select and Mask“, která je v posledních verzích Photoshopu také velmi kvalitní.   Asi to nebudeš využívat každý den, ale čas od času se takový úkol objeví. A tehdy je dobré o tomto nástroji vědět, neboť si ušetříš čas. Nastavení nástroje "Sky Replacement"Je to sice výměna oblohy na jeden klik, ale většinou to třeba trošku doladit. Nejprve si zvolíš obrázek oblohy z nabídky nástroje, které jsou ve třech složkách: Blue Skies, Spectacular a Sunsets. Máš samozřejmě možnost importovat si tam svoji vlastní oblohu. Stačí kliknout na ozubené kolečko v pravém horním rohu a najít možnost „Import Skies“ nebo přes ikonku + a nahrát si oblohu jako .jpeg soubor.[Image] Máme zde i další nastavení, o kterých je třeba si něco říct. Shift Edge – přes tento slider si umíš doladit okraje výběru a zbavit se tak případných nedotažených míst, která Photoshop až tak dobře nezvládl. Refine Edge Brush – pro případ, že tvou pozornost vyžaduje jen nějaká malá část výběru, máš k dispozici i známý nástroj z balíku „Select and mask“, kterým také umíš dotáhnout případné nedokonalosti. Fade Edge – tento nástroj umožňuje vytvořit jemnější přechod při horizontu obrázku. Photoshop ale většinou udělá robotu velmi dobře a další úpravy okrajů nejsou zvláště potřebné. Temperature, Brightness a Scale – tyto nástroje upravují již samotnou oblohu. Většinou je třeba doldit je barevnost, případně je příliš tmavá či světlá. Nebo je nutné oblohu zvětšit aby seděla s horizontem fotky. Všechno to lze upravit v těchto Sky Adjustments úpravách. Foreground Adjustments – máme možnost doladit barevně i samotný obrázek mimo oblohu tak, abychom celou kompozici co nejvíce sjednotili.[Image] Když jsi s výsledkem spokojen, je třeba si ještě stanovit, jakým způsobem se má tato úprava aplikovat do obrázku. Je zde možnost duplikovat vrstvu nebo output do nových vrstev. Skvělé je, že tento nástroj je nedestruktivní. Pokud si vybereš si vybereš output do nových vrstev, celá úprava se zobrazí ve klasické vrstvě s maskou a spolu s adjustment vrstvami. Takto máš plnou kontrolu nad výsledkem a přípravu pro další modifikace této kompozice. Jsou však situace, kdy ti Sky Replacement pomůže jen částečně. Jednou z takových může být situace, kdy se snažíš vyměnit oblohu na obrázku s vodní hladinou. A ta bude stále odrážet původní oblohu. V takovém případě bude třeba tento odraz vyřešit manuálně. Výhodou však je, že většinu potřebných masek vrstev už z tohoto nástroje máš. Sky replacement tool je podle nás skvělý nástroj ai když jej nebudeš používat každý den, v té pravé chvíli ti pomůže. Jeho ukázku se podívej i na tomto videu, ve kterém jsme si pohráli se známou bratislavskou scenérií. Vyměnili jsme oblohu a odstranili všechny postavy. A všechno nám to zabralo jen pár minut.
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.

Nezmeškej info o nových kurzech a speciálních nabídkách