Informatică, întrebare adresată de danielabrz, 8 ani în urmă

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 de Apollyon
1

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;

}

Alte întrebări interesante