C++ – Tablouri bidimensionale

C++ – Two-Dimensional Arrays

Capitol cu teorie, exerciții rezolvate (cu using namespace std;) și test de 10 întrebări. Biblioteci: <iostream>, <cmath>.

Chapter with theory, worked exercises (using using namespace std;) and a 10-question quiz. Headers: <iostream>, <cmath>.

Introducere

Un tablou bidimensional (matrice) este o colecție de elemente dispuse pe linii și coloane. În C++ (fără STL), îl poți modela ca tip v[LINII][COLOANE]. Vei învăța citirea, afișarea, procesarea pe linii/coloane, transpusa, urmele, norme (Frobenius) și operații precum înmulțirea a două matrice.

În rezolvări apare explicit using namespace std;, conform cerinței.

Introduction

A two-dimensional array (matrix) stores items in rows and columns. In C++ (without STL), you can model it as type a[ROWS][COLS]. You’ll learn input, output, row/column processing, transpose, traces, norms (Frobenius) and operations like matrix multiplication.

Solutions explicitly include using namespace std; as requested.

Teorie

Declarare și inițializare

#include <iostream>
#include <cmath>
using namespace std;

int main() {
  const int N=3, M=4;
  int a[N][M];                     // neinițializat
  int b[2][3] = {{1,2,3},{4,5,6}}; // inițializat
  cout << b[1][2] << '\n';        // 6
}

Citire & afișare (iostream)

#include <iostream>
using namespace std;

int main() {
  int n,m; cin >> n >> m;
  int a[100][100];
  for(int i=0;i<n;++i)
    for(int j=0;j<m;++j)
      cin >> a[i][j];

  for(int i=0;i<n;++i){
    for(int j=0;j<m;++j) cout << a[i][j] << ' ';
    cout << '\n';
  }
}

Operații de bază

  • Suma pe linie/coloană: iterezi j sau i.
  • Transpusă: t[j][i] = a[i][j].
  • Urma (trace): sum a[i][i] pentru matrice pătrată.
  • Norma Frobenius: sqrt(sum a[i][j]^2) (necesită <cmath>).
  • Înmulțire: c[i][k] += a[i][j]*b[j][k].

Exemplu: norma Frobenius (cmath)

#include <iostream>
#include <cmath>
using namespace std;

int main() {
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  long long s2=0;
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) s2 += 1LL*a[i][j]*a[i][j];
  cout << sqrt((double)s2) << '\n';
}

Theory

Declaration & initialization

#include <iostream>
#include <cmath>
using namespace std;

int main() {
  const int R=3, C=4;
  int a[R][C];
  int b[2][3] = {{1,2,3},{4,5,6}};
  cout << b[1][2] << '\n'; // 6
}

Input & output (iostream)

#include <iostream>
using namespace std;

int main() {
  int n,m; cin >> n >> m;
  int a[100][100];
  for(int i=0;i<n;++i)
    for(int j=0;j<m;++j)
      cin >> a[i][j];

  for(int i=0;i<n;++i){
    for(int j=0;j<m;++j) cout << a[i][j] << ' ';
    cout << '\n';
  }
}

Core operations

  • Row/column sum: iterate j or i.
  • Transpose: t[j][i] = a[i][j].
  • Trace: sum a[i][i] for square matrices.
  • Frobenius norm: sqrt(sum a[i][j]^2) (needs <cmath>).
  • Multiplication: c[i][k] += a[i][j]*b[j][k].

Example: Frobenius norm (cmath)

#include <iostream>
#include <cmath>
using namespace std;

int main() {
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  long long s2=0;
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) s2 += 1LL*a[i][j]*a[i][j];
  cout << sqrt((double)s2) << '\n';
}

Exerciții (rezolvări cu using namespace std;)

1) Suma elementelor pe fiecare linie

Rezolvare
#include <iostream>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  for(int i=0;i<n;++i){
    long long s=0;
    for(int j=0;j<m;++j) s+=a[i][j];
    cout<<"linia "<<i<<": "<<s<<'\n';
  }
}

2) Suma pe coloane

Rezolvare
#include <iostream>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  for(int j=0;j<m;++j){
    long long s=0;
    for(int i=0;i<n;++i) s+=a[i][j];
    cout<<"coloana "<<j<<": "<<s<<'\n';
  }
}

3) Transpusa unei matrice n×m

Rezolvare
#include <iostream>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100], t[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) t[j][i]=a[i][j];
  for(int i=0;i<m;++i){ for(int j=0;j<n;++j) cout<<t[i][j]<<' '; cout<<'\n'; }
}

4) Urma (trace) și suma diagonalei secundare (pătratică)

Rezolvare
#include <iostream>
using namespace std;

int main(){
  int n; cin>>n; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<n;++j) cin>>a[i][j];
  long long tr=0, sec=0;
  for(int i=0;i<n;++i){ tr+=a[i][i]; sec+=a[i][n-1-i]; }
  cout<<"trace="<<tr<<" sec="<<sec<<'\n';
}

5) Înmulțirea a două matrice (n×p) · (p×m)

Rezolvare
#include <iostream>
using namespace std;

int main(){
  int n,p,m; cin>>n>>p>>m;
  int A[100][100], B[100][100], C[100][100]={0};
  for(int i=0;i<n;++i) for(int j=0;j<p;++j) cin>>A[i][j];
  for(int i=0;i<p;++i) for(int j=0;j<m;++j) cin>>B[i][j];
  for(int i=0;i<n;++i)
    for(int k=0;k<m;++k){
      long long s=0;
      for(int j=0;j<p;++j) s+=1LL*A[i][j]*B[j][k];
      C[i][k]=(int)s;
    }
  for(int i=0;i<n;++i){ for(int j=0;j<m;++j) cout<<C[i][j]<<' '; cout<<'\n'; }
}

6) Maxim global și poziția sa (i, j)

Rezolvare
#include <iostream>
#include <climits>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  int mx=INT_MIN, pi=0,pj=0;
  for(int i=0;i<n;++i) for(int j=0;j<m;++j)
    if(a[i][j]>mx){ mx=a[i][j]; pi=i; pj=j; }
  cout<<"max="<<mx<<" la ("<<pi<<","<<pj<<")\n";
}

7) Norma Frobenius (cmath)

Rezolvare
#include <iostream>
#include <cmath>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  long long s2=0;
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) s2 += 1LL*a[i][j]*a[i][j];
  cout<< sqrt((double)s2) <<'\n';
}

Exercises (solutions use using namespace std;)

1) Row sums

Solution
#include <iostream>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  for(int i=0;i<n;++i){
    long long s=0;
    for(int j=0;j<m;++j) s+=a[i][j];
    cout<<"row "<<i<<": "<<s<<'\n';
  }
}

2) Column sums

Solution
#include <iostream>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  for(int j=0;j<m;++j){
    long long s=0;
    for(int i=0;i<n;++i) s+=a[i][j];
    cout<<"col "<<j<<": "<<s<<'\n';
  }
}

3) Transpose

Solution
#include <iostream>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100], t[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) t[j][i]=a[i][j];
  for(int i=0;i<m;++i){ for(int j=0;j<n;++j) cout<<t[i][j]<<' '; cout<<'\n'; }
}

4) Trace & secondary diagonal sum (square)

Solution
#include <iostream>
using namespace std;

int main(){
  int n; cin>>n; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<n;++j) cin>>a[i][j];
  long long tr=0, sec=0;
  for(int i=0;i<n;++i){ tr+=a[i][i]; sec+=a[i][n-1-i]; }
  cout<<"trace="<<tr<<" sec="<<sec<<'\n';
}

5) Matrix multiplication

Solution
#include <iostream>
using namespace std;

int main(){
  int n,p,m; cin>>n>>p>>m;
  int A[100][100], B[100][100], C[100][100]={0};
  for(int i=0;i<n;++i) for(int j=0;j<p;++j) cin>>A[i][j];
  for(int i=0;i<p;++i) for(int j=0;j<m;++j) cin>>B[i][j];
  for(int i=0;i<n;++i)
    for(int k=0;k<m;++k){
      long long s=0;
      for(int j=0;j<p;++j) s+=1LL*A[i][j]*B[j][k];
      C[i][k]=(int)s;
    }
  for(int i=0;i<n;++i){ for(int j=0;j<m;++j) cout<<C[i][j]<<' '; cout<<'\n'; }
}

6) Global maximum and its position

Solution
#include <iostream>
#include <climits>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  int mx=INT_MIN, pi=0,pj=0;
  for(int i=0;i<n;++i) for(int j=0;j<m;++j)
    if(a[i][j]>mx){ mx=a[i][j]; pi=i; pj=j; }
  cout<<"max="<<mx<<" at ("<<pi<<","<<pj<<")\n";
}

7) Frobenius norm (cmath)

Solution
#include <iostream>
#include <cmath>
using namespace std;

int main(){
  int n,m; cin>>n>>m; int a[100][100];
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) cin>>a[i][j];
  long long s2=0;
  for(int i=0;i<n;++i) for(int j=0;j<m;++j) s2 += 1LL*a[i][j]*a[i][j];
  cout<< sqrt((double)s2) <<'\n';
}

Test de evaluare (10 întrebări)

Subiect: tablouri bidimensionale, <iostream>, <cmath>. Bifează varianta corectă.

1) Declararea corectă a unei matrice 3×4 de int este:

2) Citirea corectă a elementelor:

3) Transpusa t a lui a are regula:

4) Urma (trace) este:

5) Norma Frobenius a lui a este:

6) Condiția pentru înmulțire A(n×p) · B(p×m):

7) Formula pentru C = A·B este:

8) Pentru sqrt, pow ai nevoie de:

9) Indexarea corectă a primei coloane este:

10) Afișarea corectă a liniei i:

Quiz (10 questions)

Topic: 2D arrays, <iostream>, <cmath>. Select the correct option.

1) Correct declaration of a 3×4 int matrix:

2) Proper input of elements:

3) Transpose t of a obeys:

4) The trace is:

5) Frobenius norm of a is:

6) Condition for A(n×p) · B(p×m):

7) Formula for C = A·B:

8) Header needed for sqrt, pow:

9) Correct indexing of the first column is:

10) Proper printing of row i: