Sari la conținut
EduCamp
Definitivat2024Teorie15 puncte✓ GRATUIT

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 principalej < i
în dreapta diagonalei principalej > 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 0coloana 1coloana 2coloana 3
linia 0DRRR
linia 1SDRR
linia 2SSDR
linia 3SSSD

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 secundarei + j < n - 1
în dreapta diagonalei secundarei + j > n - 1

Pentru același tablou cu 4 linii și 4 coloane:

coloana 0coloana 1coloana 2coloana 3
linia 0SSSD
linia 1SSDR
linia 2SDRR
linia 3DRRR

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

ZonaElementeleSuma
pe diagonala principală1, 5, 915
în stânga diagonalei principale4, 7, 819
în dreapta diagonalei principale2, 3, 611

Cele trei sume adunate dau 45, adică suma tuturor elementelor tabloului.

Rezolvarea se poate citi pe educamp.ro, la adresa de mai sus.

Actualizat: 28 august 2026