Matrici în C++

- Atestat de Informatică, 2027

8. CODURILE CU SUBMENIU

Acesta este programul complet, structurat printr-un meniu interactiv (folosind o instrucțiune repetitivă do-while și decizională switch). Cu ajutorul acestuia, poți rula și testa fiecare operațiune cu matrici învățată anterior, direct din consola Code::Blocks.

#include <iostream>
#include <climits>   // necesar pentru INT_MIN din optiunea 5

using namespace std;

// --- OPTIUNEA 1 ---
void meniu_initializare() {
    cout << "\n--- 1. Initializare Matrice ---\n";
    int a[3][4]; // Matrice cu dimensiuni fixe (neinitializata)
    
    int b[2][3] = {
        {1, 2, 3},   // linia 0
        {4, 5, 6}    // linia 1
    };
    
    float c[4][4] = {}; // Matrice initializata cu 0
    
    const int N = 3, M = 3;
    int mat[N][M]; // Buna practica: constante pentru dimensiuni
    
    cout << "Matricile au fost declarate in memorie cu succes!\n";
}

// --- OPTIUNEA 2 ---
void meniu_citire_afisare() {
    cout << "\n--- 2. Citire si Afisare ---\n";
    int n, m;
    cout << "Numar linii: "; cin >> n;
    cout << "Numar coloane: "; cin >> m;

    int a[100][100]; // dimensiune maxima
    
    cout << "Introduceti elementele:\n";
    for (int i = 0; i < n; i++) {       
        for (int j = 0; j < m; j++) {   
            cout << "a[" << i << "][" << j << "] = ";
            cin >> a[i][j];
        }
    }

    cout << "\nMatricea:\n";
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << a[i][j] << "\t"; // \t = tab (aliniere)
        }
        cout << "\n"; // rand nou dupa fiecare linie
    }
}

// --- OPTIUNEA 3 ---
void meniu_sume() {
    cout << "\n--- 3. Sume in matrice ---\n";
    int n = 3, m = 3;
    int a[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};

    // Suma tuturor elementelor
    int suma = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            suma += a[i][j];

    // Suma diagonalei principale
    int suma_diag = 0;
    for (int i = 0; i < n; i++)
        suma_diag += a[i][i];

    // Suma liniei k
    int k = 1;
    int suma_linie = 0;
    for (int j = 0; j < m; j++)
        suma_linie += a[k][j];

    cout << "Suma totala: "    << suma       << "\n"; // 45
    cout << "Suma diagonala: " << suma_diag  << "\n"; // 15
    cout << "Suma linie 1: "   << suma_linie << "\n"; // 15
}

// --- OPTIUNEA 4 ---
void meniu_transpusa() {
    cout << "\n--- 4. Transpusa matricii ---\n";
    int n = 2, m = 3;
    int a[2][3] = {{1, 2, 3},
                   {4, 5, 6}};
    int t[3][2];  // transpusa: dimensiunile se inverseaza (m x n)

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            t[j][i] = a[i][j]; // inversam indicii!

    cout << "Matricea originala (2x3):\n";
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";
        cout << "\n";
    }
    cout << "Transpusa (3x2):\n";
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++)
            cout << t[i][j] << " ";
        cout << "\n";
    }
}

// --- OPTIUNEA 5 ---
void meniu_maxim_int_min() {
    cout << "\n--- 5. Maxim cu INT_MIN ---\n";
    int a[3][3] = {{5,12,3}, {8,1,99}, {-4,7,42}};
    int n = 3, m = 3;
    int maxim = INT_MIN;  // cel mai mic int posibil
    int li, lj; // pozitia maximului

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (a[i][j] > maxim) {
                maxim = a[i][j]; // actualizam maximul
                li = i; // retinem linia
                lj = j; // retinem coloana
            }
        }
    }
    cout << "Maximul este: " << maxim << "\n";
    cout << "Pozitia: linia " << li << ", coloana " << lj << "\n";
}

// --- OPTIUNEA 6 ---
void meniu_maxim_a00() {
    cout << "\n--- 6. Maxim cu a[0][0] ---\n";
    int a[3][3] = {{5,12,3}, {8,1,99}, {-4,7,42}};
    int n = 3, m = 3;
    
    int maxim = a[0][0]; // Inițializăm cu primul element
    int li = 0, lj = 0;  // Reținem poziția

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (a[i][j] > maxim) {
                maxim = a[i][j];
                li = i; 
                lj = j; 
            }
        }
    }
    cout << "Maximul este: " << maxim << "\n";
    cout << "Pozitia: linia " << li << ", coloana " << lj << "\n";
}

// --- PROGRAMUL PRINCIPAL ---
int main() {
    int optiune;
    
    do {
        cout << "\n=========== MENIU MATRICI ===========\n";
        cout << "1. Declarare si initializare matrice\n";
        cout << "2. Citire si afisare matrice\n";
        cout << "3. Sume in matrice (totala, diag, linie)\n";
        cout << "4. Afisare transpusa matricii\n";
        cout << "5. Cautare maxim (metoda cu INT_MIN)\n";
        cout << "6. Cautare maxim (metoda cu a[0][0])\n";
        cout << "0. Iesire din program\n";
        cout << "=======================================\n";
        cout << "Alegeti o optiune (0-6): ";
        cin >> optiune;

        switch(optiune) {
            case 1: meniu_initializare(); break;
            case 2: meniu_citire_afisare(); break;
            case 3: meniu_sume(); break;
            case 4: meniu_transpusa(); break;
            case 5: meniu_maxim_int_min(); break;
            case 6: meniu_maxim_a00(); break;
            case 0: cout << "Iesire din program. La revedere!\n"; break;
            default: cout << "Optiune invalida!\n";
        }
    } while (optiune != 0);
    return 0;
}