Linux E X P R E S

Facebook

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

C++

V minulom diele sme si prvý krát predstavili knižnicu cctype a zamerali sme sa na test veľkostí znakov. V tomto článku budeme pokračovať tým, ako zmeniť veľké písmeno na malé a opačne. 


Funkcie tolower a toupper

Zmenu z veľkého znaku na malý znak vieme v jazyku C++ urobiť prostredníctvom funkcie tolower. Ak chceme z malého znaku urobiť veľký znak, využijeme funkciu toupper. Pozríme sa na prvý demonštratívny príklad.

1. príklad: Jednoduchý program na konverziu veľkostí znakov

#include <iostream>   // hlavičkové súbory
#include <cctype>

using namespace std;   // priestor mien

int main()   //hlavná funkcia main
{
    char znak1 = 'L';   // tento znak budeme testovať
    char znak3;
    char znak4;

    if (islower(znak1))   // testujeme
        znak3 = toupper(znak1);   // meníme veľkosť znaku 
    else
        znak3 = tolower(znak1);

    char znak2 = 'v';

    if (!isupper(znak2))
        znak4 = toupper(znak2);
    else
        znak4 = tolower(znak2);

    cout << "Prvy znak: " << znak3 << "\nDruhy znak: " << znak4;   //výpis na obrazovku

    return 0;   // koniec programu
}

Výsledok programu:

Prvy znak: l
Druhy znak: V

Skúsme teraz meniť veľkosť znakov v reťazci.

2. príklad:

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

using namespace std;   // priestor mien

int main()   // hlavná funkcia main
{
    string retazec = "MaestroPR"; // naš reťazec

    for (size_t i = 0; i < retazec.size(); i++)   // cyklus
    {
        if (islower(retazec[i]))  // testujeme velkost znakov
            cout << toupper(retazec[i]);    // a meníme znaky a vypisujeme ich na obrázovku
        else
            cout << tolower(retazec[i]);
    }

    return 0;   // koniec programu
}

Výsledok programu:

109656983848279112114

Stala sa v druhom programe chyba? Nie, len je potrebné ešte pridať knižnicu locale, aby sme definovali, že nechceme znaky v ASCII kóde. V prvom príklade sme knižnicu locale nepotrebovali, pretože sme rovno určili, s akou podobou znaku pracujeme. Opravíme tento kozmetický problém v treťom príklade.

3. príklad:

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

using namespace std;   // priestor mien

int main()   // hlavná funkcia main
{
    locale loc;
    string retazec = "MaestroPR"; // naš reťazec

    for (size_t i = 0; i < retazec.size(); i++)   // cyklus
    {
        if(islower(retazec[i]))  // testujeme velkost znakov
            cout << toupper(retazec[i], loc);    // a meníme znaky a vypisujeme ich na obrázovku
        else
            cout << tolower(retazec[i], loc);
    }

    return 0;   // koniec programu
}

Výsledok programu:

mAESTROpr

Skúsme teraz pozmeniť príklad z minulého dielu do plnohodnotného konvertora veľkostí znakov.

4. príklad:

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

using namespace std;   // priestor mien

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

    cout << "Tak najprv testneme nami navoleny retazec a potom zvolite vlastny retazec! \n";

    string retazec = "Galaxia Andromeda\n";   // náš zvolený reťazec

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

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

    cout << "\nOk zadajte teraz vy retazec!\n";

    string retazec1;

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

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

    cout << "Vas zvoleny retazec: " << retazec1 << "\n";

    for (size_t i = 0; i < retazec1.size(); i++)
    {
        if(!isupper(retazec1[i]))   // testujeme
            cout << toupper(retazec1[i], loc);
        else
            cout << tolower(retazec1[i], loc);
    }

    return 0;   // koniec programu
}

Výsledok programu:

Tak najprv testneme nami navoleny retazec a potom zvolite vlastny retazec!
Nas zvoleny retazec je: Galaxia Andromeda
gALAXIA aNDROMEDA

Ok zadajte teraz vy retazec!
PuntiK
Vas zvoleny retazec: PuntiK
pUNTIk



Diskuze (3) Nahoru