Sunteți pe pagina 1din 6

11. Tipuri de date II. Tipuri de date structurate n C.

Tipul tablou
Reamintim :
 O variabil simpl, asociat unui tip simplu de date, poate memora (stoca) doar o singur valoare, un numr (ntreg
sau real) sau un caracter.
 Pentru ca o variabil s poat memora mai multe valori, ea trebuie s aparin unui tip de date structurat.
 Tipurile structurate se obin prin compunerea altor tipuri de date, la baza ierarhiei stnd ntotdeauna tipurile de date
simple.
 Elementele ce caracterizeaz un tip structurat sunt tipul/tipurile utilizate, metoda de structurare (organizare) folosit
i, implicit, modalitatea de acces la componentele tipului.
Ne vom ocupa n cele ce urmeaz de un tip particular de date structurate i anume de tipul tablou, mai precis de utilizarea
sa n limbajul C.
 Existena unor aplicaii ce necesit efectuarea unor prelucrri similare asupra unui numr mare de date de acelai tip
a impus necesitatea definirii unei metode care s permit unei variabile s memoreze un set de valori i, suplimentar,
necesitatea definirii modurilor de organizare i de acces la fiecare din valorile setului. n acest context s-a definit
tipul de date structurat denumit tablou (termenul englezesc corespunztor : array).
 Tipul tablou desemneazun numr fixat (cunoscut la compilare) de componente de acelai tip, numit tip de baz.
 Fiecare element al unui tablou este accesibil pe baza poziiei sale n structur, poziie precizat prin intermediul unor
valori numite indici (indeci)
 Orice component a tabloului poate fi referit i accesat direct prin indicarea poziiei sale n tablou i ea definete o
aa-numit variabil indexat.
 Dimensiunea unui tablou este dat de numrul de indici necesari pentru a specifica poziia uni element din
structur.

 Dup dimensiune, tablourile se clasific n :


- tablouri unidimensionale (vectori, iruri)
- tablouri bidimensionale (matrici)
- tablouri multidimensionale
 Reamintim faptul c definirea corespondenei dintre numele dat unei variabile i tipul ei se face printr-o declaraie.
 Declaraia unei variabile de tip tablou precizeaz tipul comun al elementelor sale, numele tabloului i limitele
superioare (fixe) pe fiecare dimensiune.
declaratie_variabila_tablou

tip

identificator

constanta

constanta

Figura 11.1. Diagrama sintactic a declaraiei unei variabile de tip tablou


unde tip desemneaz un tip de date predefinit sau definit de utilizator (aa cum se va arta ulterior), iar constantele
specific numrul maxim de elemente de pe fiecare dimensiune (i care, evident, pot avea valori diferite!).
 n limbajul C numele unui tablou este un simbol ce are ca valoare o adres: adresa primului element al tabloului.
Compilatorul aloc unui tablou o zon contigu de memorie capabil s stocheze toate valorile componentelor sale.
 Cea mai frecvent utilizare a structurii de tablou este descrierea structurilor de tip vector sau matrice.
 Tipul indicilor folosi n accesarea elementelor tablourilor trebuie s fie obligatoriu de tip ntreg sau compatibil ( altfel
apare eroare de compilare (subscript is not of integral type).
 Indicii tablourilor n C au obligatoriu valoarea iniial 0 (ZERO)
 Pentru declararea unui tablou se estimeaz numrul maxim de elemente pe fiecare dimensiune i se rezerv astfel
spaiu de memorie maximal pentru stocarea elementelor tabloului.
Exemplul 1. Pentru un vector cu n elemente reale, simpl precizie, n<=100, preluat de la consol, s se afieze elementele
vectorului introdus, cte 7 pe linie i s se calculeze i s se afieze suma i produsul elementelor vectorului.

#define
MAX 100
#include
<stdio.h>
#include
<conio.h>
#include
<stdlib.h>
void main(void)
{
float v[MAX],s,p ;
int i,n ;
printf("Numarul de elemente ale vectorului =") ;
if (scanf("%d",&n)!=1|| n <= 0 ||n > MAX)
{
printf("Dimensiune eronata") ; exit(1) ;
}
for ( i = 0; i < n; i++)
{
printf("v[%2d]=",i) ;
if(scanf("%f",&v[i])!=1)
{
printf("Date eronate") ; exit(1) ;
}
}
s = 0.0f ; p = 1.0f ;
for( i = 0; i < n ; i++)
{
s += v[i] ;p *= v[i] ;
}
printf("Vectorul V\n") ;
for (i = 0; i < n; i++)
printf("%8g %c",v[i],i%7 == 6 || i== n-1?'\n':' ') ;
printf("Suma=%g\tProdusul=%g\n",s,p) ;
getch();
}

Exemplul 2. Pentru un vector cu n elemente reale, dubl precizie, n<=100, preluat de la consol, s se ordoneze
cresctor elementele vectorului i s se afieze vectorul astfel ordonat. Se ve folosi metoda bulelor.
..
//Ordonare metoda "bulelor"
int ordonat;
double aux;
do
{
ordonat=1;
for (i=0; i<n-1; i++)
if (v[i]>v[i+1])
{
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
ordonat=0;
}
}while (!ordonat);
.
Exemplul 3. Pentru o matrice cu elemente reale dubl precizie, de dimensiuni mxn (m,n preluai de la consol) s se calculeze
suma i produsul elementelor matricii (matricea se va afia cu cte 5 elemente pe linie).
#define MMAX 20 // nr. maxim de linii
#define NMAX 20 // nr. maxim de coloane
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main(void)
{
int m,n,i,j;
double s,p,a[MMAX][NMAX];
printf("introduceti nr. linii, nr. coloane ");

if (scanf("%d%d",&m,&n)!=2||m<=0||n<=0||m> MMAX ||n> NMAX)


{
printf("Date eronate\n"); exit(1);
}
printf("Introduceti elementele matricii\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
printf("a[%d][%d]=",i,j);
if(scanf("%lf",&a[i][j])!=1)
{
printf("Date eronate\n"); exit(1);
}
}
printf("\nMatricea a\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%10g ",a[i][j]);
if((j+1) %5==0)
printf("\n");
}
printf("\n");
}
s=0.0; p=1.0; //initializeaza suma si produsul elementelor matricii
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
s+=a[i][j]; p*=a[i][j];
}
printf("s=%g\t\tp=%g\n",s,p); // afiseaza rezultatul
}

 Tablourile unidimensionale se pot iniializa preciznd ntre paranteze acolade valorile iniiale ale elementelor.
 Tablourile bidimensionale se pot iniializa preciznd ntre paranteze acolade valorile iniiale ale vectorilor ce
constituie liniile matricilor.
 n cazul n care se folosete procedura de iniializare, nu este necesar declararea explicit a numrului de elemente
de pe fiecare dimensiune, acesta rezultnd implicit din sintaxa expresiei de iniializare.
 Un caz particular de tablouri unidimensionale sunt cele ce stocheaz iruri de caractere.
 Pentru citirea unui ir de caractere de la terminalul standard se poate folosi funcia gets
 Reamintim principalele caracteristici ale acesteia :
Funcia gets
Funcia gets are prototipul n fiierul stdio.h i ea citete de la terminalul standard un ir de caractere. Funcia are
ca parametru adresa de nceput a zonei de memorie care conine caracterele de afiat i se apeleaz sub forma :
gets(adres_ir_caractere) ;
Memorarea irului se face cu ncepere de la adresa adres_ir_caractere .
Caracterul linie nou se nlocuiete n memorie cu NUL (caracterul \0).
Funcia gets returneaz adresa de nceput a zonei de memorie n care se stocheaz caractererele citite sau 0
(NULL) la ntlnirea sfritului de fiier.
Observaie :
Biblioteca standard a limbajului C conine i funciile sscanf si sprintf analoge funciilor scanf si printf .
Acestea au suplimentar un prim parametru ce reprezint adresa unei zone de memorie n care se pstreaz
caracterele ce urmeaz a fi citite/scrise.
De exemplu, exist urmtoarea echivalen:
scanf (format, ....);

char tab[256];
gets(tab);
sscanf(tab, format, );

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