Sunteți pe pagina 1din 8

Programarea Calculatoarelor - Limbaje

Lucrarea 08. Aplicații cu tablouri

O1. Cunoașterea modului de definire și utilizare a tablourilor în C


Obiective O2. Parcurgere, extragerea, ștergerea și inserarea elementelor din
tablouri în limbajul C
O3. Transmiterea tablourilor către și dinspre funcții

INTRODUCERE
Un tablou este o listă de elemente de acelaşi tip plasate succesiv într-o zonă contiguă de
memorie (en. array).
Orice tablou este identificat print-un nume, iar numele este un pointer constant către primul
element din tablou. Tipul elementelor tabloului reprezintă tipul tabloului respectiv

TABLOURI UNIDIMENSIONALE

tip nume_tablou[dimensiune];

tip este un tip de date (predefinit sau definit de utilizator). nume_tablou este un identificator C/
C++. dimensiune este o expresie constantă întreagă şi pozitivă ce specifică numărul de elemente
din tablou
Referirea unui element din tablou:
nume_tablou[index]

nume_tablou este identificatorul dat tabloului (numele variabilei). indexul este, în general, o ex-
presie întreagă şi pozitivă. Primul element are indexul 0, iar ultimul element are indexul (dimensi-
une-1)

TABLOURI MULTIDIMENSIONALE

tip nume_tablou[dimens1][dimens2]...[dimensN];

Pentru N=1 - tabloul se numeşte unidimensional (impropriu, vector)


int tab[100];
Pentru N=2 - tabloul se numeşte matrice:
float tab[10][5];
Pentru N oarecare - tablou N-dimensional
NOTĂ: Mediile de programare pot impune restricții legate de numărul maxim de dimensiuni
admise pentru un tablou multidimensional, limbajul C/C++ nu impune însă o limitare
Referirea unui element din tablou:
nume_tablou[index1][index2]…[indexN]

© Adriana Stan, Ligia Chiorean, Mircea Vaida 1 Programarea Calculatoarelor - Limbaje


Un tablou N-dimensional este un tablou unidimensional a cărui elemente sunt tablouri (N-1)-di-
mensionale:
int tab[2][3]
tablou cu 2 elemente, fiecare element fiind un tablou cu 3 elemente
Un element de tablou poate fi utilizat oriunde poate să apară o variabilă simplă cu acelaşi tip

INIȚIALIZAREA TABLOURILOR LA DECLARARE

Tablouri unidimensionale:
tip nume_tablou[dimensiune] = {ec0, ..., ecN-1};

dacă dimensiunea lipseşte numărul expresiilor constante dă dimensiunea tabloului. Elementele


care nu se inițializează explicit sunt automat inițializate cu 0 (la tablourile globale). În cazul şirurilor
de caractere acoladele pot lipsi.

Tablouri multidimensionale:
tip nume[n][m]= {
{ec11,...,ec1m},
{ec21,...,ec2m},...,
{ecn1,...,ecnm}
};
unde: n, m, ecij - sunt expresii constante. Acoladele interioare nu sunt obligatorii, dar ele speci-
fică modul de inițializare pe linii. În cazul în care sunt mai puține elemente în listă față de dimensi-
unea specificată, restul elementelor vor fi inițializate cu 0. În cazul în care sunt mai multe elemente
în listă față de dimensiunea specificată, compilatorul va genera o eroare.

TRANSMITEREA TABLOURILOR CĂTRE FUNCȚII:

Un tablou poate fi transmis ca parametru unei funcții astfel:


- parametrul formal e declarat ca și un tablou de același tip și dimensiune cu tabloul folosit ca
argument;
- parametrul formal e declarat ca și un tablou de la care poate lipsi prima dimensiune (stânga);
- parametrul formal e un pointer către tipul tabloului.
În toate cazurile, la apel ca argument se dă doar adresa tabloului.
La tablourile unidimensionale se poate considera ca parametru un tablou fără dimensiune.
Uzual, în acest caz, se mai transmite şi un întreg ce poate fi: dimensiunea tabloului sau numărul
de elemente din tablou ce se prelucrează. În acest mod, funcția respectivă poate fi apelată pentru
orice tablou ce are acelaşi tip precizat în prototipul funcției
Primul parametru la apel se mai numeşte şi parametru tablou (adresa primului element din
tablou). În acest mod avem o formă de apel prin adresă, în care se comunică funcției aproape totul
despre tablou (cu excepția dimensiunii). Pe baza adresei de început şi a indexului unui element se
poate calcula adresa oricărui element din tablou.

© Adriana Stan, Ligia Chiorean, Mircea Vaida 2 Programarea Calculatoarelor - Limbaje


La apelul prin adresă, orice modificare în cadrul funcției a elementelor unui tablou transmis ca şi
parametru, se reflectă asupra tabloului inițial. Dacă se foloseşte modificatorul const pentru tablou,
atunci nu se mai pot face modificări asupra elementelor tabloului:

void displayArray (const int arr [ ], int MAXSIZE);


În cazul tablourilor multidimensionale, prima dimensiune, poate lipsi datorită mecanismului de


alocare a tablourilor în memorie în C:
void display(char p[ ][100], int size);

TABLOURI RETURNATE DE FUNCȚII

Limbajul C/C++ nu permite returnarea unui întreg tablou de către o funcție. Însă: poate fi retur-
nat un pointer la un tablou, specificând numele tabloului fără index. Dacă se dorește returnarea
unui tablou unidimensional dintr-o funcție, trebuie declarată o funcție care returnează un pointer. C
nu permite returnarea adresei unei variabile locale în afara funcției, așa încât trebuie definită vari-
abila locală ca variabilă statică.
Altă modalitate: alocarea tabloului în mod dinamic și returnarea pointerului obținut în urma
alocării (într-un curs viitor)

EXEMPLE

1. Program ce citeşte elementele unui tablou bidimensional, după care determina suma ele-
mentelor de pe diagonala principală.

© Adriana Stan, Ligia Chiorean, Mircea Vaida 3 Programarea Calculatoarelor - Limbaje


#include <stdio.h>
#define MAX 20

int main(void)
{
int i, j, n, sum = 0, tab[MAX][MAX];
printf("\nDimensiunea matricei: ");
scanf("%d", &n);
if (n <= 0) {
printf("\n\tDimensiunea data este negativa !");
return 0;
}//end if

printf("\nIntroduceti elementele matricei:");


for (i = 0; i<n; i++) {
printf("\n\t Linia %d: \n", i + 1);
for (j = 0; j<n; j++) {
printf("\t\ttab[%d,%d] = ", i + 1, j + 1);
scanf("%d", &tab[i][j]);
}
}//end for
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i == j)
sum += tab[i][j];
printf("\nSuma pe diagonala principala este: %d\n ", sum);
return 0;
}
2. Program pentru determinarea valorii medii a elementelor unui tablou unidimensional.

© Adriana Stan, Ligia Chiorean, Mircea Vaida 4 Programarea Calculatoarelor - Limbaje


#include <stdio.h>
#define DIM 20

float valMed(int x[], int dim);

int main(void){
int i, dim;
int x[DIM];
printf("\nIntroduceti dimensiunea tabloului: ");
scanf("%d", &dim);
if (dim > DIM) {
printf("\n Dimensiune prea mare !");
return 0;
}
printf("\n Introduceti elementele tabloului:\n");
for (i = 0; i<dim; i++){
printf("\tx[%d] = ", i);
scanf("%d", &x[i]);
}
printf("\n Valoarea medie este: %.3f\n", valMed(x, dim));
}

// Functia determina valoarea medie a elementelor unui tablou


float valMed(int x[], int n){
int i;
float sum = 0;
for (i = 0; i<n; i++)
sum += x[i];
return sum / n;
}
3. Program pentru căutarea directă într-un tablou unidimensional

© Adriana Stan, Ligia Chiorean, Mircea Vaida 5 Programarea Calculatoarelor - Limbaje


#include <stdio.h>
#define DIM 100

int cautDir(int x[], int dim, int val);

int main(void){
int i, dim, val, poz;
int x[DIM];
printf("\nIntroduceti dim tabloului( <= %d): ", DIM);
scanf("%d", &dim);
if (dim > DIM) {
printf("\n Dimensiune prea mare !");
return 0;
}

printf("\n Introduceti elementele tabloului:\n");


for (i = 0; i<dim; i++){
printf("\tx[%d] = ", i);
scanf("%d", &x[i]);
}

printf("\n Introduceti numarul de cautat: ");


scanf("%d", &val);
poz = cautDir(x, dim, val);
if (poz < 0)
printf("\n Numarul nu a fost gasit in tablou !\n");
else
printf("\n Numar gasit in pozitia %d.\n", val, poz+1);
return 0;
}

// Functie ce cauta o valoare intr-un tablou


// Returneaza pozitia sau valoarea -1 in caz de esec
int cautDir(int x[], int n, int val){
for (int i = 0; i <= n - 1; i++){
if (x[i] == val)
return i;
}
return -1;
}
3. Program pentru inserarea unei valori într-un tablou unidimensional.

© Adriana Stan, Ligia Chiorean, Mircea Vaida 6 Programarea Calculatoarelor - Limbaje


#include <stdio.h>
#define DIM 20

void inserare(int tab[], int n, int idx, int val);

int main(void)
{
int i, dim, val, poz;
int x[DIM];
printf("\nIntroduceti dimensiunea tabloului: ");
scanf("%d", &dim);
if (dim > DIM) {
printf("\n Dimensiune prea mare !");
return 0;
}

printf("\n Introduceti elementele tabloului:\n");


for (i = 0; i<dim; i++){
printf("\tx[%d] = ", i);
scanf("%d", &x[i]);
}

printf("\n Introduceti numarul de inserat: ");


scanf("%d", &val);
printf("\n Introduceti pozitia: ");
scanf("%d", &poz);
if (dim == DIM) {
printf("\n Spatiu insuficient pentru inserare !\n");
return 0;
}

inserare(x, dim, poz, val);


dim++;
printf("\nNumerele din tablou :\n");
for (i = 0; i<dim; i++)
printf("\t%d", x[i]);//end for
printf("\n");
return 0;
}

void inserare(int arr[], int n, int idx, int val){


if (idx == -1)
arr[n] = val; // adaugare
else {
for (int i = n; i > idx; i--)
arr[i] = arr[i - 1];
arr[idx] = val;
}
}

arr[n] = val; // adaugare


© Adriana Stan, Ligia Chiorean, Mircea Vaida 7 Programarea Calculatoarelor - Limbaje
TEME

1. Scrieţi un program pentru determinarea valorii medii a elementelor pozitive/negative dintr-un


tablou unidimensional.
2. Scrieţi un program pentru determinarea celui mai mic element pozitiv dintr-un tablou unidi-
mensional.
3. Scrieţi o aplicatie care citeşte de la tastatură un şir de 10 valori intregi. Definiţi o funcţie care
primeste şirul ca parametru şi apoi îl afişeaza ordonat crescător
4. Scrieţi o aplicaţie care defineşte o parolă (in format şir de caractere). Programul citeşte în mod
repetat şirurile de caractere introduse de la tastatură, până când utilizatorul scrie parola corectă.
Să se afişeze numărul de incercări până la introducerea parolei corecte.
5. Scrieţi o aplicatie care citeşte de la tastatura două siruri de caractere reprezentand numele si
prenumele unei persoane. Afisati-le cu majusculă, separate prin două spatii de tabulare.
6. Scrieţi o aplicatie care defineşte două matrice de valori intregi. Dimensiunea si elementele ma-
tricilor sunt citite de la tastatura. Scrieţi functiile care:
a) afişează poziţiile elementelor pare din fiecare matrice;
b) afişează suma elementelor impare din ambele matrice;
c) afişează suma matricelor;
7. Citiţi de la tastatura elementele unei matrice cu elemente de tip float, cu dimensiunea 3x3.
Rearanjaţi coloanele matricei astfel ca suma elementelor de pe o anumită coloană sa fie mai
mica decat suma elementelor de pe coloana următoare.
8. Scrieţi un program care pria de la tastatură “n” valori reale într-un tablou unidimensional, cal-
culează cu o funcţie valoarea medie a valorilor introduse si afişează cu o altă funcţie doar valorile
din tablou mai mari decît valoarea medie calculată.
9. Să se scrie o aplicaţie în care se citesc într-un tablou unidimensional “n” valori întregi şi se de-
termină numărul elementelor negative impare. Să se afişeze acest număr şi elementele respec-
tive.
10. Scrieţi programul care citeşte elementele întregi ale unui tablou unidimensional şi constru-
ieşte într-o funcţie un alt tablou unidimensional în care se vor stoca resturile împărţirii ele-
mentelor primului tablou la numărul elementelor pozitive din acesta.
11. Se citeşte de la tastatură un şir de caractere. Scrieţi funcţia care inversează şirul şi apoi
formează un alt şir de caractere ce va conţine elementele de pe poziţiile pare ale şirului inversat.
Afişaţi şirurile obţinute.
12. Să se citească de la tastatură elementele întregi ale unei matrice de dimensiune m x n. Dacă
matricea este pătratică să se afişeze elementele diagonalei secundare, altfel să se afişeze suma
elementelor de pe o coloană dată, c. Valorile m, n şi c se citesc de la tastatură şi se vor scrie
funcţii pentru operaţiile cerute.
13. Să se scrie un program care parcurge o matrice tridimensională din perspectivele xOy, xOz,
yOz. Afișați datele precizând din ce perspectivă au fost parcurse.

© Adriana Stan, Ligia Chiorean, Mircea Vaida 8 Programarea Calculatoarelor - Limbaje

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