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,330 veces)
|
wonted
Desconectado
Mensajes: 3
|
#include <stdio.h> #include <stdlib.h> #define fila 3 #define col 2 #define max 3 typedef struct infoAlum{ char nombre[15]; int matricula; float cal[2]; float prom; }alumnos; int main(){ alumnos **alum; int i,j,k; float prom; alum = (alumnos **)malloc(fila *sizeof(alumnos *)); // For para columnas for(i=0;i<fila;i++){ alum [i ]=(alumnos *)malloc(col *sizeof(alumnos )); } printf("Introduzca los valores de la matriz\n"); for(i=0;i<fila;i++){ for(j=0;j<col;j++){ printf("Introduce el nombre del alumno numero [%d] [%d]\n",i +1,j +1); scanf("%s", alum [i ][j ]. nombre); printf("Introduce la matricula del alumno numero [%d] [%d]\n",i +1,j +1); scanf("%d",&alum [i ][j ]. matricula); for(k=0;k<max;k++){ printf("Introduce la calificacion %d del alumno numero [%d] [%d]\n",k +1,i +1,j +1); scanf("%f",&alum [i ][j ]. cal[k ]); printf("%f\n",alum [i ][j ]. cal[k ]); alum[i][j].prom=(alum[i][j].cal[k]+alum[i][j].prom); printf("La suma en turno %d es %f\n",k +1, alum [i ][j ]. prom); } alum[i][j].prom =(alum[i][j].prom)/3; printf("El promedio de %s es %f \n",alum [i ][j ]. nombre, alum [i ][j ]. prom); } } for(i=0;i<fila;i++){ for(j=0;j<col;j++){ printf("Nombre: [%s] \t",alum [i ][j ]. nombre); printf("Matricula: [%d] \t",alum [i ][j ]. matricula); printf("Promedio [%.2f] \n",alum [i ][j ]. prom); } } // Liberando los apuntadores de memoria for (i=0;i<fila;i++){ for(j=0;j<col;j++){ } } }
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
Mensajes: 49
|
#include <stdio.h> #include <stdlib.h> #define fila 3 #define col 2 #define max 3 typedef struct infoAlum{ char nombre[15]; int matricula; float cal[2]; float prom; }alumnos; int main(){ alumnos **alum; int i,j,k; float prom; alum = (alumnos **)malloc(fila *sizeof(alumnos *)); // For para columnas for(i=0;i<fila;i++){ alum [i ]=(alumnos *)malloc(col *sizeof(alumnos )); } printf("Introduzca los valores de la matriz\n"); for(i=0;i<fila;i++){ for(j=0;j<col;j++){ printf("Introduce el nombre del alumno numero [%d] [%d]\n",i +1,j +1); scanf("%s", alum [i ][j ]. nombre); printf("Introduce la matricula del alumno numero [%d] [%d]\n",i +1,j +1); scanf("%d",&alum [i ][j ]. matricula); for(k=0;k<max;k++){ printf("Introduce la calificacion %d del alumno numero [%d] [%d]\n",k +1,i +1,j +1); scanf("%f",&alum [i ][j ]. cal[k ]); printf("%f\n",alum [i ][j ]. cal[k ]); alum[i][j].prom=(alum[i][j].cal[k]+alum[i][j].prom); printf("La suma en turno %d es %f\n",k +1, alum [i ][j ]. prom); } alum[i][j].prom =(alum[i][j].prom)/3; printf("El promedio de %s es %f \n",alum [i ][j ]. nombre, alum [i ][j ]. prom); } } for(i=0;i<fila;i++){ for(j=0;j<col;j++){ printf("Nombre: [%s] \t",alum [i ][j ]. nombre); printf("Matricula: [%d] \t",alum [i ][j ]. matricula); printf("Promedio [%.2f] \n",alum [i ][j ]. prom); } } // Liberando los apuntadores de memoria for (i=0;i<fila;i++){ for(j=0;j<col;j++){ } } }
En la línea 36: 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: 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
|
Estás intentando guardar 3 (max) notas en un array de longitud 2 (cal)... 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: for(int i = 0; i < filas; i++) { }
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
wonted
Desconectado
Mensajes: 3
|
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
|
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: variable->campo
Es equivalente a hacer: (*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: 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): printf("%s\n", matriz [i ][j ]. nombre); printf("%s\n", (*(*(matriz + i ) + j )). nombre); // Usando aritmetica de punteros
Podrías simplificar la segunda expresión haciendo uso de la flecha: 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. typedef struct { //... //... } 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: InfoAlumno **alumnos;
|
|
« Última modificación: 24 Octubre 2022, 17:19 pm por K-YreX »
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
wonted
Desconectado
Mensajes: 3
|
Gracias! Entonces lo que he hecho en mi código no está mal para punteros...?
|
|
|
En línea
|
|
|
|
K-YreX
|
Por qué? No entiendo a qué te refieres
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Criticas constructivas... estoy haciendo una page y necesito que la critiquen :)
« 1 2 3 »
Diseño Gráfico
|
Jec
|
29
|
9,630
|
14 Julio 2005, 04:42 am
por Jec
|
|
|
Pasar valores a URL metodo GET, que estoy haciendo mal?
.NET (C#, VB.NET, ASP)
|
TrashAmbishion
|
5
|
3,478
|
30 Mayo 2012, 00:14 am
por seba123neo
|
|
|
ayuda estoy haciendo un encriptador
« 1 2 »
Programación Visual Basic
|
Arconte
|
10
|
6,420
|
11 Julio 2012, 09:26 am
por Yoghurt
|
|
|
programa de matriz aver si el programa q estoy haciendo esta bien
« 1 2 »
Programación C/C++
|
eduardo17445
|
10
|
6,738
|
23 Octubre 2012, 00:11 am
por flony
|
|
|
necesito darle valores a esta matriz y que me de un resultado ayuda porfa
Programación C/C++
|
chrisvel
|
2
|
2,316
|
9 Mayo 2013, 20:49 pm
por cypascal
|
|