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