Advertisement
AntonioVillanueva

Resolviendo valores en una matriz pasada como puntero 1 d

Aug 28th, 2019
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.32 KB | None | 0 0
  1. /*
  2.  * Antonio Villanueva Segura
  3.  * g++ -std=c++11 -o exa exa.cpp
  4.  */
  5. #include <iostream>
  6. #include <string>
  7. #include <random> //numeros aleatorios
  8. #include <ctime> //hora para generar numeros aleatorios
  9.  
  10. using namespace std;
  11.  
  12. //Matriz examen ,  luego se puede implementar a nivel de punteros e inicializar de forma aleatoria ...
  13. /*
  14.  * Resultado de la matriz exament
  15. 15  48  45  108 216 324
  16. 21  33  69  123 246 369
  17. 89  55  87  231 462 693
  18. 125 136 201 924 1386 2310  
  19. 250 272 402 1386 4620 6006 
  20. 375 408 603 2310 6006 5679
  21. */
  22. int test[][6]={
  23.   {15,48,45,-1,-1,-5},
  24.   {21,33,69,-1,-1,-5},
  25.   {89,55,87,-1,-1,-5},
  26.   {-2,-2,-2,-3,-1,-5},
  27.   {-2,-2,-2,-2,-3,-5},
  28.   {-4,-4,-4,-4,-4,-6},
  29.   };
  30.  
  31. //----------------------------------------------------------------------
  32. /*Las funciones utilizan  int *m , son punteros , es decir direcciones en la memoria
  33.  * lo mas logico al principio seria m[filas][columnas] , pero como piden poder tratar
  34.  * diferentes dimensiones y trabajar punteros este es el principio.
  35.  * Para la funcion la matriz de dos dimensiones es una matriz de 1 dimension , por eso
  36.  * tenemos que crear equivalencias
  37.  * Por ejemplo m[fila=0][col=2] sera m[fila*6+col] que sera m[0*6+2] =m[2] la columna 2 de la linea 0
  38.  * en nuestra matriz anterior test[][6] seria el valor m[2]=45 o m[0][2] en dos dimensiones
  39.  * otro ejemplo
  40.  * m[fila=2][col=1] =m[2][1] seria m[fila*6+1] es decir m[2*6+1]=m[13] en la matriz lineal de 1 dimension
  41.  * es decir m[13]=m[2][1] que contiene 55 en la matriz de test ....
  42.  *
  43.  */
  44. void mostrarMatriz(int  *m ,int y,int x){
  45.     //Funcion para visualizar la matriz
  46.     for (int fila=0;fila<y;fila++){
  47.         for (int col=0;col<x;col++){
  48.             cout <<m[fila*y+col]<<"\t";
  49.         }
  50.         cout <<endl;
  51.     }
  52.     cout <<"-------------------------------------------"<<endl;
  53. }  
  54. //----------------------------------------------------------------------
  55. int sumaFila(int  *m ,int y,int fila ,int max=6,int inicio=0){
  56. //Suma una fila de la matriz m,direccionada por un puntero * entre inicio y max
  57.   int suma=0;
  58.     for (int xx=inicio;xx<max;xx++){//Recorre columnas
  59.       suma+=m[fila*y+xx];
  60.     }
  61.  
  62.   return suma;
  63. }
  64. //----------------------------------------------------------------------
  65. int sumaColumna(int  *m ,int y,int col ,int max=6,int inicio=0){
  66. //Suma una col de la matriz m,direccionada por un puntero * entre inicio y max
  67.   int suma=0;
  68.     for (int yy=inicio;yy<max;yy++){//Recorre lineas
  69.       suma+=m[yy*y+col];
  70.     }
  71.  
  72.   return suma;
  73. }
  74. //----------------------------------------------------------------------
  75. int sumaDiagonal(int  *m ,int size=6){
  76.     //Suma una diagonal
  77.     int suma=0;
  78.     for (int d=0;d<size;d++){
  79.         if (m[d*size+d]>=0){//Casilla con valor valido no negativo
  80.             suma +=m[d*size+d];
  81.         }
  82.     }
  83.     return suma;
  84. }
  85. //----------------------------------------------------------------------
  86. int generAleatorio(int min=1,int max=90){
  87.     //Genera un numero aleatorio entre min y max,se utiliza en inicializaTabla
  88.       return min+rand()%(max+1);
  89. }
  90. //----------------------------------------------------------------------
  91. void inicializaTabla(int *m,int size=6){
  92.     //Inicializa una matriz m cuadrada de tamano size
  93.     for (int linea=0;linea<size;linea++){
  94.         for (int col=0;col<size;col++){
  95.            
  96.             if (linea<3 and col<3 ){//Cuadrado de 3x3 a inicializar aletoriamente
  97.                 m[linea*size+col]=generAleatorio();//Inicializo aleatorios con el valor por defecto de la funcion  
  98.             }          
  99.         }
  100.     }
  101.    
  102. }    
  103. //----------------------------------------------------------------------
  104. //----------------------------------------------------------------------
  105. //----------------------------------------------------------------------
  106.     int main (){
  107.     srand(time(NULL));//Inicio los numeros aleatorios
  108.    
  109.     int tam=sizeof (test)/sizeof(test[0]);//Recupera la dimension de la matriz que es ,6 en este caso
  110.  
  111.     //inicializaTabla((int*)test);//Decido Re-inicializar la matriz test ,pero solo el cuadrado 3x3 con numeros aleatorios
  112.    
  113.     //Mostrar la matriz antes de ser resuelta ...
  114.     mostrarMatriz((int*)test,tam,tam);
  115.  
  116.     //Resuelve el array ,los numeros negativos seleccionan la operacion
  117.     for (int fila=0;fila<tam;fila++){
  118.       for (int col=0;col<tam;col++){
  119.             if (test[fila][col]==-1){//R1 Linea
  120.                 test[fila][col] = sumaFila((int*)test,tam,fila,col);
  121.             }
  122.            
  123.             if (test[fila][col]==-2){//R1 Columna
  124.                 test[fila][col] = sumaColumna((int*)test,tam,col,fila);
  125.             }  
  126.            
  127.             if (test[fila][col]==-3){//R1+R2
  128.                 test[fila][col] = sumaFila((int*)test,tam,fila,col)+sumaColumna((int*)test,6,col,fila);
  129.             }      
  130.            
  131.             if (test[fila][col]==-4){//Las dos ultimas de R1 et R2 columna
  132.                 test[fila][col] = sumaColumna((int*)test,tam,col,fila,fila-2);
  133.             }              
  134.  
  135.             if (test[fila][col]==-5){//Las dos ultimas de R1 et R2 fila
  136.                 test[fila][col] = sumaFila((int*)test,tam,fila,col,col-2);
  137.             }      
  138.                                        
  139.             if (test[fila][col]==-6){//Suma diagonal
  140.                 test[fila][col] =sumaDiagonal((int*)test);
  141.             }              
  142.       }
  143.     }
  144.  
  145.     //Mostrar la matriz
  146.     mostrarMatriz((int*)test,tam,tam);
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement