Sunteți pe pagina 1din 23

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

Tipul sir de caractere


Def. Sirul de caractere este o structura de date care este formata dintr-o multime ordonata de caractere care poate avea o lungime variabila. I.Implementarea sirului de caractere in C++ Implementarea sirurilor de caractere se face printr-un tablou unidimensional(vector) ale carui elemente sunt de tip character,fiecare caracter fiind reprezentat prin codul sau Ascii. Se stie: Lungimea unui vector este caracterizat prin doua lungimi: lungimea fizica(numarul de octeti alocati in memorie conform definirii) si lungimea logica(numarul de elemente cu care se lucreaza in problema,de obicei memorat intr-o variabila intreaga n). Obs: In cazul sirului de caractere lungimea logica a sirului este pusa in evidenta prin intermediul caracterului NULL sau constanta caracter \0 care are codul Ascii 0,care marcheaza sfarsitul logic al unui sir de caractere(caracterul NULL este definit in antetul stdlib.h) Ex: char sir[256]; -determina alocarea in memorie a unui spatiu de 256 octeti, din care doar in 255 se pot memora caractere,unul fiind rezervat pentru caracterul NULL. Pp.ca sir contine sirul de caractere Buna ziua=> in memorie va arata astfel:
Lungimea fizica Lungimea logica

B
sir[0]

u
sir[1]

\0

..

sir[8] sir[9]

ceilalti 246 octeti nefolositi

Obs. 1.Intr-un sir de caractere accesul la fiecare caracter se poate face prin indice(la fel ca la tablouri). 2.Intotdeauna vectorul de caractere trebuie declarat cu un caracter mai mult decat numarul de caractere maxim pe care dorim sa-l contina acesta. 3.Un sir de caractere poate fi initializat doar la definire cu un sir constant de caractere. Ex: char sir[256]=Buna ziua; Nota:1. In acest caz s-a declarat un sir de lungime maxima 256 octeti(lungimea fizica) din care doar 10 au fost ocupati(lungimea logica),adica 9 octeti pentru caractere si un octet pentru caracterul NULL. 2. Restul octetilor neocupati vor fi completati automat la definire cu caracterul NULL. 3.Daca dorim ca lungimea fizica sa fie egala cu cea logica corespunzatoare lungimii constantei sir cu care s-a initializat la declarare atunci nu este obligatoriu specificarea lungimii fizice,acesta fiind implicita. Ex: char sir[]=Buna ziua; //lungimea alocata va fi de 10 octeti=9+1 pentru caracterul NULL 4.Dupa ce ati declarat un sir de caractere nu mai puteti sa-I atribuiti o alta costanta de tip sir de caractere deoarece se stie numele unui tablou este un pointer constant. Ex: char sir[20]; sir=Buna ziua; //Eroare 5.O costanta de tip sir de caractere chiar daca contine un singur caracter este diferit de o constanta de tip caracter deoarece se stie ca un sir de caractere intotdeauna aloca in memorie un nr. de octeti+1 octet caracterul NULL.
a \0 a a

6.Pentru a insera intr-o constanta de tip sir de caractere caracterul trebuie sa folositi secventa escape \ Ex: cout<<Acesta este un \ Exemplu\ ; 7.Lungimea unui sir de caractere reprezinta numarul de caractere din sir mai putin caracterul NULL. Ex: char sir[]=Buna ziua; //lungimea sirului este 9 8.Sirul vid sau sirul nul este sirul care are lungimea 0,deci in memorie apare sir[0]=\0 ,sir[0]=NULL, sir[0]=0. Nota:1.Initializarea unui sir ca sir nul la declararea acestuia se face: Ex: char sir[256]=; 2.In cadrul programului initializarea unui sir cu sirul nul se face: Ex: char sir[256]; sir[0]=\0; // sau sir[0]=NULL; sau sir[0]=0; II.Citirea si scrierea unui sir de caractere Se poate face: a. la nivel de element(caractere cu caracter) b. la nivel de structura(tot sirul)

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

a.Citirea si afisarea la nivel de element Ex1.Sa se citeasca de la tastatura un sir de caractere inclusiv caracterul spatiu pana la intalnirea sfarsitului de linie. Obs.1.Pentru ca la citire sa se poata citi si spatiul se folosesc monipulatorii din iomanip.h 2.In cazul citirii caracter cu caracter trebuie adaugat in mod manual la sfarsit caracterul NULL. #include <iostream.h> #include <stdlib.h> #include <iomanip.h> void main() { char sir[256]; int i=0; do { cin>>resetiosflags(ios::skipsws)>>sir[i]; i++; } while (sir[i-1]!=\n); sir[i]=NULL; // sau sir[i]=0; sau sir[i]=\0 for (i=0;sir[i]!=\n;i++) cout<<sir[i]; } Ex2: Sa se scrie intr-un sir literele alfabetului latin aAbBcC si sa se afiseze. #include <iostream.h> void main() { char sir[256]; int i,j; for (i=0,j=0;j<26;j++,i+=2) { sir[i]=a+j; sir[i+1]=A+j; } sir[i]=NULL; for (i=0;sir[i]!=0;i++) cout<<sir[i]; } b. Citirea si afisarea la nivel de structura(tot sirul) Ex: #include <iostream.h> void main() { char sir[256]; cin>>sir; cout<<sir; } Obs. 1.Acest mod de citire cin>>sir; este mult mai simplu el rezolvand adaugarea automata a caracterului NULL. 2. Dezavantajul acestui mod de citire cin>>sir; este ca citirea primului caracter incepe la primul caracter diferit de un caracter alb(spatiu, enter) si se sfarseste la intalnirea primului caracter alb(spatiu,enter). Ex: daca de la tastatura se da: alfa beta gama atunci la afisare se va scire doar alfa. 3. Dezavantajul de la obs.2 se poate remedia utilizand una din functiile fluxului de date invatate si la tipul fisier. cin.get(sir,nr,ch); /*citeste din bufferul tastaturii caractere si le introduce in sir pana ori intalaneste caracterul ch ori s-au citit deja nr-1 caractere ori s-a ajuns la sfarsit de linie(caracterul sfarsit de linie).Caracterul sfarsit de linie nu-l citeste din buffer. Nota: 1.Citirea (extragerea din buffer) a caracterului sfarsit de linie \n se face cu : cin.get(); //intoarce codul ascii al caracterului extras din buffer. 2.Daca nu se extrage din buffer sfarsitul de linie(tasta enter=\n) atunci urmatorul sir citit de la tastatura cu cin.get(sir,nr,ch) va fi vid(nul).

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

Ex: char sir1[256],sir2[256]; cin.get(sir1,5); cin.get(); cin.get(sir2,5); cout<<sir1<<sir2; se da: alfa beta gama se va afisa: alfabeta III.Sirurile de caractere si pointerii 1.Sirurile de caractere pot fi manipulate si prin intermediul pointerilor. 2.Lungimea logica a unui sir de caractere(fara caracterul NULL) se poate determina cu functia: strlen(sir) ex: int i; char sir[10]=Buna; i=strlen(sir); 3.Deci declaratia char *sir=abcd poate fi folosita in locul char sir[]=abcd . Caractristici comune ale celor doua declaratii: - sir reprezinta adresa primului element sin tablou. - afiseaza acelasi lucru continutul sirului care incepe la adresa sir. - sir+k reprezinta adresa elementului k din sir. - operatorul indice []: sir[i] *(sir+i) Deosebiri: char sir[]=abcd - sir este numele simbolic al unei constante de tip adresa a carei valoare nu se poate modifica. -compilatorul aloca 5 octeti incepand de la adresa simbolica sir. - deoarece sir =ct. nu se pot aplica pe identificatorul sir operatorul de incrementare si nici nu i se poate modifica valoarea prin atribuire. - cin.get(sir,nr) citeste de la tastatura maxim nr caractere fiind scris in memorie de la adresa constanta sir. se da: a1 enter a2 se va afisa:a1a2

char *sir=abcd -sir este numele unui pointer catre tipul char,adica numele unei variabile de tip adresa. - compilatorul aloca 5 octeti pentru constanta de tip sir de caractere abcd si creaza o variabila de memorie de tip pointer care contine adresa primului caracter din sir. - deoarece sir este o variabila, se pot aplica operatorii de incrementare si decrementare si i se poate modifica valoarea prin operatia de atribuire. - cin.get(*sir) citeste de la tastatura un caracter aflat la adresa sir. - daca valoarea sir se modifica atunci la afisare se va tipari sirul care incepe de la noua adresa indicata de sir.

Exemple de utilizare a pointerilor catre caractere pentru manipularea tablourilor. Ex1: char *p,*q; p=Ana are mere.; cout<<p; //afiseaza Ana are mere. q=p+2; cout<<q-p; //afiseaza 2 Ex2: char *sir=ala bala portocala,*p; cout<<strlen(sir)<< <<sir<<endl; sir++; cout<<strlen(sir)<< <<sir<<endl; p=sir; p+=3; cout<<strlen(p)<< <<p; //afiseaza: 18 ala bala portocala //afiseaza: 17 la bala portocala

//afiseaza: 14 bala portocala

IV.Algoritmi pentru prelucrarea sirurilor de caractere Metode de prelucrare: 1.prin parcurgerea caracterelor din sir ca elemente ale unui tablou: 1.1.folosind indicii 1.2.folosind pointerii 2.folosind functiile sistem definite in fisierul antet <string.h>

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

Ex:Determinarea lungimii unui sir; Varianta1(folosind indici) #include <iostream.h> void main() { char sir[256]; int i; cout<<Dati sirul:<<endl; cin.get(sir,100); for (i=0;sir[i]!=0;i++); cout<<Lungimea sirului:<<i; } Varianta3 (folosind functia strlen(sir)) void main() { int i; cout<<Dati sirul:<<endl; cin.get(sir,100); cout<<Lungimea sirului:<<strlen(sir); }

Varianta 2(folosind pointeri) #include <iostream.h> void main() { char sir[256],*p; cout<<Dati sirul:<<endl; cin.get(sir,100); for (p=sir;*p!=0;p++); cout<<Lungimea sirului:<<p-sir; }

Clasificare algoritmi: IV.1. prelucrarea a doua siruri de caractere IV.2.prelucrarea unui sir de caractere IV.3.prelucrarea subsirurilor de caractere IV.4.conversii intre tipul sir de caractere si tipuri numerice IV.1. Prelucrarea a doua siruri de caractere Algoritmi: IV.1.1.copierea unui sir de caractere in alt sir de caractere IV.1.2.concatenarea a doua siruri de caractere IV.1.3.compararea a doua siruri de caractere IV.1.1.Copierea unui sir de caractere in alt sir de caractere Functii sistem de copiere din biblioteca string.h Functia strcpy(s2,s1) stpcpy(s2,s1) Realizeaza Sunt copiate din sirul sursa s1 in sirul destinatie s2,toate caracterele inclusiv caracterul NULL.Functia intoarce ca rezultat adresa sirului destinatie s2. Sunt copiate din sirul sursa s1 in sirul destinatie s2,toate caracterele inclusiv caracterul NULL.Functia intoarce ca rezultat adresa caracterului NULL al sirului destinatie s2(adica s2+lungimea sirului sursa s1). Sunt copiate din sirul sursa s1 in sirul destinatie s2 maxim n caractere, incepand cu primul caracter.Daca lungimea sirului s1 este mai mica decat n atunci functia este identica cu strcpy(s2,s1). In cazul in care n este mai mic decat lungimea sirului s2,dupa copierea celor n caractere din s1 nu se pune caracterul NULL. Sunt copiate din sirul sursa s1 in sirul destinatie s2 maxim n-1 caractere, incepand cu primul caracter si adauga caracterul NULL la sfarsitul caracterelor copiate.Daca lungimea sirului s1 este mai mica decat n atuncise copiaza tot sirul.Functia returneaza lungimea logica a sirului destinatie.

strncpy(s2,s1,n)

strxfrm(s2,s1,n)

Ex: char sir1[256],sir2[256],*p,*q; int i; ... strcpy(sir1,abcd); //sir1=abcd p=stpcpy(sir2,sir1); //sir2=abcd ,p=sir2+strlen(sir2) cout<<p-sir2<<endl; // se afiseaza 4(lungimea sirului sir2) strncpy(sir1,ala bala,4); // sir1=ala i=strxfrm(sir1,sir2,8); //sir1=abcd , i=4 strxfrm(sir2,sir1,4); // sir2=abcd ..

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

Enunt: Fiind dat un sir de caractere de la tastatura se cere sa se creeze un alt sir care sa-l contina pe cel citit. Rezolvarea problemei: Varianata 1:(cu indici) #include <iostream.h> void main() { char sir1[256],sir2[256]; int i; cout<<Sirul sursa:<<endl; cin.get(sir1,100); for (i=0;sir1[i]!=0;i++) sir2[i]=sir1[i]; sir2[i]=0; cout<<sir2; } Varianta 2:(cu pointeri) #include <iostream.h> void main() { char sir1[256],sir2[256],*p,*q; cout<<Sirul sursa:<<endl; cin.get(sir1,100); for (p=sir1,q=sir2;*p!=0;p++,q++) *q=*p; *q=0; cout<<sir2; } Varianta 3: (cu functii) #include <iostream.h> #include <string.h> void main() { char sir1[256],sir2[256]; cout<<Sirul sursa:<<endl; cin.get(sir1,100); strcpy(sir2,sir1); cout<<sir2; }

Obs.1.Deoarece o variabila de tip sir de caractere se poate initializa cu o constanta de tip sir de caractere doar la declarare, acelasi efect il putem obtine in cadrul programului folosind functia strcpy(sir,const_sir). Ex:char sir[256]=abcd; char sir[256]; strcpy(sir,abcd); 2.Utilizand functiile sistem adaugarea caracterului NULL se face automat. IV.1.2.Concatenarea a doua siruri de caractere Functii sistem de concatenare a doua siruri ( biblioteca string.h ) Functia strcat(s1,s2) strncat(s1,s2,n) Realizeaza Sunt adaugate din sirul sursa s2,in sirul destinatie s1,toate caracterele,inclusiv caracterul NULL.Functia returneaza adresa sirului destinatie s1. Sunt adaugate din sirul sursa s2 in sirul destinatie s1 maxim n caractere, incepand cu primul caracter. Functia adauga la sfarsitul caracterelor adugate caracterul NULL.Daca n >lungimea sirului sursa s1 se va adauga tot sirul sursa,dar nu si alte caractere. Functia returneaza adresa sirului destinatie s1.

Obs.1.In prelucrarile in care adaugati sau copiati un sir de caractere sursa la un sir de caractere destinatie trebuie sa aveti grija sa nu depasiti spatiul de memorie rezervat sirului destinatie deoarece este posibil ca sistemul de operare sa nu sesizeze eroarea si sa scrie peste zonele de memorie a altor variabile. Ex: char s1[6]=alfa,s2[6]=beta strcat(s1,s2); //eroare 2.Unei variabile sir de caractere i se poate adauga o constanta sir. Ex: char s1[20]=; strcpy(s1,abcd); //s1=abcd strcat(s1,efgh); //s1=abcdefgh Enunt:Sa se concateneze doua siruri citite de la tastatura. Varianata 1:(cu indici) Varianta 2:(cu pointeri) #include <iostream.h> #include <iostream.h> void main() void main() { { char sir1[256],sir2[256]; char sir1[256],sir2[256],*p,*q; int i; cout<<Sirul sursa:<<endl; cout<<Sirul sursa:<<endl; cin.get(sir2,100); cin.get(); cin.get(sir2,100); cin.get(); cout<<Sirul destinatie:<<endl; cout<<Sirul destinatie:<<endl; cin.get(sir1,100); cin.get(sir1,100); for (p=sir1;*p!=0;p++); for (i=0;sir1[i]!=0;i++); for (q=sir2;*q!=0;q++,p++) for (j=0;sir2[j]!=0;i++,j++); *p=*q; sir1[i]=sir2[j]; *p=0; sir1[i]=0; cout<<sir1; cout<<sir1; } }

Varianta 3: (cu functii) #include <iostream.h> #include <string.h> void main() { char sir1[256],sir2[256]; cout<<Sirul sursa:<<endl; cin.get(sir2,100); cin.get(); cout<<Sirul destinatie: cin.get(sir1,100); strcat(s1,s2); cout<<sir1; }

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

IV.1.3.Compararea a doua siruri de caractere Regula de comparare a doua siruri:Compararea a doua siruri presupune copararea codului Ascii al caracterelor de pe aceeasi pozitie a fiecarui sir.Pasii sunt urmatorii: -se compara codurile Ascii de pe prima pozitie din fiecare sir si se continua cu urmatoarele pozitii numai daca codurile Ascii de pe pozitiile anterioare sunt identice in ambele siruri.Compararea se opreste cand caracterele de pe aceleasi pozitii nu sunt identice(sirul a carui cod Ascii este mai mare se considera a fi cel mai mare) sau cand unul din siruri este mai lung decat celalalt(sirul cel mai lung este cel mai mare). -se considera ca cele doua siruri sunt egale daca au aceeasi lungime si toate caracterele de pe aceeasi pozitie sunt identice. Ex: s=abc, s1=abc ,s2=abcd, s3=am=> s=s1, s<s2 , s3>s, s3>s2. Functii sistem de comparare a doua siruri (biblioteca string.h) Functia strcmp(s1,s2) stricmp(s1,s2) strncmp(s1,s2,n) strncmpi(s1,s2,n) Realizeaza Compara cele doua siruri de caractere.Daca sunt identice,rezultatul este 0.Dca s1 este mai mare decat s2 rezultatul este pozitiv;daca s1 este mai mic decat s2,rezultatul este negativ. Compara cele doua siruri de caractere la fel ca si functia strcmp dar fara sa faca diferenta intre litere mari si litere mici. Compara primele n caractere din cele doua siruri de caractere furnizand la fel ca si functia strcmp. Compara cele doua siruri de caractere la fel ca si functia strncmp dar fara sa faca diferenta intre litere mari si litere mici.

Ex: strcmp(ab,a)>0 adev strcmp(ab,Ab)>0 adev stricmp(ab,Abc)<0 adev strncmpi(abcd,Abcd,2) >0 adev Rezolvarea problemei: Varianata 1:(cu indici) #include <iostream.h> void main() { char sir1[256],sir2[256]; int i; cout<<Sirul 1:<<endl; cin.get(sir1,100); cin.get(); cout<<Sirul 2:<<endl; cin.get(sir2,100); for (i=0;sir1[i]!=0 && sir2!=0 && sir1[i]= =sir2[i];i++); if (sir1[i]= =0 && sir2[i]= =0) cout<<sir1=sir2; else if (sir1[i]>sir2[i]) cout<<sir1>sir2; else cout<<sir1<sir2; } Varianta 3:(cu functii sistem) #include <iostream.h> #include <string.h> void main() { char sir1[256],sir2[256]; cout<<sir1:<<endl; cin.get(sir1,100); cin.get(); cout<<sir2:<<endl; cin.get(sir2,100); if (stricmp(sir1,sir2)= =0) cout<<sir1=sir2;

Varianta 2:(cu pointeri) #include <iostream.h> void main() { char sir1[256],sir2[256],*p,*q; cout<<Sir1:<<endl; cin.get(sir1,100); cin.get(); cout<<Sir2:<<endl; cin.get(sir2,100); for(p=sir1,q=sir2;*p!=0&&*q!=0&&*p= =*q;p++,q++); if (!*p && !*q) cout<<sir1=sir2; else if (*p>*q) cout<<sir1>sir2; else cout<<sir1<sir2; }

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

else if (stricmp(sir1,sir2)<0) cout<<sir1<sir2; else cout<<sir1>sir2; } Observatie:1. Pe acest tip de data se pot aplica operatorul de concatenare,de atribuire,de comparare prin intermediul functiilor sistem descrise mai sus:srtcpy(s1,s2),strcat(s1,s2),strcmp(s1,s2). 2.Deci operatorii <,>,==,!=,+,= nu pot fi aplicati pe acest tip de date decat asa cum am descris la obs1. IV.2. Prelucrarea unui sir de caractere IV.2.1. Initializarea unui sir de caractere Functii sistem (biblioteca string.h) Functia strset(s,ch) Realizeaza Sirul s este parcurs incepand cu primul caracter pana la sfarsitul lui,fiecare caracter fiind inlocuit cu caracterul ch mai putin caracterul NULL. Functia intoarce adresa sirului s modificat. In sirul s sunt parcurse primele n caractere incepand cu primul caracter dar nu mai mult decat lungimea sirului,fiecare caracter fiind inlocuit cu caracterul ch.Daca n >=lungimea sirului,functia va avea acelasi efect ca strset().Functia intoarce adresa sirului s modificat.

strnset(s,ch,n)

IV.2.2. Inversarea continutului unui sir de caractere Functia sistem (biblioteca string.h) Functia strrev(s) Realizeaza Functia returneaza pointer care indica adresa sirului inversat aceeasi cu adresa sirului inainte de inversare.

Enunt: Sa se construiasca inversul unui sir de caractere citit de la tastatuara. Varianata 1(folosind un alt sir) Varianta 2:(in acelasi sir) #include <iostream.h> #include <iostream.h> void main() void main() { { char sir[256],inv[256]=,*p; char sir[256],aux,*p,*q; cout<<Sirul de caractere:<<endl; cout<<Sirul de caractere:<<endl; cin.get(sir,100); cin.get(sir,100); for(p=sir+strlen(sir)-1; p>=sir; p--) for(p=sir+strlen(sir)-1,q=sir; p>=q; p--,q++) strncat(inv,p,1); { cout<<inv; aux=*p; } *p=*q; *q=aux; } cout<<sir; } Varianta 3(cu functia sistem) Varianata 1(folosind un alt sir) #include <iostream.h> void main() { char sir[256] ; cout<<Sirul de caractere:<<endl; cin.get(sir,100); cout<<strrev(sir); }

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

IV.2.3. Transformarea literelor mari in litere mici si invers a.Transformarea literelor mari in litere mici si invers la nivel de caracter Modalitati: - prin modificarea codului ASCII al caracterului tinand cont ca diferenta dintre codul ASCII al unei litere mici si litera mare corespondenta este 32. - cu ajutorul functiilor sistem din biblioteca ctype.h Functia tolower(ch) toupper(ch) Realizeaza Intoarce litera mica daca ch este litera mare,altfel va intoarce ch dat. Intoarce litera mare daca ch este litera mica,altfel va intoarce ch dat.

Ex: Varianta 1 (caracter cu caracter) #include <iostream.h> #include <ctype.h> void main() { char sir[256],*p; cout<<sirul:; cin.get(sir,100); //literele mari vor fi transformate in litere mici folosind codul ASCII for(p=sir; *p; p++) if(*p>=A&& *p<=Z) *p+=32; cout<<s<<endl; //literele mici vor fi transformate in litere mari folosind functiile sistem din ctype.h for(p=sir; *p; p++) *p=toupper(*p); cout<<sir; } b.Transformarea literelor mari in litere mici si invers la nivel de sir de caractere Functii sistem (biblioteca string.h) Functia strlwr(s) strupr(s) Realizeaza In sirul s,transforma literele mari in litere mici.Restul caracterelor raman nemodificate.Functia intoarce s,adresa sirului. In sirul s,transforma literele mici in litere mari.Restul caracterelor raman nemodificate.Functia intoarce s,adresa sirului.

Varianta 2 (functii sistem) #include <iostream.h> #include <string.h> void main() { char sir[256]; cout<<sirul:; cin.get(sir,100); //literele mari vor fi transformate in litere mici folosind codul ASCII cout<<strlwr(sir); //literele mici vor fi transformate in litere mari cout<<strupr(sir); } IV.2.4. Cautarea unui caracter intr-un sir Modalitati:-prin parcurgerea sirului -folosind functiile sistem din biblioteca string.h

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

Functii sistem (biblioteca string.h) Functia strchr(sir,ch) strrchr(sir,ch) Realizeaza Furnizeaza ca rezultat un pointer catre prima aparitie a caracterului ch in sirul de caractere sir(cea din extremitatea stanga). Furnizeaza ca rezultat un pointer catre ultima aparitie a caracterului ch in sirul de caractere sir(cea din extremitatea dreapta).

Ex. Se citeste de la tastatura un sir de caractere.Sa se afiseze pozitia primei si ultimei aparitii a unui caracter c dat, in sirul de caractere citit. Varianta 1(prin parcurgerea sirului) #include <iostream.h> #include <string.h> void main() { char sir[256],*p,c; cout<<sirul:; cin.get(sir,100); cout<<caracterul cautat:; cin>>c; for(p=sir; *p && *p!=c; p++) ; if (*p) { cout<<prima aparitie este in pozitia:<<p-sir+1<<endl; for(p=sir+strlen(sir)-1; p!=sir && *p!=c; p--); if (p!=sir) cout<<ultima aparitie este in pozitia:<<p-sir+1; } else cout<<caracterul nu exista in sir<<endl; } Varianta 2(cu functii sistem) #include <iostream.h> #include <string.h> void main() { char sir[256],*p,c; cout<<sirul:; cin.get(sir,100); cout<<caracterul cautat:; cin>>c; if ( (p=strchr(sir,c)) !=0) { cout<<prima aparitie:<<p-sir+1; p=strrchr(sir,c); cout<<ultima aparitie:<<p-sir+1; } else cout<<caracterul nu exista in sir; } IV.3. Prelucrarea subsirurilor de caractere Se defineste ca fiind subsir, o portiune dintr-un sir care incepe de la pozitia (n) si are lungimea (m). IV.3.1. Extragerea unui subsir dintr-un sir Varianta 1(parcurgerea sirului folosind indicii) #include <iostream.h> #include <string.h> void main()

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

{ char sir[256],sb[256]; int n,m,i; cout<<sirul:; cin.get(sir,256); cout<<pozitia din care incepe subsirul; cin>>n; cout<<lungimea subsirul:; cin>>m; if (n>strlen(sir)) //daca pozitia de extragere (n) >lungimea sirului atunci subsirul extras este subsirul vid sb[0]=0; else { if (m>=strlen(sir)-n+1) //daca lungimea (m) a subsirului este mai mare decat numarul de caractere ramase in sir for(i=0; i<=strlen(sir)-n; i++) //se extrag in sb toate caracterele ramase in sir incepand din pozitia (n) adica indicele (n-1) sb[i]=sir[n-1+i]; else for(i=0; i<m; i++) //se extrag (m) caractere din sir incepand din pozitia n (indicele (n-1)) sb[i]=sir[n-1+i]; sb[i]=0; //pe ultima pozitie a subsirului se pune caracterul \0 } cout<<sb; } Varianta 2(folosind functiile sistem) #include <iostream.h> #include <string.h> void main() { char sir[256],sb[256]=; int n,m; cout<<sirul:; cin.get(sir,256); cout<<pozitia din care incepe subsirul; cin>>n; cout<<lungimea subsirul:; cin>>m; if (n<=strlen(sir)) //daca pozitia (n) de extragere este mai mica decat lungimea sirului if (m>=strlen(sir)-n+1) //lungimea (m) a subsirului este mai mare decat numarul de caractere ramase in sir strcat(sb,sir+n-1); //extrage toate caracterele ramase in sir incepand de la pozitia n (indice n-1) else strncat(sb,sir+n-1,m); //se extrag (m) caractere incepand din pozitia n (indicele n-1) cout<<sb; } IV.3.2. Cautarea unui subsir intr-un sir Functia sistem Functia strstr(sir,sb) Realizeaza Returneaza un pointer(adresa) catre prima aparitie a subsirului sb in sir. Va returna pointerul NULL daca subsirul sb nu exista in sir.

Ex: Sa se afiseze toate pozitiile corespunzatoare aparitiilor disjuncte ale unui subsir intr-un sir . Varianata 1(prin parcurgerea sirului) #include <iostream.h> #include <string.h> void main() { char sir[256],sb[11],*p,*q,*r; cout<<sirul:;

10

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

cin.get(sir,255); cin.get(); cout<<sirul cautat:; cin.get(sb,10); cout<<subsirul apare in pozitiile:; for(p=sir; *p; p++) //se parcurge cu pointerul p fiecare caracter din sir { for (r=p, q=sb; *r= =*q && *q; r++,q++) ; //se verifica daca sb este in sir incepand din pozitia p if (*q= =0) //daca sb a fost gasit { cout<<p-sir+1<< ; //se afiseaza pozitia in care s-a gasit sb p+=strlen(sb)-1; //noua cautare va incepe dupa subsirul sb gasit } } } Varianta 2(cu functii sistem) #include <iostream.h> #include <string.h> void main() { char sir[256],sb[11],*p; int nr=0; cout<<sirul:; cin.get(sir,255); cin.get(); cout<<sirul cautat:; cin.get(sb,10); cout<<subsirul apare in pozitiile:; p=strstr(sir,sb); //se cauta prima aparitie while(p) //cat timp s-a gasit subsirul sb { cout<<p-sir+1<< ; //se afiseaza pozitia in care s-a gasit subsirul sb p=strstr(p+strlen(sb) , sb); //se cauta urmatoarea aparitie incepand de la pozitia anterior gasita plus lungimea subsirului sb } } IV.3.3. Stergerea unui subsir dintr-un sir Ex.1. Se sterge din sirul sir un subsir care incepe din pozitia n si are lungimea m. Obs.1.Daca n>strlen sirul va ramane neschimbat. 2.Daca m>strlen(sir)-n se vor sterge numai ultimele strlen(sir)-n caractere. (stergerea se face folosind indicii) #include <iostream.h> #include <string.h> void main() { char sir[256]; int n,m,i; cout<<sirul:; cin.get(sir,255); cout<<pozitia din care se sterge:; cin>>n; cout<<numarul de caractere care se sterge:; cin>>m; if (n<strlen(sir)) if (m>strlen(sir)-n) sir[n-1]=0; else { for(i=n-1; sir[i+m]; i++)

11

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

sir[i]=sir[i+m]; sir[i]=0; } cout<<sir; } Ex.2.Se sterge din sirul sir prima aparitie a unui subsir sb. #include <iostream.h> #include <string.h> void main() { char sir[256],sb[11],*p; cout<<sirul din care se sterge:; cin.get(sir,255); cin.get(); cout<<subsirul care se sterge:; cin.get(sb,10); p=strstr(sir,sb); if (p) strcpy(p,p+strlen(sb)); cout<<sir; } Tema. Sa se stearga toate aparitiile subsirului b din sirul sir. IV.3.4. Inserarea unui subsir intr-un sir Ex: Se insereaza subsirul sb in sirul sir in pozitia n. Varianta 1(folosind indicii) #include <iostream.h> #include <string.h> void main() { const int NMAX=256; char sir[NMAX],sb[20]; int n,i; cout<<sirul in care se insereaza:; cin.get(sir,255); cin.get(); cout<<subsirul in care se insereaza:; cin.get(sb,19); cout<<pozitia din care se insereaza:; cin>>n; if (n<=strlen(sir)) { if (strlen(sir)+strlen(sb)>=NMAX) { sir[NMAX-1]=0; for (i=NMAX-2; i>=n+strlen(sb)-1; i--) sir[i]=sir[i-strlen(sb)]; } else { sir[strlen(sir)+strlen(sb)]=0; for (i=strlen(sir)+strlen(sb)-1; i>=n+strlen(sb); i--) sir[i]=sir[i-strlen(sb)]; } for (i=0; i<strlen(sb); i++) sir[i+n-1]=sb[i]; } cout<<sir; }

12

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

Varianta 2(cu functii sistem) #include <iostream.h> #include <string.h> void main() { char sir[256], aux[256], sb[20], *p; int n; cout<<<<sirul in care se insereaza:; cin.get(sir,255); cin.get(); cout<<subsirul in care se insereaza:; cin.get(sb,19); cout<<pozitia din care se insereaza:; cin>>n; p=&sir[n-1]; strcpy(aux,p); strcpy(p,sb); strcpy(p+strlen(sb), aux); cout<<sir; } IV.3.5. Inlocuirea intr-un sir, a unui subsir cu un alt subsir Operatia de inlocuire presupune executarea urmatoarelor operatii: -cautarea subsirului sb1 in sirul sir -stergerea subsirului sb1 din sirul sir -inserarea in sirul sir a subsirului sb2 in pozitia in care a fost gasit subsirul sb1 Varianta 1(se parcurg sirul si subsirurile folosind indicii) #include <iostream.h> #include <string.h> void main() { char sir[256], sb1[50], sb2[50]; int n,i,j,lg,lg1,lg2; cout<<<<sirul in care se insereaza:; cin.get(sir,255); cin.get(); cout<<subsirul care se inlocuieste:; cin.get(sb1,49); cin.get(); cout<<subsirul cu care se inlocuieste:; cin.get(sb2,49); lg=strlen(sir); lg1=strlen(sb1); lg2=strlen(sb2); for(i=0; i<lg-lg1+1; i++) //se parcurge sirul sir pana la ultima pozitie posibila din care ar putea sa mai existe sb1 { for(j=0; sir[i+j]= =sb1[j] && j<lg1; j++) ; //se verifica daca sb1 apare la pozitia i if (j= =lg1) //daca sb1 apare de la pozitia i, adica toate cele lg1 caractere din sir sunt identice cu cele din sb1 { n=i+1; //se retine pozitia de aparitie a lui sb1 in sir for(j=n-1; sir[j+lg1]; j++) //se sterge sb1 din sir incepand de la pozitia i+1 gasita sir[j]=sir[j+lg1]; lg=lg-lg1; //lungimea sirului sir se micsoreaza cu lungimea lg1 a subsirului sb1 sir[lg+lg2]=0; // se pune caracterul \0 in pozitia in care se va termina sir dupa inserarea lui sb2 for(j=lg+lg2-1; j>=n+lg2-1; j--) //se deplaseaza spre dreapta subsirul care incepe din pozitia de inserare a lui sb2 sir[j]=sir[j-lg2]; for(j=0; j<lg2; j++) //se copiaza in sir, subsirul sb2 sir[j+n-1]=sb2[j]; lg=lg+lg2; // se mareste lungimea sirului sir cu lg2 , lungimea subsirului sb2 care se inlocuieste subsirul sb1 } } cout<<sir;

13

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

} Varianta 2 (folosind functiile sistem) #include <iostream.h> #include <string.h> void main() { char sir[256], sb1[50], sb2[50]; int n,i,j,lg,lg1,lg2; cout<<<<sirul in care se insereaza:; cin.get(sir,255); cin.get(); cout<<subsirul care se inlocuieste:; cin.get(sb1,49); cin.get(); cout<<subsirul cu care se inlocuieste:; cin.get(sb2,49); p=strstr(sir,sb1); //se cauta prima aparitie a lui sb1 in sir while(p) //cat timp sb1 exista in sir { strcpy(p,p+strlen(sb1)); //se suprascrie in sir incepand din pozitia in care s-a gasit sb1, subsirul ce urmeaza dupa sb1 in sir strcpy(aux,p); //se face o copie a subsirului prospat translatat in vechea pozitie a lui sb1 strcpy(p,sb2); //se adauga sirul sb2 in pozitia in care a fost sb1 strcpy(p+strlen(sb2),aux); //se adauga subsirul salvat in copie p=strstr(p+strlen(lg2),sb1); // se cauta urmatoarea aparitie } cout<<sir; } IV.4. Alte functii utile in prelucrarea sirurilor de caractere Functii sistem Functia strspn(s1,s2) strcspn(s1,s2) strpbrk(s1,s2) Realizeaza Furnizeaza ca rezultat numarul de caractere consecutive din sirul s1(incepand cu primul caracter), care se gasesc printre caracterele din sirul s2. (biblioteca string.h) Furnizeaza ca rezultat numarul de caractere consecutive din sirul s1(incepand cu primul caracter), care nu se gasesc printre caracterele din sirul s2. (biblioteca string.h) Furnizeaza ca rezultat un pointer catre primul caracter din sirul s1 care se gaseste si in sirul s2. Daca nici un caracter din sirul s1 nu se gaseste printre caracterele sirului s2,functia furnizeaza ca rezultat adresa nula. (biblioteca string.h) Sirul s2 este un sir de caractere care pot fi folosite ca separatori, iar sirul s1 este format din mai multe entitati separate prin unul dintre separatorii din sirul s2.Functia inlocuieste separatorii prin caracterul NULL si furnizeaza ca rezultat un pointer catre primul caracter al primei entitati.Pentru a gasi urmatoarea entitate din sirul s1,apelarea functiei se va face cu strtok(NULL,s2). (biblioteca stdlib.h)

strtok(s1,s2)

Ex: #include <iostream.h> #include <string.h> #include<stdlib.h> void main() { char sir[]=Azi, Ana are mere., sp[]=,. , *p; cout<<strspn(1234567890,1D2C3B)<<endl; //afiseaza 3 cout<<strspn(1234567890,2D1C3B)<<endl; //afiseaza 3 cout<<strspn(1234567890,ABC)<<endl; //afiseaza 0 cout<<strcspn(1234567890,ABC457)<<endl; //afiseaza 3 cout<<strcspn(1234567890,ABC)<<endl; //afiseaza 10 cout<<strcspn(1234567890,025)<<endl; //afiseaza 1 p=strpbrk(1234567890,052); if (p) cout<<primul caracter este <<*p<<endl; //afiseaza 2 p=strpbrk(1234567890,ABC); if (p)

14

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

cout<<primul caracter este <<*p<<endl; //nu afiseaza p=strtok(sir, sp); if (p) cout<<p<<endl; //afiseaza Azi p=strtok(NULL, sp); cout<<p<<endl; //afiseaza Ana p=strtok(NULL, sp); cout<<p<<endl; //afiseaza are p=strtok(NULL, sp); cout<<p<<endl; //afiseaza mere p=strtok(NULL, sp); cout<<p<<endl; //nu afiseaza nici un sir deoarece nu a mai ramas nici o entitate de extras din sirul initial deci p este adresa 0 }

Probleme rezolvate 1. Se citeste de la tastatura, ca sir de caractere, codul numeric al unei persoane.Sa se afiseze urmatoarele informatii:sexul si data de nastere a persoanei. Obs. Codul numeric este de forma: saallzzxxxxxx, s=sex(1-masculin, 2-feminin) , ll=luna, zz=ziua, aa=an #include <iostream.h> #include <string.h> void main() { char cn[14], s1[2]=, s2[3]=, s3[3]=, s4[3]=; cout<<Codul numeric personal este:; cin.get(cn,13); cout<<Persoana este de sex:; if (strcmp(strncat(s1,cn,1),1)) cout<<feminin<<endl; else cout<<masculin<<endl; strncat(s2,cn+1,2); strncat(s3,cn+3,2); strncat(s4,cn+5,2); cout<<si s-a nascut la data:<<s4<< - <<s3<< - <<s2; } 2. Se citeste de la tastatura un numar real sub forma unui sir de caractere.Partea intreaga este separata de partea fractionara prin virgula.Sa se afiseze partea intreaga si partea zecimala. #include <iostream.h> #include <string.h> #include <stdlib.h> void main() { char nr[20],*p; cout<<Numarul: ; cin.get(nr,19); p=strtok(nr,,); cout<<partea intreaga este: <<p<<endl; p=strtok(NULL,,); cout<<partea fractionara este: <<p<<endl; } Se citeste un text de la tastatura.Cuvintele sunt separate prin spatiu sau caracterele: . , ?.Sa se numere cuvintele din text si sa se afiseze fiecare cuvant pe un rand. #include <iostream.h> #include <string.h> #include <stdlib.h> void main() {

3.

15

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

char text[1000],sep[]= .,!?, *p; int n=0; cout<<Textul: ; cin.get (text, 999); p=strtok(text, sep); while (p) { n++; cout<<p<<endl; p=strtok(NULL,sep); } cout<<S-au gasit <<n<< cuvinte; } 4. Se citeste un text de la tastatura.Sa se afiseze cate cifre contine textul. #include <iostream.h> #include <string.h> void main() { char sir[100], cifre[]=1234567890, *p; int lc=0; cout<<textul ; cin.get(sir, 99); p=strpbrk(sir,cifre); while (p) { lc+=strspn(p,cifre); strcpy(p,p+strspn(p,cifre)); p=strpbrk(p,cifre); } cout<<Textul contine <<lc<< cifre; } 5. Se citeste de la tastatura un text care se va analiza stfel: -daca el contine numai cifre, se va afisa ca este un numar. -daca el contine numai litere,se va afisa ca este un cuvant. -daca el contine numai cifre si litere,se va afisa: numai caractere alfanumerice. -daca el contine numai semne speciale,se va afisa:numai semne speciale. -daca el contine litere,cifre si semne speciale,se va fisa:toate tipurile de caractere. #include <iostream.h> #include <string.h> void main() { char sir[100], cifre[]=1234567890, litere[27], *p; int i, lc=0, l1=0, lg; cout<<textul ; cin.get(sir,99); lg=strlen(sir); for (i=0; i<26; i++) litere[i]=a+i; litere[0]=0; if (strspn(sir,cifre)= =lg) cout<<numar; else if (strspn(strlwr(sir), litere)= =lg) cout<<cuvant; else if (strcspn(cifre,sir)= =10 && strcspn(litere,strlwr(sir))= =26) cout<<numai semne speciale; else {

16

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

p=strpbrk(sir, cifre); while (p) { lc+=strspn(p, cifre); strcpy(p, p+strspn(p, cifre)); p=strpbrk(p, cifre); } p=strpbrk(strlwr(sir), litere); while (p) { l1+=strspn(strlwr(p), litere); strcpy(p, p+strspn(p, litere)); p=strpbrk(strlwr(p), litere); } if (lc+l1==lg) cout<<numai caractere alfanumerice; else cout<<toate tipurile de caractere; } } 6. Se citesc de la tastatura doua siruri de caractere.Sa se numere cate dintre caracterele primului sir exista in al doilea sir.

#include <iostream.h> #include <string.h> void main() { char s1[100], s2[100], *p; int nr=0; cout<<primul text:; cin.get(s1,100); cin.get(); cout<al doilea text:; cin.get(s2,100); p=strpbrk(s1,s2); while(p) { nr++; p++; p=strpbrk(p,s2); } cout<<s-au gasit in primul sir <<nr; cout<< caractere care exista si in al doilea sir; } IV.5. Conversii intre tipul sir de caractere si tipuri numerice Functii sistem (biblioteca stdlib.h) Functia atoi(sir) atol(sir) atof(sir) _atold(sir) strtol(sir,&p,b) Realizeaza Converteste sirul de caractere sir intr-o valoare numerica intreaga de tip int. Converteste sirul de caractere sir intr-o valoare intreaga de tip long. Converteste sirul de caractere sir intr-o valoare numerica reala de tip double. Converteste sirul de caractere sir intr-o valoare numerica reala de tip long double. Converteste sirul de caractere sir intr-o valoare numerica intreaga de tip long.Functiei i se furnizeaza baza de numeratie prin parametrul b de tip int.Functia furnizeaza prin parametrul p un pointer catre primul caracter care nu poate fi convertit. Converteste sirul de caractere sir intr-o valoare numerica intreaga fara semn, de tip unsigned long.Functiei i se furnizeaza baza de numeratie prin parametrul b de tip int.Functia furnizeaza prin parametrul p un pointer catre primul caracter care nu poate fi convertit. Converteste sirul de caractere sir intr-o valoare numerica reala de tip double.Functia furnizeaza prin parametrul p un pointer catre primul caracter care nu poate fi convertit. Converteste sirul de caractere sir intr-o valoare reala de tip long double.Furnizeaza prin

strtoul(sir,&p,b)

strtod(sir,&p) _strtold(sir,&p)

17

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

parametrul p un pointer catre primul caracter care nu poate fi convertit. Obs: Functiile sistem de conversie din sir de caractere in numar fac parte din biblioteca standard stdlib.h Ex: #include <iostream.h> #include <stdlib.h> #include <string.h> void main() { char *sir=1234567890, *p; int n1; long n2; double n3; long double n4; n1=atoi(sir); n2=atol(sir); cout<<n1<< <<n2<<endl; //afiseaza -13035 123456789 strcpy(sir,12345); n1=atoi(sir); n2=atol(sir); cout<<n1<< <<n2<<endl; //12345 12345 strcpy(sir,12345.6789); n1=atoi(sir); n2=atol(sir); n3=atof(sir); n4=_atold(sir); cout<<n1<< <<n2<< <<n3<< <<n4<<endl; //afiseaza 12345 12345 12345.6789 12345.6789 strcpy(sir,12Aa); n2=strtol(sir,&p,16); if (!*p) cout<<conversie corecta <<n2<<endl; // se afiseaza 4778 else cout<<nu s-au putut converti decat primele <<p-sir<< caractere <<n2<<endl; n2=strtol(sir,&p,10); if (!*p) cout<<conversie corecta <<n2<<endl; else cout<<nu s-au putut converti decat primele <<p-sir<< caractere <<n2<<endl; // se afiseaza doar 12 } IV.6. Conversia unui numar in sir de caractere Functii sistem (biblioteca stdlib.h)

Functia itoa(n,sir,b) ltoa(n,sir,b) ultoa(n,sir,b) ecvt(n,m,&p,&s)

fcvt(n,m,&p,&s)

Realizeaza Converteste in sirul de caractere sir o valoarea numerica intreaga n (de tip int) exprimata in baza de numeratie b(de tip int). Converteste in sirul de caractere sir o valoarea numerica intreaga n (de tip long) exprimata in baza de numeratie b (de tip int). Converteste in sirul de caractere sir o valoarea numerica intreaga n (de tip unsigned long) exprimata in baza de numeratie b(de tip int). Converteste in sirul de caractere sir o valoarea numerica reala n (de tip double).Parametrul m (de tip int) precizeaza numarul de caractere ale sirului.Daca numarul are mai putine cifre decat m,se va completa la dreapta cu caracterul cifra 0,pana se obtin cele m caractere.Functia furnizeaza prin numele ei adresa sirului de caractere,prin parametrul p(de tip int)-pozitia punctului zecimal si prin parametrul s(de tip int)-semnul numarului(s=1 daca n<0 si s=0 daca n>=0). Converteste in sirul de caractere sir o valoarea numerica reala n (de tip double),la fel ca functia ecvt(),cu deosebirea ca parametrul m (de tip int) precizeaza numarul de caractere ale partii zecimale din sir;daca numarul are mai putine cifre in partea fractionara decat m,se va completa la dreapta cu caracterul cifra 0 pana se obtin cele m caractere pentru partea fractionara.

18

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

Obs: Functiile sistem de conversie din numar in sir de caractere fac parte din biblioteca standard stdlib.h Ex: #include <iostream.h> #include <stdlib.h> void main() { char sir[25], *sc; double n; int n1=-12345, m,p,s; long n2=213456789; unsigned long n3=4223456789; itoa(n1,sir,10); cout<<n1<< <<sir<<endl; //afiseaza -12345 -12345 n1=12345; itoa(n1,sir,10); cout<<n1<< <<sir<<endl; //12345 12345 ltoa(n2,sir,10); cout<<n2<< <<sir<<endl; //213456789 213456789 ultoa(n3,sir,10); cout<<n3<< <<sir<<endl; //4223456789 4223456789 n=-123.456; m=15; sc=ecvt(n,m,&p,&s); cout<<sc<< <<p<< <<s<<endl; // 123456000000000 1 0 n=9988.76; m=5; sc=ecvt(n,m,&p,&s); cout<<sc<< <<p<< <<s<<endl; //99888 4 0 n=987.654; sc=fcvt(n,m,&p,&s); cout<<sc<< <<p<< <<s<<endl; //98765400 3 0 n=9.87654; m=10; sc= fcvt(n,m,&p,&s); cout<<sc<< <<p<< <<s<<endl; //98765400000 1 0 n=-123.456; m=5; sc= fcvt(n,m,&p,&s); cout<<sc<< <<p<< <<s<<endl; //12345600 3 1 n=-1.23456; m=10; sc= fcvt(n,m,&p,&s); cout<<sc<< <<p<< <<s<<endl; //12345600000 1 1 n=9.87654; m=3; sc= fcvt(n,m,&p,&s); cout<<sc<< <<p<< <<s<<endl; //9877 1 0 }

Probleme rezolvate 1. Se citeste de la tastatura un text care poate contine si numere.Sa se afiseze suma acestor numere, chiar daca fac parte din cuvinte. #include <iostream.h> #include <stdlib.h> #include <string.h> void main() { char sir[100], nr[10], cifre[]=1234567890, *p,*q, *r; unsigned long s=0; cout<<textul ;

19

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

cin.get(sir,100); p=strpbrk(sir,cifre); while (p) { strcpy(nr,); q=p+strspn(p,cifre); strncat(nr,p,q-p); s+=strtoul(nr,&r,10); strcpy(p,q); p=strpbrk(p,cifre); } cout<<suma=<<s; } 2.Sa se afiseze suma a doua numere hexazecimale citite de la tastatura. #include <iostream.h> #include <stdlib.h> #include <string.h> void main() { char nr1[10], nr2[10], suma[10], *p; unsigned long n1,n2; cout<<primul numar ; cin.get(nr1,10); cin.get(); n1=strtoul(nr1,&p,16); while (p-nr1 != strlen(nr1)) { cout<<primul numar ; cin.get(nr1,10); cin.get(); n1=strtoul(nr1,&p,16); } cout<<al doilea numar ; cin.get(nr2,10); cin.get(); n2=strtoul(nr2,&p,16); while (p-nr2 != strlen(nr2)) { cout<<al doilea numar ; cin.get(nr2,10); cin.get(); n2=strtoul(nr2,&p,16); } ultoa(n1+n2,suma,16); cout<<suma= <<suma; }

Sinteza
20

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

Functii din biblioteca string.h


Functia strcpy(s2,s1) stpcpy(s2,s1) Realizeaza Sunt copiate din sirul sursa s1 in sirul destinatie toate caracterele inclusiv caracterul NULL.Functia intoarce ca rezultat adresa sirului destinatie s2. Sunt copiate din sirul sursa s1 in sirul destinatie toate caracterele inclusiv caracterul NULL.Functia intoarce ca rezultat adresa caracterului NULL al sirului destinatie s2(adica s2+lungimea sirului sursa s1). Sunt copiate din sirul sursa s1 in sirul destinatie s2 maxim n caractere, incepand cu primul caracter.Daca lungimea sirului s1 este mai mica decat n atunci functia este identica cu strcpy(s2,s1).In cazul in care lungimea sirului s1 este mai mare decat n atunci nu se va pune automat caracterul NULL. Sunt copiate din sirul sursa s1 in sirul destinatie s2 maxim n-1 caractere, incepand cu primul caracter si adauga caracterul NULL la sfarsitul caracterelor copiate.Daca lungimea sirului s1 este mai mica decat n atuncise copiaza tot sirul.Functia returneaza lungimea logica a sirului destinatie. Realizeaza Sunt adaugate din sirul sursa s2,in sirul destinatie s1,toate caracterele,inclusiv caracterul NULL.Functia returneaza adresa sirului destinatie s1. Sunt adaugate din sirul sursa s2 in sirul destinatie s1 maxim n caractere, incepand cu primul caracter. Functia adauga la sfarsitul caracterelor adugate caracterul NULL.Daca n >lungimea sirului sursa s1 se va adauga tot sirul sursa,dar nu si alte caractere. Functia returneaza adresa sirului destinatie s1. Realizeaza Compara cele doua siruri de caractere.Daca sunt identice,rezultatul este 0.Dca s1 este mai mare decat s2 rezultatul este pozitiv;daca s1 este mai mic decat s2,rezultatul este negativ. Compara cele doua siruri de caractere la fel ca si functia strcmp dar fara sa faca diferenta intre litere mari si litere mici. Compara primele n caractere din cele doua siruri de caractere furnizand la fel ca si functia strcmp. Compara cele doua siruri de caractere la fel ca si functia strncmp dar fara sa faca diferenta intre litere mari si litere mici. Realizeaza Sirul s este parcurs incepand cu primul caracter pana la sfarsitul lui,fiecare caracter fiind inlocuit cu caracterul ch mai putin caracterul NULL. Functia intoarce adresa sirului s modificat. In sirul s sunt parcurse primele n caractere incepand cu primul caracter dar nu mai mult decat lungimea sirului,fiecare caracter fiind inlocuit cu caracterul ch.Daca n >=lungimea sirului,functia va avea acelasi efect ca strset().Functia intoarce adresa sirului s modificat.

strncpy(s2,s1,n)

strxfrm(s2,s1,n)

Functia strcat(s1,s2)

strncat(s1,s2,n)

Functia strcmp(s1,s2)

stricmp(s1,s2) strncmp(s1,s2,n) strncmpi(s1,s2,n)

Functia strset(s,ch)

strnset(s,ch,n)

Functia strrev(s)

Realizeaza Functia returneaza pointer care indica adresa sirului inversat aceeasi cu adresa sirului inainte de inversare. Realizeaza In sirul s,transforma literele mari in litere mici.Restul caracterelor raman nemodificate.Functia intoarce adresa sirului s. In sirul s,transforma literele mici in litere mari.Restul caracterelor raman nemodificate.Functia intoarce adresa sirului s. Realizeaza Furnizeaza ca rezultat un pointer catre prima aparitie a caracterului ch in sirul de caractere sir(cea din extremitatea stanga).

Functia strlwr(s) strupr(s)

Functia strchr(sir,ch)

21

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

strrchr(sir,ch)

Furnizeaza ca rezultat un pointer catre ultima aparitie a caracterului ch in sirul de caractere sir(cea din extremitatea dreapta). Realizeaza Returneaza un pointer(adresa) catre prima aparitie a subsirului sb in sir. Va returna pointerul NULL daca subsirul sb nu exista in sir. Realizeaza Furnizeaza ca rezultat numarul de caractere consecutive din sirul s1(incepand cu primul caracter), care se gasesc printre caracterele din sirul s2. Furnizeaza ca rezultat numarul de caractere consecutive din sirul s1(incepand cu primul caracter), care nu se gasesc printre caracterele din sirul s2. Furnizeaza ca rezultat un pointer catre primul caracter din sirul s1 care se gaseste si in sirul s2.Daca nici un caracter din sirul s1 nu se gaseste printre caracterele sirului s2,functia furnizeaza ca rezultat adresa nula. Sirul s2 este un sir de caractere care pot fi folosite ca separatori, iar sirul s1 este format din mai multe entitati separate prin unul dintre separatorii din sirul s2.Functia inlocuieste separatorii prin caracterul NULL si furnizeaza ca rezultat un pointer catre primul caracter al primei entitati.Pentru a gasi urmatoarea entitate din sirul s1,apelarea functiei se va face cu strtok(NULL,s2).

Functia strstr(sir,sb)

Functia strspn(s1,s2) strcspn(s1,s2) strpbrk(s1,s2)

strtok(s1,s2)

Functii din biblioteca ctype.h


Functia tolower(ch) Toupper(ch) Realizeaza Intoarce litera mica daca ch este litera mare,altfel va intoarce ch dat. Intoarce litera mare daca ch este litera mica,altfel va intoarce ch dat.

Functii din biblioteca stdlib.h


Functia atoi(sir) atol(sir) atof(sir) _atold(sir) strtol(sir,&p,b) Realizeaza Converteste sirul de caractere sir intr-o valoare numerica intreaga de tip int. Converteste sirul de caractere sir intr-o valoare intreaga de tip long. Converteste sirul de caractere sir intr-o valoare numerica reala de tip double. Converteste sirul de caractere sir intr-o valoare numerica reala de tip long double. Converteste sirul de caractere sir intr-o valoare numerica intreaga de tip long.Functiei i se furnizeaza baza de numeratie prin parametrul b de tip int.Functia furnizeaza prin parametrul p un pointer catre primul caracter care nu poate fi convertit. Converteste sirul de caractere sir intr-o valoare numerica intreaga fara semn, de tip unsigned long.Functiei i se furnizeaza baza de numeratie prin parametrul b de tip int.Functia furnizeaza prin parametrul p un pointer catre primul caracter care nu poate fi convertit. Converteste sirul de caractere sir intr-o valoare numerica reala de tip double.Functia furnizeaza prin parametrul p un pointer catre primul caracter care nu poate fi convertit. Converteste sirul de caractere sir intr-o valoare reala de tip long double.Furnizeaza prin parametrul p un pointer catre primul caracter care nu poate fi convertit.

strtoul(sir,&p,b)

strtod(sir,&p)

_strtold(sir,&p)

22

Limbajului C++ - Suport de curs pentru clasele 9-11, profil matematica-informatica

prof.informatica Gabriela Gligor

Functia itoa(n,sir,b) ltoa(n,sir,b) ultoa(n,sir,b) ecvt(n,m,&p,&s)

fcvt(n,m,&p,&s)

Realizeaza Converteste in sirul de caractere sir o valoarea numerica intreaga n (de tip int) exprimata in baza de numeratie b(de tip int). Converteste in sirul de caractere sir o valoarea numerica intreaga n (de tip long) exprimata in baza de numeratie b (de tip int). Converteste in sirul de caractere sir o valoarea numerica intreaga n (de tip unsigned long) exprimata in baza de numeratie b(de tip int). Converteste in sirul de caractere sir o valoarea numerica reala n (de tip double).Parametrul m (de tip int) precizeaza numarul de caractere ale sirului.Daca numarul are mai putine cifre decat m,se va completa la dreapta cu caracterul cifra 0,pana se obtin cele m caractere.Functia furnizeaza prin numele ei adresa sirului de caractere,prin parametrul p(de tip int)-pozitia punctului zecimal si prin parametrul s(de tip int)-semnul numarului(s=1 daca n<0 si s=0 daca n>=0). Converteste in sirul de caractere sir o valoarea numerica reala n (de tip double),la fel ca functia ecvt(),cu deosebirea ca parametrul m (de tip int) precizeaza numarul de caractere ale partii zecimale din sir;daca numarul are mai putine cifre in partea fractionara decat m,se va completa la dreapta cu caracterul cifra 0 pana se obtin cele m caractere pentru partea fractionara.

23

S-ar putea să vă placă și