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; // BCodurile nu trebuie să le știi pe de rost. Reține doar că fiecare grup are coduri consecutive:
| grup | coduri |
|---|---|
'0' … '9' | 48 … 57 |
'A' … 'Z' | 65 … 90 |
'a' … 'z' | 97 … 122 |
| spațiu | 32 |
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'; // 7Merge 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 0Cu 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ă mareSau 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, iarc - 'a'dă poziția literei.c - 'a' + 'A'transformă în literă mare fără să memorezi 32.<cctype>areisalpha,isdigit,toupperși celelalte. Sunt permise la bac.cin >> csare peste spații,cin.get()nu.