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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.  (Leído 6,315 veces)
wonted

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
« 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


« Última modificación: 22 Octubre 2022, 17:27 pm por K-YreX » En línea

Lieutenant McFarley

Desconectado Desconectado

Mensajes: 49



Ver Perfil
Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
« Respuesta #1 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.


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
« Respuesta #2 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);
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
wonted

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
« Respuesta #3 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.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
« Respuesta #4 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;
« Última modificación: 24 Octubre 2022, 17:19 pm por K-YreX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
wonted

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
« Respuesta #5 en: 25 Octubre 2022, 04:22 am »

Gracias! Entonces lo que he hecho en mi código no está mal para punteros...?  :P
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Necesito ayuda. Estoy haciendo uso de matriz con struct y malloc pero el promedio no lee valores como debería.
« Respuesta #6 en: 25 Octubre 2022, 10:40 am »

Por qué? No entiendo a qué te refieres  :huh:
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:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines