Exercitii rezolvate stringuri

Precizați care ar fi efectul executării secvențelor de cod următoare !

1. În secvenţa de instrucţiuni de mai jos, variabila s memorează un şir de caractere format doar din litere ale alfabetului englezesc, iar variabilele i şi n sunt de tip int. Ştiind că în urma executării secvenţei s-a afişat succesiunea de caractere „eied\*eael\*”, scrieţi care este şirul de caractere memorat de variabila s.

```
n=strlen(s);

for(i=0;i<n;i++) if (s[i]==’e’) cout<<’*’;

else cout<<'e'<<s[i];

```

**Soluție:** se observă că secvența înlocuiește fiecare caracter ’e’ prin asterix, iar pentru celelalte caractere determină afișarea caracterului ‘e’ înainte. Prin urmare, șirul inițial este: „ideale”.

2. Ce se afişează în urma executării secvenţei de program de mai jos dacă variabila s memorează şirul de caractere „abcdefgh”?

```
strcpy(s+2,s+4);

cout<<s<<” ”<<strlen(s);

```

**Soluție:** secvența determină copierea subșirului ce începe de la al 4-lea caracter peste subșirul ce începe de la de al 2-lea caracter. Prin urmare, rezultatul afișat va fi: „abefgh6"

3. Se consideră declararea:

```
char s[50], x[50];

```

Ce se afişează în urma executării secvenţei de program scrisă mai jos, dacă variabila s memorează şirul „abcdefg”?

```
strcpy(x,s+4);

strcpy(s+4,”123”);

strcat(s,x); cout<<s;

```

**Soluție**: abcd123efg

4. Ce se va afişa în urma executării secvenţei de program de mai jos, considerând că a este o variabilă de tip şir de caractere, iar i o variabilă de tip întreg?

```
char a[10]="examen";

for (i=0;i<=2;i++) strcpy(a+i,a+i+1);

cout<<a;

```

**Soluție:** xmn

5. Ştiind că variabila i este de tip întreg şi variabila s reţine un şir de caractere, ce se va afişa la executarea secvenţei de mai jos?

```
strcpy(s,”bac2009”);

for(i=0; i<strlen(s); i++) if(s[i]<’0’ || s[i]>’9’) cout<<s[i];

```

**Soluție:** bac

**B. Scrieți programe C++ pentru rezolvarea următoarelor probleme !**

1. Se citeşte de la tastatură un cuvânt format din cel mult 100 de caractere, litere mici și mari ale alfabetului. Programul determină transformarea cuvântului citit prin înlocuirea fiecărei vocale a cuvântului printr-un şir format din trei caractere şi anume: vocala respectivă urmată de litera p și, apoi, încă o dată vocala respectivă, ca în exemplul dat mai jos. Programul afişează pe ecran cuvântul obţinut. Se consideră vocale literele din mulţimea {a,e,i,o,u, A, E, I, O, U}.

**Exemplu:** pentru cuvântul „caracter” se va afişa pe ecran: „caparapacteper”.

**Soluție:**

```
#include <iostream>

#include<string.h>

using namespace std;

int main() {

char s[100], voc[10], aux[100];

//initilizam sirul voc cu sirul vocalelor

strcpy(voc,"aeiouAEIOU");

cin.getline(s,100);

for(int i=0;i<strlen(s);i++)

//functia strchr determina pointerul primei aparitii a caracterului s[i] in sirul

//vocalelor sau returneaza valoarea NULL, in caz nefavorabil

if(strchr(voc,s[i])) {

//copiem in aux subsirul ce incepe de la caracterul cu indicele i

strcpy(aux,s+i+1);

s[i+1]='p';

s[i+2]=s[i];

//lipim inapoi in s subsirul copiat anterior, dupa ce am inserat

//caracterele cerute in enunt

strcpy(s+i+3,aux);

i+=2; }

cout<<s;

return 0;}

```

2. Se consideră un text cu maximum 255 de caractere în care cuvintele sunt separate prin unul sau mai multe spaţii. Primul caracter din textul citit este o literă, iar cuvintele sunt formate numai din litere mici ale alfabetului englez. Scrieţi un program C++ care citeşte de la tastatură textul şi îl transformă, înlocuind prima literă a fiecărui cuvânt cu litera mare corespunzătoare, restul caracterelor rămânând nemodificate. Textul astfel transformat va fi afişat pe ecran.

**Exemplu:** dacă de la tastatură se introduce textul: „toamna se numara bobocii" se va afişa pe ecran: „Toamna Se Numara Bobocii".

**Soluție:**

```
#include <iostream>

#include<string.h>

using namespace std;

int main() {

char s[255];

int i;

cin.getline(s,100);

s[0]=s[0]-('a'-'A');

for(int i=1;i<strlen(s);i++) if(s[i]==' ') {

                        while(s[i]==' ')i++;

                        s[i]=s[i]-('a'-'A'); }

cout<<s;

return 0;

}

```

3. Scrieţi un program în limbajul C++ care citeşte de la tastatură două şiruri, formate fiecare din cel mult 20 de caractere. Primul şir reprezintă numele unei persoane, iar al doilea şir reprezintă prenumele aceleiaşi persoane. Atât numele cât şi prenumele sunt formate numai din litere ale alfabetului englezesc şi fiecare conţine cel puţin o consoană. Programul construieşte în memorie şi afişează pe ecran un al treilea şir de caractere, care conţine consoanele din prenumele citit dispuse în ordinea în care apar în prenume urmate de exact un spaţiu şi de numele citit.

**Exemplu:** dacă primul şir citit este „Mihai”, iar al doilea este „Popa” se va construi şi apoi se va afişa pe ecran şirul „Mh Popa”.

**Soluție:**

```
 #include <iostream>

#include<string.h>

using namespace std;

int main() {

char nume[20], prenume[20], numecomplet[40], vocale[]={"aeiou"};

int i;

cin.getline(nume,20);

cin.getline(prenume,20);

for(int i=0;i<strlen(prenume);i++) if(strchr(vocale, prenume[i])) strcpy(prenume+i, prenume+i+1) ; strcat(numecomplet, prenume);

strcat(numecomplet, " ");

strcat(numecomplet, nume);

cout<<numecomplet;

return 0; }

```

4. Scrieţi un program în limbajul C++ care citeşte de la tastatură un text, format din cel mult 250 de caractere. Programul permite înlocuirea tuturor aparițiilor unui cuvânt dat printr-un alt cuvânt.

**Exemplu:** dacă șirul este „Anul acesta fiica cea mare va merge la mare ” și se dorește înlocuirea cuvântului “mare” prin cuvântul “mica” se va construi şi apoi se va afişa pe ecran şirul „Anul acesta fiica cea mica va merge la mica”.

**Soluție:**

```
#include <iostream>

#include <string.h>

using namespace std;

int main(){

char text[250],cuvant1[20],cuvant2[20],auxiliar[250];

char *poz;

cout<<"Introduceti textul: ";

cin.getline(text,250);

cout<<"\n Introduceti cuvantul cautat: ";

cin.getline(cuvant1, 20);

cout<<"\n Introduceti cuvantul substitut: ";

cin.getline(cuvant2, 20);

while(poz=strstr(text,cuvant1)) {

               strcpy(auxiliar,poz+strlen(cuvant1));

               strcpy(text+(poz-text), cuvant2);

                strcat(text, auxiliar); }

cout<<text;

return 0;}

```

5. Scrieţi un program în limbajul C++ care citeşte de la tastatură un text, pentru simplificare, format din cel mult 250 de caractere. Programul identifică cuvintele care încep cu o vocală și determină inversarea lor în textul dat. **Exemplu:** dacă șirul dat este „afara este soare” programul va construi şi apoi va afişa pe ecran şirul „arafa etse soare”.

**Soluție:**

```
#include <iostream>

#include <string.h>

using namespace std;

int main (){

int nrap=0,i=0,j,k,poz;char s[255], aux[100], voc[]="aeiou";

cin.getline(s,255);

strcpy(aux, " ");

strcat(aux,s);

strcpy(s, aux);

s[strlen(s)+1]=NULL;

s[strlen(s)]=' ';

i=0;

while(i<strlen(s)-1) {

                 if((s[i]==' ')&&(strchr(voc,s[i+1])))

                                      { j=i+1;

                                        k=0;

                                        while(s[j]!=' ') {

                                                     aux[k]=s[j];

                                                     k++

                                                     j++; }

                                        aux[k]=NULL;

                                        strrev(aux);

                                        k=0;

                                        for(j=i+1;j<i+1+strlen(aux);j++) {

                                                    s[j]=aux[k];

                                                    k++;}

                                         i=i+strlen(aux); }

                 i++; }

strcpy(s,s+1);

cout<<s;

return 0; }

```