Sunteți pe pagina 1din 9

Tipuri structurate de date

ȘIRURI DE
CARACTERE

Colegiul Naţional “VICTOR BABEŞ”


Prof. Eugenu DRĂGOESCU 1
Operaţii cu şiruri de caractere

Numere mari - operaţii cu şiruri de caractere

Există situații când într-o problemă avem nevoie să lucrăm cu numere întregi
mai mari decât 264 și în aceste condiții nu putem utiliza nici unul dintre
tipurile de date predefinite ale limbajului C/C++.

Tipurile de date cele mai mari ale limbajului C/C++ sunt cele pe 8 bytes
(octeți):

• tipul long long care are următorul interval de valori:

[-9.223.372.036.854.775.808, 9.223.372.036.854.775.807]=[-263,263-1]

• tipul unsigned long long care poate memora numere din următorul
interval de valori:

[0, 18.446.744.073.709.551.615]=[0,264-1]

Colegiul Naţional “VICTOR BABEŞ”


Prof. Eugenu DRĂGOESCU 2
Operaţii cu şiruri de caractere

Se observă că se pot folosi numere de maxim 19, 20 de cifre, cu condiția ca


valorile lor să se încadreze în intervalele prezentate mai sus. În situația în
care dorim să efectuăm operații cu numere de mari dimensiuni (100, 500,
1000 de cifre) trebuie să ne definim propriul nostru tip de date pentru
prelucrarea numerelor mari și să implementăm funcțiile care realizează
principalele operații dintre două numere cum ar fi adunarea, scăderea,
înmulțirea, împărțirea, compararea.

Colegiul Naţional “VICTOR BABEŞ”


Prof. Eugenu DRĂGOESCU 3
Operaţii cu şiruri de caractere

Reprezentarea numerelor mari

Pentru a reprezenta un număr cu mai mult de 20 de cifre vom utiliza un


vector și vom reține în ordine cifrele sale începând cu cifra unităților.
Vom stabili tipul elementelor vectorului ca fiind char (1 octet), deoarece
fiecare element din vector este o cifră a numărului (observație: dacă am
stabili tipul elementelor vectorului ca fiind int (2 octeți) practic am dubla
spațiul de stocare și am irosi memoria).
Exemplu:
Dacă dorim să memorăm numărul 7654865 atunci el va fi memorat astfel:

număr mare: 5 6 8 4 5 6 7
puterea bazei: 0 1 2 3 4 5 6

Se poate observa ușor că indicele fiecărei cifre din număr coincide cu


puterea bazei corespunzătoare acelei cifre. Să considerăm în continuare că
numerele mari cu care vom lucra în continuare au maxim 1000 de cifre.
Colegiul Naţional “VICTOR BABEŞ”
Prof. Eugenu DRĂGOESCU 4
Operaţii cu şiruri de caractere

Declararea unui astfel de număr se face astfel:

#define DIM_MAX 1000 // dimensiune maximă: număr cu 1000 cifre


char a[DIM_MAX+1]; // numărul a
int lga; // numărul de cifre a numărului a=>lungimea şirului de caractere

unde:

• DIM_MAX - constanta cu valoarea 1000, stabileşte dimensiunea maximă


a şirului de caractere (numărul maxim de cifre pe care îl poate conţine
numărul a)

Colegiul Naţional “VICTOR BABEŞ”


Prof. Eugenu DRĂGOESCU 5
Operaţii cu şiruri de caractere
Citirea unui număr mare
Citirea unui număr mare se va realiza într-un șir de caractere, apoi vom
transforma caracterele cifră în numere și le vom memora în ordine inversă în
vectorul care va conţine numărul mare. Pentru a ușura calculele ulterioare,
vom completa cu 0 pozițiile din vector care nu au fost ocupate de cifrele
numărului mare.
Funcția citire are doi parametri:
• șirul de caractere în care vom memora cifrele numărului mare: char
s[DIM_MAX];
• numărul de cifre ale numărului mare: int ≶
Observații:
• parametrul lg se transmite prin referință pentru ca funcția citire() să
poată modifica valorea acestui parametru, valoarea rămânând modificată
și după apel
• parametrul s nu este nevoie să se transmită prin referință, deoarece este
un vector, fiind pointer constant la primul element al șirului.
• este necesară definirea parametrilor formali în funcția citire(), putând
astfel utiliza această funcţie pentru citirea mai multor numere mari,
apelând funcția pentru fiecare în parte.
Colegiul Naţional “VICTOR BABEŞ”
Prof. Eugenu DRĂGOESCU 6
Operaţii cu şiruri de caractere
// citire număr mare
void citire(char s[DIM_MAX],int &lg)
{ char sir[DIM_MAX]; // şir auxiliar
int i;
cin.get(sir,DIM_MAX);
cin.get();
// determin numărul de cifre
lg=strlen(sir);
// transform caracterele cifre în numere şi le reţin în
ordine inversă
for(i=lg-1;i>=0;--i)
s[lg-i-1]=sir[i]-'0';
// completăm vectorul cu 0 până la DIM_Max - cifre
nesemnificative
for(i=lg;i<DIM_MAX;i++)
s[i]=0;
}
Apelul funcției:
citire(a,lga); // citirea numărului a cu lga cifre
citire(b,lgb); // citirea numărului b cu lgb cifre

Colegiul Naţional “VICTOR BABEŞ”


Prof. Eugenu DRĂGOESCU 7
Operaţii cu şiruri de caractere
Afişarea unui număr mare
Afișarea unui număr mare se va face cifră cu cifră de la ultimul element din
şir, până la primul element. Funcția de afisare() va avea doi parametri:
• vectorul care memorează numărul mare - şirul de caractere char s[];
• numărul de cifre - lungimea şirului int lg, transmis prin valoare, dearece el
nu se va mai modifica.
//afişarea unui număr mare
void afisare(char s[], int lg)
{ cout<<"numarul este: ";
for(int i=lg-1;i>=0;i--)
cout<<(int)s[i]; //conversie explicita de tip de la char la int
cout<<endl;
}
Observaţie: deoarece elementele vectorului sunt de tip char, dacă am afișa
cifrele numărului mare cu comanda cout<<s[i]; atunci cifrele vor fi
considerate coduri ASCII și ar fi afișate caracterele corespunzătoare acestor
coduri. Pentru a evita acest aspect trebuie să facem la fiecare cifră conversie
explicită de tip: cout<<(int)s[i]; şi să forțăm să se afișeze cifra memorată.

Colegiul Naţional “VICTOR BABEŞ”


Prof. Eugenu DRĂGOESCU 8
VĂ MULȚUMESC PENTRU ATENȚIE!!!

Colegiul Naţional “VICTOR BABEŞ”


Prof. Eugenu DRĂGOESCU 9

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