Curs C++ | Sectiunea 4 – Tipul Char
Am discutat pana acum despre calculator (si despre compilator) doar din postura de masina de calcul. Acest lucru este doar o parte din ceea ce putem face. Calculatorul putand foarte usor sa faca si procesare de text, dupa cum si stim de altfel.
Ne putem defini un cuvant ca un sir (string) de caractere (litere, numere, semne de punctuatie etc). Ne-am mai intalnit cu aceste siruri in Sectiunea 1, cand am folosit cout pentru afisarea unui mesaj.
Momentan, totusi, nu ne vom focusa pe siruri de caractere ci doar pe caractere individual. Vom reveni la ele ulterior in alta sectiune, nu va faceti griji 🙂 .
💡 Pentru stocare si manipulare de caractere individuale, C++ ne ofera un nou tip de date. Acest tip poarta numele de char, fiind o abreviere de la character. Declararea se face astfel:
Codul ASCII
❗ Calculatorul stocheaza caracterele noastre ca numere. Fiecare caracter folosit are ca si corespondent un numar unic. Multe din acestea sunt invizibile pentru noi dar esentiale pentru calculator.
Unele din acestea se numesc spatii goale (white spaces), altele se numesc caractere de control (control characters), avand rolul de a controla input-ul/output-ul dispozitivelor. Un exemplu de spatiu gol este un caracter special ce marcheaza terminarea fiecarei linii intr-un text, desi nu-l vedem, el exista.
💡 Acest lucru a dus la nevoia unui standard universal de scriere si interpretare a caracterelor. ASCII (American Standard Code for Information Interchange) este cel mai raspandit sistem si este folosit de aproape toate dispozitivele moderne. Acest cod ofera 256 de caractere diferite, noi insa folosind primele 128. Un mic exemplu:
| Dec | Hex | Character | Dec | Hex | Character | Dec | Hex | Character | Dec | Hex | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| (NUL) | 0 | 0 | (space) | 32 | 20 | @ | 64 | 40 | ` | 96 | 60 | ||||
| (SOH) | 1 | 1 | ! | 33 | 21 | A | 65 | 41 | a | 97 | 61 | ||||
| (STX) | 2 | 2 | “ | 34 | 22 | B | 66 | 42 | b | 98 | 62 |
➡ Pentru intregul tabel, puteti intra aici.
Veti observa ca in primele 128 de caracatere le regasim pe cele folosite si de noi. Mai mult, literele sunt aranjate in aceeasi ordine cu a alfabetului latin.
Ce mai trebuie adaugat este faptul ca ASCII a devenit intre timp o submultime a lui UNICODE. Acesta fiind noul standard de reprezentare al tuturor caracterelor existente (chiar si emoji 😮 ).
Valoarea unui char
❓ Se pune urmatoarea intrebare. Cum folosim valorile unui char? Ei bine, exista 2 metode ce nu sunt tocmai echivalente.
Prima metoda presupune scrierea directa a caracterului dorit intre apostrofuri (ecnlosed in single quotes). Avem urmatorul exemplu:
A doua metoda consta in asignarea unei valori intregi mai mari ca 0 (non-negative integer value). Valorea trebuie sa fie cea corespunzatoare caracterului dorit. Spre exemplu, pentru caracterul “A“, avem astfel:
❗ Varianta aceasta este mai putin recomandata si daca se poate, sa fie evitata. Un motiv ar fi ca exista un numar semnificativ de calculatoare in lume ce nu folosesc codul ASCII. Spre exemplu, multe mainframe-uri IBM folosesc un cod numit EBCDIC (Extended Binary Coded Decimal Interchange Code) care este foarte diferit de ASCII.
Literal
💡 Literalul este un simbol ce identifica in mod unic valoarea lui.
- caracter – acesta nu ese un literal; cel mai probabil este numele unei variabile
- ‘A‘ – acesta este un literal; imediat ce il citim stim ca este un literal de tip char
- 10 – acesta este un literal de tipul int
- 10.0 – acesta este un literal de tipul float
- a + 10 – acesta este o combinatie intre o variabila, un operator si un literal; este o expresie
❓ Daca esti o persoana curioasa, probabil ai urmatoarea intrebare. Daca orice literar trebuie scris intre apostrofuri, cum putem sa folosim caracterul apostrof in sine?
💡 Pentru aceasta problema, C++ foloseste o conventie speciala ce se aplica la multe caractere, nu doar apostrof. Aceasta este caracterul backslash, adica “\” si se comporta ca un escape character. “Escape” de la faptul ca prin el putem scapa de definitia normala a caracterului folosit dupa backaslah.
Astfel, ca sa raspundem la intrebare, putem scrie:
Mai mult, putem chiar sa folosim backslash la backslash pentru a-l putea folosi.
Escape characters
Caracterul backslash il putem folosi si cu literale ce reprezinta spatii goale.
\n – denota tranzitia catre o noua linie (new line), uneori este numit LF (Line Feed).
\r – denota intoarcerea la inceputul liniei (return to the beginning of the line), uneori este numit CR (Carriage Return – “carriage” a fost un sinonim pentru “print head” in timpul masinilor de scris).
\a – denota o alarma – este o religva a trecutului de pe vremea cand erau folosite teleprintere pentru a comunica cu calculatorele. Cand trimiti acest caracter catre un teleprinter, acesta porneste o alarma (de aici si numele oficial de BEL). Chiar si in zilele noastre, daca incercam sa folosim acest caracter vom auzi un beep, puteti incerca 🙂 .
\0 – (zero 0, nu litera O) este numit nul (provenit de la cuvantul din Latina nullus – nimic). Este un caracter ce nu reprezinta niciun caracter. Desi poate parea ciudat, ii vom vedea utilitatea mai tarziu.
Mai avem de discutat 2 cazuri. Sa vedem ce se intampla cand folosim dupa backslash un numar octal si un numar hexazecimal (daca nu stiti ce sunt aceste numere, puteti sa reveniti la Sectiunea 2 ).
In primul caz va afisa litera “A” deoarece valoarea 101 in reprezentare octala este egala cu 65 in decimal. Acest lucru este valabil si pentru valoarea hexazecimala x41. Astfel, conform tabelului ASCII, numarul corespunde caracterului “A“. Veti putea observa ca in tabel regasim valoarea corespunzatoare fiecarui caracter in toate cele 3 reprezentari discutate.
Char = Int
Putem prespune ca tipul char este tratat ca un tip int mai special. Astfel avem urmatoarele afirmatii:
- oricand putem sa asignam o valoare char unei variabile de tip int
- oricand putem sa asignam o valoare int unei variabile de tip char; totusi daca depasim valoarea 255 (valoarea maxima din tabelul ASCII), ne vom astepta la o pierdere de valoarea
- valoarea tipului char poate fi folosita cu aceeasi operatori ca si in cazul tipului int
Cea mai buna explicatie este un exemplu asa ca sa aruncam o privire la codul urmator:
Dupa cum puteti observa, am folosit aceeasi operatori ca si in cazul unor variabile de tip int. Tot ce am facut a fost sa folosim valorile din tablul ASCII, pentru ‘A‘ 65, pentru ‘a‘ 97 si pentru space ” ” este 32. Puteti sa incercati si voi cateva exemple. Ca un fun fact: daca adunam space la literele mari le obtinem pe cele mici 😉 .
Aici se termina si aceasta sectiune. Daca aveti intrebari suplimentare ma puteti gasi oricand folosind informatiile de aici.
➡ Sectiunea anterioara:Curs C++| Sectiunea 3 – Numere si operatori
➡ Sectiunea urmatoare:Curs C++ | Sectiunea 5 – Flow Control

