Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: naiken en 13 Enero 2022, 01:29 am



Título: Matrices en C++
Publicado por: naiken en 13 Enero 2022, 01:29 am
Buen día, tarde o noche, ando practicando necesito ayuda para este ejercicio (llevo 4 días tratando de encontrar el error pero ya no doy T.T):

Leer dos matrices 5x5 enteros y determinar si el promedio de los mayores números primos por cada fila de una matriz es igual al promedio de los mayores números primos por cada columna de la otra matriz.

Y mi código es el siguiente:

Código
  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5. main()
  6. {
  7. int matrix47[5][5],matrix[5][5],i,j,nd=0,k,acum,acum2,mayprimof,mayprimoc,promf,promc;
  8.  
  9. cout<<"Ingrese 25 numeros de la primer matriz: "<<endl;
  10. for(i=0;i<5;i++)
  11. {
  12. cout<<"Fila "<<i+1<<endl;
  13. for(j=0;j<5;j++)
  14. {
  15. cout<<"Columna: "<<j+1<<endl;
  16. cin>>matrix47[i][j];
  17. }
  18. }
  19. cout<<"Ahora ingrese 25 numeros para la segunda matriz: "<<endl;
  20. for(i=0;i<5;i++)
  21. {
  22. cout<<"Fila "<<i+1<<endl;
  23. for(j=0;j<5;j++)
  24. {
  25. cout<<"Columna: "<<j+1<<endl;
  26. cin>>matrix[i][j];
  27. }
  28. }
  29.  
  30. acum=0;
  31. mayprimof=0;
  32. for(i=0;i<5;i++)
  33. {
  34. for(j=0;j<5;j++)
  35. {
  36. nd=0;
  37. for(k=1;k<=matrix47[i][j];k++)
  38. {
  39. if(matrix47[i][j]%k==0)
  40. {
  41. nd++;
  42. }
  43. }
  44. if(nd==2)
  45. {
  46. if(matrix47[i][j]>mayprimof)
  47. {
  48. mayprimof=matrix47[i][j];
  49. }
  50. }
  51. }
  52. acum=acum+mayprimof;
  53. promf=acum/5;
  54. }
  55.  
  56. acum2=0;
  57. mayprimoc=0;
  58.  
  59. for(i=0;i<5;i++)
  60. {
  61. for(j=0;j<5;j++)
  62. {
  63. nd=0;
  64. for(k=1;k<=matrix[j][i];k++)
  65. {
  66. if(matrix[j][i]%k==0)
  67. {
  68. nd++;
  69. }
  70. }
  71. if(nd==2)
  72. {
  73. if(matrix[j][i]>mayprimoc)
  74. {
  75. mayprimoc=matrix[j][i];
  76. }
  77. }
  78.  
  79. }
  80. acum2=acum2+mayprimoc;
  81. promc=acum2/5;
  82. }
  83.  
  84. if(promf>promc)
  85. {
  86. cout<<"El promedio de los mayores numeros primos por fila de la primer matriz es mayor al promedio de los mayores numeros primos por columna de la segunda matriz"<<endl;
  87. cout<<"  Promedio por fila: "<<promf<<endl;
  88. cout<<"  Promedio por columna: "<<promc<<endl;
  89. }
  90. else if(promc>promf)
  91. {
  92. cout<<"El promedio de los mayores numeros primos por columna de la segunda matriz es mayor al promedio de los mayores numeros primos por fila de la primer matriz"<<endl;
  93. cout<<"  Promedio por fila: "<<promf<<endl;
  94. cout<<"  Promedio por columna: "<<promc<<endl;
  95. }
  96. else if(promf==promc)
  97. {
  98. cout<<"El promedio de los mayores numeros primos por fila de la primer matriz es igual al promedio de los mayores numeros primos por columna de la segunda matriz"<<endl;
  99. cout<<"  Promedio por fila: "<<promf<<endl;
  100. cout<<"  Promedio por columna: "<<promc<<endl;
  101. }
  102. }


Con la primer matriz no hay problema, me detecta los números primos, los suma y promedia normal, el error que tengo es con la segunda matriz, no sé qué números me esté sumando y promediando que no me da el promedio que debe de ser :/ , por ejemplo, uso estos números para las dos matrices:

   Fila 1: 10  |  3  |  12 |  5  |  14
   Fila 2: 15  |  7  |   8  |  9  |  11
   Fila 3: 16  |  13|  18 |  20 |  24
   Fila 4: 29  | 26 |  28 | 89  |  30
   Fila 5: 32  | 59 | 131| 34  |  36

Para las filas me da un total de 249, dividiéndolos sobre 5 me da 49 como promedio.
Ahora para las columnas me da un total de 319 que sobre 5 debe de dar 63 pero me da 96 T.T
Pienso que ha de ser la forma de ubicar las posiciones en los ciclos pero lo he cambiado y nada, o tal vez ya me bloqueé , no sé Q.Q Si alguien puede apoyarme, se lo agradecería mucho <3



Título: Re: Matrices en C++
Publicado por: K-YreX en 15 Enero 2022, 17:12 pm
El problema que tienes da la casualidad de que con la matriz que has puesto de ejemplo no aparece cuando se recorre por filas porque los primos van siempre aumentando.
El problema en sí es: No estás reiniciando los valores de 'mayprimof' ni 'mayprimoc'

Entonces cuando recorres por filas, el valor 'mayprimof' se va actualizando correctamente porque siempre va aumentando.
Sin embargo, al recorrer por columnas, cuando encuentra el 131, ese valor se queda para siempre. Por lo tanto está sumando el 131 tres veces (columnas 2, 3 y 4)


Y algunos consejos extra:
  • Parametriza los números sueltos que tienes por el programa:
Código
  1. const int NUM_FILAS = 5;
  2. const int NUM_COLS = 5;
  3.  
  4. int main() {
  5.  int matriz[NUM_FILAS][NUM_COLS];
  6.  //...
  7. }
Haciendo el programa así, si en cualquier momento quieres cambiar el tamaño de las matrices, sólo tendrás que cambiarlo arriba del todo y el resto del programa funcionará. En tu caso tienes que cambiarlo en todas las líneas en que has puesto 5 (y tendrás que tener cuidado de ver dónde son filas y dónde columnas)

  • Utiliza funciones auxiliares (y a ser posible optimizadas):
Código
  1. int isPrime(int num) {
  2.  // Asumimos que el numero es primo si es mayor que 1 (el 1 no se considera primo)
  3.  int prime = (num > 1);
  4.  // Dividir entre 1 o entre el propio num sabemos que va a dar resto 0 siempre. No hace falta hacerlo (empezamos en 2 y llegamos hasta num-1)
  5.  // Seguimos comprobando mientras siga siendo primo. En cuanto encontremos un divisor paramos
  6.  for(int i = 2; i < num && prime; i++) {
  7.    prime = (num % i != 0);
  8.  }
  9.  return prime;
  10. }
Usando funciones como esta para saber si un número es primo, el código principal te quedará más limpio (y más rápido).
Además puedes probar a pasar a tu algoritmo y a este el número 1234567890 y ver la diferencia de tiempo. Ya te adelanto que el tuyo va a dividir el número 1234567890 veces y este 1 vez.

  • En las últimas líneas, si tienes 2 líneas que estás repitiendo en todos los if(), ponlas una sola vez después del if(). Evita repetir código.
  • Además si primero comprueba si a>b y después si b>a; si ninguna se cumpla ya sabes que a==b. El último if() sobra también.


Título: Re: Matrices en C++
Publicado por: naiken en 18 Noviembre 2022, 08:20 am
En efecto, funcionó reiniciando la variable mayprimoc, solo con la de las columnas porque la de las filas no hubo problema, muchísimas gracias y de nuevo gracias por los consejos extra! muy útiles la verdad!!!!

P.D.: Una disculpa por lo mega tardado pero me había olvidado responder jeje

Saludos!!!