|
|
Siruri de caractere in C++ |
|
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 sirului de caractere sus
- Introducerea sirului de caractere folosind functia de citire cin sus
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
|
- Introducerea sirului de caractere folosind functia de citire cin.get sus
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
|
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;
}
|
|
|
|
|