Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: wonted en 21 Octubre 2022, 04:47 am



Título: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
Publicado por: wonted en 21 Octubre 2022, 04:47 am
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define fila 3
  4. #define col 2
  5. #define max 3
  6. typedef struct infoAlum{
  7. char nombre[15];
  8. int matricula;
  9. float cal[2];
  10. float prom;
  11. }alumnos;
  12.  
  13. int main(){
  14. alumnos **alum;
  15. int i,j,k;
  16. float prom;
  17. alum = (alumnos**)malloc(fila*sizeof(alumnos*));
  18.  
  19. // For para columnas
  20. for(i=0;i<fila;i++){
  21. alum[i]=(alumnos*)malloc(col*sizeof(alumnos));
  22. }
  23.  
  24. printf("Introduzca los valores de la matriz\n");
  25.  
  26. for(i=0;i<fila;i++){
  27. for(j=0;j<col;j++){
  28. printf("Introduce el nombre del alumno numero [%d] [%d]\n",i+1,j+1);
  29. scanf("%s", alum[i][j].nombre);
  30. printf("Introduce la matricula del alumno numero [%d] [%d]\n",i+1,j+1);
  31. scanf("%d",&alum[i][j].matricula);
  32. for(k=0;k<max;k++){
  33. printf("Introduce la calificacion %d del alumno numero [%d] [%d]\n",k+1,i+1,j+1);
  34. scanf("%f",&alum[i][j].cal[k]);
  35. printf("%f\n",alum[i][j].cal[k]);
  36. alum[i][j].prom=(alum[i][j].cal[k]+alum[i][j].prom);
  37. printf("La suma en turno %d es %f\n",k+1, alum[i][j].prom);
  38. }
  39. alum[i][j].prom =(alum[i][j].prom)/3;
  40. printf("El promedio de %s es %f \n",alum[i][j].nombre, alum[i][j].prom);
  41. }
  42. }
  43. for(i=0;i<fila;i++){
  44. for(j=0;j<col;j++){
  45. printf("Nombre: [%s] \t",alum[i][j].nombre);
  46. printf("Matricula: [%d] \t",alum[i][j].matricula);
  47. printf("Promedio [%.2f] \n",alum[i][j].prom);
  48. }
  49. }
  50.  
  51.  
  52. // Liberando los apuntadores de memoria
  53. for (i=0;i<fila;i++){
  54. for(j=0;j<col;j++){
  55. free(alum[i]);
  56. free(alum);
  57. }
  58. }
  59. }

MOD: El código debe ir entre etiquetas de Código GeSHi


Título: Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
Publicado por: Lieutenant McFarley en 21 Octubre 2022, 10:52 am
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define fila 3
  4. #define col 2
  5. #define max 3
  6. typedef struct infoAlum{
  7. char nombre[15];
  8. int matricula;
  9. float cal[2];
  10. float prom;
  11. }alumnos;
  12.  
  13. int main(){
  14. alumnos **alum;
  15. int i,j,k;
  16. float prom;
  17. alum = (alumnos**)malloc(fila*sizeof(alumnos*));
  18.  
  19. // For para columnas
  20. for(i=0;i<fila;i++){
  21. alum[i]=(alumnos*)malloc(col*sizeof(alumnos));
  22. }
  23.  
  24. printf("Introduzca los valores de la matriz\n");
  25.  
  26. for(i=0;i<fila;i++){
  27. for(j=0;j<col;j++){
  28. printf("Introduce el nombre del alumno numero [%d] [%d]\n",i+1,j+1);
  29. scanf("%s", alum[i][j].nombre);
  30. printf("Introduce la matricula del alumno numero [%d] [%d]\n",i+1,j+1);
  31. scanf("%d",&alum[i][j].matricula);
  32. for(k=0;k<max;k++){
  33. printf("Introduce la calificacion %d del alumno numero [%d] [%d]\n",k+1,i+1,j+1);
  34. scanf("%f",&alum[i][j].cal[k]);
  35. printf("%f\n",alum[i][j].cal[k]);
  36. alum[i][j].prom=(alum[i][j].cal[k]+alum[i][j].prom);
  37. printf("La suma en turno %d es %f\n",k+1, alum[i][j].prom);
  38. }
  39. alum[i][j].prom =(alum[i][j].prom)/3;
  40. printf("El promedio de %s es %f \n",alum[i][j].nombre, alum[i][j].prom);
  41. }
  42. }
  43. for(i=0;i<fila;i++){
  44. for(j=0;j<col;j++){
  45. printf("Nombre: [%s] \t",alum[i][j].nombre);
  46. printf("Matricula: [%d] \t",alum[i][j].matricula);
  47. printf("Promedio [%.2f] \n",alum[i][j].prom);
  48. }
  49. }
  50.  
  51.  
  52. // Liberando los apuntadores de memoria
  53. for (i=0;i<fila;i++){
  54. for(j=0;j<col;j++){
  55. free(alum[i]);
  56. free(alum);
  57. }
  58. }
  59. }


En la línea 36:
Código:
alum[i][j].prom=(alum[i][j].cal[k]+alum[i][j].prom);
se acumula prom sobre sí mismo sin haberle dado un valor inicial. Quizá el programa le asigne un valor arbitrario que distorsiona el resultado.

Pienso que entre las líneas 31 y 32, antes del bucle en k debería asignársele un valor inicial cero:
Código:
alum[i][j].prom = 0;

Por otro lado la variable prom de main (), línea 16, no parece usarse, ya que se utiliza el .prom del struct.

Finalmente no veo, personalmente, la conveniencia de representar a los alumnos por una matriz bidimensional. A no ser que sea un ejercicio con esa exigencia o que se quiera representar fisicamente un aula tradicional con los alumnos en mesas distribuidas en un rectángulo, y que además la distribución coincida exactamente con un rectángulo y no falten mesas para rellenar la matriz completa. Personalmente, ya digo, creo que podria haberse usado un array lineal de struct.


Título: Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
Publicado por: K-YreX en 22 Octubre 2022, 17:36 pm
Estás intentando guardar 3 (max) notas en un array de longitud 2 (cal)...  :silbar: :silbar:
Además si estás usando un 'define' para guardar [max = 3], luego úsalo para calcular el promedio en lugar de dividir directamente entre 3.

Y por otro lado, no estás liberando bien la matriz dinámica.
Fíjate en cómo reservas la memoria pues para liberarla el proceso es el mismo. Lo que reservas con bucle, lo liberas con bucle y lo que reservas una vez, lo liberas una vez:
Código
  1. for(int i = 0; i < filas; i++) {
  2.    free(alumnos[i]);
  3. }
  4. free(alumnos);


Título: Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
Publicado por: wonted en 24 Octubre 2022, 05:24 am
Muchas gracias, me ha servido mucho este y el otro comentario. Como duda adicional. ¿Estoy haciendo bien en usar el punto para referirme a la struct siendo que es memoria dinamica? En arreglos funciona con flechas pero con matrices me marco error.


Título: Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
Publicado por: K-YreX en 24 Octubre 2022, 17:15 pm
Muchas gracias, me ha servido mucho este y el otro comentario. Como duda adicional. ¿Estoy haciendo bien en usar el punto para referirme a la struct siendo que es memoria dinamica? En arreglos funciona con flechas pero con matrices me marco error.

El uso de la flecha tal que:
Código
  1. variable->campo
Es equivalente a hacer:
Código
  1. (*variable).campo

La flecha simplemente permite simplificar un poco las expresiones para que no quede tan engorroso.
En este caso concreto, al ser una matriz, cuando haces:
Código:
matriz[i][j]
Ya estás accediendo a un elemento de tipo <alumnos> no a un puntero, por eso tienes que usar el punto.

Si usases aritmética de punteros para acceder a la matriz (si no me he equivocado, ambas líneas muestran exactamente lo mismo):
Código
  1. printf("%s\n", matriz[i][j].nombre);
  2. printf("%s\n", (*(*(matriz + i) + j)).nombre); // Usando aritmetica de punteros

Podrías simplificar la segunda expresión haciendo uso de la flecha:
Código
  1. printf("%s\n", (*(matriz + i) + j)->nombre);

Pero como puedes ver, con matrices siempre es más sencillo utilizar los índices.



Ya puestos, otro extra:
Al momento de crear el struct, si utilizas typedef, no es necesario que asignes un primer nombre, bastaría con el del final.
Poner un nombre al principio y otro al final sólo es necesario si quieres hacer referencia a la propia struct dentro de sí misma.
Código
  1. typedef struct {
  2.  //...
  3.  //...
  4. } InfoAlumno;
Y el nombre mejor en singular, has creado una estructura, no un array de esa estructura. Luego ya si creas un array, llamas a la variable en plural:
Código
  1. InfoAlumno **alumnos;


Título: Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
Publicado por: wonted en 25 Octubre 2022, 04:22 am
Gracias! Entonces lo que he hecho en mi código no está mal para punteros...?  :P


Título: Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
Publicado por: K-YreX en 25 Octubre 2022, 10:40 am
Por qué? No entiendo a qué te refieres  :huh: