Sunteți pe pagina 1din 9

www.cartiaz.

ro – Carti si articole online gratuite de la A la Z

Tablouri şi şiruri de caractere in C++

Un tablou este o colecţie de variabilede acelaşi tip, apelate cu acelaşi nume.


Tablourile sunt plasate într-o zonă de memorie contiguă. Accesul la un element al
tabloului se face cu ajutorul unor indici.

Tablouri unidimensionale

Forma generală de declarare a tablourilor unidimensionale (şirurilor) este


următoarea:

tip_element nume_tablou[număr_elemente];

unde tip_element este un tip oarecare şi reprezintă tipul elementelor tabloului,


nume_tablou este un identificator, iar număr_elemente este o expresie constantă şi
pozitivă ce precizează numărul de elemente ale tabloului.
De exemplu, în secvenţa:

int k[50];
char c[8];
float a[100];

se declară tablourile c , k şi a cu, respectiv, 50 de elemente întregi, 8 elemente de tip


caracter şi 100 elemente de tip float.
Pentru referirea la un element se foloseşte o expresie cu operatorul de indexare [ ],
precizând numele tabloului şi indexul (poziţia elementului în tablou):

nume_tablou[index]

Indexul variază între 0, pentru primul element a tabloului şi număr_elemente-1,


pentru ultimul element.
Dimensiunea zonei de memorie care trebuie alocată tabloului poate fi calculată cu
relaţia:

dimensiune_tablou = sizeof(tip_element)*număr_elemente

Tablourile unidimensionale sunt liste de informaţii de acelaşi tip care sunt plasate
în zone de memorie contiguă, în ordinea indicilor. De exemplu, dacă tabloul c cu 8
elemente de tip caracter, declarat mai sus, începe cu locaţia de memorie 1100, în
memorie acesta apare astfel:

Element c[0] c[1] c[2] c[3] c[4] c[5] c[6] c[7]


Adresă 1100 1101 1102 1103 1104 1105 1106 1107
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Observaţie: Limbajul C nu controlează limitele unui tablou. Se pot depăşi ambele


margini, distrugând u-se alte date sau cod de program, fără ca să se semnaleze eroare.

Aplicaţie

Programul următor determină minimul dintre termenii pozitivi ai unui şir şi


maximul dintre termenii negativi ai aceluiaşi şir.
/* MAX numere negative MIN numere pozitive */
#include <stdio.h>
#include <conio.h>
void main()
{
char i,n,poz,neg;
char min,max,a[50];
clrscr();
printf("n=");scanf("%i",&n);
for (i=1;i<=n;++i)
{
printf("A(%i)=",i);
scanf("%d",&a[i]);
}
poz=neg=0;
for (i=1;i<=n;++i)
{
if (a[i]>0) if (poz==0){
min=a[i];
poz=1;
}
else if (min>a[i]) min=a[i];
if (a[i]<0) if (neg==0){
max=a[i];
neg=1;
}
else if (max<a[i]) max=a[i];
}
if (poz) printf("MIN poz=\%d\n",min);
if (neg) printf("MAX neg=\%d\n",max);
if ((poz==0)&&(neg==0)) printf("Toate numerele sunt
nule\n");
getch();
}

Şiruri de caractere
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

În C, un şir de caractere este un tablou unidimensional cu elemente de tip caracter.


Forma generală de declarare a unui şir de caractere este este următoarea:

char nume_şir[număr_elemente];

Pentru a se marca sfârşitul şirului, după ultimul caracter din şir, se adaugă un octet
cu valoarea zero, adică caracterul ’\0’. În caz particular, şirul vid are primul element chiar
terminatorul ’\0’.
Dimensiunea indicată la declarare, în cazul unui tablou de tip şir, trebuie să fie cu
o unitate mai mare decăt cel mai lung şir, pentru a încăpea şi terminatorul’\0’. Astfel într-
un tablou cu număr_elemente caractere poate încăpea un şir cu cel mult număr_elemente-
1 caractere.
Terminatorul ’\0’ permite testarea facilă a sfârşitului şirului. De exemplu,
progrmul Lungime sir de caractere citeşte un sir şi îi calculează lungimea.
/* Lungime sir de caractere */
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
char i,s[100];
printf("\tIntroduceti un sir de caractere:");
gets(s); /* citeste un sir terminat cu Enter */
for(i=0;s[i];++i);
printf("\tlungimea sirului este=%d",i);
getch();
}

Observaţie: Pentru a se putea citi un şir ce conţine şi spaţii trebuie să se utilizeze


funcţia gets, deoarece funcţia scanf citeşte şiruri ce se termină cu spatiu.

De exemplu, instrucţiunea:

scanf("%10s",s);

citeste un şir restricţionat la 10 caractere şi terminat cu tasta Spaţiu sau Enter.

O constantă şir de caractere este o listă de caractere încadrată de ghilimele. La


întâlnirea constantei, compilatorul rezervă zona de memorie necesară, o iniţializează cu
codurile ASCII ale caracterelor şirului şi adaugă terminatorul ’\0’. O asemenea constantă
poate fi utilizată pentru iniţializarea unui şir de caractere.
De exemplu, programul Constanta sir de caractere conţine un şir de caractere, s,
iniţializat, afişează codurile caracterelor acestuia, citeşte un nou şir şi îl afişează.

/* Constanta sir de caractere */


www.cartiaz.ro – Carti si articole online gratuite de la A la Z

#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
char i,s[50]="CONSTANTA SIR";
printf("Sirul initial este:%s\n",s);
printf("Codurile caracterelor sunt:");
for(i=0;s[i];++i) printf("%x ",s[i]);
printf("\nIntroduceti un sir de caractere:");
gets(s);
printf("Noul sir este:%s",s);
getch();
}

O serie de funcţii care operează cu şiruri de caractere se află în fişierul antet


string.h. Cele mai uzuale dintre acestea sunt date în tabelul de mai jos:

Nr. Efect
Funcţia
Crt.
Citeşte caractere de la tastatură şi le înscrie în şirul s,
1 gets(s); până întâlneşte caracterul ’\n’. Acest caracterul nu este
înscris în s, dar se adaugă terminatorul ’\0’.
2 puts(s); Afişează şirul s pe ecran şi trece la linie nouă.
3 strcpy(s1, s2); Copiază şirul s2 în şirul s1.
Copiază primele n caractere din şirul s2 în şirul s1 (pe
4 strncpy(s1, s2, n);
poziţia n, trebuie adăugat după copiere terminatorul ’\0’.
5 strcat(s1, s2); Adaugă şirul s2 la sfârşitul şirului s1.
Adaugă cel mult n caractere din şirul s2 la sfârşitul
6 strncat(s1, s2, n);
şirului s1.
În şirul s, caracterele litere mici sunt înlocuite cu
7 strupr(s);
caractere litere mari.
În şirul s, caracterele litere mari sunt înlocuite cu
8 strlwr(s);
caractere litere mici.
Inversează toate caracterele şirului s, exceptând
9 strrev(s);
terminatorul’\0’.
10 strset(s,c); În şirul s, toate caracterele sunt înlocuite cu caracterul c.
În şirul s, primele n caracterele sunt înlocuite cu
11 strnset(s,c,n); caracterul c. Operaţia se încheie, dacă este întâlnit
terminatorul’\0’.
12 strlen(s); Returnează lungimea şirului s.
13 strcmp(s1, s2); Compară succesiv codurile ASCII ale celor două şiruri.
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Returnează valoarea 0 dacă sunt identice, o valoare


pozitivă dacă s1[k]>s2[k]; o valoare negativă dacă
s1[k]<s2[k], unde k este indicele unde apare prima
diferenţă între caracterele şirurilor.
strcimp(s1, s2); sau Idem strcmp, fără a face deosebire între literele mari şi
14
strcmpi(s1, s2); mici.
Idem strcmp, dar compară numai primelor n caractere
15 strncmp(s1, s2,n);
ale celor două şiruri
Idem strcmp, dar compară numai primelor n caractere
strncmpi(s1, s2,n); sau
16 ale celor două şiruri, fără a face deosebire între literele
strnicmp(s1, s2,n);
mari şi mici.
Returnează un pointer la prima apariţie a caracterului c
17 strchr(s, c); în şirul s. Când caracterul nu este găsit, se returnează
NULL
Returnează un pointer la ultima apariţie a caracterului c
18 strrchr(s, c); în şirul s. Când caracterul nu este găsit, se returnează
NULL
Returnează un pointer la prima apariţie a şirului s2 în
18 strstr(s1, s2);
şirul s1. Când şirul s2 nu este găsit, se returnează NULL

Programul Extrage majuscule utilizează o parte din funcţiile de mai sus. Astfel,
citeşte un şir de caractere s, realizează o copie a acestuia, converteşte toate caracterele
şirului copie în litere mici şi, comparând şirul iniţial cu copia, caracter cu caracter,
extrage literele mari din şirul s şi le depune în şirul majuscule.

/* Extrage majuscule */
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
clrscr();
char i,j,s[50],copie[50],majuscule[50];
printf("\nIntroduceti un sir de caractere:");
gets(s);
strcpy(copie,s);
strlwr(copie);
for(i=j=0;s[i];++i)
if (s[i]!=copie[i])
{
majuscule[j]=s[i];
++j;
}
majuscule[j]='\0';
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

printf("Majuscule:%s\n",majuscule);
getch();
}

Tablouri multidimensionale

Forma generală de declarare a tablourilor multidimensionale este următoarea:

tip_element nume_tablou[dimensiune_1] [dimensiune_2] ...[dimensiune_n];

Un tablou cu n dimensiuni este de fapt un tablou unidimensional ale cărui


elemente sunt n tablouri cu n-1 dimensiuni.
Dimensiunea zonei de memorie care trebuie unui tablou multidimensional poate fi
calculată cu relaţia:

dimensiune_tablou =
sizeof(tip_element)*dimensiune_1*dimensiune_2*...*dimensiune_n.

De exemplu, în secvenţa:

int p[5][10];
char ch[3][8][20];

se declară tabloul p cu două dimensiuni, tabloul ch cu trei dimensiuni, cu câte 50 şi,


respectiv, 480 de elemente.
Referirea la un element se face scriind numele tabloului urmat de fiecare indice
încadrat de paranteze pătrate:

nume_tablou[indice_1][indice _2]...[ indice _n];

De exemplu, pentru tablourile declarate mai sus, primele elemente sunt: p[0][0] şi
ch[0][0][0], iar ultimele elemente sunt: p[4][9] şi ch[2][7][19].

Aplicaţie

Programul Produsul a doua matrice determină produsul unei matrice A, de


dimensiune nxp, cu o matrice B, de dimensiune pxq. Reziltatul este matricea C, de
dimensiune nxq,

/* Produsul a doua matrice */


#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

int n,p,q,i,j,k;
int a[10][10],b[10][10],c[10][10];
printf("n="); scanf("%d",&n);
printf("p="); scanf("%d",&p);
printf("q="); scanf("%d",&q);
for(i=0;i<n;++i)
for(j=0;j<p;++j)
{
printf("a[%d,%d]=",i,j);
scanf("%d",&a[i][j]);
};
for(i=0;i<p;++i)
for(j=0;j<q;++j)
{
printf("b[%d,%d]=",i,j);
scanf("%d",&b[i][j]);
};
for(i=0;i<n;++i)
for(j=0;j<q;++j)
{
c[i][j]=0;
for(k=0;k<p;++k) c[i][j]=c[i][j]+a[i][k]*b[k]
[j];
};
for(i=0;i<n;++i)
{
for(j=0;j<q-1;++j) printf("%8d ",c[i][j]);
printf("%8d\n",c[i][j]);
;}
getch();
}

Iniţializarea tablourilor

Iniţializarea unei matrice se poate face în acelaşi timp cu declararea sa.


Forma generală de iniţializare a tablourilor unidimensionale este următoarea:

tip_element nume_tablou[dimensiune_1] [dimensiune_2] ...


[dimensiune_n]={lista_valori};

umde lista_valori trebuie să conţină valori pentru toate elementele tabloului, valori
compatibile cu tipul elementelor tabloului. În listă, valorile se separă prin virgulă.
Exemple:

int vector[3]={2,-7,5};
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

int matrice[2][3]={{2,-6,5},{0,7,1}};

Observaţie: Acoladele care delimitează liniile matricei nu sunt obligatorii. Ele


pot fi utilizate pentru a mări claritatea.

Tablourile (şirurile) de caractere permit o iniţializare prescurtată de forma:

char nume_şir[dimensiune] =.”şir de caractere”;

Astfel, următoarea declaraţie:

char s[8]={’E’,’x’,’e’,’m’,’p’,’l’,’u’,’\0’};

este echivalentă cu declaraţia:

char s[8]=”Exemplu”;

Observaţie: Deoarece toate şirurile de caractere se termină cu caracterul null,


dimensiunea tabloului trebuie să fie suficient de mare pentru al include. În cel de al doilea
caz, compilatorul adaugă automat caracterul null.
În cazul tablourilor unidimensionale, se poate omite dimensiunea, iar în cazul
tablourilor multidimensionale, se poate omite numai dimensiunea din extrema stângă,
celelalte fiind necesare compilatorului pentru a cunoaşte organizarea elementelor.
Exemple de declaraţii valide:

int vector[]={2,-7,5};
int matrice[][3]={2,-6,5,0,7,1};

Această facilitate este foarte utilă la iniţializarea şirurilor de caractere, deoarece


nu mai este nevoie să se cunoască numărul caracterelor. Exemplu:

char s[]=”Sir de caractere iniţializat”;

Şirul s permite memorarea oricărui şir, fără a se depăşi mărimea declarată.


Programul următor afişează tablouri iniţializate:

/* Initializare tablouri */
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
clrscr();
int i,j,k,n=3,p=3,q=2;
int a[][3][2]={1,2,
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

3,4,
5,6,
7,8,
9,10,
11,12,
13,14,
15,16,
17,18};
char s[4]={'a','b','c','\0'};
char s1[4]="abc";/* Copia lui s */
for(i=0;i<n;++i)
{
printf("\n\tElement %d\n\n",i);
for(j=0;j<p;++j)
{
for(k=0;k<q-1;++k) printf("%8d ",a[i][j]
[k]);
printf("%8d\n",a[i][j][k]);
};
}
printf("\n\t s=");
for(i=0;i<strlen(s);++i) printf("%c",s[i]);
printf("\ncopia lui s=");
for(i=0;i<strlen(s1);++i) printf("%c",s1[i]);
getch();
}