Documente Academic
Documente Profesional
Documente Cultură
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.
tip
identificator
constanta
constanta
#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 ");
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, );