Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
SIRURI DE CARACTERE
Tipul CHAR
lFolosit pentru retinerea caracterelor
lO valoare de tip char este inclusa intre ' '
lSe memoreaza pe un octet
lIn C++ nu exista tipul sir de caractere, asa ca, pentru siruri de caractere se foloseste tipul char
Declararea sirurilor de caractere
lchar nume_sir[lungime];
lchar *a;
Citirea sirurilor
lUn sir de caractere se termina cu '0'
lAtunci cand se citeste un sir de caractere de la tastatura se introduce valoarea sirului si se apasa enter.
lDaca se foloseste cin atunci se retin in sir toate caracterele pana la primul spatiu.Daca vrem ca sirul sa contina si spatii se va folosi cin.get()
cin.get()
lForma:
cin.get(nume, lungime,caracter );
lnume=numele sirului care trebuie citit
llungime=numarul maxim de caractere care se vor citi
lcaracter=citirea sirului se face sau pana se apasa enter sau pana se intalneste acest caracter
lCaracterul este optional.
Exemplu
char a[20];
cin.get(a,15);
Explicatii:
lSirul va avea 20 de caractere dintre care unul va fi cel de sfarsit de sir
lLa citire se vor retine in sir maximul 15 caractere
Citirea mai multor siruri
lPentru a putea citi mai multe siruri de caractere, dupa citirea fiecarui sir se va scrie
cin.get();
Exemplu
#include<iostream.h>
#include<conio.h>
void main()
lExplicatii
Acest program va citi 2 siruri de caractere: a de maximul 20 caractere si b de maximul 15 caractere.
La citire in a se vor citi maximul 5 caractere, iar in b maximul 7
Datorita faptului ca cin.get(); este pus dupa comentarii sirul b nu va fi citit.
Functii pentru prelucrarea sirurilor de caractere
lstrlen
lstrcat
lstrncat
lstrcpy
lstrchr
lstrrchr
lstrcmp
lstricmp
lstrstr
lstrtok
lstrcspn
lstrlwr
lstrupr
latof
latoi
latol
1.Functia strlen
lForma:
int strlen(const char* s)
lIntoarce lungimea sirului de caractere de adresa s
lObs: nu se numara
Exemplu
lFie urmatoarea secventa de instructiuni:
char a[ ]="acesta este un exemplu";
cout<< strlen(a);
Se va afisa 22 pentru ca a are 22 de cractere
2.Functia strcpy
lRealizeaza copierea sirurilor de caractere
lForma generala:
char *strcpy(char *dest, char *sursa)
lcopieaza sirul de adresa sursa la adresa dest.
lcopierea se termina dupa ce a fost copiat caracterul nul
lse returneaza adresa dest
Exemplu
lFie urmatoarea secventa de instructiuni:
char a[ ]="primul sir",b[ ]="al doilea sir";
strcpy(b,a);
cout<<"b="<<b;
Se va afisa :
b=primul sir
fiindca in b s-a copiat a
Exercitiu
1) Fiind date 2 siruri de caractere a si b, sa se interschimbe continutul sirurilor
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
3.Functia strcat
lForma generala:
char *strcat(char *dest, char *sursa)
ladauga sirului de adresa dest sirul de adresa sursa.
lrezultatul este adresa sirului sursa
laceasta operatie se numeste concatenare
lsirul de adresa sursa ramane nemodificat
Exemplu
lFie urmatoarea secventa de instructiuni:
char a[ ]="concatenarea",b[ ]=" sirurilor";
strcat(a,b);
cout<<"a="<<a;
Se va afisa :
a=concatenarea sirurilor
fiindca prin concatenare la sfarsitul lui a se adauga caracterele din b
Exercitiu
2) Fiind dat un sir de caractere ce reprezinta numele de familie al unei persoane si un alt sir ce reprezinta prenumele persoanei, sa se creeze un al treilea sir care sa reprezinte numele intreg al persoanei respective si sa se afiseze pe ecran
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
4.Functia strncat
lForma generala:
char *strncat(char *dest, char *sursa, size_t n)
lAre acelasi rol ca si strcat cu deosebirea ca adauga sirului destinatie primii n octeti ai sirului sursa
Exemplu
lFie urmatoarea secventa de instructiuni:
char a[ ]="concatenarea",b[ ]=" primilor n octeti din b";
strncat(a,b,18);
cout<<"a="<<a;
Se va afisa :
a=concatenarea primilor n octeti
fiindca prin concatenare la sfarsitul lui a se adauga primele 18 caracterele din b
Exercitiu
3) Fiind date 2 siruri de caractere a si b, sa se adauge lui a toate caracterele din b pana cand in b se intalneste caracterul ' '.Daca in b nu exista ' ' se va adauga tot sirul b
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
5.Functia strchr
lForma generala:
char *strchr(char *sursa, char c)
lCauta caracterul c in sirul sursa.Cautarea se face de la stanga la dreapta
lDaca caracterul a fost gasit functia returneaza adresa subsirului care incepe cu prima aparitie a caracterului citit si se termina cu caracterul nul al sirului in care se face cautarea
lDaca nu a fost gasit functia intoarce o expresie de tipul char* cu valoarea 0 (o adresa vida)
Exemplu
lFie urmatoarea secventa de instructiuni:
char b[ ]="bacalaureat";
cout<<strchr(b,'a');
Se va afisa :
acalaureat
Exercitii:
4_1) Fiind dat un sir de caractere, sa se verifice daca sirul contine caracterul 'y' si sa se afiseze indicele primei aparitii daca 'y' este in sir, altfel sa se afiseze mesajul "nu exista" .
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
4_2) Fiind date un sir de caractere si un caracter, sa se afiseze de cate ori apare caracterul in sir.
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
cout<<'nr aparitii='<<nr;
getch();
6.Functia strrchr
lForma generala:
char *strrchr(const char *sursa, char c)
lcauta caracterul c in sirul sursa.Cautarea se face de la stanga la dreapta
ldaca caracterul a fost gasit functia returneaza adresa subsirului care incepe cu ultima aparitie a caracterului citit si se termina cu caracterul nul al sirului in care se face cautarea
lDaca nu afost gasit functia intoarce o expresie de tipul char* cu valoarea 0 (o adresa vida)
Exemplu
lFie urmatoarea secventa de instructiuni:
char b[ ]="bacalaureat";
cout<<strrchr(b,'a');
Se va afisa :
at
Exercitii
5) Fiind dat un sir de caractere sub forma de cuvinte despartite printr-un singur spatiu (sirul nu are spatii la inceput si sfarsit), sa se afiseze primul caracter al ultimului cuvant.
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
7.Functia strcmp
lForma generala:
int strcmp(const char *s1,const char *s2)
lCompara lexicografic 2 siruri de caractere.Valoarea returnata este:
<0, daca s1<s2
=0, daca s1=s2
>0, daca s1>s2
Observatii
lOrdine lexicografica= ordinea cuvintelor in dictionar (s1<s2 daca s1 apare in dictionar inaintea lui s2)
lFunctia strcmp nu face distinctia intre literele mici si mari ale alfabetului
lCompararea celor 2 siruri se face de la stanga la dreapta
Exemplu
lFie urmatoarea secventa de instructiuni:
char a[ ]='anomalie',b[ ]='anatomie';
if(strcmp(a,b)>0) //adica 'a>b'
cout<<a;
else cout<<b;
Se va afisa :
anomalie
Exercitii
6) Se citesc 2 siruri de caractere reprezentand numele a 2 persoane.Sa se afiseze numele in ordine alfabetica
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
8.Functia stricmp
lForma generala:
int stricmp(const char *s1,const char *s2)
lAre acelasi rol ca strcmp, diferenta este ca nu face distinctia intre literele mici si mari ale alfabetului.
Exemplu
lFie urmatoarea secventa de instructiuni:
char a[ ]='id@gmail.com',b[ ]='gmail';
if(strstr(a,b)!=0) //adica b se regaseste in a
cout<<'b subsir a lui a';
else cout<<'b nu este subsir a lui a';
Se va afisa :
b subsir a lui a
Exercitii
7) Se citeste un numar n natural (3<n<11), apoi n siruri de caractere reprezentand numele a n persoane.Sa se afiseze aceste nume in ordine alfabetica (nu se face distinctia intre literele mari si mici).
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if (stricmp(a[i],a[j])>0)
for(i=0;i<n;i++)
cout<<a[i]<<endl;
getch();
9.Functia strstr
lForma generala
char *strstr(const char *s1,const char *s2);
lIdentifica daca s2 este subsir al lui s1
lDaca s2 este subsir al lui s1 , functia returneaza adresa de inceput a primei aparitii al sirului s2 in cadrul sirului s1, altfel returneaza adresa 0.
Exemplu
lFie urmatoarea secventa de instructiuni:
char a[ ]="id@gmail.com",b[ ]=" gmail";
strcat(a,b);
cout<<"a="<<a;
Se va afisa :
a=concatenarea sirurilor
fiindca prin concatenare la sfarsitul lui a se adauga caracterele din b
Exercitiu
8) Fiind date 2 siruri de caractere, sa se verifice daca al doilea este subsir in primul.Daca da, sa se afiseze "da", altfel sa se afiseze "nu".
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
9)Fiind dat un numar natural n (2<n<21) reprezentand adresele de mail a n persoane,id-ul unei persoane,apoi n adrese de mail, sa se afiseze toate adresele de mail ale persoanei careia i se cunoste id-ul.Daca nu are nici o adresa sa se afiseze mesajul "nu se gaseste"
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
cout<<'dati id-ul persoanei ';
cin.get(b,25);
nr=0;
for(i=0;i<n;i++)
if (strstr(a[i],b)!=0)
if (nr==0) cout<<'nu se gaseste';
getch();
10.Functia strtok
lForma generala
char *strtok(char *s1, const char *s2)
lUnde s1 este considerat a fi alcatuit din 1,2, . .n entitati separate prin unul sau mai multe caractere cu rol de separatori care apartin lui s2
Principiu de executie strtok
lPrima apelare trebuie sa fie de forma strtok(s1,s2): va intoarce adresa de inceput al primei entitati si separatorul este inlocuit prin caracterul nul;
lUrmatoarele apeluri sunt de forma strtok(NULL,s2) si intoarce adresa de inceput a fiecarei noi entitati, apoi inlocuieste separatorul cu nul
lDaca sirul nu mai are entitati functia intoarce adresa nula
Exemplul1
lFie urmatoarea secventa de instructiuni:
char a[ ]='cuvant1, cuvant2 cuvant3;cuvant4";
char b[ ]=', ;',*p;
p=strtok(a,b);
cout<<p<<endl;
Se va afisa :
cuvant1
Exemplul2
lFie urmatoarea secventa de instructiuni:
char a[ ]='cuvant1, cuvant2 cuvant3;cuvant4',b[ ]=', ;',*p;
p=strtok(a,b);
while(p!=0)
lSe va afisa :
cuvant1
cuvant2
cuvant3
cuvant4
Exercitiu
10)Fiind date mai multe cuvinte separate prin spatiu, punct si virgula, virgula, sa se afiseze fiecare cuvant pe o linie.
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
getch();
11)Fiind dat un numar n si un text reprezentand n adrese de mail la acelasi provider despartite prin virgula, sa se afiseze id-urile asociate adreselor.
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
getch();
11.Functia strspn
l Forma
size_t strspn(char* s1, char* s2);
l Returneaza numarul de caractere ale sirului s1 - caractere consecutive care incep obligatoriu cu primul caracter - care se gasesc in sirul s2.
Exemplul1
lFie char *s1="AB2def",*s2="16A32BF".
lAtunci strspn(s1,s2) returneaza 3 pentru ca din s1 se gasesc in s2 caracterele 'A','B','2'
Exemplul2
lFie char *s1="AB2def",*s2="
lAtunci strspn(s1,s2) returneaza 0 pentru ca primul caracter din s1 nu se gaseste in s2
Exercitiu
12)Fiind data o fraza si un cuvant x, sa se afiseze cate cuvinte din fraza pot fi obtinute din caracterele lui x printre care se pot exista si alte caractere
De exemplu daca fraza este:"Mioara este la mare" si cuvantul este: "mar" se va afisa 2
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
cout<<nr;
getch();
12.Functia strlwr
lForma generala
char* strlwr(char* s)
lConverteste literele mari in litere mici in sirul de la adresa s.
lFunctia intoarce adresa s.
lObs: Restul caracterelor raman neschimbate
Exemplu
lFie urmatoarea secventa de instructiuni:
char b[ ]="bACalaUrEat";
cout<<strlwr(b);
Se va afisa :
bacalaureat
Exercitiu
13) Intr-un text sunt mai multe cuvinte despartite prin ',' ,' ' , ';' , '.' care pot contine litere mari si mici.Sa se afiseze cuvintele care au ca subsir de caractere sirul "ale"
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
getch();
13.Functia strupr
lForma generala
char* strupr(char* s)
lConverteste literele mici in litere mari in s
lFunctia intoarce adresa s.
lObs: Restul caracterelor raman neschimbate
Exercitiu
14)Fie x un cuvant care contine litere mici si mari.Sa se afiseze cate vocale contine(daca o vocala se repeta va fi numarata de cate ori se repeta).
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
Exemplu
lFie urmatoarea secventa de instructiuni:
char b[ ]="bACalaUrEat";
cout<<strupr(b);
Se va afisa :
BACALAUREAT
II.CONVERSIA SIRURILOR IN VALORI NUMERICE SI INVERS
Functiile utilizate pentru conversia valorilor numerice in sir si invers au prototipul stdlib.h.
14.Functia atof
lFunctia atof converteste un sir catre tipul double.
lForma:
double atof(const char *s)
Daca conversia esueaza (se intalneste un caracter nenumeric) valoarea intoarsa este 0. Daca primele caractere ale sirului sunt albe, acestea sunt ignorate.
Exemplul1
lFie urmatoarea secventa de instructiuni:
char b[ ]=" 123.45';
float a=12.45 ;
cout<<a+atof(b);
Se va afisa:
135.9
Exemplul2
lFie urmatoarea secventa de instructiuni:
char b[ ]=" abc123.45';
Char c[ ]=" 123ab.45';
cout<<atof(b)<<endl;
cout<<atof(c);
Se va afisa:
0
123
Exercitiu
15) Fie un text care contine cuvinte reprezentand numele unor elevi sau media lor separate prin ',' si ' '. Sa se afiseze toate mediile din text. (In cuvintele reprezentand medii sunt doar cifre si caracterul '.')
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
getch();
15.Functia atoi
lFunctia atoi converteste un sir catre tipul int: int atoi(const char *s);
Exemplul
lFie urmatoarea secventa de instructiuni:
char b[ ]='321';
char c[ ]=' 123.45';
cout<<atoi(b)<<endl<<atoi(c);
lSe va afisa:
321
123
Exercitiu
16)Fie un sir de caractere format din mai multe numere reale despartite prin spatiu.Sa se afiseze suma partilor intregi a numerelor
De exemplu,
daca sirul este "12.6 3 3.5 7
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
void main()
cout<<s;
getch();
16.Functia atol
lFunctia atol converteste un sir catre tipul long:
Forma generala:
long atol(const char *s);
Exemplu
lFie urmatoarea secventa de instructiuni:
char b[ ]='987654321';
long c=atol(b);
cout<<c;
lSe va afisa:
987654321
17.Functia _atold
lFunctia _atold converteste un sir catre tipul long double:
Forma generala:
long double _atold(const char *s);
18.Functia ecvt
lFunctia ecvt are rolul de a converti o valoare de tip double catre un sir. Caracterul nul este adaugat automat sirului obtinut.
lForma generala este:
char* ecvt(double valoare, int poz, int* zec, int* semn);
unde:
valoare - valoarea de convertit;
poz - numarul de pozitii pe care trebuie sa le ocupe sirul in urma conversiei;
zec - adresa unei variabile, de tip int, care retine, dupa apel, numarul zecimalelor pe care le are numarul;
semn - adresa unei variabile, de tip int, care are rolul de a memora, dupa apel, 1, daca numarul este negativ, sau 0, in caz contrar.
lDaca a este o variabila, &a este adresa ei.
lVariabila zec retine dupa apel numarul intregilor, iar variabila semn semnul rezultatului.
lFunctia nu insereaza in sir nici punctul zecimal, nici semnul numarului.
lSirul obtinut incepe cu cifra cea mai semnificativa a numarului.
lDaca numarul pozitiilor ocupate de sir (poz) este mai mare decat ocupa data, sirul este completat in stanga cu un numar de 0 necesar.
lIn cazul in care numarul pozitiilor este mai mic decat cel ocupat de numar, rezultatul este rotunjit.
19.Functia itoa
lFunctia itoa are rolul de a converti o valoare de tip int in sir, care este memorat in variabila sir.
char* ltoa(long valoare, char * sir, int baza);
lValoarea baza retine baza de numeratie catre care sa se faca conversia.In cazul bazei 10, sirul obtinut retine si eventualul semn -
lFunctia intoarce adresa sirului obtinut.
20.Functia ltoa
lFunctia ltoa are acelasi efect ca itoa, deosebirea fiind data de faptul ca se converteste catre sir o valoare de tip long int.
char* ltoa(long valoare, char * sir, int baza);
21.Functia ultoa
lFunctia ultoa are acelasi efect ca itoa, deosebirea fiind data de faptul ca se converteste catre sir o valoare de tip unsigned long.
char* ultoa(unsegned long valoare, char * sir, int baza);
21.Functia strtol
l Functia
long strtol(const char *s, char **endptr, int baza);
are rolul de a converti un sir catre long. In afara sirului care trebuie convertit, functia primeste ca parametru de intrare adresa unei variabile de tip char*. Dupa apel, aceasta variabila va retine pozitia primului caracter din sir care nu poate fi convertit.
Exercitiu
lFie un sir de caractere a format din litere si cifre. Sa se adune toate numerele care sunt intercalate intre litere.
lDe exemplu, pentru "a12b3n45h8"se va afisa 68 (12+3+45+8)
22.Functia strtod
lFunctia
double strtod(const char *s, char **endptr);
converteste un sir catre double.
23.Functia _strtold
lFunctia
long double_strtold(const char *s, char *endptr);
converteste un sir catre long double.
24.Functia strtoul
lFunctia
unsigned long strtoul(const char *s, char **endptr, int baza);
converteste un sir catre unsigned long.
lIn caz de depasire - adica numarul nu poate fi memorat deoarece este in afara tipului - functiile strtol, strtod, strtold si strtoul returneaza cea mai mare sau cea mai mica valoare care poate fi memorata de tipul in care se face conversia, dupa cum valoarea este pozitiva sau negativa
Exercitii
1. Scrieti o functie C care stabileste daca un sir de caractere dat ca parametru reprezinta un palindrom. Pentru aceasta este necesar ca primul si ultimul caracter din sirul de caractere sa fie egale, al doilea si penultimul, s.a.m.d.
Functia intoarce 1 daca sirul de caractere este un palindrom si 0 in caz contrar.
2. Un text citit de pe mediul de intrare reprezinta un program C. Sa se copieze pe mediul de iesire, pastrand structura liniilor, dar suprimand toate comentariile.
3. Dintr-un text, citit de pe mediul de intrare, sa se separe toate cuvintele, plasandu-le intr-un vector cu elemente siruri de caractere de lungime 10 (cuvintele mai scurte se vor completa cu spatii libere, iar cele mai lungi se vor trunchia la primele 10 caractere.
Se vor afisa elemenetele acestui tablou, cate 5 elemente pe o linie, separate intre ele prin 2 asteriscuri.
4. Dintr-un text citit de pe mediul de intrare sa se afiseze toate cuvintele care contin cel putin 3 vocale distincte.
5. Scrieti un program care citeste si afiseaza un text si determina numarul de propozitii si de cuvinte din text. Fiecare propozitie se termina prin punct, iar in interiorul propozitiei cuvintele sunt separate prin spatii, virgula sau liniuta. 6. De pe mediul de intrare se citeste un text format din cuvinte separate prin spatii libere. Sa se afiseze acest text la iesire, pastrand structura liniilor si scriind in dreptul liniei cel mai lung cuvant din linie. Daca mai multe cuvinte au aceeasi lungime maxima, va fi afisat numai primul dintre ele.
7. Scrieti un program care citeste de la intrarea standard cuvinte, pana la intalnirea caracterului punct si afiseaza cate un cuvant pe o linie, urmat de despartirea acestuia in silabe. Se utilizeaza urmatoarele reguli de despartire in silabe:
-o consoana aflata intre doua vocale trece in silaba a doua
-in cazul a doua sau mai multe consoane aflate intre doua vocale, prima ramane in silaba intaia, iar celelalte trec in silaba urmatoare.
-Nu se iau in considerare exceptiile de la aceste reguli.
8. Sa se transcrie la iesire un text citit de la intrarea standard, suprimand toate cuvintele de lungime mai mare ca 10. Cuvintele pot fi separate prin punct, virgula sau spatii libere si nu se pot continua de pe o linie pe alta.
9. Scrieti un program care citeste de la intrarea standard un text terminat prin punct si il transcrie la iesirea standard, inlocuind fiecare caracter '*' printr-un numar corespunzator de spatii libere care ne pozitioneaza la urmatoarea coloana multiplu de 5. Se va pastra structura de linii a textului.
10. Scrieti un program pentru punerea in pagina a unui text citit de la intrarea standard. Se fac urmatoarele precizari:
lcuvintele sunt separate intre ele prin cel putin un spatiu
lun cuvant nu se poate continua de pe o linie pe alta
llungimea liniei la iesire este N
llungimea maxima a unui cuvant este mai mica decat N / 2
lIn textul rezultat se cere ca la inceput de linie sa fie un inceput de cuvant, iar sfarsitul de linie sa coincida cu sfarsitul de cuvant. In acest scop, spatiile se distribuie uniform si simetric intre cuvinte. Face exceptie doar ultima linie. Caracterul punct apare doar la sfarsit de text.
Politica de confidentialitate |
Copyright © 2024 - Toate drepturile rezervate