Noțiuni de bază -definiție, declarare, selectare, reprezentare în memorie și
prezentarea modului în care se realizează citirea, afișarea și parcurgerea unei matrice.
Noțiuni de bază
Definiție
Tipul tablou - este o colecție de date omogenă, formată dintr-un număr fix de componente, numite elemente. Matricea este un tablou bidimensional.
Caracteristici:
- elemente de același tip
- număr fix de elemente
- memorare în zone contigue
- structură bidimensională (2 dimensiuni).
În figura din stânga jos este o matrice care are n linii și pe fiecare linie, m elemente, iar în dreapta este reprezentarea matematică a matricei.
Declarare
<tip_elemente> <nume_matrice> [<dim1>] [<dim2>]; - exemplu: int a[4][3];
- se declară o matrice cu 4 linii și 3 coloane, cu elemente de tip întreg
- în C/C++ numerotarea începe de la 0, vor fi deci:
» 4 linii numerotate de la 0 la 3
» 3 coloane numerotate de la 0 la 2
-numărul de elemente este dim1 * dim2, deci pentru matricea din exemplu sunt 4 * 3 = 12 elemente.
Selectare
< nume_matrice > [<dim1>] [<dim2>] - pentru selectarea/ accesarea unui element se indică numele matricei urmat de cei doi indici care precizează poziția pe linie respectiv pe coloană a elementului.
exemplu: a [2] [1] selectează elementul din matricea a, de pe linia cu indice 2 și coloana cu indice 1
- elementul se află:
» pe a 3-a linie (prima are indice 0 !!!)
» pe a 2-a coloană (prima are indice 0 !!!)
Reprezentare în memorie
-în C/C++ fiecare variabilă are asociată o anumită adresă în memorie şi ocupă o anumită lungime, măsurată în octeţi.
-standardul C impune pentru tablou să fie memorat într-o zonă contiguă de memorie.
- dacă declarăm o matrice de forma: tip tab[dim1][dim2]; dimensiunea ocupată în memorie va fi sizeof(tip)*dim1*dim2.
- pentru exemplul dat, int a[4][3]; dimensiunea necesară este 4 * 4 * 3 = 48 de octeți pentru că în general tipul int e memorat pe 4 octeți
- exemplu: int a[5][7]; se declară o matrice cu 5 linii și 7 coloane, dar la momentul execuției utilizăm doar n linii și m coloane unde n este 3 și m este 2 asta însemnă că se lucrează efectiv doar cu 3 linii și 2 coloane din cele 5 linii și 7 coloane și în plus se utilizează doar 6 ( = 3 * 2 ) elemente în loc de 35 ( = 5 * 7 ) elemente câte sunt alocate.
- dacă matricea efectivă cu care se lucrează are elementele: care teoretic, apar memorate în matricea declarată astfel:
- practic însă, în memorie, matricea va fi reprezentată în forma:
Citire, Afișare, Parcurgere
01
Citire
citirea unei matrice presupune citirea dimensiunii efective (numărul de linii și numărul de coloane) și citirea valorilor elementelor ei
cout <<" Dati numarul de linii ";
cin >> n;
cout <<" Dati numarul de coloane ";
cin >> m;
for ( i = 0; i < n; i ++ )
{
for ( j = 0; j < m; j ++ )
{
cout<<"a["<< i<<"] ["<< j<< "]=";
cin>>a[i][j];
}
}
02
Afișare
afișarea unei matrice presupune afișarea valorilor elementelor ei
cout<<" Matricea are elementele:";
for ( i = 0; i < n; i ++ )
{
for ( j = 0; j < m; j ++ )
cout << a[i] [j] << " ";
cout << ’ \n ’;
}
03
Parcurgere
parcurgerea sau traversarea unei matrice/ a unei colecții presupune accesarea elementelor, pentru realizarea unei prelucrări
în exemplu se parcurge o matrice pentru a calcula suma tuturor elementelor pare
s = 0;
for ( i = 0; i < n; i ++ )
for ( j = 0; j < m; j ++ )
if ( a[i] [j] % 2 == 0 )
s = s + a[i] [j];
cout<<" Suma elementelor pare este: "<< s;
ALGORITMI DE BAZĂ
Algoritmii de bază se referă la operațiile de modificare a unei colecții de date (adică inserare și ștergere) și
la operațiile matematice de bază, adunarea și înmulțirea matricilor.
Modificare
Modificarea unei matrice se poate realiza prin inserare (inserare de linie și/sau coloană) sau prin ștergere (ștergere de linie și/sau coloană)
INSERARE
Inserare linie
Fie a o matrice cu n linii și m coloane. Pentru a insera o linie pe
poziția p, este necesară mutarea elementelor astfel încât linia p
să fie eliberată.
De fapt se adaugă o linie după ultima linie din matrice și elemente-
le se mută (practic, se copiază) tot cu câte o linie mai jos, elibe-
rându-se linia p.
Dacă această operație se realizează prin copierea elementelor de pe
linia p, pe linia p+1, atunci se pierd elementele de pe linia p+1.
Aceste elemente ar fi trebuit înainte copiate pe linia p+2 (pentru
a nu se pierde), iar elementele de pe linia p+2 ar fi trebuit copia-
te pe linia p+3 și tot așa.
De aceea copierea elementelor începe de la ultima linie.
In C/C++ pentru o matrice cu n linii numerotate de la 0, ultima
linie este linia n-1. Toate elementele de pe ultima linie, linia
n-1 se vor copia pe linia n, mutându-se astfel cu o linie mai jos,
printr-o instrucțiune de forma:
for (j = 0; j < m; j++ )
a[n] [j] = a[n-1] [j];
Astfel, se eliberează ultima linie (n-1) pe care se pot copia acum
elementele liniei anterioare, linia n-2, printr-o instrucțiune de
forma:
for (j = 0; j < m; j++ )
a[n-1] [j] = a[n-2] [j];
Astfel se eliberează linia n-2 pe care se pot copia elementele li-
niei n-3 și tot așa se repetă procesul de jos în sus până când se
copiază pe linia p+1 (eliberată) elementele liniei p, printr-o
instrucțiune de forma:
for ( j = 0; j < m; j++ )
a[p+1] [j] = a[p] [j];
De aici, se observă necesitatea utilizării a două instrucțiuni re-
petitive for, pentru a realiza copierea tuturor elementelor înce-
pând de la ultima linie n-1 până la linia dorită p.
for (i = n-1; i > = p; i-- )
for ( j = 0; j < m; j++)
a[i+1] [j] = a[i] [j];
După realizarea copierii elementelor se eliberează linia p, pe care
se pot seta valori noi (preluate dintr-un vector, dintr-o altă linie
a unei matrici sau citite).
Întotdeauna după inserarea unei linii, valoarea variabilei ca-
re memorează numărul de linii al matricei trebuie să crească.
În video-ul următor sunt prezentate acțiunile realizate la inserarea
unei linii intr-o matrice.
Inserare coloană
Fie a o matrice cu n linii și m coloane. În mod asemănător se reali-
zează și operația de inserare a unei coloane într-o matrice, pe po-
ziția k. În acest caz este necesar să fie copiate toate elementele,
de pe fiecare coloană începând de la ultima până la coloana de indi-
ce k, cu o poziție mai la dreapta.
Pentru copierea elementelor de pe ultima coloană cu o poziție mai
spre dreapta instrucțiunile necesare sunt:
for (i = 0; i < n; i++ )
a[i] [m] = a[i] [m-1];
Pentru a elibera coloana k copierea se va face în forma:
for ( i = 0; i < n; i++ )
a[i] [k+1] = a[i] [k];
Și pentru a repeta copierea de la ultima coloană până la coloana k
se folosește:
for (j = m-1; j > = k; j-- )
for ( i = 0; i < n; i++)
a[i] [j+1] = a[i] [j];
Se observă că matricea este parcursă pe coloane NU pe linii.
După realizarea copierii elementelor se eliberează coloana k, pe ca-
re se pot seta valori noi (preluate dintr-un vector, dintr-o altă
linie a unei matrici sau citite).
for ( i = 0; i < n; i++)
cin >> a[i] [k];
Și întotdeauna după inserarea unei coloane, valoarea variabilei care
memorează numărul de coloane al matricei trebuie să crească.
Adică: m++;
ȘTERGERE
Ștergere linie
Fie a o matrice cu n linii și m coloane, în care se șterge linia de
indice q. Teoretic se va șterge linia q, practic NU se poate reali-
za această operație.
De fapt elementele de pe linia q+1 se vor copia peste cele de pe
linia q, și astfel linia q va părea ștearsă. Pentru aceasta scriem:
for (j = 0; j < m; j++ )
a[q] [j] = a[q+1] [j];
Dar elementele de pe linia q+1 vor apărea de două ori în matrice.
O dată, cele originale, de pe linia q+1 și încă o dată cele copiate
de pe linia q. Deci este necesară apoi ștergerea liniei q+1 și se
va realiza prin copierea peste elementele din linia q+1 a celor din
linia q+2, astfel:
for (j = 0; j < m; j++ )
a[q+1] [j] = a[q+2] [j];
Repetăm procedeul pentru toate liniile rămase, până cand ultima li-
nie, n-1 se va copia peste penultima linie n-2.
for (j = 0; j < m; j++ )
a[n-2] [j] = a[n-1] [j];
De aici se observă necesitatea utilizării a două instrucțiuni repe-
titive for, pentru a realiza copierea tuturor elementelor începând
de la linia q până la ultima linie n-1, copierea elementelor începe de
la linia care trebuie ștearsă. for (i = q; i < =n-2; i++ ) //se poate scrie și i<n-1
for ( j = 0; j < m; j++)
a[i] [j] = a[i+1] [j];
În acest moment elementele de pe ultima linie apar de 2 ori. O dată,
pe linia n-2 (după copiere) și încă o dată pe linia n-1 (unde erau
în matrice). După ștergerea liniei valoarea variabilei care memorează
numărul de linii al matricei trebuie să scadă,
adică: m--;
Astfel se realizează ștergerea efectivă prin renunțarea la ultima
linie, linia n-1, deoarece elementele ei se află deja copiate pe
linia n-2, linia anterioară.
În video-ul următor sunt prezentate acțiunile realizate la șterge-
rea unei linii dintr-o matrice.
Ștergere coloană
Fie a o matrice cu n linii și m coloane. În mod asemănător se reali-
zează și operația de ștergere a unei coloane într-o matrice, coloan-
na de pe poziția r. În acest caz este necesară copierea elementelor
de pe coloana r cu o poziție mai la stânga, apoi de pe fiecare co-
loană începând de la cea de indice r+1 până la ultima coloană se fa-
ce copierea elementelor cu o poziție mai la stânga.
Instrucțiunile necesare pentru ștergerea elementelor de pe coloana
de indice r, de fapt copierea elementelor de pe coloana de indice
r+1 cu o poziție mai spre stânga sunt:
for (i = 0; i < n; i++ )
a[i] [r] = a[i] [r+1];
Copierea ultimei coloane, coloana m-1 peste coloana m-2 se va face
în forma:
for ( i = 0; i < n; i++ )
a[i] [m-2] = a[i] [m-1];
Și pentru a repeta copierea de la coloana r până la ultima coloană
sunt necesare instrucțiunile:
for (j = r; j < =m-2; j-- ) //se poate scrie și i<m-1
for ( i = 0; i < n; i++)
a[i] [j] = a[i] [j+1];
Se observă că matricea este parcursă pe coloane NU pe linii.
După realizarea copierii tuturor elementelor se pierde coloana r.
Întotdeauna după ștergerea unei coloane, valoarea variabilei care
memorează numărul de coloane al matricei trebuie să scadă.
Adică: m--;
ATENȚIE
la inserare copierea începe de la ultima linie/coloană care se copiază pe următoarea
se repetă până la indicele liniei/ coloanei pe care este cerută inserarea
la ștergere, copierea începe de la linia/coloana aflata imediat după cea care trebuie ștearsă, care se copiază pe anterioara
se repetă până la ultima linie/coloană
dupa inserare de linie/coloană valoarea variabilei care memorează numărul de linii/coloane crește
dupa ștergere de linie/coloană valoarea variabilei care memorează numărul de linii/coloane scade
Operații matematice
01
Suma a două matrici
Suma a două matrici A+B este definită doar dacă matricile au aceleași dimensiuni (adică același număr de linii și de coloane).
matricea a are: n1 linii și m1 coloane
matricea b are: n2 linii și m2 coloane
matricea ra are: nra linii și mra coloane - matricea rezultat/sumă
if ( n1 != n2 || m1 != m2 )
cout<<"Matricile NU se pot aduna";
else
{
for ( i = 0; i < n1; i++ )
{
for ( j = 0; j < m1; j++ )
ra[i][j] = a[i][j] + b[i][j];
}
nra = n1; mra = m1;
}
Video-ul următor prezintă operațiile care se execută pentru adunarea a două matrici.
02
Produsul a două matrici
Produsul a două matrici A x B, este definit doar dacă numărul de coloane al matricei A este egal cu numărul de linii al matricei B.
Matricea rezultat va avea același număr de linii ca și matricea A și același număr de coloane ca și matricea B.
matricea a are: n1 linii și m1 coloane
matricea b are: n2 linii și m2 coloane
matricea r are: nr linii și mr coloane - matricea rezultat/produs
if( m1 != n2 ) cout<<„Matricile Nu se pot inmulti";
else
{
for ( i = 0; i < n1; i++)
for ( j = 0; j < m2; j++)
{
r[i][j] = 0;
for ( k = 0; k < m1; k++)
r[i][j] = r[i][j] + a[i][k] * b[k][j];
}
nr = n1; mr = m2;
}
Video-ul următor prezintă operațiile care se execută pentru înmulțirea a 2 matrici.
APLICAȚII
Probleme cu matrici extrase din subiectele furnizate la examenul de Bacalaureat,
model, simulare, sesiunea specială, sesiunea iulie, sesiunea august, anii 2015-2017.
Subiecte Bacalaureat sesiuni anul 2017
SIMULARE 2017
SII.5
Rezolvare
II 5.
int a[20][20],i,j,n;
cin >> n;
// initializare
for ( i = 0; i < n; i++)
{ a[0][i] = n; // prima linie
a[i][n-1] = n-i; // ultima coloana
}
// constructie rest matrice
for ( i = 1; i < n; i++)
for ( j = n-2; j >= 0; j--)
a[i][j] = a[i][j+1] + a[i-1][j];
// afisare matrice
for ( i = 0; i < n; i++)
{ for ( j = 0; j < n; j++)
cout << a[i][j] << ' ';
cout << '\n'; // sau cout<< endl;
} // pentru trecere la rand nou
SESIUNE SPECIALĂ 2017 - V3
SII.4
Rezolvare
V3 II 4.
se observă că elementele aflate în zona de nord, în partea
superioară a matricei, cuprinse între cele două diagonale
trebuie să primească valoarea a iar celelalte b pentru a
preciza elementele de deasupra diagonalei principale e necesar
ca i < j (cu i = j sunt elementele de pe diagonală), iar
pentru cele aflate deasupra diagonalei secundare j < n-i-1
(cu j = n-1-i sunt elementele de pe diagonala secundară)
for ( i = 0; i < 9; i++)
for ( j = 0; j < 9; j++)
if (i < j && j < n-i-1)
a[i][j] = 'a';
else
a[i][j] = 'b';
SESIUNE IULIE 2017 - V4
SII.5
Rezolvare
V4 II.5
int a[50][50],i,j,n,m, val;
cin >> n >> m;
// citire elemente matrice
for ( i = 0; i < n; i++)
for ( j = 0; j < n; j++)
cin >> a[i][j];
val = a[n-1][m-1];
for ( j = 0; j < m; j++)
{ a[0][j] = val; // prima linie
a[n-1][j] = val; // ultima linie
}
for ( i = 1; i < n-1; i++) // primul si ultimul element sunt
{ // deja puse cu liniile
a[i][0] = val; // prima coloana
a[i][n-1] = val; // ultima coloana
}
// afisare matrice
for ( i = 0; i < n; i++)
{ for ( j = 0; j < m; j++)
cout << a[i][j]<<' ';
cout << '\n'; // sau cout << endl;
} // pentru trecere la rand nou
SESIUNE IULIE 2017 REZERVĂ - V5
SII.5
Rezolvare
V5 II 5.
int a[50][50],n,m,i,j,mini=-1,minf=-1,pozi, pozf;
cin >> m >> n;
//citire elemente matrice
for ( i = 0; i < n; i++)
for ( j = 0; j < n; j++)
cin >> a[i][j];
for ( i = 0; i < m; i++)
{
if ( a[i][0] < mini ) // determinare min de pe prima coloana
{ mini = a[i][0];
pozi = i;
}
if ( a[i][n-1] < minf ) // determinare min de pe ultima coloana
{ minf = a[i][n-1];
pozf = i;
}
}
//interschimbare elemente
a[pozi][0] = minf; a[pozf][0] = mini;
//afisare matrice
for ( i = 0; i < m; i++)
{ for ( j = 0; j < n; j++)
cout << a[i][j] << ' ';
cout << '\n'; // sau cout << endl;
} // pentru trecere la rand nou
SESIUNE AUGUST 2017 - V7
SII.5
- se copiaza fiecare element de pe linia curenta pe urmatoarea
- creste numarul de linii prin inserare
-la adunare se pun în s toate elementele din matrice de pe
coloana j, deci și elementul aflat pe linia p (care este de
fapt dublura elementului care s-a mutat pe linia p+1), de
aceea el trebuie scăzut
-ATENTIE !!! s este declarat float pentru a se realizeaza corect
impartire reala NU ÎNTREAGĂ !!!
-împărțirea se face la n-1 NU la n deoarece n a crescut dupa
inserarea liniei deci sunt n-1 elemente din matricea inițială
Rezolvare
V7 II 5.
float a[51][51], s;
int i,j,n,p;
cin >> n;
// citire elemente matrice
for ( i = 0; i < n; i++)
for ( j = 0; j < n; j++)
cin >> a[i][j];
p = n / 2; // p va fi numarul liniei ce trebuie inserate
//eliberarea liniei p
for ( i = n-1; i >= p; i--)
for ( j = 0; j < n; j++)
{ a[i+1][j] = a[i][j]; }
n++;
// setarea elementelor de pe linia inserata conform cerintei
for ( j = 0; j < n; j++)
{ s = 0;
for ( i = 0; i < n; i++)
s = s + a[i][j];
s = s - a[p][j];
a[p][j] = s / (n-1);
}
// afisare matrice
for ( i = 0; i < n; i++)
{ for ( j = 0; j < n; j++)
cout << a[i][j] << ' ';
cout << '\n'; // sau cout << endl;
} // pentru trecere la rand nou
Subiecte Bacalaureat sesiuni anul 2016
MODEL 2016
SII.4
- se observa ca pentru linii pare si coloane pare sau linii impare
si coloane impare, elementul are valoare 0
- cum numerotarea incepe de la 1, pentru elementele nenule suma
liniei cu coloana este exact valoarea necesara
- se specifică faptul că inițial toate elementele au valoarea 0,
deci este necesară atribuirea valorii doar pentru celelalte
- adica trebuie verificata fie conditia:
V1 - linia si coloana au parități diferite, fie
V2 - suma liniei cu coloana sa fie un număr impar
Rezolvare
SII 4.
V1 - linie si coloana cu paritate diferita
for ( i = 1; i <= 5; i++ )
for ( j = 1; j <= 5; j++ )
if ( i % 2 != j % 2 )
a[i][j] = i + j;
V2 - linia si coloana au suma impara
for ( i = 1; i <= 5; i++ )
for ( j = 1; j <= 5; j++ )
if ( ( i + j ) % 2 != 0)
a[i][j] = i + j;
SIMULARE 2016
SII.4
- se observa ca pentru linii pare si coloane pare sau linii impare
si coloane impare elementul are valoarea !
- adica trebuie verificata fie conditia
V1 - linia si coloana au aceeasi paritate, fie
V2 - suma liniei cu coloana este numar par (suma de pare, respec-
tiv suma de impare au ca rezultat numar par)
Rezolvare
SII.4
V1 - linie si coloana cu aceeasi paritate, caracter !
for ( i = 0; i < 5; i++ )
for ( j = 0; j < 5; j++ )
if (i%2 == j%2)
a[i][j] = '!';
else
a[i][j] = '?';
V2 - linia si coloana au suma para, caracter ! altfel ?
for ( i = 0; i < 5; i++ )
for ( j = 0; j < 5; j++ )
if ( ( i + j ) % 2 == 0 )
a[i][j] = '!';
else
a[i][j] = '?';
SESIUNE SPECIALĂ 2016 -V4
SII.1
Rezolvare
V4 SII.1
d.) e raspunsul corect
nici una din celelalte variante NU are sintaxa corecta
SESIUNE IULIE 2016 - V10
SII.5
Rezolvare
V10 SII 5.
int a[100][100],i,j,n;
cin >> n;
// initializare
for ( i = 0; i < n; i++ )
{ a[i][0] = i+1; // prima coloana
a[n-1][i] = n; // ultima linie
}
// constructie rest matrice
for ( i = n-2; i >= 0; i-- )
for ( j = 1; j < n; j++ )
a[i][j] = a[i][j-1] + a[i+1][j-1];
// afisare matrice
for ( i = 0; i < n; i++ )
{ for ( j = 0; j < n; j++ )
cout << a[i][j] << ' ';
cout << '\n'; // sau cout << endl;
} // pentru trecere la rand nou
SESIUNE AUGUST 2016 - V9
SII.5
- primul si ultimul element sunt deja verificate pe linie
- daca s-a gasit deja elementul (exista=1) nu mai este necesara
cautarea lui
- sau se poate scrie doar if (exista)
Rezolvare
V9 SII 5.
int a[100][100],i,j,n,m, x, exista=0;
cin >> n >> m;
// citire elemente matrice
for ( i = 0; i < n; i++ )
for ( j = 0; j < n; j++ )
cin >> a[i][j];
cin >> x;
// cautare x pe contur
for ( j = 0; j < m && exista == 0; j++ )
{ if ( a[0][j] == x ) exista = 1; // prima linie
if ( a[n-1][j] == x ) exista = 1; // ultima linie
}
for ( i = 1; i < n-1 && exista == 0; i++ )
{ if ( a[i][0] == x ) exita = 1; // prima coloana
if ( a[i][n-1] == x ) exista = 1; // ultima coloana
}
if ( exista == 1 )
cout << "DA";
else
cout << "NU";
Subiecte Bacalaureat sesiuni anul 2015
MODEL 2015
SII.5
Rezolvare
SII 5.
int a[20][20],i,j,n,m,x;
cin >> m >> n;
x = 1;
// constructie tablou
for ( i = m-1; i >= 0; i-- )
{ for ( j = n-1; j >= 0; j-- )
{ a[i][j] = x;
x = x + 2;
if ( x % 3 == 0 )
x = x + 2;
}
}
//afisare matrice
for ( i = 0; i < n; i++ )
{ for ( j = 0; j < n; j++ )
cout << a[i][j] << ' ';
cout << '\n'; // sau cout << endl;
} //pentru trecere la rand nou
SIMULARE 2015
SII.5
- se observa ca prima valoare de pe linia i este 2*i+1
dacă numerotarea liniilor începe de la 0
Rezolvare
SII 5.
int a[50][50],i,j,n,m;
cin >> m >> n;
// constructie tablou
for ( i = 0; i < m; i++ )
{ a[i][0] = 2 * i + 1; // primul element
for ( j = 1; j < n; j++ )
a[i][j] = a[i][j-1] + 1;
// afisare matrice
for ( i = 0; i < n; i++ )
{ for ( j = 0; j < n; j++ )
cout << a[i][j] << ' ';
cout << '\n'; // sau cout << endl;
} // pentru trecere la rand nou
SESIUNE SPECIALĂ 2015 -V5
SII.4
- se observa ca pentru linii pare si coloane pare sau linii impare
si coloane impare, elementul are valoare 1
- cum se specifică faptul că inițial toate elementele au valoarea
0 e necesară doar atribuirea unei valori pentru elementele nenule
- adica trebuie verificata fie conditia
V1 - linia si coloana au aceeași paritate, fie
V2 - suma liniei cu coloana este un număr par
Rezolvare
V5 SII 4.
V1 - linia si coloana au aceeași paritate
for ( i = 1; i <= 5; i++ )
for ( j = 1; j <= 5; j++ )
if ( i % 2 == j % 2 )
a[i][j] = 1;
V2 - linia si coloana au suma para
for ( i = 1; i <= 5; i++ )
for ( j = 1; j <= 5; j++ )
if ( ( i + j ) % 2 == 0 )
a[i][j] = 1;
SESIUNE IULIE 2015 -V9
SII.5
Rezolvare
V9 SII 5.
int a[20][20],i,j,n,x;
cin >> n;
// citirea elementelor de pe prima linie
for ( i = 0; i < n; i++ )
cin >> a[0][i];
// constructie rest matrice
for ( i = 1; i < n; i++ )
{ for ( j = n-1; j > 0; j-- )
a[i][j] = a[i-1][j-1];
a[i][0] = a[i-1][n-1];
// afisare matrice
for ( i = 0; i < n; i++ )
{ for ( j = 0; j < n; j++ )
cout << a[i][j] << ' ';
cout << '\n'; // sau cout << endl;
} // pentru trecere la rand nou
SESIUNE AUGUST 2015- V2
SII.4
- se observă că valorile din matrice sunt numerele naturale de la
1 la 25 așezate începând de la prima la ultima linie, iar în ca-
drul liniei de la prima la ultima coloană
V1 - se inițializează elementele de pe prima linie cu valoarea
coloanei și apoi la început de linie se continuă cu numărul care
urmează după ultimul de pe linia anterioară si în cadrul liniei
se continuă cu valoarea care urmează după elementul anterior
V2 - se calculează numărul de elemente setate deja și se continuă
cu valoarea următoare pe fiecare linie i sunt n elemente (5 în
cazul nostru), deci pentru fiecare element, numărul curent va fi
(i-1) liniile deja setate* 5 (număr de elemente pe linie) + j
numărul de elemente de pe linia curentă
Rezolvare
V2 SII 4.
V1 - cu calcularea valorii la începutul fiecărei linii
for ( i = 1; i <= 5; i++ )
for ( j = 1; j <= 5; j++ )
if (i == 0)
a[i][j] = j;
else
if ( j == 0 )
a[i][j] = a[i-1][5] + 1;
else
a[i][j] = a[i][j-1] + 1;
V2 - cu calcularea valorii pentru fiecare element
for ( i = 1; i <= 5; i++ )
for ( j = 1; j <= 5; j++ )
a[i][j] = ( i - 1 ) * 5 + j;