Sunteți pe pagina 1din 47

Universitatea Constatin Brncui din Trgu-Jiu Facultatea de Inginerie Departamentul de Automatic, Energie i Mediu

Programarea calculatoarelor
Lect. dr. Adrian Runceanu

Curs 10

14.11.2012

Programarea calculatoarelor

Capitolul 8. iruri de caractere

8.1. Form general. Declarare 8.2. Funcii specifice irurilor de caractere 8.3. Probleme cu iruri de caractere

14.11.2012

Programarea calculatoarelor

8.1. Form general. Declarare


Datele care se reprezint sub form se iruri de caractere au o larg aplicabilitate n programarea calculatoarelor, indiferent de limbajul folosit. Astfel i n limbajul C/C++ se pot memora i prelucra informaii de tip ir de caractere. Cu toate c limbajul C/C++ nu conine un tip de date special pentru iruri de caractere aa cum are limbajul Pascal, se pot utiliza tablouri unidimensionale de caractere.
14.11.2012 Programarea calculatoarelor 4

8.1. Form general. Declarare


Declararea unui tablou de caractere se face astfel:
char nume_tablou[dimensiune_maxim];
Exemple:

char sir[20]; char t[10];

// tablou de 20 de caractere // tablou de 10 caractere

14.11.2012

Programarea calculatoarelor

8.1. Form general. Declarare


Pentru a specifica sfritul irului de caractere, dup ultimul caracter se adaug un octet cu valoarea 0 ( caracterul \0 ). Dimensiunea declarat pentru un tablou de iruri de caractere trebuie s fie cu o unitate mai mare pentru ca pe ultima poziie s se poat pune i valoarea \0 = terminatorul de ir.
14.11.2012 Programarea calculatoarelor 6

8.1. Form general. Declarare


Reprezentarea intern a unui ir de caractere
char sir[33]=Programarea calculatoarelor;
Pr o g r a m a r e a c a l c u l a t o a r e l o r \0

sir[0] sir[33]=Programarea calculatoarelor Ultimi octei sunt nefolosii.

14.11.2012

Programarea calculatoarelor

8.1. Form general. Declarare


n limbajul C/C++, un ir de caractere este un tablou unidimensional cu elemente de tip caracter i care se termin cu NULL. Totui compilatorul C/C++ nu adaug automat terminatorul NULL, dect n cazul folosirii funciilor predefinite fgets() i gets() (functii de citire din fisiere sau de la tastatura), iar n celelalte cazuri este necesar ca programatorul s adauge terminatorul de ir atunci cnd dorete acest lucru, pentru a lucra cu irurile de caractere.
14.11.2012 Programarea calculatoarelor 8

8.1. Form general. Declarare


Exemplu: Urmtorul program declar un ir de caractere de 256 de elemente i atribuie primelor 26 de locaii libere literele mari ale alfabetului:
#include<iostream.h> int main() { char sir[256]; int i; for(i=0;i<26;i++) sir[i] = 'A' + i; sir[i] = \0; cout<<"Sirul de caractere contine: "<<sir; }

Dup compilarea i execuia programului, pe ecran vor aprea urmtoarele valori:


14.11.2012 Programarea calculatoarelor 9

Capitolul 8. iruri de caractere

8.1. Form general. Declarare 8.2. Funcii specifice irurilor de caractere 8.3. Probleme cu iruri de caractere

14.11.2012

Programarea calculatoarelor

10

8.2. Funcii specifice irurilor de caractere


n biblioteca limbajului C++ exist cteva funcii specifice irurilor de caractere: n fiierul standard de intrare / ieire stdio.h, avem funciile gets() i puts(). n fiierul string.h, avem mai multe funcii pe care le voi prezenta n continuare.
14.11.2012 Programarea calculatoarelor 11

8.2. Funcii specifice irurilor de caractere


Pentru citirea sirurilor de caractere care contin spatii se poate folosi metoda getline a funciei cin:

cin.getline(variabila_sir, dimensiune_maxima);
Exemplu: char variabila_sir[120]; cin.getline(variabila_sir, 120);
14.11.2012 Programarea calculatoarelor 12

8.2. Funcii specifice irurilor de caractere


Funciile pentru operaii cu iruri ce se gsesc n header-ul <string.h>.

strlen (nume_ir)
Returneaz un numr ntreg ce reprezint lungimea unui ir de caractere, fr a numra terminatorul de ir. 10 Exemplu: cout <<strlen("sir corect");
14.11.2012 Programarea calculatoarelor 13

8.2. Funcii specifice irurilor de caractere


strcmp (ir_1, ir_2)
Funcia compar cele dou iruri date ca argument i returneaz o valoare ntreag egal cu diferena dintre codurile ASCII ale primelor caractere care nu coincid. 0 Exemplu: cout <<strcmp("carte", "carte");
14.11.2012 Programarea calculatoarelor 14

8.2. Funcii specifice irurilor de caractere strcpy (ir_destinaie, ir_surs)


Funcia copiaz irul surs n irul destinaie. Nota: Pentru a fi posibil copierea, lungimea irului destinaie trebuie s fie mai mare sau egal cu cea a irului surs, altfel pot aparea erori grave.

Exemplu: cout <<strcpy(sir, "carte_informatica");


14.11.2012 Programarea calculatoarelor

"carte_informatica"

15

8.2. Funcii specifice irurilor de caractere


strcat (ir_destinaie, ir_surs)
Funcia concateneaz cele dou iruri: irul surs este adugat la sfritul irului destinaie.
Tabloul care conine irul destinaie trebuie s aib suficiente elemente. Exemplu: "carteinformatica" char sir[]="carte"; cout <<strcat(sir, "informatica");
14.11.2012 Programarea calculatoarelor 16

8.2. Funcii specifice irurilor de caractere


strchr(sir, caracter) Returneaza o valoare pozitiva daca un caracter apare intr-un sir, 0 in caz contrar.
Exemplu: if (strchr(sir, c)) cout << "L-am gasit!"

14.11.2012

Programarea calculatoarelor

17

8.2. Funcii specifice irurilor de caractere


strstr(sir1,sir2) Returneaza o valoare pozitiva daca un sir apare intr-un alt sir, 0 in caz contrar.
Exemplu: if (strstr(sir1,sir2)) cout <<"Am gasit subsirul!"
14.11.2012 Programarea calculatoarelor 18

8.2. Funcii specifice irurilor de caractere


Exemplu 1: #include <iostream.h> #include <string.h> int main() { char sir1[] = "abcd", sir2[] = "abcde"; cout<<strcmp(sir1, sir2)<<"\n"; // afiare: -101 // a = 97,, d = 100, e = 101 // 0 - e = -101
14.11.2012 Programarea calculatoarelor 19

8.2. Funcii specifice irurilor de caractere

cout<<strcmp(sir2, sir1)<<"\n"; // afiare: 101 cout<<strcmp(sir1, "")<<" "; // compararea variabilei sir1 cu constanta ir vid

14.11.2012

Programarea calculatoarelor

20

8.2. Funcii specifice irurilor de caractere


char str1[20]="hello"; char str2[20]="goodbye"; char str3[20]=""; int diferenta, lungime; cout<<"str1="<<str1<<" str2="<<str2<<"\n";

14.11.2012

Programarea calculatoarelor

21

8.2. Funcii specifice irurilor de caractere


diferenta = strcmp(str1, str2); if (diferenta == 0) cout<<"Siruri echivalente! "<<"\n"; else if (diferenta > 0) cout<<str1<<" mai mare (d.p.d.v. lexicografic) dect "<<str2<<"\n"; else cout<<str1<<" mai mic (d.p.d.v. lexicografic) dect "<<str2<<"\n";
14.11.2012 Programarea calculatoarelor 22

8.2. Funcii specifice irurilor de caractere


cout<<"str1="<<str1<<"\n"; cout<<"str3="<<str3<<"\n"; strcpy (str3, str1); cout<<"str1="<<str1<<"\n"; cout<<"str3="<<str3<<"\n"; strcat (str3, str1); cout<<"str1="<<str1<<"\n"; cout<<"str3="<<str3<<"\n"; }
14.11.2012 Programarea calculatoarelor 23

8.2. Funcii specifice irurilor de caractere


Executia programului:

14.11.2012

Programarea calculatoarelor

24

8.2. Funcii specifice irurilor de caractere


Exemplu 2:
Verificati daca un nume apare intr-un sir. #include <iostream.h> #include <string.h> int main() { char nume[10],sir[100]; cout<<"Introduceti numele: "; cin.getline(nume,10);
14.11.2012 Programarea calculatoarelor 25

8.2. Funcii specifice irurilor de caractere


cout<<"Introduceti sirul: "; cin.getline(sir,100); if(strstr(sir,nume)) cout<<nume<<" apare in sirul "<<sir<<"\n"; else cout<<nume<<" NU apare in sirul "<<sir<<"\n";

}
14.11.2012 Programarea calculatoarelor 26

8.2. Funcii specifice irurilor de caractere


Executia programului:

14.11.2012

Programarea calculatoarelor

27

8.2. Funcii specifice irurilor de caractere

n fiierul <stdlib.h> exist cteva funcii care prelucreaz irurile de caractere. Acestea sunt funciile de conversie dintr-un numr ntr-un ir de caractere i invers.

14.11.2012

Programarea calculatoarelor

28

8.2. Funcii specifice irurilor de caractere


n programul urmtor vor fi exemplicate funciile de conversie iruri de caractere n numere:
Funcie atof atoi atol strtod strtol
14.11.2012

la ce folosete
convertete un ir de caractere ntr-un numr real simpl precizie convertete un ir de caractere ntr-un numr ntreg convertete un ir de caractere ntr-un numr ntreg de tip long convertete un ir de caractere ntr-un numr real dubl precizie convertete un ir de caractere ntr-un numr de tip long
Programarea calculatoarelor 29

8.2. Funcii specifice irurilor de caractere


#include<iostream.h> #include<stdlib.h> int main() { int numar_int; float numar_real; long numar; numar_int = atoi("6789"); numar_real = atof("12.345"); numar = atol("1234567890L"); cout<<numar_int<<" "<<numar_real<<" "<<numar; }
14.11.2012 Programarea calculatoarelor 30

8.2. Funcii specifice irurilor de caractere


n programul urmtor vor fi exemplicate funciile de conversie numere n iruri de caractere:
Funcie itoa ftoa ultoa la ce folosete
convertete un numr ntreg ntr-un ir de caractere convertete un numr real simpl precizie ntr-un ir de caractere convertete un numr de tip long unsigned ntr-un ir de caractere

14.11.2012

Programarea calculatoarelor

31

8.2. Funcii specifice irurilor de caractere


#include<iostream.h> #include<stdlib.h> int main() { int numar_int = 6789; long numar = 1234567890L; char sir[25]; itoa(numar_int, sir, 10); cout<<" numar = "<< numar_int<<" sir = "<<sir; ltoa(numar, sir, 10); cout<<" numar = "<< numar<<" sir = "<<sir; }
14.11.2012 Programarea calculatoarelor

32

8.2. Funcii specifice irurilor de caractere


Executia programului:

14.11.2012

Programarea calculatoarelor

33

Capitolul 8. iruri de caractere

8.1. Form general. Declarare 8.2. Funcii specifice irurilor de caractere 8.3. Probleme cu iruri de caractere

14.11.2012

Programarea calculatoarelor

34

8.3. Probleme cu iruri de caractere


Problema 1: Enun: S se afieze numrul de vocale dintr-un text scris cu litere mici, memorat intr-o variabil de tip ir de caractere. Exemplu: Date de intrare: Programarea calculatoarelor Date de ieire: Exista 12 vocale in text
14.11.2012 Programarea calculatoarelor 35

8.3. Probleme cu iruri de caractere


#include <iostream.h> #include <string.h> int main() { char text[100]; char vocale[] = "aeiou"; int contor = 0; cout<<"Introduceti text: "; cin.getline(text, 100);
14.11.2012 Programarea calculatoarelor 36

8.3. Probleme cu iruri de caractere


for (int i=0; i<strlen(text); i++) for (int j=0; j<strlen(vocale); j++) if (text[i] == vocale[j]) contor++; cout<<"Exista "<<contor<<" vocale in text. "; }

14.11.2012

Programarea calculatoarelor

37

8.3. Probleme cu iruri de caractere


Problema 2: Enun: S se afieze cu litere mari un text dat, de maxim 255 caractere. Exemplu: Date de intrare text: liMBajUl c++ Date de ieire LIMBAJUL C++
14.11.2012 Programarea calculatoarelor 38

8.3. Probleme cu iruri de caractere


#include <iostream.h> int main() { char sir[255]; cout<<"Introduceti textul: "; cin.getline(sir, 255); for (int i=0; sir[i]!=0; i++) if (sir[i] >= 'a' && sir[i] <= 'z') sir[i] = sir[i] - 'a' + 'A'; cout<<sir; }
14.11.2012 Programarea calculatoarelor 39

8.3. Probleme cu iruri de caractere


Problema 3: Enun: Se citete un ir de caractere. S se afieze litera cea mai des ntlnit. Exemplu: Date de intrare text: carte de informatica si programare Date de ieire: a apare de 5 ori
14.11.2012 Programarea calculatoarelor 40

8.3. Probleme cu iruri de caractere


#include <iostream.h> #include <string.h> int main() { char sir[1000], carac_max, c; int i, frecv[256], max=0; // frecv - vector de frecvente cout<<"Dati sirul de caractere: "; cin.getline(sir,1000); for (i=0; i<256; i++) frecv[i] = 0;
14.11.2012 Programarea calculatoarelor 41

8.3. Probleme cu iruri de caractere


for (i=0;i<strlen(sir);i++) { c=sir[i]; frecv[c]=frecv[c]+1; if (frecv[c]>max){ max=frecv[c]; carac_max=c; } } cout<<carac_max<<" apare de "<<max<<" ori"; }
14.11.2012 Programarea calculatoarelor 42

8.3. Probleme cu iruri de caractere

14.11.2012

Programarea calculatoarelor

43

Probleme propuse spre rezolvate iruri de caractere


1. S se afieze toate prefixele i sufixele unui cuvnt citit de la tastatur. Exemplu: Date de intrare: informatica Date de ieire: i a
in inf info infor inform informa informat informati informatic informatica
14.11.2012 Programarea calculatoarelor

ca ica tica atica matica rmatica ormatica formatica nformatica informatica


44

Probleme propuse spre rezolvate iruri de caractere


2. Se citete de la tastatur un caracter c i un text de maxim 100 de carectere. Afiai de cte ori apare caracterul c n cadrul textului. Literele mari se vor considera diferite de literele mici. Exemplu: Date de intrare: Acesta este un simplu exemplu Caracterul e Date de ieire:
14.11.2012

Litera e apare de 5 ori


Programarea calculatoarelor 45

Probleme propuse spre rezolvate iruri de caractere


3. Se citete de la tastatur un ir de maxim 100 de carectere format numai din litere i cifre. Afiai numrul literelor mari, numrul literelor mici i numrul caracterelor de tip cifr din textul dat. Exemplu: Date de intrare: S-a nascut la Targu Jiu in 1968 pe 21 martie Date de ieire: Se gasesc 25 de litere mici, 2 litere mari si 6 cifre
14.11.2012 Programarea calculatoarelor 46

ntrebri?

14.11.2012

Programarea calculatoarelor

47

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