Subiectul I, cerința 1
Tablouri bidimensionale
Cele două forme de declarare, accesul la un element și relațiile dintre indici față de cele două diagonale, cu o problemă rezolvată pe sumele din cele trei zone.
Un tablou bidimensional este o structură de date omogenă, ale cărei elemente sunt de același tip și sunt așezate pe linii și coloane. Un element se identifică prin doi indici: indicele liniei și indicele coloanei pe care se află.
Declararea unei variabile de tip tablou bidimensional
Prima declarare pune în evidență alocarea memoriei. Se precizează tipul elementelor și
numărul maxim de linii și de coloane. Pentru un tablou cu 100 de linii și 100 de coloane se
rezervă 10 000 de locații de tip int, adică 40 000 de octeți, așezați succesiv în memorie,
linie după linie. Dimensiunile din declarare sunt constante și se stabilesc înainte de
executarea programului; ele reprezintă spațiul maxim, nu numărul de elemente folosite efectiv.
int a[100][100];
A doua declarare pune în evidență inițializarea cu date. Valorile se scriu între acolade,
grupate câte o acoladă pentru fiecare linie a tabloului. Tabloul b are 3 linii și 4 coloane,
iar elementele lui primesc valorile din listă în ordinea liniilor.
int b[3][4] = { {1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12} };
Accesul la un element
Un element al tabloului se accesează scriind numele tabloului urmat de cei doi indici, fiecare
între paranteze drepte: a[i][j] desemnează elementul aflat la intersecția liniei i cu
coloana j. În C++ indicii încep de la 0, deci pentru un tablou cu n linii și m coloane
indicele liniei ia valori de la 0 la n−1, iar cel al coloanei de la 0 la m−1.
Scrierea a[i][j] se folosește atât pentru citirea valorii elementului, cât și în stânga
atribuirii, pentru modificarea lui:
cin >> a[2][3]; // se citește elementul de pe linia 2, coloana 3
a[0][0] = a[1][1] + 5; // se modifică elementul de pe linia 0, coloana 0
Poziția unui element față de cele două diagonale
Diagonalele sunt definite numai pentru tablourile pătratice, la care numărul de linii este
egal cu numărul de coloane. Se notează cu n această valoare comună, iar indicii iau valori
de la 0 la n−1.
Diagonala principală
Diagonala principală unește elementul din colțul din stânga sus cu cel din colțul din dreapta jos.
Poziția elementului a[i][j] | Relația dintre indici |
|---|---|
| pe diagonala principală | i == j |
| în stânga diagonalei principale | j < i |
| în dreapta diagonalei principale | j > i |
Pentru un tablou cu 4 linii și 4 coloane, zonele sunt următoarele, unde D marchează elementele de pe diagonală, S pe cele din stânga ei și R pe cele din dreapta ei:
| coloana 0 | coloana 1 | coloana 2 | coloana 3 | |
|---|---|---|---|---|
| linia 0 | D | R | R | R |
| linia 1 | S | D | R | R |
| linia 2 | S | S | D | R |
| linia 3 | S | S | S | D |
Diagonala secundară
Diagonala secundară unește elementul din colțul din dreapta sus cu cel din colțul din stânga
jos. Pe linia i, elementul de pe această diagonală se află pe coloana n−1−i, de unde rezultă
relația dintre indici.
Poziția elementului a[i][j] | Relația dintre indici |
|---|---|
| pe diagonala secundară | i + j == n - 1 |
| în stânga diagonalei secundare | i + j < n - 1 |
| în dreapta diagonalei secundare | i + j > n - 1 |
Pentru același tablou cu 4 linii și 4 coloane:
| coloana 0 | coloana 1 | coloana 2 | coloana 3 | |
|---|---|---|---|---|
| linia 0 | S | S | S | D |
| linia 1 | S | S | D | R |
| linia 2 | S | D | R | R |
| linia 3 | D | R | R | R |
Problema propusă
Enunț. Se citesc de la tastatură un număr natural n (2 ≤ n ≤ 20) și elementele unui tablou bidimensional cu n linii și n coloane, numere întregi. Să se afișeze suma elementelor situate pe diagonala principală, suma elementelor situate strict în stânga ei și suma elementelor situate strict în dreapta ei, separate prin câte un spațiu.
Exemplu: pentru n = 3 și tabloul
1 2 3
4 5 6
7 8 9
se afișează 15 19 11.
Descrierea soluției în limbaj natural. Se citesc dimensiunea n și elementele tabloului, linie cu linie. Se folosesc trei variabile pentru cele trei sume, inițializate cu 0.
Se parcurge tabloul cu doi indici, i pentru linii și j pentru coloane, ambii luând valori
de la 0 la n−1, astfel încât fiecare element să fie vizitat exact o dată. Pentru elementul
curent se compară cei doi indici:
- dacă sunt egali, elementul se află pe diagonala principală, iar valoarea lui se adună la prima sumă;
- dacă indicele coloanei este mai mic decât cel al liniei, elementul se află în stânga diagonalei, iar valoarea lui se adună la a doua sumă;
- în caz contrar, elementul se află în dreapta diagonalei, iar valoarea lui se adună la a treia sumă.
Cele trei condiții sunt exclusive și acoperă toate pozițiile posibile, deci fiecare element intră în exact una dintre sume. La sfârșit se afișează cele trei valori.
Implementarea soluției.
#include <iostream>
using namespace std;
int a[20][20];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
int sumaD = 0, sumaS = 0, sumaR = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (i == j)
sumaD = sumaD + a[i][j];
else if (j < i)
sumaS = sumaS + a[i][j];
else
sumaR = sumaR + a[i][j];
cout << sumaD << " " << sumaS << " " << sumaR;
return 0;
}
Verificarea pe exemplul din enunț.
| Zona | Elementele | Suma |
|---|---|---|
| pe diagonala principală | 1, 5, 9 | 15 |
| în stânga diagonalei principale | 4, 7, 8 | 19 |
| în dreapta diagonalei principale | 2, 3, 6 | 11 |
Cele trei sume adunate dau 45, adică suma tuturor elementelor tabloului.
Rezolvarea se poate citi pe educamp.ro, la adresa de mai sus.