Tipul char

Un caracter este un număr. De aici vin toate trucurile: conversia cifrelor, schimbarea literelor mari în mici și clasificarea.

Un caracter este un cod

char c = 'A';

Pui apostrofuri simple pentru un caracter și ghilimele duble pentru un text. 'A' și "A" sunt lucruri diferite: primul este un caracter, al doilea un șir de un caracter.

Intern, char este un număr mic, și anume codul ASCII al caracterului:

cout << (int)'A';       // 65
cout << (char)66;       // B

Codurile nu trebuie să le știi pe de rost. Reține doar că fiecare grup are coduri consecutive:

grupcoduri
'0' … '9'48 … 57
'A' … 'Z'65 … 90
'a' … 'z'97 … 122
spațiu32

Literele mici au coduri mai mari decât cele mari. Între o literă mică și litera mare corespunzătoare diferența e mereu aceeași: 32.

Ce se poate face cu asta

Cifra ca text → cifra ca număr

char c = '7';
int cifra = c - '0';        // 7

Merge pentru că '7' are codul cu 7 mai mare decât '0'. Invers:

int x = 5;
char c = x + '0';           // '5'

Ai nevoie de asta de fiecare dată când citești un număr caracter cu caracter dintr-un text.

Poziția unei litere în alfabet

char c = 'd';
int pozitie = c - 'a';      // 3, numărând de la 0

Cu asta poți indexa un vector de frecvențe pe litere:

int fr[26] = {0};
fr[c - 'a']++;

Litere mari ↔ litere mici

char mare = 'q' - 32;       // 'Q'
char mic  = 'Q' + 32;       // 'q'

Poți scrie mai limpede, fără să memorezi 32:

char mare = c - 'a' + 'A';

Se citește „ia poziția lui c în alfabetul mic și pune-o în alfabetul mare".

Clasificarea

Testele le poți scrie de mână, comparând coduri:

if (c >= '0' && c <= '9')   // este cifră
if (c >= 'a' && c <= 'z')   // literă mică
if (c >= 'A' && c <= 'Z')   // literă mare

Sau poți folosi funcțiile din <cctype>, care sunt permise la bac:

funcțieîntoarce adevărat dacă
isalpha(c)este literă
isdigit(c)este cifră
isupper(c)este literă mare
islower(c)este literă mică
isspace(c)este spațiu, tab sau linie nouă
isalnum(c)este literă sau cifră
toupper(c)litera mare corespunzătoare
tolower(c)litera mică corespunzătoare
#include <cctype>
...
if (isalpha(c))
    c = toupper(c);

toupper și tolower lasă neschimbat orice nu este literă, deci le poți aplica fără să testezi înainte.

La examen sunt acceptate ambele variante, și comparațiile de mână, și funcțiile. Comparațiile arată că înțelegi ce se întâmplă. Funcțiile sunt mai scurte și e mai greu să greșești cu ele.

Citirea unui caracter

char c;
cin >> c;

cin >> c sare peste spații și linii noi, exact ca la numere. Dacă ai nevoie să citești și spațiile (de exemplu, ca să numeri cuvintele dintr-un text), folosește:

c = cin.get();

care ia următorul caracter, oricare ar fi el.

Un exemplu

Se citește un caracter. Să se afișeze ce fel de caracter este.

#include <iostream>
#include <cctype>
using namespace std;

int main() {
    char c;
    cin >> c;

    if (isdigit(c))
        cout << "cifra cu valoarea " << c - '0';
    else if (isupper(c))
        cout << "litera mare, pozitia " << c - 'A' + 1;
    else if (islower(c))
        cout << "litera mica, pozitia " << c - 'a' + 1;
    else
        cout << "alt caracter, cod " << (int)c;

    return 0;
}

De reținut

  • Apostrofuri simple pentru caracter, ghilimele pentru șir.
  • Cifrele, literele mari și cele mici au fiecare coduri consecutive.
  • c - '0' dă valoarea cifrei, iar c - 'a' dă poziția literei.
  • c - 'a' + 'A' transformă în literă mare fără să memorezi 32.
  • <cctype> are isalpha, isdigit, toupper și celelalte. Sunt permise la bac.
  • cin >> c sare peste spații, cin.get() nu.