Miketo_prog

menuMatrices

Feb 9th, 2021 (edited)
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.07 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <iomanip>
  5. #include <map>
  6.  
  7. #define SALTO std::cout << std::endl << std::endl
  8.  
  9. typedef struct {
  10.     int **mat = NULL;
  11.     int m;
  12.     int n;
  13.  
  14. }Matrix;
  15.  
  16. void create(Matrix&);
  17. void fillMatrix(Matrix); //int **, int, int);
  18. void printMatrix(Matrix);
  19. void destroy(Matrix&);
  20. void newMatrix(Matrix&); //int**&, int**&, int&, int&);
  21. int menu(Matrix);
  22. bool runOptions(int, Matrix&);
  23.  
  24. void intercambiarColumnas(Matrix);
  25. void intercambiarFilas(Matrix);
  26. void transponerFilaCol(Matrix);
  27. void sumaDiagonales(Matrix);
  28. void transponerDiagonalFila(Matrix);
  29. void reemplazarConCinco(Matrix);
  30. void promedioReemplazar(Matrix);
  31. void sumaLetraO(Matrix);
  32. void promedioLetraL(Matrix);
  33. void reemplazarLetraU(Matrix);
  34.  
  35. int main()
  36. {
  37.     Matrix m;
  38.  
  39.     while( runOptions(menu(m), m) );
  40.  
  41.     destroy(m);
  42.  
  43.     return 0;
  44. }
  45.  
  46. int menu(Matrix m){
  47.     std::map<int, std::string> opciones{ {0, "Crear una matriz"},
  48.                                          {1, "Intercambiar columnas: primera y ultima (mxn)"},
  49.                                          {2, "Intercambiar filas: primera y ultima (mxn)"},
  50.                                          {3, "Intercambiar primera columna con ultima fila (nxn)"},
  51.                                          {4, "Suma diagonales: principal y secundaria (nxn)"},
  52.                                          {5, "Intercambiar diagonal principal por ultima fila (nxn)"},
  53.                                          {6, "Reemplazar diagonal secundaria con 5's (nxn)"},
  54.                                          {7, "Promedio de los numeros pares. Numero mayor y reemplazo de valores (mxn)"},
  55.                                          {8, "Sumar numeros que forman la letra O (mxn)"},
  56.                                          {9, "Promedio de numeros que forman letra L (mxn)"},
  57.                                          {10, "Reemplazar por 0 los numeros letra U (mxn)"},
  58.                                          {11, "Salir"} };
  59.     int opc;
  60.  
  61.     std::cout << "  M  E  N  U" << std::endl << std::endl;
  62.  
  63.     for(const auto &i: opciones)
  64.             std::cout << ( (m.mat==NULL && i.first!=0 && i.first!=(opciones.size()-1) ||
  65.                          (i.first>=3 && i.first<=6 && m.m!=m.n) ) ?"*":" ")
  66.                       << std::setw(2) << i.first << ". " << i.second << std::endl;
  67.  
  68.     std::cout << std::endl;
  69.  
  70.     if( m.mat==NULL || m.m!=m.n )
  71.         std::cout << "* Ninguna de estas opciones esta disponible por el momento." << std::endl << std::endl;
  72.  
  73.     do{
  74.         std::cout << "Opcion: ";
  75.         std::cin >> opc;
  76.     }while( opc<0 || opc>=opciones.size() );
  77.  
  78.     return opc;
  79. }
  80.  
  81. bool runOptions(int opc, Matrix &m){
  82.     bool state = true;
  83.  
  84.     system("cls");
  85.  
  86.     switch (opc){
  87.         case 0:
  88.             newMatrix(m);
  89.             fillMatrix(m);
  90.             break;
  91.         case 1:
  92.             if( m.mat!=NULL )
  93.                 intercambiarColumnas(m);
  94.             break;
  95.         case 2:
  96.             if( m.mat!=NULL )
  97.                 intercambiarFilas(m);
  98.             break;
  99.         case 3:
  100.             if( m.mat!=NULL && m.m==m.n )
  101.                 transponerFilaCol(m);
  102.             break;
  103.         case 4:
  104.             if( m.mat!=NULL && m.m==m.n )
  105.                 sumaDiagonales(m);
  106.             break;
  107.         case 5:
  108.             if( m.mat!=NULL && m.m==m.n )
  109.                 transponerDiagonalFila(m);
  110.             break;
  111.         case 6:
  112.             if( m.mat!=NULL && m.m==m.n )
  113.                 reemplazarConCinco(m);
  114.             break;
  115.         case 7:
  116.             if( m.mat!=NULL )
  117.                 promedioReemplazar(m);
  118.             break;
  119.         case 8:
  120.             if( m.mat!=NULL )
  121.                 sumaLetraO(m);
  122.             break;
  123.         case 9:
  124.             if( m.mat!=NULL )
  125.                 promedioLetraL(m);
  126.             break;
  127.         case 10:
  128.             if( m.mat!=NULL )
  129.                 reemplazarLetraU(m);
  130.             break;
  131.         case 11:
  132.             state = false;
  133.             break;
  134.     }
  135.  
  136.     SALTO;
  137.     if( opc!=11 )
  138.         system("pause");
  139.  
  140.     system("cls");
  141.  
  142.     return state;
  143. }
  144.  
  145. void newMatrix(Matrix &m){ //int**& mat0, int**& mat1, int& m, int& n){
  146.     if( m.mat!=NULL )
  147.         destroy(m);
  148.  
  149.     do{
  150.         system("cls");
  151.         std::cout << "MATRIZ NUEVA";
  152.         SALTO;
  153.         std::cout << "Cuantas filas deseas? ";
  154.         std::cin >> m.m;
  155.         std::cout << "Cuantas columnas deseas? ";
  156.         std::cin >> m.n;
  157.  
  158.         if( m.m!=0 && m.n!=0 )
  159.             break;
  160.     }while( 1 );
  161.  
  162.     create(m);
  163. }
  164.  
  165. void create(Matrix& m){
  166.     m.mat = new int*[m.m];
  167.  
  168.     for(int i=0; i<m.m; i++)
  169.         m.mat[i] = new int[m.n];
  170. }
  171.  
  172. void fillMatrix(Matrix m){
  173.     srand(time(NULL));
  174.  
  175.     for(int i=0; i<m.m; i++)
  176.         for(int j=0; j<m.n; j++)
  177.             m.mat[i][j] = 10 + rand()%90;
  178. }
  179.  
  180. void printMatrix(Matrix m){
  181.     for(int i=0; i<m.m; i++){
  182.         for(int j=0; j<m.n; j++)
  183.             std::cout << std::setw(4) << m.mat[i][j];
  184.  
  185.         std::cout << std::endl;
  186.     }
  187. }
  188.  
  189. void destroy(Matrix& m){
  190.     for(int i=0; i<m.m; i++)
  191.         delete[] m.mat[i];
  192.  
  193.     delete[] m.mat;
  194.  
  195.     m.mat = NULL;
  196. }
  197.  
  198. //01 Ingresar n�meros enteros a una matriz de tama�o N x M e intercambiar los elementos de la primera columna con la �ltima columna.
  199. void intercambiarColumnas(Matrix m){
  200.     Matrix mCopy;
  201.     mCopy.m = m.m;
  202.     mCopy.n = m.n;
  203.     create(mCopy);
  204.  
  205.     for(int i=0; i<m.m; i++){
  206.         for(int j=0; j<m.n; j++)
  207.             if( j==0 )
  208.                 mCopy.mat[i][m.n-1] = m.mat[i][j];
  209.             else if( j==(m.n-1) )
  210.                 mCopy.mat[i][0] = m.mat[i][j];
  211.             else
  212.                 mCopy.mat[i][j] = m.mat[i][j];
  213.     }
  214.  
  215.     std::cout << "Matriz original:" << std::endl;
  216.     printMatrix(m);
  217.     SALTO;
  218.     std::cout << "Matriz con columnas intercambiadas:" << std::endl;
  219.     printMatrix(mCopy);
  220.  
  221.     destroy(mCopy);
  222. }
  223.  
  224. //02 Ingresar n�meros enteros a una matriz de tama�o N x M e intercambiar los elementos de la primera fila con la �ltima fila.
  225. void intercambiarFilas(Matrix m){
  226.     Matrix mCopy;
  227.     mCopy.m = m.m;
  228.     mCopy.n = m.n;
  229.     create(mCopy);
  230.  
  231.     for(int i=0; i<m.m; i++){
  232.         for(int j=0; j<m.n; j++)
  233.             if( i==0 )
  234.                 mCopy.mat[m.m-1][j] = m.mat[i][j];
  235.             else if( i==(m.m-1) )
  236.                 mCopy.mat[0][j] = m.mat[i][j];
  237.             else
  238.                 mCopy.mat[i][j] = m.mat[i][j];
  239.     }
  240.  
  241.     std::cout << "Matriz original:" << std::endl;
  242.     printMatrix(m);
  243.     SALTO;
  244.     std::cout << "Matriz con filas intercambiadas:" << std::endl;
  245.     printMatrix(mCopy);
  246.  
  247.     destroy(mCopy);
  248. }
  249.  
  250. //03 Ingresar n�meros enteros a una matriz cuadrada de tama�o N e intercambiar los elementos de la primera columna con la �ltima fila.
  251. void transponerFilaCol(Matrix m) {
  252.     Matrix mCopy;
  253.     mCopy.m = m.m;
  254.     mCopy.n = m.n;
  255.     create(mCopy);
  256.  
  257.     for(int i=0, j=m.n-1; i<m.m; i++, j--){
  258.         mCopy.mat[m.m-1][j] = m.mat[i][0];
  259.         mCopy.mat[i][0] = m.mat[m.m-1][j];
  260.     }
  261.  
  262.     for(int i=0; i<m.m-1; i++)
  263.         for(int j=1; j<m.n; j++)
  264.             mCopy.mat[i][j] = m.mat[i][j];
  265.  
  266.     std::cout << "Matriz original:" << std::endl;
  267.     printMatrix(m);
  268.     SALTO;
  269.     std::cout << "Matriz con columna-filas intercambiadas:" << std::endl;
  270.     printMatrix(mCopy);
  271.  
  272.     destroy(mCopy);
  273. }
  274.  
  275. //04 Ingresar n�meros enteros a una matriz cuadrada de tama�o N y calcular la suma de la diagonal principal y la suma de la diagonal secundaria.
  276. void sumaDiagonales(Matrix m) {
  277.     int *valoresPrincipal = new int[m.m];
  278.     int *valoresSecundaria = new int[m.m];
  279.     int diagonalPrincipal = 0;
  280.     int diagonalSecundaria = 0;
  281.  
  282.     for(int i=0, j=0; i<m.m; i++, j++){
  283.         diagonalPrincipal += m.mat[i][j];
  284.         valoresPrincipal[i] = m.mat[i][j];
  285.     }
  286.  
  287.     for(int i=0, j=m.n-1; i<m.m; i++, j--){
  288.         diagonalSecundaria += m.mat[i][j];
  289.         valoresSecundaria[i] = m.mat[i][j];
  290.     }
  291.  
  292.     std::cout << "Matriz original:" << std::endl;
  293.     printMatrix(m);
  294.     SALTO;
  295.  
  296.     std::cout << "Suma diagonal principal: " << std::endl;
  297.     for(int i=0; i<m.m; i++)
  298.         std::cout << valoresPrincipal[i] << (i!=(m.m-1)?" + ":" = ");
  299.     std::cout << diagonalPrincipal;
  300.  
  301.     SALTO;
  302.  
  303.     std::cout << "Suma diagonal secundaria: " << std::endl;
  304.     for(int i=0; i<m.m; i++)
  305.         std::cout << valoresSecundaria[i] << (i!=(m.m-1)?" + ":" = ");
  306.     std::cout << diagonalSecundaria << std::endl;
  307.  
  308.     delete[] valoresPrincipal;
  309.     delete[] valoresSecundaria;
  310. }
  311.  
  312. //05 Ingresar n�meros enteros a una matriz cuadrada de tama�o N e intercambiar los elementos de la diagonal principal por los elementos de la �ltima fila de una matriz cuadrada.
  313. void transponerDiagonalFila(Matrix m) {
  314.     Matrix mCopy;
  315.     mCopy.m = m.m;
  316.     mCopy.n = m.n;
  317.     create(mCopy);
  318.  
  319.     for(int i=0, j=0; i<m.m; i++, j++){
  320.         mCopy.mat[m.m-1][j] = m.mat[i][j];
  321.         mCopy.mat[i][j] = m.mat[m.m-1][j];
  322.     }
  323.  
  324.     for(int i=0; i<m.m-1; i++)
  325.         for(int j=0; j<m.n; j++)
  326.             if( i!=j )
  327.                 mCopy.mat[i][j] = m.mat[i][j];
  328.  
  329.     std::cout << "Matriz original:" << std::endl;
  330.     printMatrix(m);
  331.     SALTO;
  332.     std::cout << "Matriz con diagonal-fila intercambiadas:" << std::endl;
  333.     printMatrix(mCopy);
  334.  
  335.     destroy(mCopy);
  336. }
  337.  
  338. //06 Ingresar n�meros enteros a una matriz cuadrada de tama�o N y reemplazar por el n�mero 5 todos los elementos de la diagonal secundaria.
  339. void reemplazarConCinco(Matrix m) {
  340.     Matrix mCopy;
  341.     mCopy.m = m.m;
  342.     mCopy.n = m.n;
  343.     create(mCopy);
  344.  
  345.     for(int i=0; i<m.m; i++)
  346.         for(int j=0; j<m.n; j++)
  347.             if( (i+j)==(m.m-1) )
  348.                 mCopy.mat[i][j] = 5;
  349.             else
  350.                 mCopy.mat[i][j] = m.mat[i][j];
  351.  
  352.     std::cout << "Matriz original:" << std::endl;
  353.     printMatrix(m);
  354.     SALTO;
  355.     std::cout << "Matriz con diagonal secundaria con 5's:" << std::endl;
  356.     printMatrix(mCopy);
  357.  
  358.     destroy(mCopy);
  359. }
  360.  
  361. //07 Ingresar n�meros enteros a una matriz de tama�o N x M, calcular el promedio de los n�meros pares de la matriz,
  362. //luego hallar el mayor n�mero de toda la matriz y reemplazar los valores de la columna donde esta dicho n�mero mayor por el promedio antes calculado.
  363. void promedioReemplazar(Matrix m) {
  364.     Matrix mCopy;
  365.     mCopy.m = m.m;
  366.     mCopy.n = m.n;
  367.     create(mCopy);
  368.     int promedio = 0;
  369.     int cantInts = 0;
  370.     int mayor = m.mat[0][0];
  371.     int colMayor = 0;
  372.  
  373.     for(int i=0; i<m.m; i++)
  374.         for(int j=0; j<m.n; j++){
  375.             if( m.mat[i][j]%2==0 ){
  376.                 promedio += m.mat[i][j];
  377.                 cantInts++;
  378.             }
  379.  
  380.             if( mayor<m.mat[i][j] ){
  381.                 mayor = m.mat[i][j];
  382.                 colMayor = j;
  383.             }
  384.         }
  385.  
  386.     promedio /= cantInts;
  387.  
  388.     for(int i=0; i<m.m; i++)
  389.         for(int j=0; j<m.n; j++)
  390.             if( j==colMayor )
  391.                 mCopy.mat[i][j] = promedio;
  392.             else
  393.                 mCopy.mat[i][j] = m.mat[i][j];
  394.  
  395.     std::cout << "Matriz original:" << std::endl;
  396.     printMatrix(m);
  397.     SALTO;
  398.     std::cout << "Matriz con columna intercambiadas por promedio:" << std::endl;
  399.     printMatrix(mCopy);
  400.  
  401.     SALTO;
  402.  
  403.     std::cout << "Cantidad de numeros pares: " << cantInts << std::endl;
  404.     std::cout << "Promedio de numeros pares: " << promedio << std::endl;
  405.     std::cout << "Numero mayor de la matriz: " << mayor << std::endl;
  406.     std::cout << "Columna del numero mayor: " << colMayor << std::endl;
  407.  
  408.     destroy(mCopy);
  409. }
  410.  
  411. //08 Ingresar n�meros enteros a una matriz de tama�o N x M, sumar todos los elementos que forman la letra O.
  412. void sumaLetraO(Matrix m) {
  413.     //int *numeros = new int[(2*(m.m+m.n)-4)];
  414.     int suma = 0;
  415.  
  416.     for(int i=0; i<m.m; i++)
  417.         for(int j=0; j<m.n; j++)
  418.             if( i==0 || i==(m.m-1) || j==0 || j==(m.n-1) )
  419.                 suma += m.mat[i][j];
  420.            
  421.     std::cout << "Matriz original:" << std::endl;
  422.     printMatrix(m);
  423.     SALTO;
  424.  
  425.     std::cout << "Suma de numeros que forman la O:" << std::endl;
  426.  
  427.     for(int i=0; i<m.m; i++){
  428.         for(int j=0; j<m.n; j++)
  429.             if( i==0 || i==(m.m-1) || j==0 || j==(m.n-1) )
  430.                 std::cout << std::setw(4) << m.mat[i][j];
  431.             else
  432.                 std::cout << "    ";
  433.  
  434.         std::cout << std::endl;
  435.     }
  436.  
  437.     SALTO;
  438.     std::cout << "La suma es de : " << suma;
  439.     SALTO;
  440.  
  441. }
  442.  
  443.  
  444. //09 Ingresar n�meros enteros a una matriz de tama�o N x M, calcular el promedio de todos los elementos que forman la letra L.
  445. void promedioLetraL(Matrix m) {
  446.     int promedio = 0;
  447.     int cantNums = 0;
  448.  
  449.     for(int i=0; i<m.m; i++)
  450.         for(int j=0; j<m.n; j++)
  451.             if( j==0 || i==(m.m-1) ){
  452.                 promedio += m.mat[i][j];
  453.                 cantNums++;
  454.             }
  455.    
  456.     promedio /= cantNums;
  457.  
  458.     std::cout << "Matriz original:" << std::endl;
  459.     printMatrix(m);
  460.     SALTO;
  461.  
  462.     std::cout << "Promedio de numeros que forman la L:" << std::endl;
  463.  
  464.     for(int i=0; i<m.m; i++){
  465.         for(int j=0; j<m.n; j++)
  466.             if( j==0 || i==(m.m-1) )
  467.                 std::cout << std::setw(4) << m.mat[i][j];
  468.             else
  469.                 std::cout << "    ";
  470.  
  471.         std::cout << std::endl;
  472.     }
  473.    
  474.     SALTO;
  475.     std::cout << "La cantidad de elementos es de : " << cantNums << std::endl;
  476.     std::cout << "El promedio es de: "  << promedio;
  477.     SALTO;
  478. }
  479.  
  480.  
  481. //10 Ingresar n�meros enteros a una matriz de tama�o N x M, reemplazar por el n�mero 0 todos los elementos que forman la letra U.
  482. void reemplazarLetraU(Matrix m) {
  483.     Matrix mCopy;
  484.     mCopy.m = m.m;
  485.     mCopy.n = m.n;
  486.     create(mCopy);
  487.  
  488.     for(int i=0; i<m.m; i++)
  489.         for(int j=0; j<m.n; j++)
  490.             if( j==0 || j==(m.n-1) || i==(m.m-1) )
  491.                 mCopy.mat[i][j] = 0;
  492.             else
  493.                 mCopy.mat[i][j] = m.mat[i][j];
  494.  
  495.     std::cout << "Matriz original:" << std::endl;
  496.     printMatrix(m);
  497.     SALTO;
  498.     std::cout << "Matriz con ceros letra U:" << std::endl;
  499.     printMatrix(mCopy);
  500.  
  501.     destroy(mCopy);
  502. }
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
Add Comment
Please, Sign In to add comment