Autor
|
Tema: Calificaciones en C - Error al mostrar. (Leído 2,420 veces)
|
Samuelfrm
Desconectado
Mensajes: 2
|
Sucede que a la hora de llamar mostrar, y buscar (relativamente lo mismo), se me crashea. Por lo visto tiene que ver con calificación, o no tengo ni idea, ¿Qué puede estar sucediendo?. Sin contenido en las estructuras (usar la opción mostrar sin antes meter algo), funciona, de igual forma buscar, pero el problema es cuando relleno; Ya no me deja usarlas, crashea. #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> typedef struct materia{ char nombre[100]; float cal; }materia; typedef struct alumno{ char apellidoP[15]; char apellidoM[15]; char nombre[30]; materia mat[50]; int nua; char carrera[30]; struct alumno *s; }alumno; void buscar(alumno *p1){ int op, i=1, nua, nm=0; float prom=0; printf("\nIngresa el NUA a buscar: "); printf("\n\nNombre\t\t\tNUA\tCalificacion\tCarrera\n"); while(p1!=NULL) { if(nua==p1->nua) { printf("%d. %s %s %s %d, %f, %s\t\n", i ++, p1 ->nombre , p1 ->apellidoP , p1 ->apellidoM , p1 ->nua , p1 ->mat [nm ]. cal, p1 ->carrera ); } p1=p1->s; } if(i==1) { printf("No se encontraron resultados.\n"); } } int tamanio(alumno *lt){ if(lt==NULL) return 0; else return tamanio(lt->s)+1; } alumno *ingresar(alumno *p1){ int op, P, nm=0, Q=0; float Cal, prom, Con=0; { int ch; while ((ch = getchar()) != EOF && ch != '\n') ; } alumno *A, *aux; A =(alumno *)malloc(sizeof(alumno )); scanf("%s", A ->apellidoP ); scanf("%s", A ->apellidoM ); { int ch; while ((ch = getchar()) != EOF && ch != '\n') ; } A->s=NULL; if(p1==NULL) p1=A; else { aux=p1; while(aux->s!=NULL) aux=aux->s; aux->s=A; } printf("\nDesea ingresar materias?\n1. Si\n2. No\nOpcion: "); switch(op) { case 1: while(op!=2) { printf("\nIngrese el nombre de la materia: "); scanf("%s", p1 ->mat [nm ]. nombre); printf("\nIngrese calificacion de la materia: "); scanf("%f", &(A ->mat [nm ]. cal)); printf("\nDesea agregar otra materia?\n1. Si\n2. No\nOpcion: "); if(op==1) { nm++; } } for( op=0;op<=nm;op++){ printf("\n%s. Y la calificación ingresada es:", p1 ->mat [op ]. nombre); printf("%f\n",p1 ->mat [op ]. cal); } break; case 2 : break; return p1; } } void mostrar(alumno *p1){ int i=1; printf("\n\nNombre\t\t\tNUA\tCalificacion\tCarrera\n"); while(p1!=NULL) { printf("%d. %s %s %s %d, %s\t\n", i ++, p1 ->nombre , p1 ->apellidoP , p1 ->apellidoM , p1 ->nua , p1 ->carrera ); p1=p1->s; } } int main(){ alumno *p1=NULL; int op; do{ printf("1. Ingresar un alumno.\n"); printf("2. Mostrar alumnos.\n"); switch(op) { case 1: p1=ingresar(p1); break; case 2: mostrar(p1); break; case 3: buscar(p1); break; default: printf("Opcion no valida.\n"); } }while(op!=8); return 0; }
Gracias de antemano.
|
|
« Última modificación: 8 Diciembre 2016, 02:56 am por Samuelfrm »
|
En línea
|
|
|
|
jvm1994
Desconectado
Mensajes: 29
|
A ver veamos... vos tenes un puntero p1 y en ese puntero das de alta un usuario.. y después con un while recorres el puntero?? El puntero es uno sólo, sí cada vez que vos das de alta un usuario lo das de alta asignando un nuevo espacio en memoria a ese puntero con malloc, perdes la referencia a la direccion de memoria anterior.. es decir después cuando lo busques no vas a saber donde buscarlo, por que no existe un puntero que apunte allí. Lo más recomendable sería trabajar con un array de entidades.. es decir, tenes la estructura alumnos y declaras una variable de la siguiente manera. #define CANTIDAD_ALUMNOS 10 alumnos activos[CANTIDAD_ALUMNOS]; // De esta manera vas a tener espacio en memoria para 10 alumnos. ///Entonces podrías recorrerlo de la siguente manera for(i=0; i <= CANTIDAD_ALUMNOS; i++) { printf("Alumno: %s"), activos [i ]. nombre; } // Lo que deberías tener en cuenta es que en este caso // Te va a imprimir tus 10 espacios en memoria // Por lo que deberías agregar a tu estructura un FLAG // Que indique si el alumno está activo o no // Y A la hora de hacer el alta, cuando das el alta al alumno // Le pones el flag en 1 // Entonces imprimis así for(i=0; i <= CANTIDAD_ALUMNOS; i++) { if(activos[i].flagEstado == 1) { printf("Alumno: %s"), activos [i ]. nombre; } }
Ahora deberías dar información, que querés que haga tu programa, cómo?, utilizando alguna técnica en particular??? Sí lo que querés es trabajar con punteros podés hacer algo similar utilizando un array de punteros. Ahí ya es preferible recurrir a el método de ArrayList.. algo que tiene más una orientación a paradigma de objetos, yo tengo desarrolladas por mí unas excelentes librerías de array list en C, que muy probablemente te ayuden a solucionar esto en unos simples minutos, además están bien documentadas.
|
|
« Última modificación: 8 Diciembre 2016, 16:59 pm por jvm1994 »
|
En línea
|
"La posibilidad de crear tu mundo." int main() { eMundo * Own = world_new(); if(Own != NULL) { world_create(Own); } return 0; }
|
|
|
Samuelfrm
Desconectado
Mensajes: 2
|
Hola, buenas noches. Mira, es un "Kardex", vaya, una boleta de calficaciones. En esta ingreso el todo lo del a estructura, nombre, apellido materno, paterno, numero único de alumno, X calificación de X materias, y quiero ingresar X alumnos, vaya, que al ingresarlos, y pida "mostrar", me muestre toda la información del alumno tal cual lo tengo, y el promedio. El error comienza cuando ingreso calificaciones, no se como meterlas, si borro lo que es "Ingres calificaciones", me muestra toda la información del alumno,p oer sin calificaciones obvio. No se como deba de ingresar las X calificaciones, para que al final me de el promedio de todo. Gracias de antemano, espero haberme explicado.
|
|
|
En línea
|
|
|
|
jvm1994
Desconectado
Mensajes: 29
|
Sí, eso lo entiendo, pero a ver.. recurramos a un poco de teoría básica de punteros. Supongamos que tenes un entero, este entero lo vas a almacenar en X espacio de memoria, este espacio va a tener su respectiva dirección de memoria.. en fin, lo importante es que una dirección de memoria corresponde a un espacio. Cuando usas el WHILE, imagino que lo que estás intentando hacer es recorrer varias direcciones de memoria para ir leyendo los diferentes espacios, es decir en donde se encuentran tus "alumnos en este caso". El tema es el siguiente, vos lo que estás haciendo es cada vez que almacenas un alumno aplicas a el puntero p1 un malloc, asignando un nuevo espacio en memoria para un nuevo alumno, el problema es que al hacer eso perdes la referencia. alumno *puntero = NULL; // Actualmente el puntero apunta a null. agregarAlumno(puntero); // Se agrega un alumno // Actualmente puntero apunta a la dirección 1. agregarAlumno(puntero); // Se agrega otro alumno // Actualmente puntero apunta a la dirección 2. // Ahora no tenes manera de volver a apuntar a la dirección uno. // De modo que perdiste la referencia a tu alumno anterior. // Por lo que no es posible "mostrar tu alumno"
Para evitar esto vas a tener que trabajar con algún arreglo. Podría ser un array de punteros del tipo alumno. Es decir un array que almacene punteros. int CANTIDAD_DE_ALUMNOS = 10; alumno **alumnos[CANTIDAD_DE_ALUMNOS]; // De esta manera tendrías espacio para almacenar diez alumnos. // Lo único que deberías hacer es almacenar la dirección de memoria en alguno de //los indices // Por ejemplo. alumno *puntero = NULL; agregarAlumno(puntero); // Puntero apunta a la direccion 1 y tiene un alumno cargado. alumnos[0] = p1; // Guardamos la dirección del alumno anterior. // alumnos[0] apunta a la direccion 1 agregarAlumno(puntero); // Puntero apunta a 2 y tiene un alumno cargado. alumnos[1] = p1; // Guardamos la dirección del alumno anterior. // alumnos[0] apunta a la direccion 2
|
|
|
En línea
|
"La posibilidad de crear tu mundo." int main() { eMundo * Own = world_new(); if(Own != NULL) { world_create(Own); } return 0; }
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Error Al Mostrar Datos
Programación Visual Basic
|
Rudy21
|
1
|
1,699
|
16 Noviembre 2008, 18:22 pm
por seba123neo
|
|
|
Pregunta Error al mostrar reporte en IIS
Desarrollo Web
|
javb2018
|
0
|
2,995
|
31 Agosto 2012, 23:37 pm
por javb2018
|
|
|
Asunto De Calificaciones (Ayuda!)
Programación Visual Basic
|
LuisM_23
|
1
|
1,467
|
14 Julio 2015, 16:13 pm
por 79137913
|
|
|
Error al mostrar variable en un jlabel
Java
|
JenselG
|
1
|
2,965
|
17 Octubre 2017, 16:42 pm
por Angel wing
|
|
|
Selectividad 2020: Cómo consultar calificaciones y notas de corte
Noticias
|
El_Andaluz
|
1
|
1,970
|
23 Junio 2020, 11:13 am
por crazykenny
|
|