Ce vei învăța astăzi?
După această lecție vei înțelege ce este un șir de caractere, cum este el organizat în memorie ca un model liniar și cum îl afișăm caracter cu caracter în C++.
Ce este un șir de caractere?
Definiție: Un șir de caractere este o secvență finită de caractere, plasate într-o ordine bine stabilită. Ordinea este esențială: schimbarea ordinii caracterelor produce alt cuvânt.
În memorie, un șir este un model liniar: caracterele sunt așezate unul după altul, iar fiecare caracter are o poziție (indice) unică.
Analogia: literele unui cuvânt, în ordine
Cuvântul INFORMATICĂ este asemenea unui șirag de mărgele: fiecare mărgea este o literă, iar mărgelele sunt înșirate într-o ordine precisă. Dacă schimbi două mărgele, obții alt cuvânt.
Numărul locului ocupat de un caracter (0, 1, 2, ...)
O literă, o cifră sau un simbol, de exemplu 'I'
Succesiunea fixă a caracterelor în șir
| Poziție | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Caracter | I | N | F | O | R | M |
Sfârșitul unui șir: caracterul terminator
În C++, un șir de caractere se termină întotdeauna cu caracterul special '\0' (terminator de șir, cu codul 0). De aceea, pentru un șir de maximum 100 de caractere declarăm un vector de 101 poziții: 100 pentru litere și 1 pentru terminator.
De ce contează terminatorul?
Programul nu „știe" cât de lung este șirul tău: el parcurge caracterele până întâlnește '\0'. Așa află unde se termină șirul și nu afișează caractere „zombie" rămase din memorie.
Observă: caracterul '\0' nu este un spațiu și nu este literă; el este invizibil și marchează doar sfârșitul șirului.
#include <iostream>
using namespace std;
int main()
{
char s[101] = "INFORMATICA";
for (int i = 0; s[i] != '\0'; i++)
{
cout << "Caracterul de pe pozitia " << i
<< " este " << s[i] << endl;
}
return 0;
}
Ce învățăm: parcurgem șirul cu un for de la poziția 0, cât timp caracterul curent nu este terminatorul '\0'. Variabila i este poziția (indicele) curentă.
Lucrul cu pozițiile unui șir
Fiind un model liniar, fiecare caracter al șirului s este accesat cu s[i], unde i este poziția. Primul caracter este s[0]. Numărul total de caractere (lungimea) se poate afla cu funcția strlen (funcție care întoarce numărul de caractere reale, fără terminator) din biblioteca <cstring>.
Exemplu ghidat: primul și ultimul caracter
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int n = strlen(s);
cout << "Primul caracter: " << s[0] << endl;
cout << "Ultimul caracter: " << s[n - 1] << endl;
return 0;
}
Observă: lungimea n a șirului, dată de strlen, nu include terminatorul. Ultimul caracter real se află pe poziția n - 1.
Exercițiu de completare
Completează enunțul despre șirurile de caractere:
Un șir de caractere este o ______ finită de caractere, plasate într-o ______ bine stabilită. Fiecare caracter are o ______ unică, iar primul caracter se află pe poziția ______. Sfârșitul șirului este marcat de caracterul ______.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care afișează un șir caracter cu caracter:
Bancă de cuvinte:
Test de înțelegere
Test rapid - șirul de caractere:
1. Ce este un șir de caractere?
2. Pe ce poziție se află primul caracter al unui șir?
3. Care caracter marchează sfârșitul unui șir în C++?
'\0' nu este cifra '0' (codul 48) și nici spațiul: el are codul 0 și marchează doar sfârșitul șirului. Declară întotdeauna 101 poziții pentru un șir de maximum 100 de caractere, ca să rămână loc pentru terminator.Aprofundare
Cazuri particulare și detalii avansate:
- Spațiul este un caracter obișnuit. În șirul
"Ana are"există 7 caractere plus terminatorul; spațiul de pe poziția 3 este un caracter ca oricare altul, cu codul ASCII 32. - Terminatorul
'\0'nu este caracterul'0'.'\0'are codul 0 și marchează sfârșitul șirului, pe când'0'este cifra zero, cu codul 48. Nu le confunda niciodată! - Afișarea cu
cout << s: dacă afișezi tot șirul deodată,coutscrie caracterele până la'\0'. Dacă șirul nu are terminator, programul ar putea afișa și „resturi" din memorie. - Lungimea reală vs. dimensiunea declarată:
char s[101]rezervă 101 locuri, dar lungimea logică a șirului este dată doar de pozițiile până la primul'\0'. Restul locurilor rămân nefolosite. - Șirul gol are ca singur conținut terminatorul pe poziția 0:
s[0] = '\0', deci lungimea sa este 0.
Un șir de caractere poate fi văzut și ca un vector de caractere: fiecare element s[i] este un caracter (tip char), iar vectorul este parcurs exact ca un tablou unidimensional, cu deosebirea că oprirea se face la întâlnirea terminatorului.
PbInfo - Afișarea caracterelor
Enunț:
Cerință: Se citește un cuvânt s (format doar din litere mici). Să se afișeze fiecare caracter al cuvântului pe câte o linie.
Date de intrare:
Programul citește de la tastatură cuvântul s.
Date de ieșire:
Programul va afișa fiecare caracter al cuvântului pe o linie separată.
Restricții și precizări:
Cuvântul are cel mult 100 de caractere.
Exemplu:
Intrare:
informatica
Ieșire:
i n f o r m a t i c a
Cum gândim soluția:
- Declarăm șirul
char s[101]și îl citim cucin >> s - Parcurgem cu
forcât timps[i] != '\0' - Afișăm fiecare caracter
s[i]cucoutșiendl
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main()
{
char s[101];
cin >> s;
for (int i = 0; s[i] != '\0'; i++)
{
cout << s[i] << endl;
}
return 0;
}
Ce învățăm: terminatorul '\0' ne spune unde se termină șirul; fără el, bucla for nu s-ar opri la momentul potrivit.
PbInfo - Primul și ultimul caracter
Enunț:
Cerință: Se citește un cuvânt s (format doar din litere mici). Să se afișeze primul și ultimul caracter al cuvântului, separate printr-un spațiu.
Date de intrare:
Programul citește de la tastatură cuvântul s.
Date de ieșire:
Programul va afișa primul caracter, un spațiu și ultimul caracter.
Restricții și precizări:
Cuvântul are cel mult 100 de caractere.
Exemplu:
Intrare:
informatica
Ieșire:
i a
Cum gândim soluția:
- Citim cuvântul cu
cin >> s - Calculăm lungimea
n = strlen(s)cu<cstring> - Afișăm
s[0]șis[n - 1]
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int n = strlen(s);
cout << s[0] << " " << s[n - 1];
return 0;
}
Ce învățăm: pozițiile 0 și n - 1 marchează capetele modelului liniar: n este lungimea șirului, fără terminator.
Exercițiul Practic: modelul liniar al unui șir
Sarcini de lucru
Completează următoarele sarcini pentru a-ți consolida cunoștințele despre șirurile de caractere
Sarcina 1: Cuvântul pe verticală
Cerință: Scrie un program C++ complet care citește un cuvânt de la tastatură și afișează fiecare caracter al cuvântului pe câte o linie, folosind un for cu condiția s[i] != '\0'.
Soluție pentru Sarcina 1:
#include <iostream>
using namespace std;
int main()
{
char s[101];
cin >> s;
for (int i = 0; s[i] != '\0'; i++)
{
cout << s[i] << endl;
}
return 0;
}
Verifică: pentru intrarea bac, programul afișează b, a, c, fiecare pe o linie.
Sarcina 2: Care este poziția?
Cerință: Scrie un program C++ complet care citește un cuvânt și afișează caracterul de pe poziția 3 (al patrulea caracter). Pentru intrarea informatica se afișează o.
Soluție pentru Sarcina 2:
#include <iostream>
using namespace std;
int main()
{
char s[101];
cin >> s;
cout << s[3];
return 0;
}
Verifică: pozițiile încep de la 0: s[0]='i', s[1]='n', s[2]='f', s[3]='o'.