Cum funcționează
Problema are o particularitate pe care mulți o ratează: datele vin din două surse diferite.
Matricea se citește din fişier cu f >>, iar l1 și l2 de la tastatură cu cin >>. Sunt
fluxuri complet separate și nu se amestecă.
Pentru interschimbarea propriu-zisă: o linie de matrice nu e o singură valoare, ci n valori. Nu
poți scrie a[l1] = a[l2] — trebuie să muți fiecare element, pe rând:
for (int j = 0; j < n; j++) {
double aux = a[l1 - 1][j];
a[l1 - 1][j] = a[l2 - 1][j];
a[l2 - 1][j] = aux;
}
Bucla merge pe j, adică pe coloane, iar indicii de linie (l1 - 1 și l2 - 1) rămân fixați.
Practic aplici interschimbarea clasică prin variabilă auxiliară de n ori, o dată pentru fiecare
coloană.
Variabila aux e obligatorie. Fără ea, prima atribuire ar distruge valoarea pe care urma s-o
salvezi — aceeași regulă ca la
sortarea elevilor.
Din nou - 1: enunțul numără liniile de la 1, C++ de la 0.
Afișarea matricei se face cu două bucle, iar cout << endl stă în bucla exterioară — după ce
s-a terminat o linie întreagă. Dacă ar fi în cea interioară, fiecare element ar apărea pe rândul
lui.
Pentru coloane în loc de linii, se schimbă doar ce se fixează: bucla merge pe i, iar
indicii de coloană rămân constanți — a[i][c1 - 1] și a[i][c2 - 1].
Greșeli frecvente
a[l1] = a[l2] — nu se poate atribui o linie întreagă în C++.
- Citirea lui
l1 și l2 din fişier — ele vin de la tastatură; programul ar citi valori
greșite sau ar rămâne blocat.
- Fixarea greșită a indicilor — dacă plimbi
l1 în loc de j, muți diagonale, nu linii.
- Lipsa lui
aux — ambele linii ajung identice.
cout << endl în bucla interioară — matricea se afișează pe o singură coloană.
- Uitarea lui
- 1 — se interschimbă liniile vecine.