Informatiile acestui spatiu sunt gratuite. Observatii si sugestii pot fi trimise pe adresa de contact sau pe forum.

     Siruri de caractere in C++

Probleme rezolvate

Sirurile de caractere reprezinta un tip special de tablou unidimensional (vector), in care ultimul caracter este untotdeauna caracterul NULL (caracterul care are codul 0). Acest caracter nu se poate introduce niciodata de la tastatura, ci este completat automat.

Declaratia unui sir de caractere se realizeaza prin specificarea tipului componentelor sirului, identificatorul sirului, urmat apoi de dimensiunea acestuia intre paranteze drepte.

     char sir[11];         - declara un sir de maxim 10 caractere, al 11-lea caraacter fiind caracterul NULL

Atentie: Datorita caracterului NULL, la declararea sirului de caractere se adauga 1 la dimensiunea lui normala, deci, daca lungimea sirului de caracatere ar fi de exemplu 10, in momentul declararii variabilei respective, lungimea acesteia va fi 11.

Introducerea sirurilor de caractere

Functii cu siruri de caractere

Introducerea sirului de caractere      sus

  1. Introducerea sirului de caractere folosind functia de citire cin      sus
  2. Sirul de caractere poate fi citit ca si orice tablou folosind funcia cin, insa in acest caz caracterul NULL trebuie adaugat manual la sfarsitul introducerii sirului.

    Exemplul 1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    using namespace std;
    int main()
    {
       int i;
       char c[10];
       cout<<"Introduceti sirul de caractere:"<<endl;
       for (i=0;i<7;i++)
          cin>>c[i];
       c[7]=0;
       cout<<"Sirul de caractere introdus este: "<<c;
    }
    Introduceti sirul de caractere:
    t
    e
    s
    t
    a
    r
    e
    Sirul de caractere introdus este: testare



    Dezavantajul introducerii in acest mod a unui sir de caractere este faptul ca in acest caz nu sunt luate in considerare spatiile dintre caractere:

    Exemplul 2:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    #include <iostream>
    using namespace std;
    int main()
    {
       int i;
       char c[10];
       cout<<"Introduceti sirul de caractere:"<<endl;
       //dupa intoducerea fiecarui caracter se va introduce cate un    caracter spatiu
       for (i=0;i<7;i++)
          cin>>c[i];
       c[7]=0;
       cout<<"Sirul de caractere introdus este: "<<c;
    }

    Introduceti sirul de caractere:
    t

    e

    s

    t

    a

    r

    e
    Sirul de caractere introdus este: testare

    Se observa ca, la fel ca si in exemplul anterior, rezultatul afisarii sirului de caractere este identic, deci spatiile care au fost introduse dupa fiecare caracter nu au fost luate in considerare.

    Sirul de caractere mai poate fi citit folosind functia cin, introducand toate caracterele unul dupa altul, in acest caz caracterul NULL fiind adaugat automat. Dezavantajul este faptul ca nu se vor putea memora in sir mai multe cuvinte (caractere despartite prin caracterul spatiu), sirul memorand de aceasta data toate caracterele pana la intalnirea caracterului spatiu.

    Exemplul 3:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <iostream>
    using namespace std;
    int main()
    {
       char c[10];
       cout<<"Introduceti sirul de caractere: "<<endl;
       cin>>c;
       cout<<"Sirul de caractere introdus este: "<<c;
    }
    Introduceti sirul de caractere: ora de varf
    Sirul de caractere introdus este: ora









  3. Introducerea sirului de caractere folosind functia de citire cin.get      sus
  4. Atentie: Pentru a folosi functia cin.get trebuie utilizata directiva preprocesor string.h:

    #include <string.h>

    Functia cin.get poate fi utilizata in 3 forme:

    • Varianta completa, cu 3 parametri
    • cin.get(s,n+1,'c')

      unde:
      • s - reprezinta sirul de caractere
      • n+1 - lungimea sirului de caractere, care include si caracterul NULL
      • c - caracterul care va determina incheierea introducerii de caractere in sir

      Exemplul 4:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      #include <iostream>
      #include <string.h>
      using namespace std;
      int main()
      {
         char c[100];
         cout<<"Introduceti sirul de caractere: "<<endl;
         cin.get(c,99,'x');
         cout<<"Sirul de caractere introdus este: "<<c;
      }
      Introduceti sirul de caractere: ora de varfx
      Sirul de caractere introdus este: ora de varf








      Observatii:

      • Daca lungimea sirului introdus este mai mare decat cea declarata, atunci sirul va fi trunchiat;
      • Sirul va memora toate caracterele introduse, inclusiv cele speciale/albe: spatiu, tab, enter.
      • Dimesiunea sirului include si caracterul NULL

    • Varianta prescurtata, cu 2 parametri
    • cin.get(s,n+1)

      unde:
      • s - reprezinta sirul de caractere
      • n+1 - lungimea sirului de caractere, care include si caracterul NULL

      Aceasta varianta prescurtata implica utilizarea caracterului Enter ca si caracter terminal al sirului.

      Exemplul 5:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      #include <iostream>
      #include <string.h>
      using namespace std;
      int main()
      {
         char c[100];
         cout<<"Introduceti sirul de caractere: "<<endl;
         cin.get(c,99);
         cout<<"Sirul de caractere introdus este: "<<c;
      }
      Introduceti sirul de caractere: ora de varf
      Sirul de caractere introdus este: ora de varf








      Observatii:

      • Daca lungimea sirului introdus este mai mare decat cea declarata, atunci sirul va fi trunchiat;
      • Sirul va memora toate caracterele introduse, inclusiv cele speciale, in afara de Enter, care este considerat terminator al sirului introdus.
      • Dimesiunea sirului include si caracterul NULL

    • Varianta fara nici un parametru
    • In unele probleme este necesar sa se citeasca mai multe siruri de caractere folosind variabile diferite. In cazul in care se foloseste functia cin.get, acest lucru nu este posibil decat daca intre operatiile de introducere a sirurilor de caractere se apeleaza functia cin.get fara nici un parametru:

      cin.get()

      Exemplul 6:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      #include <iostream>
      #include <string.h>
      using namespace std;
      int main()
      {
         char c[100], d[100];
         cout<<"Introduceti primul sir de caractere: ";
         cin.get(c,99);
         cout<<"Primul sir de caractere este: "<<c<<endl;
         cin.get();
         cout<<"Introduceti al doilea sir de caractere: ";
         cin.get(d,99);
         cout<<"Al doilea sir de caractere este: "<<d<<endl;
      }
      Introduceti primul sir de caractere: test 1
      Primul sir de caractere este: test 1
      Introduceti al doilea sir de caractere: test 2
      Al doilea sir de caractere este: test 2











Functii cu siruri de caractere

  • Functia strlen
    - permite aflarea lungimii exacte a unui sir de caractere (exceptannd caracterul NULL).

    Exemplu: Se citeste de la tastatura un sir de caractere. Sa se afiseze lungimea acestuia.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       int l;
       char c[100];
       cout<<"Introduceti sirul de caractere: ";
       cin.get(c,99);
       l=strlen(c);
       cout<<"Lungimea sirului de caractere este: "<<l<<endl;
    }
    Introduceti sirul de caractere: test 1
    Lungimea sirului de caractere este: 6










    Atentie: - lungimea sirului nu include caracterul NULL aflat la sfarsitul sirului de caractere (terminator al sirului).

  • Functia strupr
    - permite transformarea literelor mici in litere mari.

    Exemplu: Se citeste de la tastatura un sir de caractere. Sa se converteasca toate literele mici in litere mari.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char c[100];
       cout<<"Introduceti sirul de caractere: ";
       cin.get(c,99);
       strupr(c);
       cout<<"Noul sir de caractere este: "<<c<<endl;
    }
    Introduceti sirul de caractere: test
    Noul sir de caractere este: TEST










  • Functia strlwr
    - permite transformarea literelor mari in litere mici.

    Exemplu: Se citeste de la tastatura un sir de caractere. Sa se converteasca toate literele mari in litere mici.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char c[100];
       cout<<"Introduceti sirul de caractere: ";
       cin.get(c,99);
       strlwr(c);
       cout<<"Noul sir de caractere este: "<<c<<endl;
    }
    Introduceti sirul de caractere: TEST
    Noul sir de caractere este: test










  • Functia strcat
    - permite concatenarea a doua siruri de caractere.

    Sintaxa:
       strcat(sir1, sir2) - adauga sirul sir2 la sirul sir1 - al doilea sir ramane neschimbat.

    Exemplu: Se citesc de la tastatura doua siruri de caractere. Sa se concateneze cele doua siruri si sa se afiseze continutul acestora in urma concatenarii.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char sir1[100], sir2[100];
       cout<<"Introduceti primul sir de caractere: ";
       cin.get(sir1,99);
       cin.get(); //pentru a putea citi al doilea sir de caractere
       cout<<"Introduceti al doilea sir de caractere: ";
       cin.get(sir2,99);
       strcat(sir1,sir2);
       cout<<"Primul sir de caractere este: "<<sir1<<endl;
       cout<<"Al doilea sir de caractere este: "<<sir2<<endl;
    }
    Introduceti primul sir de caractere: test
    Introduceti al doilea sir de caractere: are
    Primul sir de caractere este: testare
    Al doilea sir de caractere este: are












    Observatie: Functia mai poate fi intalnita si sub urmatoarea forma:
       strncat(sir1, sir2, n) - adauga primele n caractere din sirul sir2 la sirul sir1 - al doilea sir ramane neschimbat.

    Exemplu: Se citesc de la tastatura doua siruri de caractere. Sa se concateneze cele doua siruri prin adaugarea primelor n caractere din al doilea sir la sfarsitul primului sir, iar apoi si sa se afiseze continutul celor doua siruri in urma concatenarii.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char sir1[100], sir2[100];
       int n;
       cout<<"Introduceti primul sir de caractere: ";
       cin.get(sir1,99);
       cin.get(); //pentru a putea citi al doilea sir de caractere
       cout<<"Introduceti al doilea sir de caractere: ";
       cin.get(sir2,99);
       cout<<"n=";
       cin>>n;
       strncat(sir1,sir2,n);
       cout<<"Primul sir de caractere este: "<<sir1<<endl;
       cout<<"Al doilea sir de caractere este: "<<sir2<<endl;
    }
    Introduceti primul sir de caractere: test
    Introduceti al doilea sir de caractere: are la informatica
    n=11
    Primul sir de caractere este: testare la info
    Al doilea sir de caractere este: are la informatica














  • Functia strcpy
    - permite copierea unui sir de caractere in alt sir de caractere.

    Sintaxa:
       strcpy(sir1, sir2) - copiaza sirul sir2 in sirul sir1 - primul sir va fi suprascris in cazul in care acesta este initializat anterior.

    Exemplu: Se citesc de la tastatura doua siruri de caractere. Sa se copieze al doilea sir de caractere in primul si sa se afiseze continutul celor doua siruri in urma acestei operatii.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char sir1[100], sir2[100];
       cout<<"Introduceti primul sir de caractere: ";
       cin.get(sir1,99);
       cin.get(); //pentru a putea citi al doilea sir de caractere
       cout<<"Introduceti al doilea sir de caractere: ";
       cin.get(sir2,99);
       strcpy(sir1,sir2);
       cout<<"Primul sir de caractere este: "<<sir1<<endl;
       cout<<"Al doilea sir de caractere este: "<<sir2<<endl;
    }
    Introduceti primul sir de caractere: test
    Introduceti al doilea sir de caractere: are
    Primul sir de caractere este: are
    Al doilea sir de caractere este: are












    Observatie: Functia mai poate fi intalnita si sub urmatoarea forma:
       strncpy(sir1, sir2, n) - copiaza primele n caractere din sirul sir2 in sirul sir1 - primul sir va fi suprascris in cazul in care acesta este initializat anterior.

    Exemplu: Se citesc de la tastatura doua siruri de caractere. Sa se copieze primele n caractere din al doilea sir de caractere in primul si sa se afiseze continutul celor doua siruri in urma acestei operatii.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char sir1[100], sir2[100];
       int n;
       cout<<"Introduceti primul sir de caractere: ";
       cin.get(sir1,99);
       cin.get(); //pentru a putea citi al doilea sir de caractere
       cout<<"Introduceti al doilea sir de caractere: ";
       cin.get(sir2,99);
       cout<<"n=";
       cin>>n;
       strcpy(sir1,sir2,11);
       cout<<"Primul sir de caractere este: "<<sir1<<endl;
       cout<<"Al doilea sir de caractere este: "<<sir2<<endl;
    }
    Introduceti primul sir de caractere: test
    Introduceti al doilea sir de caractere: are la informatica
    n=11
    Primul sir de caractere este: are la info
    Al doilea sir de caractere este: are la informatica














  • Functia strcmp
    - permite compararea a doua siruri de caractere prin compararea codurilor ASCII ale caracterelor corespondente din fiecare sir. Se citeste caracter cu caracter din fiecare sir si se compara codurile ASCII pana cand codurile difera sau pana cand se intalneste primul caracter NULL.

    Sintaxa:
       strcmp(sir1, sir2) - returneaza:
    • un numar negativ, daca primul sir este mai mic decat al doilea
    • 0, daca sirurile sunt egale
    • un numar pozitiv, daca primul sir este mai mare decat al doilea

    Exemplu: Se citesc de la tastatura doua siruri de caractere. Sa se indice care dintre cele doua siruri este mai mare sau daca cele doua siruri sunt identice.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char sir1[100], sir2[100];
       int val;    cout<<"Introduceti primul sir de caractere: ";
       cin.get(sir1,99);
       cin.get(); //pentru a putea citi al doilea sir de caractere
       cout<<"Introduceti al doilea sir de caractere: ";
       cin.get(sir2,99);
       val=strcmp(sir1,sir2);
       cout<<"val="<<val<<endl;
       if (val==0)
          cout<<"Sirurile sunt identice"<<endl;
       else
          if (val<=0)
             cout<<"Primul sir este mai mic decat al doilea"<<endl;
          else
             cout<<"Primul sir este mai mare decat al doilea"<<endl;
    }
    Introduceti primul sir de caractere: tematica
    Introduceti al doilea sir de caractere: temeinica
    val=-1
    Primul sir este mai mic decat al doilea


















    Observatie: Functia mai poate fi intalnita si sub urmatoarea forma:

       strncmp(sir1, sir2, n)

    Aceasta forma permite compararea a doua siruri de caractere prin compararea codurilor ASCII ale caracterelor corespondente din fiecare sir. Se citeste caracter cu caracter din fiecare sir si se compara codurile ASCII pana cand codurile difera, sau pana cand se intalneste primul caracter NULL, sau pana cand se ajunge la caracterul numarul n in oricare din cele doua siruri.

    Exemplu: Se citesc de la tastatura doua siruri de caractere. Sa se determine daca primele n caractere ale celor 2 siruri sunt identice.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char sir1[100], sir2[100];
       int n,val;    cout<<"Introduceti primul sir de caractere: ";
       cin.get(sir1,99);
       cin.get(); //pentru a putea citi al doilea sir de caractere
       cout<<"Introduceti al doilea sir de caractere: ";
       cin.get(sir2,99);
       cout<<"n=";
       cin>>n;
       val=strncmp(sir1,sir2,n);
       cout<<"val="<<val<<endl;
       if (val==0)
          cout<<"Primele "<<n<<" caractere sunt identice"<<endl;
       else
          cout<<"Primele "<<n<<" caractere nu sunt identice"<<endl;
    }
    Introduceti primul sir de caractere: tematica
    Introduceti al doilea sir de caractere: temeinica
    n=3
    val=0
    Primele 3 caractere sunt identice

















  • Functia strchr
    - permite cautarea unui caracter intr-un sir de caractere. Cautarea se face de la stanga la dreapta iar rezultatul apelului functiei este subsirul de caractere care incepe cu prima aparitie a caracterului cautat si restul caracterelor sirului initial.

    Sintaxa:
       strchr(sir, caracter)

    Exemplu: Sa se determine pe ce pozitie se gaseste prima aparitie a caracterului c in sirul s, unde sirul s si caracterul c se citesc de la tastatura.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char s[100], c;
       char *caut;
       int poz;
       cout<<"Introduceti sirul de caractere: ";
       cin.get(s,99);
       cout<<"Introduceti caracterul cautat: c=";
       cin>>c;
       caut=strchr(s,c);
       cout<<"caut="<<caut<<endl;
       poz=caut-s;
       cout<<"Pozitia primei aparitii: "<<poz<<endl;
    }
    Introduceti sirul de caractere: testare
    Introduceti caracterul cautat: c=e
    caut=estare
    Pozitia primei aparitii: 1













    Explicatii:

    • sirul introdus este: testare
    • caracterul de cautat este: e
    • in variabila caut se retine rezultatul apelului functiei strchr, care este subsirul format din prima aparitie a caracterului cautat si restul sirului initial: estare
    • a se observa ca variabila caut este un pointer catre o adresa de memorie (vezi capitolul Pointeri si referinte)
    • calcularea pozitiei primei aparitii a caracterului cautat se face ca diferenta intre doua adrese de memorie : adresa subsirului "estare" si cea a sirului initial "testare".
    • pozitia primei aparitii este 1 deoarece pozitionarea caracterelor in cadrul sirurilor de caractere se face incepand cu pozitia 0, deci, in cazul nostru, al doilea caracter din sirul initial (primul "e") se afla pe pozitia 1.
    • variabila poz, care memoreaza pozitia pe care se afla caracterul cautat, este de tip intreg, deoarece aceasta memoreaza diferenta intre doua adrese de memorie.

    Observatie: Functia mai poate fi intalnita si sub urmatoarea forma:

       strrchr(sir, caracter)

    Sub aceasta forma, functia realizeaza acelasi lucru, cautarea unul caracter intr-un sir de caractere, numai ca, de aceasta data, cautarea se face de la dreapta la stanga.

    Exemplu: Sa se determine pe ce pozitie se gaseste ultima aparitie a caracterului c in sirul s, unde sirul s si caracterul c se citesc de la tastatura.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char s[100], c;
       char *caut;
       int poz;
       cout<<"Introduceti sirul de caractere: ";
       cin.get(s,99);
       cout<<"Introduceti caracterul cautat: c=";
       cin>>c;
       caut=strrchr(s,c);
       cout<<"caut="<<caut<<endl;
       poz=caut-s;
       cout<<"Pozitia ultimei aparitii: "<<poz<<endl;
    }
    Introduceti sirul de caractere: testare
    Introduceti caracterul cautat: c=e
    caut=e
    Pozitia ultimei aparitii: 6













    Explicatii:

    • sirul introdus este: testare
    • caracterul de cautat este: e
    • in variabila caut se retine rezultatul apelului functiei strchr, care este subsirul format din ultima aparitie a caracterului cautat si restul sirului initial (in cazul nostru ultimul caracter al sirului): e
    • a se observa ca variabila caut este un pointer catre o adresa de memorie (vezi capitolul Pointeri si referinte)
    • calcularea pozitiei ultimei aparitii a caracterului cautat se face ca diferenta intre doua adrese de memorie : adresa subsirului "e" si cea a sirului initial "testare".
    • pozitia ultimei aparitii este 6 deoarece pozitionarea caracterelor in cadrul sirurilor de caractere se face incepand cu pozitia 0, deci, in cazul nostru, al saptelea caracter din sirul initial (ultimul "e") se afla pe pozitia 6.
    • variabila poz, care memoreaza pozitia pe care se afla caracterul cautat, este de tip intreg, deoarece aceasta memoreaza diferenta intre doua adrese de memorie.


  • Functia strstr
    - verifica daca un sir reprezinta un subsir al unui sir dat, cautarea facandu-se de la stanga la dreapta. In caz afirmativ, intoarce subsirul format din sirul cautat si restul caracterelor sirului initial. In caz contrar, intoarce sirul vid. Mai exact, cand sirul cautat este gasit in sirul initial, apelul functiei returneaza adresa de memorie corespunzatoare pozitiei subsirului in cadrul sirului initial, iar in caz contrar intoarce adresa 0.

    Sintaxa:
       strstr(sir1, sir2) - verifica daca sirul sir2 este subsir al sirului sir1.

    Observatie: Daca sirul sir2 este intalnit de mai multe ori in cadrul sirului sir1, atunci apelul functiei returneaza adresa de memorie corespunzatoare primei aparitii a subsirului in cadrul sirului dat.

    Exemplu: Sa se determine daca sirul b se gaseste in sirul a si sa se determine pozitia primei aparitii.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char a[100], b[100];
       char *caut;
       int poz;
       cout<<"Introduceti primul sir de caractere: ";
       cin.get(a,99);
       cin.get();
       cout<<"Introduceti al doilea sir de caractere: ";
       cin.get(b,99);
       caut=strstr(a,b);
       if (caut)
          {
           cout<<"caut="<<caut<<endl;
           poz=caut-a;
           cout<<"Pozitia primei aparitii: "<<poz<<endl;
          }
       else
          cout<<"Sirul "<<b<<" nu a fost gasit in sirul " <<a<<endl;
    }
    Introduceti primul sir de caractere: testare
    Introduceti al doilea sir de caractere: sta
    caut=stare
    Pozitia primei aparitii: 2




















  • Functia strrev
    - returneaza in ordine inversa sirul de caractere introdus ca parametru. Sirul initial este suprascris cu sirul citit in ordine inversa.

    Sintaxa:
       strrev(sir)

    Exemplu: Sa se determine daca sirul a, introdus de la tastatura, este sau nu un palindrom (sirul este identic cu sirul citit invers).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
       char a[100], b[100];
       cout<<"Introduceti sirul de caractere: ";
       cin.get(a,99);
       strcpy(b,a); //se creaza o copie a sirului
       if (strcmp(strrev(a),b)==0)
          cout<<"Sirul este palindrom"<<endl;
       else
          cout<<"Sirul nu este palindrom"<<endl;
    }
    Introduceti sirul de caractere: asta
    Sirul nu este palindrom













Probleme rezolvate

1. Un elev introduce de la tastatura un sir de caractere reprezentand numele unui coleg, iar sirul respectiv se stocheaza intr-o variabila c. Scrieti un program care sa permita unui alt coleg (care nu a vazut sirul introdus de primul elev) sa introduca un sir de caractere pana cand ghiceste numele introdus de colegul sau. La sfarsit, programul trebuie sa afiseze din cate incercari a reusit al doilea elev sa gaseasca numele introdus de primul elev.       Solutie
2. Scrieti un program care citeste un sir de caractere si transforma sirul in sir cu litere mici.       Solutie
3. Se da un sir de caractere a. Sa se afiseze sirul de caractere obtinut prin transformarea literelor mari cuprinse intre ‘D’ si ‘O’ in litere mici, respectiv literelor mici cuprinse intre ‘f’ si ‘t’ in litere mari. Ex : tEst => teSt.       Solutie
4. Sa se scrie programul care citeste de la tastatura un cuvant si afiseaza pe ecran pe o linie, despartite de un spatiu, toate prefixele acestuia (prefixele unui cuvant sunt compuse din minim un caracter si maxim toate caracterele, citite de la stanga la dreapta).       Solutie
5. Scrieti programul care citeste de la tastatura un sir de caractere al alfabetului englez si afiseaza pe randuri diferite sirul de caractere dat cat si toate prefixele acestuia de lumgime cel putin 1, in ordinea descrescatoare a lungimii prefixelor, aliniate la stanga. De exemplu, daca se citeste sirul "proba" atunci fisierul bac.txt va contine :

proba
prob
pro
pr
p
      Solutie
6. Scrieti programul care citeste de la tastatura un sir de caractere al alfabetului englez si afiseaza sirul de caractere dat precum si toate sufixele acestuia de lumgime cel putin 1, fiecare pe cate o linie in ordinea crescatoare a lungimii sufixelor, aliniate la stanga. De exemplu, daca se citeste sirul "teste" atunci se va afisa:

e
te
ste
este
teste
      Solutie
7. Se citeste o fraza de la tastatura. Sa se creeze un program care afiseaza toate cuvintele gasite in fraza respectiva.       Solutie
8. Se citeste de la tastatura un sir de caractere. Sa se precizeze daca sirul introdus reprezinta un numar.       Solutie
9. Sa se verifice daca doua cuvinte citite de la tastatura rimeaza (spunem ca douacuvinte rimeaza daca ultimele doua caractere sunt identice).       Solutie
10. Se consideră un text cu cel mult 70 de caractere (litere mici ale alfabetului englez si spatii), în care cuvintele sunt separate prin unul sau mai multe spatii. Înaintea primului cuvânt si după ultimul cuvânt nu există spatii. Scrieti un program C/C++ care citeste de la tastatură un text de tipul mentionat mai sus si afisează pe ecran numărul de cuvinte în care apare litera a. Exemplu: pentru textul : "voi sustine examenul la informatica" se va afisa valoarea 3.       Solutie

Rezolvari

1. Un elev introduce de la tastatura un sir de caractere reprezentand numele unui coleg, iar sirul respectiv se stocheaza intr-o variabila c. Scrieti un program care sa permita unui alt coleg (care nu a vazut sirul introdus de primul elev) sa introduca un sir de caractere pana cand ghiceste numele introdus de colegul sau. La sfarsit, programul trebuie sa afiseze din cate incercari a reusit al doilea elev sa gaseasca numele introdus de primul elev.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char c[100], d[100];
   int i=0;
   cout<<"Introduceti numele colegului:";
   cin.get(c,20);
   cout<<"sirul introdus este:"<<c<<endl;
   cin.get();
   cout<<"Incearca sa ghicesti numele colegului:";
   cin.get(d,20);cin.get();i++;
   while (strcmp(c,d)!=0)
   {
      cout<<"ai gresit, mai incearca:";
      cin.get(d,20);cin.get();i++;
   }
   cout<<"Bravo, ai ghicit din "<<i<<" incercari - numele colegului era: "<<c;
   return 0;
}

2. Scrieti un program care citeste un sir de caractere si transforma sirul in sir cu litere mici.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char c[100];
   int i=0;
   cout<<"Introduceti sirul de caractere:";
   cin.get(c,20);
   while(c[i]!=0)
   {
      if( (c[i]>=65) && (c[i]<=90) )
         c[i]=c[i]+32;
      i++;
   }
   cout<<"Sirul transformat in litere mici este "<<c;
   return 0;
}

3. Se da un sir de caractere a. Sa se afiseze sirul de caractere obtinut prin transformarea literelor mari cuprinse intre ‘D’ si ‘O’ in litere mici, respectiv literelor mici cuprinse intre ‘f’ si ‘t’ in litere mari. Ex : tEst => teSt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char a[100];
   int i;
   cout<<"Introduceti sirul de caractere:";
   cin.get(a,20);
   for (i=0; i<strlen(a);i++)
   {
   if (a[i]>'D' && a[i]<'O')
      a[i]=a[i]+'a'-'A';
   if (a[i]>'f' && a[i]<'t')
      a[i]=a[i]-'a'+'A';
   }
   cout<<"Sirul final este: "<<a;
   return 0;
}

4. Sa se scrie programul care citeste de la tastatura un cuvant si afiseaza pe ecran pe o linie, despartite de un spatiu, toate prefixele acestuia (prefixele unui cuvant sunt compuse din minim un caracter si maxim toate caracterele, citite de la stanga la dreapta).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char s[100];
   int i=0,j;
   cout<<"Introduceti sirul de caractere:";
   cin>>s;
   cout<<"Prefixele sirului dat sunt:"<<endl;
   while(s[i]!=NULL)
   {
   for(j=0;j<=i;j++)
      cout<<s[j];
      cout<<" ";
      i++;
   }
   return 0;
}

5. Scrieti programul care citeste de la tastatura un sir de caractere al alfabetului englez si afiseaza pe randuri diferite sirul de caractere dat cat si toate prefixele acestuia de lumgime cel putin 1, in ordinea descrescatoare a lungimii prefixelor, aliniate la stanga. De exemplu, daca se citeste sirul "proba" atunci fisierul bac.txt va contine :

proba
prob
pro
pr
p


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char s1[100],s2[100],temp[100];
   int i;
   cout<<"Introduceti sirul de caractere:";
   cin.get(s1,100);
   cout<<"Prefixele sirului dat sunt:"<<endl;
   for(i=0;i<strlen(s1);i++)
   {
      strcpy(temp,s1);
      strrev(temp);
      strcpy(s2,temp+i);
      strrev(s2);
      cout<<s2<<endl;
   }
   return 0;
}

6. Scrieti programul care citeste de la tastatura un sir de caractere al alfabetului englez si afiseaza sirul de caractere dat precum si toate sufixele acestuia de lumgime cel putin 1, fiecare pe cate o linie in ordinea crescatoare a lungimii sufixelor, aliniate la stanga. De exemplu, daca se citeste sirul "teste" atunci se va afisa:

e
te
ste
este
teste


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char s1[100],s2[100],temp[100];
   int i;
   cout<<"Introduceti sirul de caractere:";
   cin.get(s1,100);
   cout<<"Prefixele sirului dat sunt:"<<endl;
   for(i=strlen(s1)-1;i>=0;i--)
   {
      strcpy(s2,s1);
      strcpy(temp,s2+i);
      cout<<temp<<endl;
   }
   return 0;
}

7. Se citeste o fraza de la tastatura. Sa se creeze un program care afiseaza toate cuvintele gasite in fraza respectiva.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char s[100];
   int i;
   cout<<"Introduceti fraza:";
   cin.get(s,100);
   cout<<"Cuvintele din fraza introdusa sunt:"<<endl;
   for(i=0;i<strlen(s);i++)
      if (s[i]!=' ')
         cout<<s[i];
      else
         cout<<endl;
   return 0;
}

8. Se citeste de la tastatura un sir de caractere. Sa se precizeze daca sirul introdus reprezinta un numar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char s[100],v[]="0123456789";
   int i,test=1;
   cout<<"Introduceti sirul de caractere:";
   cin.get(s,100);
   for(i=0;i<strlen(s);i++)
      if (strchr(v,s[i])==0)
      {
         test=0;;
         cout<<"i="<<i<<" => s["<<i<<"]="<<s[i]<<endl;
      }
   if (test==1)
      cout<<"Sirul introdus reprezinta un numar.";
   else
      cout<<"Sirul introdus nu reprezinta un numar.";
   return 0;
}

9. Sa se verifice daca doua cuvinte citite de la tastatura rimeaza (spunem ca douacuvinte rimeaza daca ultimele doua caractere sunt identice).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char s1[100],s2[100];
   int i;
   cout<<"Introduceti primul cuvant: ";
   cin.get(s1,100);
   cin.get();
   cout<<"Introduceti al doilea cuvant: ";
   cin.get(s2,100);
   cout<<"Lungimea primului cuvant este:"<<strlen(s1)<<endl;
   cout<<"Lungimea celui de-al doilea cuvant este:"<<strlen(s2)<<endl;
   cout<<"Ultimele 2 caractere ale primului cuvant sunt: "<<s1[strlen(s1)-2]<<s1[strlen(s1)-1]<<endl;
   cout<<"Ultimele 2 caractere ale celui de-al doilea cuvant sunt: "<<s2[strlen(s2)-2]<<s2[strlen(s2)-1]<<endl;
   if (s1[strlen(s1)-2]==s2[strlen(s2)-2] && s1[strlen(s1)-1]==s2[strlen(s2)-1])
      cout<<"Cuvintele "<<s1<<" si "<<s2<<" rimeaza.";
   else
      cout<<"Cuvintele "<<s1<<" si "<<s2<<" nu rimeaza.";
   return 0;
}

10. Se consideră un text cu cel mult 70 de caractere (litere mici ale alfabetului englez si spatii), în care cuvintele sunt separate prin unul sau mai multe spatii. Înaintea primului cuvânt si după ultimul cuvânt nu există spatii. Scrieti un program C/C++ care citeste de la tastatură un text de tipul mentionat mai sus si afisează pe ecran numărul de cuvinte în care apare litera a. Exemplu: pentru textul : "voi sustine examenul la informatica" se va afisa valoarea 3.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
   char a[71];
   int i,j,num=0,temp;
   cout<<"Introduceti sirul de caractere: ";
   cin.get(a,70);
   for (i=0;i<strlen(a);i++)
   {
      cout<<"i="<<i<<endl;
      if (a[i]=='a' || a[i]=='A')
         {
         num++;
         cout<<"num="<<num<<endl;
         for (j=i;j<strlen(a);j++)
            {
            cout<<"j="<<j<<endl;
            temp=j;
            if (a[j]==' ')
               j=strlen(a);
            }
         i=temp;
         cout<<"i="<<i<<endl;
         }
   }
   cout<<"Litera a apare in "<<num<<" cuvinte ale frazei: "<<a;
   return 0;
}