elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Matrices en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Matrices en C++  (Leído 472 veces)
naiken

Desconectado Desconectado

Mensajes: 5



Ver Perfil
Matrices en C++
« 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



En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 947



Ver Perfil
Re: Matrices en C++
« Respuesta #1 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.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
matrices en C#
Programación General
volterra 4 9,038 Último mensaje 18 Mayo 2010, 06:26 am
por Og.
matrices
Programación C/C++
lorderick 3 2,255 Último mensaje 8 Septiembre 2012, 05:12 am
por CSQCasimiro
c++ matrices[3][4]
Programación C/C++
lukaszg_15 6 2,057 Último mensaje 25 Marzo 2014, 20:38 pm
por Eternal Idol
matrices
Programación C/C++
aggv1106 0 714 Último mensaje 16 Mayo 2016, 17:17 pm
por aggv1106
Matrices
Programación General
Dominic91 1 730 Último mensaje 3 Septiembre 2019, 01:37 am
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines