přejít na obsah přejít na navigaci

Linux E X P R E S, Programovanie v jazyku C++: Cykly (3)

Programovanie v jazyku C++: Cykly (3)

C++

V článku si ukážeme jednoduchú manipuláciu reťazca pomocou cyklu for. Ešte predtým si ukážeme algoritmus, ktorý rozhodne, či číslo je alebo nie je prvočíslom. 


Prvočísla

Prv, než prejdeme na využitie cyklu for v reťazcoch, vám chcem ukázať zaujímavý algoritmus, ktorý sa vám môže hodiť.

Prvočísla sú také prirodzené čísla, ktoré sú deliteľné bez zvyšku len 1 a zároveň sebou samým. Číslo 1 ale nie je prvočíslo. Prvočíslom môžu byť len nepárne čísla, pretože párne sú deliteľné 2. Jedine číslo 2 je výnimkou a je prvočíslom.

Príklad prvočísla je číslo 3. Vieme ho vydeliť bez zvyšku len 1 a 3. Číslo 4 vieme vydeliť 2, čiže nie je prvočíslo. Vytvoríme si program, ktorý nám nájde prvočísla.

1. príklad: Program na testovanie, čí číslo je prvočíslom

#include <iostream>   // hlavičkové súbory
#include <cmath>
using namespace std;  // priestor mien
int main()  // hlavná funkcia main
{
    int n;  //deklarácie premenných
    cout << "Zadajte cislo na otestovanie, ci je prvocislom: ";  // výpis
    cin >> n;  // vstup
    if (n == 1)  // podmienka
    {
        cout << "Cislo "<<n<<" nie je prvocislo!\n";
        return 0;        
    } 
   
    if (n == 2)
    {
        cout << "Cislo "<<n<<" je prvocislo!\n";
        return 0;
    }
    if (n < 1)
    {
        cout << "Zly vstup!\n";
        return 0;
    }
    if (n % 2 == 0)
    {
        cout << "Cislo "<<n<<" nie je prvocislom!\n";
        return 0;
    }
    int hranica = (int) sqrt(n);
    
    for (int i = 3; i <= hranica; i += 2)
    {
        if (n % i == 0)
        {
            cout << "Cislo "<<n<<" nie je prvocislom!\n";
            return 0;
        }
    }       
    cout << "Cislo "<<n<<" je prvocislom!\n";
    return 0;
}

Výsledok:

Zadajte cislo na otestovanie, ci je prvocislom: 5
Cislo 5 je prvocislom!

Rozbor programu: Prvý krok je zo strany užívateľa, ktorý zadá číslo na otestovanie, čí je prvočíslo. V druhom kroku ošetríme vstup. Ak je vstup 1, nie je prvočíslo. Ak menšie ako 1, ide o zlý vstup. Ošetríme aj číslo 2, pretože je to jediné párne číslo, ktoré je zároveň prvočíslo. Algoritmus samotný pracuje len s nepárnymi číslami. V treťom kroku určíme vytvoríme odmocninu z vstupného čísla. Následne pomocou cyklu rozhodneme, či je dané číslo prvočíslo.

Cyklus for a reťazce

Podobne ako pole, i s reťazcami vieme pracovať pomocou for. Pozor davajte na ukončovací znak pri reťazcoch. Tak poďme na príklady

2. príklad: Jednoduchý príklad na reťazec s cyklom for

#include <iostream>
#include <string>
using namespace std;
int main()
{
string name = "supermoon";
for (int i = 0; i < 9; i++)
{
cout <<name[i];   
}
return 0;
}

Výsledok:

supermoon

Rozbor programu: Súhlasím, je to príklad ktorý môže byť hodený do koša. Predsa string vieme vypísať bez problémov i bez cyklu. Je to len ukážka, že pole či reťazec, práca s nimi je rovnaká. Až na malú drobnosť pri reťazci, ktorý má ukončovací znak.

3. príklad: Napíšeme reťazec odzadu

#include <iostream>
#include <string>
using namespace std;
int main()
{
string name = "supermoon";
for (int i = 8; i >= 0; i--) 
{
cout <<name[i];   
}
cout << "\n";
return 0;
}

Výsledok

noomrepus

4. príklad: Na koniec ešte jeden príklad

#include <iostream>
#include <string>
using namespace std;
int main()
{
string name = "supermoon";
for (int i = 0; i < 3; i++) 
{
cout << name[i+3];   
}
cout << "\n";
return 0;
}

Výsledok:

erm

Rozbor programu:

Čo sme urobili v programe? My sme posunuli o 3 miest v reťazci. Takto jednoducho sa dajú manipulovať s reťazcami. Ale pozor na hranice reťazca (alebo poľa). Veľmi rýchlo sa dá vybočiť mimo priestor určenému poľu či reťazcu.

Nabudúce si ukážeme varianty cyklu while.

Nahoru

Příspěvky

Programovanie v jazyku C++: Cykly (3)
Daniel Kozak 24. 11. 2016, 00:18:57
Odpovědět  Odkaz 
Doufam ze tento dil (mozna cely serial) je bran jako vtip. Vetsina dilu mela spoustu nepresnosti a chyb, ale tento dil je perfektni ukazkou jak se nema programovat. V podstate je to super dil, pokud by byl nazvan odstrasujici zpusoby co se da (bohuzel) v C/C++ udelat
Programovanie v jazyku C++: Cykly (3)
Livan 24. 11. 2016, 13:27:47
Odpovědět  Odkaz 
Když už tomu článku něco vytýkáš, bylo by fajn být trošku konkrétnější a i vysvětlit, proč je to špatně.
Petr Valach Re: Programovanie v jazyku C++: Cykly (3)
Petr Valach 24. 11. 2016, 15:55:54
Odpovědět  Odkaz 
Na trolly je nejlepší nereagovat, oni se odrovnají sami.
Re: Programovanie v jazyku C++: Cykly (3)
strepon 25. 11. 2016, 18:00:38
Odpovědět  Odkaz 
Ač nejsem znalec C++, poslední příklad s přístupem mimo meze pole mi odstrašující připadá, první je zase zbytečně komplikovaný...
Re: Programovanie v jazyku C++: Cykly (3)
NULL 27. 11. 2016, 13:13:11
Odpovědět  Odkaz 
Tak třeba tohle: Proč sakra musíš ošetřovat 2jku

if (n == 2)
{
cout
Programovanie v jazyku C++: Cykly (3)
NULL 27. 11. 2016, 13:14:42
Odpovědět  Odkaz 
Aha, tak mi to useklo kus text. Taky dobré.
Programovanie v jazyku C++: Cykly (3)
NULL 27. 11. 2016, 13:26:37
Odpovědět  Odkaz 
No každoopádně ověřovat

if (!isPrime) . . .

když před tím není nic jiného než

bool isPrime = false;

je opravdu " zaujímavý algoritmus, ktorý sa vám môže hodiť." . . . :-D A to tu celou větu ani nebudu dál rozebírat, protože je to přece jenom algoritmus na prvočíslo a kdyby to psal někdo normální, tak ta funkce by mohla byt tak poloviční . . .
Programovanie v jazyku C++: Cykly (3)
borg 27. 11. 2016, 21:22:15
Odpovědět  Odkaz 
uf, vazne ako clanok a serial co ma nieco ludi naucit? A to vas netankuje, ze ich to nauci zle? uplne zle. Zle podane informacie mozu ovela viac uskodit.
Eduard Boldižár Programovanie v jazyku C++: Cykly (3)
Eduard Boldižár 29. 11. 2016, 12:15:39
Odpovědět  Odkaz 
@NULL: 2 je párne číslo a zároveň prvočíslo, ostatné prvočísla sú nepárne. Pre povahu algoritmu sa 2 rieši samostatne a ostatné prvočísla v rámci cyklu.
@ALL: ďakujem za kritický feedback, zapracujem na chybách a bude to opravené i v článku. Vďaka za trpezlivosť
Re: Programovanie v jazyku C++: Cykly (3)
Daniel Kozak 10. 12. 2016, 00:08:49
Odpovědět  Odkaz 
Hele dela ti vlastne nekdo korekci? Jako jestli obsah svych clanku s nekym (kdo rozumi C/C++ nebo aspon programovani) konzultujes. Pokud ne tak se klidne nabizim (umim@kodit.cz)
Programovanie v jazyku C++: Cykly (3)
NULL 29. 11. 2016, 13:55:17
Odpovědět  Odkaz 
" 2 je párne číslo a zároveň prvočíslo, ostatné prvočísla sú nepárn"

Jenomže ty nehodnotíš, zda je to "párne číslo" ale jenom jestli je to prvočíslo. Nicméně jsem nad tím přemýšlel a v podstatě, nesedí mi to tam kde to je a dal bych to, když už teda, tak až do algoritmu na prvočíslo a ošetřoval to až tam, ale tak dobře, beru, pro mě to vypadá jako čuňárna ale beru, v rámci toho, aby to projelo co nejrychleji, přežil bych to. Ale
"
No každopádně ověřovat

if (!isPrime) . . .

když před tím není nic jiného než

bool isPrime = false;
"

To mi promiň, to je čuňárna! Na ostatní příklady už jsem se ani nedíval . . .
Eduard Boldižár Programovanie v jazyku C++: Cykly (3)
Eduard Boldižár 29. 11. 2016, 14:57:13
Odpovědět  Odkaz 
@NULL O tej druhej chybe, ktorú si spomenul, som neokomentoval, to znamená, že súhlasím a opravím, nemusíš mi to 5 krát opakovať.
A ešte k tej dvojke, troška matematiky k vysvetleniu tohto algoritmu. Ak zoberieme 2, odmocnina z 2 je 1,414..., ak by sme začali od hladiny 1, tak by urobil algoritmus 2/1 = 2 == 0, čiže číslo 2 by bolo vyhlásené, že nie je prvočíslo, čo nie je pravda. Ďalším problém tušíš, že by tak vyhlásilo všetky prvočísla za neprvočísla, pretože i 5:1 má zv. 0 a atď...
Prečo nás nezaujímajú párne delitele? Pretože nepárne číslo pri delení párnym číslom nemôže mať zvyšok 0! Napríklad 9:3 = 3, zv. 0
15:5 = 3, zv. 0
21:7 = 3, zv. 0
25:5 = 5, zv. 0
atď...
ak by platilo nepárne číslo/párne číslo = akýkoľvek výsledok so zvyškom 0, tak ten algoritmus zlyhá, ale našťastie, táto úvaha nie je pravdivá, takže preto je taký algoritmus, aký je.

Odpovědět

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz