Sa se scrie un program care introduce de la tastatura o matrice cu m linii si n coloane, m si n numere intregi. Interschimbati coloanele matricei astfel incat in linia k elementele sa fie ordonate crescator si afisati rezultatul pe ecran.
Răspunsuri la întrebare
Răspuns:
#include <iostream>
int** creareMatrice(size_t m, size_t n);
void ordoneazaLiniaCrescator(int** pMatrice, size_t m, size_t n, size_t k);
void afiseazaMatricea(int** pMatrice, size_t m, size_t n);
void stergeMatrice(int** pMatrice, size_t m);
int main() {
/* citim cele m linii și n coloane */
size_t m = 0, n = 0;
std::cout << "Cate linii si cate coloane (de ex. 3 3) >> ";
std::cin >> m >> n;
/* alocăm dinamic o matrice de m linii și n coloane, totodată inserăm și numerele citite de la tastatură*/
int** pMatrice = creareMatrice(m, n);
/* citim a câta linie s-o ordonăm crescător */
size_t k = 0;
std::cout << "A cata linie sa fie ordonata crescator (nr. max. " << m << ") ? >> ";
std::cin >> k;
/* (opțional) afișăm matricea înainte de interschimbarea coloanelor */
std::cout << "pMatrice inainte de interschimbare:\n";
afiseazaMatricea(pMatrice, m, n);
/* în această funcție se produce interschimbarea */
ordoneazaLiniaCrescator(pMatrice, m, n, k);
/* afișăm matricea după interschimbarea coloanelor */
std::cout << "\npMatrice dupa interschimbare:\n";
afiseazaMatricea(pMatrice, m, n);
/* și la final ștergem zona de memorie alocată mai sus */
stergeMatrice(pMatrice, m);
return 0;
}
int** creareMatrice(size_t m, size_t n) {
/* m (numărul de linii) și n (numărul de coloane) */
int** pMatrice = new int*[m];
for (size_t i = 0; i < m; i++) {
pMatrice[i] = new int[n];
for (size_t j = 0; j < n; j++) {
std::cout << "pMatrice[" << i << "][" << j << "] = ";
std::cin >> pMatrice[i][j];
}
}
return pMatrice;
}
void ordoneazaLiniaCrescator(int** pMatrice, size_t m, size_t n, size_t k) {
/* k (a câta linie să fie ordonată crescător), j (index-ul liniei respective) */
size_t j = k - 1;
/* parcurgem linia cu indexul j */
for (size_t i = 0; i < n - 1; i++) {
/* dacă numărul curent este mai mare decât următorul interschimbăm coloanele */
if (pMatrice[j][i] > pMatrice[j][i + 1]) {
/*
de exemplu pentru următoarea matrice dacă vrem să ordonăm crescător prima linie
|3 1 2 |
|4 2 3|
|5 1 6 |
observăm că pMatrice[j][i](3) > pMatrice[j][i+1](1) deci interschimbăm coloanele celor două numere vom porni practic de sus în jos (linie cu linie) și interschimbăm numerele de pe pozițiile l (care e indexul liniei) și i care e index-ul unde am găsit „problema” și o să avem:
||3| <=> |1| 2| |1 3 2|
||4| <=> |2| 3| => |2 4 3|
||5| <=> |1| 6| |1 5 6|
acuma la următoarea iterație o să observăm că 3 > 2, se face aceași chestie, rezultatul o să fie:
|1 |3| <=> |2|| |1 2 3|
|2 |4| <=> |3|| => |2 3 4|
|1 |5| <=> |6|| |1 6 5|
*/
for (size_t l = 0; l < m; l++) {
int nrTemp = pMatrice[l][i];
pMatrice[l][i] = pMatrice[l][i + 1];
pMatrice[l][i + 1] = nrTemp;
}
}
}
}
void afiseazaMatricea(int** pMatrice, size_t m, size_t n) {
for (int i = 0; i < m; i++) {
for (size_t j = 0; j < n; j++) {
std::cout << pMatrice[i][j] << " ";
}
std::cout << "\n";
}
}
void stergeMatrice(int** pMatrice, size_t m) {
for (size_t i = 0; i < m; i++) {
delete[] pMatrice[i];
}
delete[] pMatrice;
}