Programarea Calculatoarelor: Laborator 6
Tema: lucrul cu tablouri și siruri. Exerciții propuse:
-- funcție care returnează maximul sau minimul dintr-un tablou
-- funcție care tipărește o matrice
-- funcție care adună / înmulțește două matrici (primind ca parametru
și adresa pentru rezultat).
-- funcție care afișeaza/calculează suma pe diagonala principală/secundară/
sub-/supra-/diagonală a unei matrici
-- funcții care fac prelucrările din lab. 3 și 4 pe șiruri de caractere
(numărat cuvinte, scris cuvinte cu literă mare/literă mică, convertit șir în număr, etc.)
#include <stdio.h>
#define L 2
#define C 3
void aduna_mat(int m, int n, double a[m][n], double b[m][n], double r[m][n])
{
int i, j;
for (i = 0; i < m; ++i)
for (j = 0; j < n; ++j)
r[i][j] = a[i][j] + b[i][j];
}
void tipar_mat(int m, int n, double a[m][n])
{
int i, j;
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j)
printf("%f\t", a[i][j]);
putchar('\n');
}
}
int main(void)
{
double m1[L][C] = { { 1, 3.14, 2 }, { 5.5, 4.2, 3 } },
m2[L][C] = { { 6, -5.1, 14 }, { 2.1, 3.7, 6.2 } },
r[L][C];
aduna_mat(L, C, m1, m2, r);
tipar_mat(L, C, r);
return 0;
}
Remarcăm în acest exemplu simplu următoarele aspecte:
-- am definit nume pentru constantele care reprezintă dimensiunile
matricii cu ajutorul directivei #define a preprocesorului.
-- în declarația unui parametru tablou trebuie specificate toate
dimensiunile în afara de prima. În general, e necesar sa transmitem și
un parametru separat cu prima dimensiune, pentru a ști câte elemente
trebuie prelucrate.
-- începând cu standardul C99, dimensiunile unui parametru tablou nu
trebuie să fie neapărat constante, ci pot fi expresii în funcție de alți
parametri la funcție (a căror valoare e cunoscută în momentul apelului),
ca în exemplu. Pentru a compila un program care folosește noile facilități
ale standardului C99 e necesară pe linia de comandă opțiunea -std=c99
-- funcțiile nu pot returna tablouri (blocuri de elemente), ci doar
adresele acestora. E greșită returnarea adresei unui tablou declarat ca
variabilă locală, pentru că spațiul de memorie asociat ei nu mai e valabil
după încheierea funcției. De aceea, funcția de adunare ia ca parametru
și adresarezultatului, ceea ce îi permite să modifice valorile
elementelor de la acea adresă. Variabila tablou pentru rezultat e definită
în funcția unde e nevoie de ea, și de unde se apelează funcția de adunare
(în acest caz, main).
-- valorile dimensiunilor pentru argumentele tablou transmise
la o funcție trebuie să corespundă cu valorile dimensiunilor cu care
variabilele tablou respective au fost definite în program, pentru ca
funcția să poată calcula corect deplasamentul elementelor față de adresa
de început a tabloului. Pentru prima dimensiune eventual funcția poate
primi ca parametru o valoare mai mică, dacă se dorește doar prelucrarea
unei părți de tablou.
-- pentru prelucrarea fiecărui element dintr-un tablou bidimensional
se folosesc două cicluri încuibate: ciclul din exterior prelucrează
fiecare linie a tabloului, iar în cadrul fiecărei iterații, ciclul interior
prelucrează fiecare element al liniei.
Marius Minea
Last modified: Sun Mar 5 17:38:25 EET 2006