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.
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.
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
saui
. - 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
ori
. - 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ă.
Quiz (10 questions)
Topic: 2D arrays, <iostream>
, <cmath>
. Select the correct option.