symp

TABLOU BIDIMENSIONAL - Matrice

main1
programare matrice algoritm
prof. Adina Stănculescu
Colegiul Național "Gheorghe Lazăr" Sibiu

GENERALITĂȚI

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.
matrice generala        matrice generala mate

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.
declarare

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 !!!)
         selectare_element

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: reprezentare_matr1care teoretic, apar memorate în matricea declarată astfel: reprezentare_matr2
- practic însă, în memorie, matricea va fi reprezentată în forma: reprezentare_matr3

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;

Contact

Trimite un comentariu sau o sugestie.