Bun venit la cel mai fun atelier de string-uri! Dacă șirurile de caractere sunt cuvintele calculatorului, atunci funcțiile predefinite sunt trucurile de magie pe care le poți face cu ele. Hai să vedem ce instrumente fantastice ne oferă C++ (doar cu <iostream> și <string>) și Pascal!
1. Ce este un Șir de Caractere? “Un Tren de Caractere”
Gândește-te la un șir de caractere ca la un tren unde fiecare vagon este o literă, cifră sau simbol:
- Șir: “Salut”
- Caractere: ‘S’ ‘a’ ‘l’ ‘u’ ‘t’
- Terminator: ‘\0’ (caracterul invizibil de la sfârșit)
Analogie cu un Cuvânt Într-o Cutie:
Cutia poate conține: S a l u t \0 \0 \0 \0 \0
Unde \0 e terminatorul care spune “aici se termină cuvântul”
Partea 1: C++ cu <string> – Magicianul Modern
A. Setul de Bază: “Cele 7 Minuni” ale String-ului
#include <iostream>
#include <string> // ASTA E SINGURA BIBLIOTECĂ DE CARE AVEM NEVOIE!
using namespace std;
int main() {
cout << "=== MAGIA STRING-URILOR în C++ ===\n\n";
// 1. CREAREA - "Născocirea din nimic"
string magie1 = "Abracadabra!";
string magie2("Hocus Pocus");
string magie3 = magie1; // O clonă perfectă!
cout << "1. CREARE:\n";
cout << " magie1: " << magie1 << endl;
cout << " magie2: " << magie2 << endl;
cout << " magie3 (clona): " << magie3 << endl;
// 2. LUNGIMEA - "Ruleta Magică"
cout << "\n2. LUNGIME:\n";
cout << " '" << magie1 << "' are " << magie1.length() << " caractere\n";
cout << " (sau " << magie1.size() << " caractere cu .size())\n";
// 3. GOAL? - "Verificarea Videzii"
string sacGol = "";
string sacPlin = "Vrajeala";
cout << "\n3. VERIFICARE GOAL:\n";
cout << " sacGol.empty(): " << (sacGol.empty() ? "DA" : "NU") << endl;
cout << " sacPlin.empty(): " << (sacPlin.empty() ? "DA" : "NU") << endl;
return 0;
}
B. Operații Magice: “Trucurile Magicianului”
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "=== OPERAȚII MAGICE cu STRING-URI ===\n\n";
string vrajitor = "Merlin";
string actiune = "invata";
string obiect = "magie";
// 1. CONCATENAREA - "Alchimia Cuvintelor"
// GÂNDEȘTE-TE: Lipirea a două vagoane de tren
string propozitie = vrajitor + " " + actiune + " " + obiect + ".";
cout << "1. CONCATENARE (+):\n";
cout << " " << propozitie << endl;
// Adăugare la sfârșit - "Extinderea Vagonului"
propozitie += " Foarte mult!";
cout << " Cu +=: " << propozitie << endl;
// 2. COMPARAREA - "Balanța Dreptății"
// GÂNDEȘTE-TE: Cine e "mai mare" alfabetic?
string cuv1 = "Ana";
string cuv2 = "Maria";
string cuv3 = "Ana";
cout << "\n2. COMPARARE:\n";
cout << " '" << cuv1 << "' == '" << cuv3 << "': "
<< (cuv1 == cuv3 ? "ADEVARAT" : "FALS") << endl;
cout << " '" << cuv1 << "' == '" << cuv2 << "': "
<< (cuv1 == cuv2 ? "ADEVARAT" : "FALS") << endl;
cout << " '" << cuv1 << "' < '" << cuv2 << "': "
<< (cuv1 < cuv2 ? "ADEVARAT" : "FALS") << " (A < M alfabetic)\n";
// 3. ACCES CARACTERE - "Vagonul Specific"
// GÂNDEȘTE-TE: Caut vagonul numărul X din tren
string tren = "Express";
cout << "\n3. ACCES CARACTERE:\n";
cout << " Trenul: " << tren << endl;
cout << " Primul vagon [0]: " << tren[0] << endl;
cout << " Al treilea vagon [2]: " << tren[2] << endl;
cout << " Ultimul vagon: " << tren[tren.length()-1] << endl;
// Modificare caracter
tren[0] = 'E'; // Schimbă 'E' în 'E' (rămâne la fel)
cout << " După modificare: " << tren << endl;
return 0;
}
C. Căutare și Găsire: “Vânătoarea de Comori”
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "=== VÂNĂTOAREA DE COMORI în STRING-URI ===\n\n";
string mapa = "Comoara se afla sub copacul mare din padure";
cout << "Harta noastră: \"" << mapa << "\"\n\n";
// 1. FIND - "Detectorul de Metal"
// GÂNDEȘTE-TE: Caut unde începe cuvântul "comoara"
size_t pozitie = mapa.find("comoara");
cout << "1. FIND (căutare):\n";
if(pozitie != string::npos) { // npos = "Nu am găsit nimic"
cout << " Am găsit 'comoara' la poziția: " << pozitie << endl;
} else {
cout << " Nu am găsit comoara :(\n";
}
// Caută de la o anumită poziție
pozitie = mapa.find("a", 10); // Caută 'a' începând cu poziția 10
cout << " Prima 'a' după poziția 10: " << pozitie << endl;
// 2. RFIND - "Căutarea Inversă"
// GÂNDEȘTE-TE: Caut ULTIMA apariție
pozitie = mapa.rfind("a");
cout << "\n2. RFIND (căutare inversă):\n";
cout << " Ultima 'a' este la: " << pozitie << endl;
// 3. FIND_FIRST_OF - "Orice din Listă"
// GÂNDEȘTE-TE: Găsește PRIMA vocală
pozitie = mapa.find_first_of("aeiou");
cout << "\n3. FIND_FIRST_OF (orice caracter din listă):\n";
cout << " Prima vocală este la: " << pozitie << endl;
// 4. FIND_LAST_OF - "Ultimul din Listă"
pozitie = mapa.find_last_of("aeiou");
cout << "\n4. FIND_LAST_OF (ultimul din listă):\n";
cout << " Ultima vocală este la: " << pozitie << endl;
return 0;
}
D. Tăiere și Lipire: “Chirurgia String-urilor”
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "=== CHIRURGIA STRING-URILOR ===\n\n";
string pacient = "Acesta este un string lung si interesant";
cout << "Pacientul inițial: \"" << pacient << "\"\n\n";
// 1. SUBSTR - "Extragerea unei Bucați"
// GÂNDEȘTE-TE: Tai o felie din tortă
string felie = pacient.substr(8, 10); // de la pozitia 8, 10 caractere
cout << "1. SUBSTR (extragere):\n";
cout << " pacient.substr(8, 10) = \"" << felie << "\"\n";
// 2. REPLACE - "Înlocuirea Magică"
// GÂNDEȘTE-TE: Înlocuiesc o bucată cu alta
pacient.replace(8, 10, "a fost");
cout << "\n2. REPLACE (înlocuire):\n";
cout << " După replace: \"" << pacient << "\"\n";
// 3. ERASE - "Ștergerea cu Radierul Magic"
// GÂNDEȘTE-TE: Șterg o parte
pacient.erase(20, 5); // șterge 5 caractere începând cu poziția 20
cout << "\n3. ERASE (ștergere):\n";
cout << " După erase: \"" << pacient << "\"\n";
// 4. INSERT - "Inserez ceva Nou"
// GÂNDEȘTE-TE: Bag un vagon nou în tren
pacient.insert(20, "foarte ");
cout << "\n4. INSERT (inserare):\n";
cout << " După insert: \"" << pacient << "\"\n";
return 0;
}
E. Transformări: “Metamorfoza String-urilor”
#include <iostream>
#include <string>
#include <algorithm> // pentru transform
using namespace std;
int main() {
cout << "=== METAMORFOZA STRING-URILOR ===\n\n";
string animal = "Un Dragon magic zboara sus";
cout << "Animalul inițial: \"" << animal << "\"\n\n";
// 1. TRANSFORM - "Schimbarea Formei"
// GÂNDEȘTE-TE: Transform toate literele în majuscule
string dragonMare = animal;
transform(dragonMare.begin(), dragonMare.end(), dragonMare.begin(), ::toupper);
cout << "1. TRANSFORM (majuscule):\n";
cout << " TOATE MAJUSCULE: \"" << dragonMare << "\"\n";
// Transform în minuscule
string dragonMic = animal;
transform(dragonMic.begin(), dragonMic.end(), dragonMic.begin(), ::tolower);
cout << " toate minuscule: \"" << dragonMic << "\"\n";
// 2. SWAP - "Schimbul Magicianilor"
// GÂNDEȘTE-TE: Schimb conținutul a două cutii
string cutie1 = "Vrajeala";
string cutie2 = "Magie";
cout << "\n2. SWAP (schimb):\n";
cout << " Înainte: cutie1 = \"" << cutie1 << "\", cutie2 = \"" << cutie2 << "\"\n";
cutie1.swap(cutie2);
cout << " După swap: cutie1 = \"" << cutie1 << "\", cutie2 = \"" << cutie2 << "\"\n";
return 0;
}
Partea 2: Pascal – Vrăjitorul Clasic
program MagiaStringurilor;
uses sysutils; { Cutia noastră de instrumente magice }
var
vraja, incantatie, rezultat: string;
poz: integer;
begin
writeln('=== VRĂJILE STRING-URILOR în PASCAL ===');
writeln;
{ 1. CREARE ȘI LUNGIME - "Învățământul de bază" }
vraja := 'Abracadabra';
incantatie := 'Hocus Pocus';
writeln('1. CREARE ȘI LUNGIME:');
writeln(' vraja = "', vraja, '"');
writeln(' Lungimea: ', length(vraja), ' caractere');
writeln(' incantatie = "', incantatie, '"');
{ 2. CONCATENARE - "Alchimia Pascal" }
rezultat := vraja + ' ' + incantatie + '!';
writeln;
writeln('2. CONCATENARE:');
writeln(' ', rezultat);
{ 3. COMPARARE - "Balanța Vrăjitorului" }
writeln;
writeln('3. COMPARARE:');
writeln(' "', vraja, '" = "', vraja, '": ', vraja = vraja);
writeln(' "', vraja, '" < "', incantatie, '": ', vraja < incantatie);
{ 4. ACCES CARACTERE - "Vagonul Specific" }
{ ATENȚIE: În Pascal indexarea începe de la 1! }
writeln;
writeln('4. ACCES CARACTERE (index de la 1):');
writeln(' vraja[1] = ', vraja[1]);
writeln(' vraja[3] = ', vraja[3]);
writeln(' Ultimul: vraja[', length(vraja), '] = ', vraja[length(vraja)]);
{ 5. CĂUTARE - "Vânătoarea de Vrăji" }
vraja := 'Comoara se afla sub copacul mare';
poz := pos('copac', vraja);
writeln;
writeln('5. CĂUTARE (pos):');
writeln(' "copac" in "', vraja, '" -> pozitia ', poz);
{ 6. EXTRAGERE - "Decuparea Vrăjii" }
rezultat := copy(vraja, 20, 6);
writeln;
writeln('6. EXTRAGERE (copy):');
writeln(' copy("', vraja, '", 20, 6) = "', rezultat, '"');
{ 7. ȘTERGERE - "Dispariția Vrăjită" }
delete(vraja, 20, 6);
writeln;
writeln('7. ȘTERGERE (delete):');
writeln(' după delete(20,6): "', vraja, '"');
{ 8. INSERARE - "Apariția Magică" }
insert('inalt ', vraja, 20);
writeln;
writeln('8. INSERARE (insert):');
writeln(' după insert("inalt ", 20): "', vraja, '"');
{ 9. TRANSFORMĂRI - "Metamorfoza" }
writeln;
writeln('9. TRANSFORMĂRI:');
writeln(' LowerCase("VRAJITOR"): ', LowerCase('VRAJITOR'));
writeln(' UpperCase("vrajitor"): ', UpperCase('vrajitor'));
{ 10. FORMATARE - "Arta Frumuseții" }
writeln;
writeln('10. FORMATARE:');
writeln(' Format: ', Format('%s are %d mere magice', ['Vrajitorul', 7]));
end.
Tabel Magic Comparativ: C++ vs Pascal
| Operație Magica | C++ (<string>) | Pascal |
|---|---|---|
| Creare | string s = "magie"; | s := 'magie'; |
| Lungime | s.length() sau s.size() | length(s) |
| Concatenare | s1 + s2 sau s1 += s2 | s1 + s2 |
| Comparare | s1 == s2, s1 < s2 | s1 = s2, s1 < s2 |
| Căutare | s.find("ceva") | pos('ceva', s) |
| Extragere | s.substr(poz, n) | copy(s, poz, n) |
| Ștergere | s.erase(poz, n) | delete(s, poz, n) |
| Inserare | s.insert(poz, "text") | insert('text', s, poz) |
| Majuscule | transform(..., ::toupper) | UpperCase(s) |
| Minuscule | transform(..., ::tolower) | LowerCase(s) |
Reguli de Aur pentru Magia String-urilor
Pentru C++:
// 1. FIND întotdeauna verifică cu string::npos
if (text.find("comoara") != string::npos) {
cout << "Am gasit comoara!";
}
// 2. SUBSTR - primește (pozitie, lungime)
string bucata = text.substr(3, 5); // 5 caractere începând cu poziția 3
// 3. La INSERT, ERASE, REPLACE - prima poziție e indexul
text.insert(5, "AAA"); // inserează "AAA" la poziția 5
// 4. Operatorul + pentru concatenare e cel mai ușor
string complet = "Buna " + nume + "!";
Pentru Pascal:
{ 1. Indexarea începe de la 1, nu de la 0! }
s := 'Salut';
writeln(s[1]); { afișează 'S' }
writeln(s[3]); { afișează 'l' }
{ 2. POS întoarce 0 dacă nu găsește }
poz := pos('magie', s);
if poz > 0 then
writeln('Gasit la pozitia ', poz);
{ 3. COPY primește (sursa, pozitie, lungime) }
bucata := copy(s, 2, 3); { 3 caractere începând cu poziția 2 }
Exercițiu Final: “Vrăjitorul Începător”
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "=== EXAMENUL VRĂJITORULUI ÎNCEPĂTOR ===\n\n";
// Problema 1: Inversează un nume
string numeIntreg = "Merlin Vrajitorul";
// Găsește spațiul
size_t spatiu = numeIntreg.find(' ');
if (spatiu != string::npos) {
string prenume = numeIntreg.substr(0, spatiu);
string nume = numeIntreg.substr(spatiu + 1);
cout << "1. Nume inversat:\n";
cout << " Original: " << numeIntreg << endl;
cout << " Inversat: " << nume << " " << prenume << endl;
}
// Problema 2: Creează un username
string numeComplet = "Ana Maria Popescu";
string username = "";
// Ia prima literă din fiecare nume
username += tolower(numeComplet[0]); // 'a'
for (size_t i = 0; i < numeComplet.length(); i++) {
if (numeComplet[i] == ' ') {
username += tolower(numeComplet[i + 1]);
}
}
// Adaugă ultimul nume
size_t ultimSpatiu = numeComplet.find_last_of(' ');
if (ultimSpatiu != string::npos) {
string ultimNume = numeComplet.substr(ultimSpatiu + 1);
transform(ultimNume.begin(), ultimNume.end(), ultimNume.begin(), ::tolower);
username += ultimNume;
}
cout << "\n2. Username generat:\n";
cout << " Nume complet: " << numeComplet << endl;
cout << " Username: " << username << endl;
return 0;
}
Concluzie Magică:
Fie că folosești C++ sau Pascal, string-urile sunt ca un set de instrumente magice. Învață să le folosești bine, și vei putea face orice cu textul în programele tale! 🧙♂️✨
Leave a Reply