Späť na blog
Tipy a triky

5 zdrojov pasívneho príjmu pre dizajnérov

Skillmea tím
02.11.2021
5 minút čítania

V tomto článku ti ukážeme možnosti, ako zarábať viac a generovať pasívny príjem. Diverzifikácia zdrojov príjmu je dobrá stratégia. Dnes ti priblížime 5 spôsobov, vďaka ktorým môžeš ako kreatívec popri svojom hlavnom zamestnaní zarábať viac. Každý pasívny príjem zahŕňa úvodnú investíciu. Tou môže byť čas, námaha a úsilie, peniaze alebo kombinácia všetkých prvkov. Začnime pekne poporiadku.

1. Vytváraj a predávaj dizajnové templaty / šablóny

Jednou z najpopulárnejších stratégií pasívneho príjmu, ktorú dizajnéri radi využívajú, je predaj rôznych hotových dizajnových vzorov online. Ak o tom premýšľaš, veľa nedizajnérov alebo začínajúcich dizajnérov pravidelne hľadá hotové šablóny na rôzne využitie od social media, cez newslettre až po dizajn webstránok. Skús vytvárať šablóny, ktoré sú univerzálne a využiteľné širokospektrálne, napríklad:

  • vizitky,
  • rôzne mockupy,
  • dizajn webstránok s rôznym zameraním,
  • prezentácie,
  • fotografie a ilustrácie,
  • životopisy,
  • ďalšie.

Templaty môžeš predávať na rôznych portáloch (marketplace) ako sú napríklad Shutterstock, Adobe Stock, iStock, ale aj Canva nedávno spustila svoj marketplace.

2. Zdieľaj svoje znalosti

Ako dizajnér máš určite mnoho vedomostí a skúseností, o ktoré sa môžeš podeliť. Určite budeš mať dobrý pocit, keď pomôžeš začínajúcim dizajnérom zdieľaním svojich cenných poznatkov a zároveň tým vieš zarobiť peniaze navyše. Ako zdieľať svoje znalosti? Môžeš zorganizovať workshop či školenie, napísať knihu (ebook), vytvoriť online kurz alebo mentorovať dizajnérov začiatočníkov.

Samozrejme, budeš musieť investovať čas do prípravy a vytvoreniu týchto vzdelávacích zdrojov, ale keď ich sprístupníš, z dlhodobého hľadiska sa môžu stať zaujímavým zdrojom príjmu.

3. Predávaj vlastné nástroje a assety

Medzi tieto nástroje a assety môžeme zaradiť napríklad ilustrácie, PSD zdrojáky, fonty, textúry, gridy, UI kity a mnoho ďalšieho. Iní dizajnéri sa môžu zaujímať o tieto zdroje a budú ich chcieť použiť vo svojich vlastných dizajnových výtvoroch. Pre teba pôjde o ideálny pasívny príjem, nakoľko síce vynaložíš čas na vytvorenie digitálnych produktov, ale potom ich budeš predávať znovu a znovu. Začať je jednoduché, existuje viacero stránok, kde môžeš svoje diela predávať, napríklad Envato Market, Vecteezy, Creative Market a ďalšie.

4. Navrhuj a predávaj merch

Predaj vlastného tovaru je zaujímavý zdroj príjmu najmä ak už máš dostatočne veľké publikum, ktoré ťa sleduje. Najskôr sa teda povenuj budovaniu svojho brandu a followerov. Predaj merchu je v súčasnosti pomerne jednoduchý, využi medzinárodnú službu ako Printify alebo lokálny GoMerch. Ak už máš veľa sledovateľov, za zváženie stojí aj rozbehnúť Patreon či iné formy monetizovania obsahu, napríklad cez affiliate marketing alebo rôzne referral programy.

5. Vytvor členskú webstránku

Ak to s budovaním dlhodobého online podnikania myslíš vážne, skvelou možnosťou je vytvorenie členskej webovej stránky. Môže to byť výhodné najmä vtedy, ak už máš napríklad blog a hľadáš spôsob, ako ho speňažiť.

Členská webstránka bude účtovať poplatok (zvyčajne je na mesačnej alebo ročnej báze) za prístup k prémiovému obsahu. Obsahom môžu byť čokoľvek od dizajnových návodov, zdroje na stiahnutie alebo iný zaujímavý obsah pre dizajnérov. Prípadne sa zameraj na úplne iný typ používateľov a ponúkni im pridanú hodnotu, za ktorú sú ochotní platiť.

Nie je ľahké začať a chvíľu trvá, kým sa stránka rozbehne a vybuduješ ju, ale ak sa tomu budeš venovať dlhodobo, môže to byť skvelá voľba.

Tipy na záver

Je dobré vedieť, čo je tvojou motiváciou pri tvorbe týchto vedľajších projektov. Ak sú to len peniaze, pristupuj k tvorbe organizovanejšie a s obchodným myslením, vyber si vedľajší projekt s potenciálom tvorby príjmu. 

Mysli aj na časovú stránku veci a snaž sa spraviť si realistický odhad času, ktorý môžeš vedľajším projektom venovať. Máš na to pár hodín každý týždeň, alebo je to skôr sporadický voľný čas? Pred začatím projektu je teda dobré zvážiť množstvo času, ktoré máš k dispozícii. 

Určite ber do úvahy aj priebežné požiadavky, ktoré tiež môžu zhltnúť nejakú porciu času a námahy. Vo všeobecnosti by sa dalo povedať, že grafika, tlačoviny či e-knihy sú dobré pre dizajnérov, ktorí neočakávajú, že budú musieť investovať veľa času na priebežnú podporu a servis. A veci ako šablóny, pluginy, blogy, komunitné webové stránky alebo online kurzy majú síce potenciál vysokého príjmu, ale na druhej strane vyžadujú aj potrebu intenzívnejšej podpory.

Skillmea tím

Sme jednotka v online vzdelávaní na Slovensku.

Na našom webe nájdeš viac ako 260 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 ťa zaujímať

Tipy a triky
11.03.2021
Ľudovít Nastišin

Zmena oblohy na fotkách vo Photoshope jediným klikom

Štandardný postup pri zmene oblohy na fotkách si vyžaduje istú zručnosť vo výberoch a maskovaní. Avšak s novým Photoshopom je na scéne aj veľmi zaujímavá funkcia, ktorá tieto časovo náročné postupy zlúčila v podstate do jediného kliknutia. Hovoríme o „Sky Replacement Tool“, ktorý nájdeme vo Photoshope 2021.  V tomto článku sa na túto funkciu pozrieme a ukážeme si to aj na príklade. Sky Replacement nájdeme v edit>Sky Replacement. Ihneď po otvorení tejto funkcie začne softvér automaticky analyzovať obrázok. Okamžite potom si sám vytvorí na danom obrázku masku oblohy a vymení ju za inú. Jediným klikom. Tento nástroj využíva Adobe Sensei (umelú inteligenciu spoločnosti Adobe). Je to niečo podobné ako funkcia „Select and Mask“, ktorá je v posledných verziách Photoshopu taktiež veľmi kvalitná. Asi to nebudeš využívať každý deň, no čas od času sa takáto úloha objaví. A vtedy je dobré o tomto nástroji vedieť, lebo si ušetríš čas. Nastavenie nástroja "Sky Replacement"Je to síce výmena oblohy na jeden klik, no väčšinou to treba trošku doladiť. Najprv si zvolíš obrázok oblohy z ponuky nástroja, ktoré sú v troch priečinkoch: Blue Skies, Spectacular a Sunsets. Máš samozrejme možnosť importovať si tam svoju vlastnú oblohu. Stačí kliknúť na ozubené koliesko v pravom hornom rohu a nájsť možnosť „Import Skies“ alebo cez ikonku + a nahrať si oblohu ako .jpeg súbor. Máme tu aj ďalšie nastavenie, o ktorých si treba niečo povedať. Shift Edge – cez tento slider si vieš doladiť okraje výberu a zbaviť sa tak prípadných nedotiahnutých miest, ktoré Photoshop až tak dobre nezvládol. Refine Edge Brush – pre prípad, že si tvoju pozornosť vyžaduje len nejaká malá časť výberu, máš k dispozícii aj známy nástroj z balíka „Select and mask“, ktorým tiež  vieš dotiahnuť prípadné nedokonalosti. Fade Edge – tento nástroj umožňuje vytvoriť jemnejší prechod pri horizonte obrázka. Photoshop ale väčšinou urobí robotu veľmi dobre a ďalšie úpravy okrajov nie sú zvlášť potrebné. Temperature, Brightness a Scale – tieto nástroje upravujú už samotnú oblohu. Väčšinou treba doldiť  je farebnosť, prípadne je príliš tmavá či svetlá. Alebo je nutné oblohu zväčšiť aby sedela s horizontom fotky. Všetko to sa dá upraviť v týchto Sky Adjustments  úpravách. Foreground Adjustments – máme možnosť doladiť farebne aj samotný obrázok mimo oblohy tak, aby sme celú kompozíciu čo najviac zjednotili. Keď si s výsledkom spokojný, je treba si ešte stanoviť, akým spôsobom sa má táto úprava aplikovať do obrázka. Je tu možnosť duplikovať vrstvu alebo output do nových vrstiev. Skvelé je, že tento nástroj je nedeštruktívny. Ak si vyberieš si vyberieš output do nových vrstiev, celá úprava sa zobrazí vo klasickej vrstve s maskou a spolu s adjustment vrstvami. Takto máš plnú kontrolu nad výsledkom a prípravu pre ďalšie modifikácie tejto kompozície. Sú však situácie, kedy ti Sky Replacement pomôže len čiastočne. Jednou z takých môže byť situácia, kedy sa snažíš vymeniť oblohu na obrázku s vodnou hladinou. A tá bude stále odrážať pôvodnú oblohu. V takom prípade bude potrebné tento odraz vyriešiť manuálne. Výhodou však je, že väčšinu potrebných masiek vrstiev už z tohto nástroja máš. Sky replacement tool je podľa nás skvelý nástroj a aj keď ho nebudeš používať každý deň, v tej pravej chvíli ti pomôže. Jeho ukážku si pozri aj na tomto videu, v ktorom sme sa pohrali so známou bratislavskou scenériou. Vymenili sme oblohu a odstránili všetky postavy. A všetko nám to zabralo len pár minút.
Tipy a triky
30.10.2019
Skillmea tím

Lambda výrazy v Jave - časť IV.

Funkcionálne rozhraniaAk chcem používať lambda výraz, tak potrebujem na to rozhranie s jednou abstraktnou metódou. Daná metóda musí odpovedať popisu nášho lambda výrazu. Ak sa nad tým zamyslíš, tak v skutočnosti sa dané rozhranie môže volať hocijako. Na názve nezáleží. A aj metóda v tom rozhraní môže mať hocijaký názov, pre logiku lambda výrazu to nemá žiaden zmysel. Jediné, čo je dôležité je, aby metóda sedela s lamba výrazom v tom, čo vracia a to, čo je na vstupe metódy ako parameter. Bolo by úplne super, keby sme nemuseli vždy pri písaní lambda výrazu riešiť vytvorenie nového rozhrania, ktoré nám bude slúžiť ako typ daného lambda výrazu. Čo povieš? Povedali sme, si, že java nevytvorila nový typ pre lambdy. Pri písaní, sme si mohli všimnúť, že metódy sú často podobné. Vraciam nejaký typ alebo vraciam void a mám tam názov metódy tam sú alebo nie sú parametre. Sú tu nejaké paterny, nejaké vzorce, ktoré sa opakujú častejšie. Java nám ponúka niekoľko takých rozhraní, ktoré môžeme kľudne použiť. Tieto rozhrania sú v balíčku java.util.function. V tomto balíku je mnoho pred pripravených rozhraní, ktoré môžeš používať. Tieto rozhrania používajú generiká, tak si tam vieš dosadiť objekty aké potrebuješ. Napríklad Predicate je presne stvorený na to, ak potrebujeme zobrať na vstupe objekt a vrátiť boolean ako návratovú hodnotu. Takto môžeme použiť toto rozhranie namiesto toho rozhrania, čo sme si sami napísali, keď sme riešili predchádzajúcu úlohu. Ako ošetriť výnimky Spravme si príklad, ktorý bude obsahovať zoznam osôb, ktoré budem spracovávať – vypíšeme ich mená a dáme ich na veľké písmená. 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()); } } } Prepíšeme si to na lambda výraz. Náš kód, ktorý chceme metóde predať ako argument je System.out.println(osoba.getMeno().toUpperCase()). Pracujem teda len s objektom osoba. Výsledok napíšem na konzolu. Tým pádom mám jeden argument a tento kus kódu nevracia žiadnu hodnotu. Budeme na to potrebovať funkcionálne rozhranie, ktoré má metódu s jedným parametrom a nevracia nič. Takým je Consumer s jeho metódou 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); } } } Teraz si náš zoznam osôb zmením tak, že namiesto mien dám do zoznamu null. Pri spracúvaní 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šetriť túto výnimku. Ako na to? Jedným zo spôsobov je obaliť volanie 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 škaredé riešenie. To čo príde do consumer môže byť všeličo možné a nemusí to dať NullPointerException, možno to bude iná výnimka. Náš kód chceme mať jednoduchší. Druhou možnosťou je, aby bola výnimka spracovaná priamo v lamba výraze. 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); } } }Dosiahol som to, že metóda processOsoby je krajšia, ale náš lambda výraz je teraz viacriadkový a nie pekný - jednoriadkový. Na jednej strane chceme mať pekné jednoduché lambda výrazy, na druhej strane chceme, aby bolo postarané o výnimky. V našom kóde sa vráťme k riešeniu, ktoré nepoužíva try catch blok. Na odchytenie výnimky použijeme wrapper metódu. Try catch blok si vyvedieme do osobitnej metódy a potom obalíme náš lambda výraz, ďalším lambda výrazom, ktorý má try catch blok. Urobme to, čo som teraz napísal. Vytvoríme si novú metódu, ktorá bude akceptovať lambda výraz. V našom prípade sme na to použili Consumer rozhranie. A keďže je to wrapper, tak to čo mi príde na vstup tak dám aj na výstup. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return consumer; }V metóde processOsoby(osoby, osoba -> System.out.println(osoba.getMeno().toUpperCase())); zavolám namiesto lambda výrazu, wrapper metódu, ktorej argument bude lambda výraz. Urobí to to isté, ale použil som wrapper metódu. 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; } }Tu môžem spraviť nasledujúcu vec. Namiesto toho aby som lambdu prehnal cez wrapper metódu, tak ju ani nepoužijem, ale použjime len jej vstupný parameter, čo je osoba. Môžem spraviť niečo takéto: private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> System.out.println(osoba.getPriezvisko()); }Namiesto toho, aby som využil vstupnú lambdu, ktorá mi prišla cez parameter consumer, som na ňu zabudol a len som využil vstupný parameter danej lambdy a vytvoril som novú lambdu. Pri volaní consumer.accept(osoba); v metóde processOsoby sa vykoná lambda výraz z wrapper metódy. Toto nie je skutočný wrapper. Skutočný wrapper, zoberie vstupnú lambdu a vykoná čo požaduje. Teraz máme istotu, že sa zavolá presne náš požadovaný lambda výraz a zároveň môžeme pridávať kód okolo. private static Consumer<Osoba> wrapperLambda(Consumer<Osoba> consumer){ return osoba -> consumer.accept(osoba); }Tu prichádza narad try catch blok v wrapper metóde. Upravíme si kód, aby nám hádzal výnimku. 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"); } }; } }Ak sa zastavuješ pri myšlienke, že sme nič nezjednodušili, len sme presunuli kód na iné miesto, tak máš pravdu, ale! Ak si danú metódu spravíš generickú, tak si do tejto metódy môžeš zabaliť hocijakú lambdu, ktorej typ je Consumer rozhranie. Škoda, že tvorcovia javy nespravili takéto wrapper metódy pre všetky funkcionálne rozhrania 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čovať s Lambda výrazmi budeme opäť v ďalšom článku. Moje meno je Jaro Beňo a naučím ťa programovať v Jave. Ahoj.
Tipy a triky
16.10.2019
Skillmea tím

Ako zistiť, či je číslo zadané zo vstupu prvočíslom?

V 15. kapitole online kurzu vyššieho programovacieho jazyka C++ úrovne Elementary II nájdete medzi zadaniami praktických príkladov na domáce precvičenie aj úlohu, v ktorej máte nájsť najväčší spoločný deliteľ dvoch čísel a taktiež úlohu, v ktorej máte nájsť najmenší spoločný násobok dvoch čísel alebo ich najväčší spoločný deliteľ. Ak siahnete do osnov matematiky druhého stupňa základnej školy niekde do 6. alebo 7. ročníka, zistíte, že kľúčom k vyriešeniu týchto dvoch úloh je rozklad obidvoch čísel na súčin prvočísel. Úlohy patria z hľadiska logiky a analytického myslenia medzi začiatočnícke. Napriek tomu viem, že sú náročnejšie. Práve preto som sa rozhodol napísať tento blog. V tomto blogu nechcem riešiť túto úlohu za vás, ale aspoň by som vám rád podal návod, ako zistiť, či je načítané číslo zo vstupu prvočíslom. Táto úloha je jedna z čiastkových úloh, ktoré je potrebné riešiť pri dvoch spomenutých príkladoch, ktorých riešenie ste dostali za úlohu nájsť. Tí, ktorí zabudli, čo je prvočíslo, ozrejmím aj tento pojem. Prvočíslo je celé kladné číslo, ktoré je deliteľné len jednotkou a svojou vlastnou hodnotou. Budeme sa teda pohybovať iba v množine kladných celých čísel. Príkladom prvočísla môže byť napr. číslo 5, pretože je deliteľné len číslom 1 a 5. ďalšími príkladmi sú 2, 3, 7, 11, 13, 17 atď. Samotné číslo 1 sa za prvočíslo nepovažuje. Povedzme, že máme číslo 60, jeho rozklad na súčin prvočísel je 2 x 2 x 3 x 5. Už z rozkladu je zrejmé, že ho môžeme vynásobiť číslom 1, nič by to totiž nezmenilo na výsledku, stále by ste dostali číslo 60. Vidíte, a práve preto sa matematici dohodli, že 1 prvočíslom nebude, nemá totiž už žiadny vplyv v súčine prvočísel, ktorého výsledkom je nejaké číslo. Takže bez zbytočných ďalších prázdnych fráz prejdem rovno k veci. Nasleduje teda zdrojový kód v jazyku C++, ktorý rieši titulok tohto 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 riadku 01 je uvedená direktíva preprocesora #include, ktorej parametrom je štandardná knižnica iostream. Potrebujeme ju z dôvodu používania objektov cout, cin a manipulátora endl. Na riadku 02 uvádzame do platnosti menný priestor std pre celý zdrojový súbor .cpp. Spomenuté objekty cout, cin a manipulátor endl je zároveň súčasťou tohto priestoru. Na riadku 04 je uvedená funkcia main aj so svojim návratovým typom, ktorým je int (integer). Túto funkciu volá operačný systém. Na riadku 05 je uvedená ľavá programová zátvorka, ktorou sa začína telo funkcie main. Na riadku 06 je deklarovaná premenná iNumb na údajový typ int. Táto premenná reprezentuje hodnotu celého kladného čísla, o ktorom chceme zistiť, či patrí medzi prvočísla. Na riadku 08 je pomocou objektu cout zapísaný na výstup konzolovej aplikácie textový reťazec, ktorý vyzve používateľa na zadanie hodnoty kladného celého čísla, ktorého vlastnosť prvočísla testujeme. Na riadku 09 je prostredníctvom objektu cin načítaná táto hodnota do premennej iNumb. Na riadku 10 je prostredníctvom objektu cout a manipulátora endl presunutý kurzor konzolovej aplikácie na ďalší riadok. Na riadku 12 je deklarovaná premenná flag a zároveň inicializovaná na hodnotu true. Táto premenná nám bude po otestovaní načítaného čísla ukladať informáciu, či je číslo prvočíslom alebo nie. Z hľadiska logiky algoritmu je nutné premennú flag inicializovať pred testovaním na hodnotu true. Algoritmom budeme totiž testovať, či načítané číslo medzi prvočísla nepatrí. Používa sa tu teda postup vylučovací. Na riadku 14 je testovaná podmienka, či v premennej iNumb nie je hodnota 1. Ak áno, program pokračuje kladnou vetvou a do premennej flag sa na riadku 16 zapíše hodnota false, ktorá reprezentuje stav, kedy načítané číslo prvočíslom nie je. Na riadku 13 a 15 sú len uvedené programové zátvorky, ktoré uzatvárajú blok kódu uvedený v kladnej vetve. Ak spomínaná podmienka splnená nie je, pokračuje sa zápornou vetvou. Blok kódu v zápornej vetve uzatvorený programovými zátvorkami na riadkoch 19 a 29. Na riadku 20 až 27 je uvedené jadro algoritmu, ktorý testuje vlastnosť prvočísla u čísel väčších ako 1. A v čom spočíva idea jadra algoritmu ? V každej iterácii cyklu zisťujeme, či je číslo deliteľné hodnotou v premennej i. Najmenšie číslo, ktorým môže byť načítané testované deliteľné, je číslo 2 (viď. riadok 20 – for slučka) a preto iterujeme od tejto hodnoty. Premennú i postupne inkrementujeme (viď. riadok 20 – for slučka) a testujeme, či je hodnota premennej iNumb deliteľná bez zvyšku pomocou operácie modulo na riadku 22, ktorá je umiestnená v príkaze if. Ak je číslo deliteľné hodnotou v premennej i bez zvyšku, tak sa na riadku 24 uloží do premennej flag hodnota false, čo reprezentuje stav, kedy načítané číslo nie je prvočíslom. Premenná i sa inkrementuje po iNumb / 2 (viď. riadok 20 – for slučka). Dôvodom je fakt, že žiadne celé kladné číslo nemôže byť predsa deliteľné bez zvyšku číslom väčším ako je jeho polovica. Ak sa teda nenájde číslo, ktorým je načítaná hodnota testovaného čísla deliteľná bez zvyšku, neuloží sa do premennej flag hodnota false, čiže po ukončení v nej bude uložená hodnota true, čo reprezentuje stav, kedy je načítané testované číslo prvočíslom. Na riadku 25 je uvedené kľúčové slovo break a to z toho dôvodu, že v prípade nájdenia jedného čísla, ktoré delí načítané testované číslo bez zvyšku, nie je nutné hľadať ďalšie delitele. Testované číslo už prvočíslo totiž byť nemôže a preto násilne ukončíme slučku for, urýchlime program, ktorý následne prejde až na riadok 30. Tu sa už len testuje hodnota v premennej flag. Ak je v tejto premennej uložená hodnota true, tak sa zapíše na výstup konzolovej aplikácie pomocou objektu cout informácia o tom, že je načítané testované číslo prvočíslom (viď. riadok 32), ak false tak informácia, že prvočíslom nie je. Na riadku 41 a 42 je už len načítavaný vstup z konzolovej aplikácie pomocou objektu cin, čo slúži na to, aby sa hneď program neukončil a bol zobrazený výsledok v okne konzole, pokým používateľ nezatlačí ľubovoľná kláves. Na riadku 44 vracia funkcia main operačnému systému hodnotu 0, ktorá indikuje stav správneho ukončenia aplikácie. Na riadku 45 je ukončené telo programu pravou programovou zátvorkou. Algoritmus, ktorý som navrhol a implementoval v jazyku C++ nie je ešte optimálny. Je však pre účely kurzu úrovne začiatočník postačujúci. Medzi prvočíslami sa dajú ešte sledovať určité vlastnosti, nebudem ich však tomto bloku spomínať, aby som príliš poslucháča úrovne začiatočník zbytočne nadmerne nezaťažil. Optimálny algoritmus však budem ešte publikovať a rozoberať v ďalšom bloku a v kurze, ktorý bude zameraný aj na matematiku. Autorom blogu je Marek Šurka, lektor online kurzov jazyka C++ na Learn2Code

Nezmeškaj info o nových kurzoch a špeciálnych ponukách