Tablouri unidimensionale
Tablouri multidimensionale


Tablouri



Tablouri unidimensionale
 

Definitie:
Tabloul este o colectie finita de elemente de acelasi tip, numit tip de baza al tabloului, care ocupa un spatiu continuu de memorie.

Sintaxa declaratiei:
 

tip_de_baza nume_tablou[dimensiune]={const0,const1,...};

dimensiune - este o expresie intreaga constanta, precizand numarul de elemente ale tabloului ( se precizeaza de obicei printr-o constanta simbolica ).
Memoria ocupata de tablou este: dimensiune*sizeof(tip_de_baza)

Tabloul poate fi initializat la definire, parte optionala marcata,  prin precizarea constantelor de initializare. Daca numarul acestora:

Daca este prezenta partea de initializare, dar lipseste dimensiune, aceasta este implicit numarul constantelor.

Exemple:

int tab[10]; // defineste un tablou de 10 elemente intregi, care ocupa 20 octeti

#define N 10
int tab[N]; // definitie echivalenta cu cea de mai sus

#define NR_ELEM 5
float t[NR_ELEM]={1.2,5,3}; //primele trei elemente se initializeaza cu constantele precizate,
                            //urmatoarele doua cu 0

double a[]={2,5.9}; //tabloul a este de dimensiune 2

Selectarea unui element de tablou:
 

nume_tablou[indice]//se foloseste operatorul de indexare []

indice - expresie intreaga cu valori intre 0 si dimensiune -1
Un element de tablou poate fi prelucrat ca orice variabila avand tipul de baza.

Observatii:

Exemplu:

1. Se considera un tablou de N elemente intregi ( N este constanta predefinita ). Sa se prelucreze tabloul astfel:



Tablouri multidimensionale

Definirea unui tablou multidimensional:
 

tip_de_baza nume_tablou[dim1][dim2]...[dimn]={{const10,...},{const20,...},
                                                      ...,{constn0,...}};

dim1,dim2,...,dimn - expresii intregi constante ( de obicei constante simbolice ).
Memoria continua ocupata de tablou este de dimensiune: dim1*dim2*...*dimn*sizeof(tip_de_baza).
Elementele tabloului multidensional sunt memorate astfel incat ultimul indice variaza cel mai rapid.

Tabloul poate fi initializat la definire, parte optionala marcata,  prin precizarea constantelor de initializare.

Tablourile bidimensionale se numesc matrici, prima dimensiune reprezentand numarul de linii, iar a doua, de coloane.

Exemple:

int m[10][5]; // defineste un tablou dimensional de elemente intregi, cu 10 linii si 5 coloane, care ocupa 10*5*2=100 octeti

#define NL 10
#define NC 5
int m[NL][NC]; // definitie echivalenta cu cea de mai sus

double a[3][2]={{2},{5.9,1},{-9}}; //elementele pe linii sunt: 2 0 5.9 1 -9 0

double a[3][2]={2,5.9,1,-9}; //elementele pe linii sunt: 2 5.9 1 -9 0 0

Selectarea unui element de tablou:
 

nume_tablou[ind1][ind2]...[indn]

ind1,ind2,...,indn - expresii intregi cu valori intre 0 si dimi-1, i=1..n
Un element de tablou poate fi prelucrat ca orice variabila avand tipul de baza.

Exemplu:

Sa se scrie un program care realizeaza urmatoarele prelucrari asupra unei matrici patratice M de ordin N ( constanta simbolica ), avand elemente intregi, fiecare prelucrare fiind realizata de cate o functie void fara parametri:

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#define N 10

char optiune;
int n,matrice[N][N]; 

void citire(void){
  int i,j;
  do{ //citire cu validare a ordinului matricii
   printf("\nIntroduceti nr de linii si coloane:(1..%d)",N);
   scanf("%d",&n);
  }while(n<=0||n>N);
  for (j=0;j<n;j++)
    for (i=0;i<n;i++){
      printf("elem[%d][%d]:",i,j);
      scanf("%d",&matrice[i][j]);
    }
}

void afisare(void){
  int i,j;
  puts("Matricea:");
  for (i=0;i<n;i++){
    for (j=0;j<n;j++)
      printf("%d\t",matrice[i][j]);
    putchar('\n');
  }
}

void modifica(void){
  int i,j;
  afisare();
  for (i=0;i<n;i++)
    for (j=0;j<n;j++)
      matrice[i][j]+=i+j;
  puts("Dupa modificare:");
  afisare();
}

void verif_sim(void){
  int i,j;
  for (i=0;i<n;i++) // se compara fiecare elem de deasupra
    for (j=i+1;j<n;j++)// diag cu simetricul sau
      if (matrice[i][j]!=matrice[j][i]){
         puts("Matricea nu este simetrica");
         return;
      }
  puts("Matricea este simetrica");
}

void linia_max(void){
  int i,j,linia;long produsmax,produs;
  for (i=0;i<n;i++){
    for (produs=1,j=0;j<n;j++) // calcul produs linia i
      produs*=matrice[i][j];
    if(i==0){
      produsmax=produs;
      linia=0;
    }
    else if (produs>produsmax){
       produsmax=produs;
       linia=i;
    }
  } // for i
  printf("Produsul maxim este %ld,se afla pe linia d;", produsmax,linia);
}

void calc_sume(void){
  int i,j,diagprinc=0,diagsec=0,deasupradiagprinc=0,margine=0;
  for (i=0;i<n;i++){
       diagprinc+=matrice[i][i];
       diagsec=diagsec+matrice[i][n-1-i];
       margine+=matrice[i][0];
       margine+=matrice[i][n-1];
       for > optiune=getche();
 putchar('\n');
}
void main(void)
{
 n=0;
 do{ 
  clrscr(); 
  citire_optiune();
  switch(toupper(optiune)){
   case 'I':citire();break;
   case 'A':afisare();break;
   case 'M':modifica();break;
   case 'V':verif_sim();break;
   case 'L':linia_max();break;
   case 'C':calc_sume();break;
   case 'T':transpusa();break;
   case 'X':puts("La revedere!");break;
   default:puts("*** Optiune eronata ***\n");
  }
  getch(); 
 }while(toupper(optiune)!='X');
}
 


 

Carmen Holotescu
martie 2000