Funcții Predefinite pentru String-uri: “Magia” din în C++ și Pascal

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 MagicaC++ (<string>)Pascal
Crearestring s = "magie";s := 'magie';
Lungimes.length() sau s.size()length(s)
Concatenares1 + s2 sau s1 += s2s1 + s2
Comparares1 == s2, s1 < s2s1 = s2, s1 < s2
Căutares.find("ceva")pos('ceva', s)
Extrageres.substr(poz, n)copy(s, poz, n)
Ștergeres.erase(poz, n)delete(s, poz, n)
Inserares.insert(poz, "text")insert('text', s, poz)
Majusculetransform(..., ::toupper)UpperCase(s)
Minusculetransform(..., ::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! 🧙‍♂️✨

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *