Linux E X P R E S

Facebook

Programovanie v jazyku C++: Knižnica cctype (3)

C++

Pokračujeme v predstavovaní knižnice cctype a jej podporovaných funkcii. 


Konvertor mien

V minulom diele sme si predstavili tieto dve funkcie a využili sme ich v príkladoch. Teraz by sme ale mohli vytvoriť program, v ktorom by užívateľ zadal svoje meno a program by vy vypísal zadané meno. Avšak, myslíme nato, že užívateľ sa môže pomýliť a zadá napr, eVička alebo evicKA. Ale správne má byť Evička. Poďme sa o taký program pokúsiť.

1. príklad: Program na konvertor mien

#include <iostream>   // hlavickové súbory
#include <cctype>
#include <locale>

using namespace std;   // priestor mien

int main()   // hlavná funkcia main
{
    locale loc;

    cout << "Zadajte svoje meno!\n";

    string retazec;

    cin >> retazec;    // užívateľ zadá reťazec

    if (retazec.empty())
    {
        cout << "Och chyba! Koncim!\n";
        return 0;
    }

    cout << "Vas zvoleny retazec: ";

    for (size_t i = 0; i < retazec.size(); i++)
    {
        if (islower(retazec[i]) && i == 0)  // prve písmeno musí byť veľké
            cout << toupper(retazec[i], loc);
        if (isupper(retazec[i]) && i == 0)  // ak prve je velke, len ho vypiseme
            cout << retazec[i];
        else if(i != 0)   //a ostatné malé
            cout << tolower(retazec[i], loc);
    }
    return 0;   // koniec programu
}

Výsledok programu:

Zadajte svoje meno!
eVičkA
Vas zvoleny retazec: Evička

Funkcia isspace

V prvom diele minicyklu o knižníci cctype sme si predstavili program, ktorý nám spočíta, koľko veľkých a malých písmen sa nachádza v reťazci. Pripomeňme si program.

2. príklad: Program vytvorený v prvom dieli minicyklu o knižnici cctype

#include <iostream>   // hlavickové súbory
#include <cctype>

using namespace std;   // priestor mien

int main()   // hlavná funkcia main
{
    string retazec = "Galaxia Andromeda";   // náš zvolený reťazec

    cout << "Nas zvoleny retazec je: " << retazec;

    int pocitadloM = 0;   // počitanie malých a veľkých znakov
    int pocitadloV = 0;

    for (size_t i = 0; i < retazec.size(); i++)   // cyklus, ktory preverí každý znak v reťazci
    {
        if (islower(retazec[i]))   // testujeme
            pocitadloM++;

        if (!islower(retazec[i]))
            pocitadloV++;
    }

    cout << "\nV retazci " << retazec << " je " << pocitadloM << " malych znakov a " << pocitadloV << " velkych znakov.\n";

    return 0;
}

Výsledok programu:

Nas zvoleny retazec je: Galaxia Andromeda
V retazci Galaxia Andromeda je 14 malych znakov a 3 velkych znakov.

Tak ako to urobiť tak, aby medzeru nezapočítalo do veľkých písmen (a samozrejme ani do malých)? No máme dve spôsoby ako nato. A určite sa nájdu i ďalšie možností.

3. príklad: Korekcia druhého programu cez test znaku

#include <iostream>   // hlavickové súbory
#include <cctype>

using namespace std;   // priestor mien

int main()   // hlavná funkcia main
{
    string retazec = "Galaxia Andromeda";   // náš zvolený reťazec

    cout << "Nas zvoleny retazec je: " << retazec;

    int pocitadloM = 0;   //počitanie malých a veľkých znakov
    int pocitadloV = 0;

    for (size_t i = 0; i < retazec.size(); i++)   // cyklus, ktory preverí každý znak v reťazci
    {
        if (islower(retazec[i]) && retazec[i] != ' ')   // testujeme
            pocitadloM++;

        if (!islower(retazec[i]) && retazec[i] != ' ')
            pocitadloV++;
    }

    cout << "\nV retazci " << retazec << " je " << pocitadloM << " malych znakov a " << pocitadloV << " velkych znakov.\n";

    return 0;
}

Výsledok programu:

Nas zvoleny retazec je: Galaxia Andromeda
V retazci Galaxia Andromeda je 14 malych znakov a 2 velkych znakov.

Rozbor programu:

Pri teste, či je písmeno malé alebo veľké sme pridali i test, či náhodou nemôže daný znak byť medzerou.

4. príklad: Korekcia druheho programu cez funkciu isspace

#include <iostream>   // hlavickové súbory
#include <cctype>

using namespace std;   // priestor mien

int main()   // hlavná funkcia main
{
    string retazec = "Galaxia Andromeda";   // náš zvolený reťazec

    cout << "Nas zvoleny retazec je: " << retazec;

    int pocitadloM = 0;   // počitanie malých a veľkých znakov
    int pocitadloV = 0;

    for (size_t i = 0; i < retazec.size(); i++)   // cyklus, ktory preverí každý znak v reťazci
    {
        if (islower(retazec[i]) && !isspace(retazec[i]))   // testujeme
            pocitadloM++;

        if (!islower(retazec[i]) && !isspace(retazec[i]))
            pocitadloV++;
    }

    cout << "\nV retazci " << retazec << " je " << pocitadloM << " malych znakov a " << pocitadloV << " velkych znakov.\n";

    return 0;
}

Výsledok programu:

Nas zvoleny retazec je: Galaxia Andromeda
V retazci Galaxia Andromeda je 14 malych znakov a 2 velkych znakov.

Rozbor programu:

Ako sami tušite, funkcia isspace testuje, či znak je medzera.

Je na vás, ktorý z modifikovaných programov si vyberiete pri riešení daného problému, keďže výsledky davajú rovnaké. Pri vývoji programov treba myslieť nielen na výsledok, ale často krát aj na výkon a množstvo zdrojov, ktoré aplikácia spotrebuje. Ale v tomto prípade je aplikácia tak nenaročná, že nás to nemusí zaujímať. Ale pri zložitejších aplikáciach to bude potrebné, pretože vy predsa nebudete chcieť vrátiť peniaze zato, že užívateľ bude reklamovať dlhu dobu odozvy pri nejakom stlačení tlačítka. Ako sa hovorí, čas si za peniaze nekúpiš.



Diskuze (2) Nahoru