Clasa a IX-a lecția 13 - 1 feb 2020: Difference between revisions

From Algopedia
Jump to navigationJump to search
 
(No difference)

Latest revision as of 19:46, 31 January 2020

Clasament teme lecțiile 1 - 12

Probleme Olimpiada pe Școală

Clasamente avansați

Avansați Infoarena
Avansați Varena

Clasamente începători

Începători Varena
Începători Infoarena

Lecție

Matrice

Sursă: IQAcademy


Matricele sunt asemănătoare cu vectorii, dar cu două dimensiuni.

Declarare matrice

Matricele se declară similar cu vectorii, însă cu o dimensiune în plus:

int a[100][500];

Primul număr, 100 în cazul nostru, reprezintă numărul de linii al matricei a. Al doilea număr, 500 în exemplul de mai sus, reprezintă numărul de coloane al matricei a, sau numărul de elemente al fiecărei linii. O matrice poate fi privită ca un vector de vectori. În exemplul de mai sus a poate fi privită ca un vector de 100 de elemente. Fiecare element al acestui vector este, la rândul lui, un alt vector, de 500 de elemente. Numărul total de elemente al matricei a este 100 x 500, adică 50000 de elemente întregi.

Citire matrice

Cum citim o matrice? Asemănător cu un vector, vom citi mai întîi numărul de linii și numărul de coloane, apoi elementele. Elementele se citesc, în general, de-a lungul liniilor, fiecare linie fiind citită ca un vector:

...
fscanf(fin, "%d%d", &m, &n);
for (i = 0; i < m; ++i)
  for (j = 0; j < n; ++j)
    fscanf(fin, "%d", &a[i][j]);

Scriere matrice

Scrierea este asemănătoare cu citirea, cu mențiunea să avem grijă să tipărim un '\n' la finalul fiecărei linii:

...
for (i = 0; i < m; ++i) {
  for (j = 0; j < n; ++j)
    fprintf(fout, "%d ", a[i][j]);
  fprintf(fout, "\n");
}

Căutare element în matrice

i = j = 0;
while ((i < m) && (a[i][j] != e)) { // cat timp nu am trecut de ultima linie si numarul pe care suntem nu este cel cautat
  j++; // trecem pe urmatoarea coloana
  if (j >= n) { // daca am trecut de ultima coloana
    i++; // trecem pe urmatoarea linie
    j = 0; // resetam coloana pe zero
  }
}

Transpunere matrice

Se dă o matrice pătrată, să se modifice astfel încît în final elementele ei să fie oglindite față de diagonala principală. Diagonala principală e cea care începe în colțul din stînga-sus și se termină în colțul din dreapta-jos. Această operațiune se mai numește si transpunere.

for ( i = 1; i < n; i++ )
  for ( j = 0; j < i; j++ ) {
    aux = a[i][j];
    a[i][j] = a[j][i];
    a[j][i] = aux;
  }

Aceeași problemă pentru diagonala secundară. Diagonala secundară e cea care începe în colțul din dreapta-sus și se termină în colțul din stînga-jos

for ( i = 0; i < (n - 1); i++ )
  for ( j = 0; j < (n - i); j++ ) {
    aux = a[i][j];
    a[i][j] = a[n - 1 - j][n - 1 - i];
    a[n - 1 - j][n - 1 - i] = aux;
  }

Aplicații

varena - matrix
varena - diagonal
varena - zoomx2
varena - cautare

Pentru cei începători

Am reluat construirea unui vector cu numere prime utilizând ciurul lui Eratostene și am dat ca exemplu de utilitate descompunerea rapidă în factori primi a multor numere.

Temă

varena - matrix
varena - diagonal
varena - zoomx2
varena - cautare

infoarena - cri (Bonus)

În plus pentru începători

infoarena - maxd
infoarena - vase (Opțional)