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

 

 


Tema destacado: Introducción a Git (Primera Parte)


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

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Calificaciones en C - Error al mostrar.
« en: 8 Diciembre 2016, 02:50 am »

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.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>
  5.  
  6. typedef struct materia{
  7.    char nombre[100];
  8.    float cal;
  9. }materia;
  10. typedef struct alumno{
  11.    char apellidoP[15];
  12.    char apellidoM[15];
  13.    char nombre[30];
  14.    materia mat[50];
  15.    int nua;
  16.    char carrera[30];
  17.    struct alumno *s;
  18. }alumno;
  19. void buscar(alumno *p1){
  20.    int op, i=1, nua, nm=0;
  21.    float prom=0;
  22.    printf("\nIngresa el NUA a buscar: ");
  23.    scanf("%d", &nua);
  24.    printf("\n\nNombre\t\t\tNUA\tCalificacion\tCarrera\n");
  25.            while(p1!=NULL)
  26.            {
  27.  
  28.                if(nua==p1->nua)
  29.                {
  30.                    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);
  31.                }
  32.                p1=p1->s;
  33.            }
  34.            if(i==1)
  35.            {
  36.                printf("No se encontraron resultados.\n");
  37.            }
  38. }
  39. int tamanio(alumno *lt){
  40.    if(lt==NULL)
  41.        return 0;
  42.    else
  43.        return tamanio(lt->s)+1;
  44. }
  45. alumno *ingresar(alumno *p1){
  46.    int op, P, nm=0, Q=0;
  47.    float Cal, prom, Con=0;
  48.    {
  49.        int ch;
  50.  
  51.        while ((ch = getchar()) != EOF && ch != '\n')
  52.            ;
  53.    }
  54.    alumno *A, *aux;
  55.    A=(alumno*)malloc(sizeof(alumno));
  56.    printf("Nombre: ");
  57.    gets(A->nombre);
  58.    printf("Apellido paterno: ");
  59.    scanf("%s", A->apellidoP);
  60.    printf("Apellido materno: ");
  61.    scanf("%s", A->apellidoM);
  62.    printf("NUA: ");
  63.    scanf("%d", &(A->nua));
  64.    printf("Carrera: ");
  65.    {
  66.        int ch;
  67.  
  68.        while ((ch = getchar()) != EOF && ch != '\n')
  69.            ;
  70.    }
  71.    gets(A->carrera);
  72.    A->s=NULL;
  73.    if(p1==NULL)
  74.        p1=A;
  75.    else
  76.    {
  77.        aux=p1;
  78.        while(aux->s!=NULL)
  79.            aux=aux->s;
  80.        aux->s=A;
  81.    }
  82.    printf("\nDesea ingresar materias?\n1. Si\n2. No\nOpcion: ");
  83.    scanf("%d", &op);
  84.    switch(op)
  85.    {
  86.        case 1:
  87.            while(op!=2)
  88.            {
  89.                printf("\nIngrese el nombre de la materia: ");
  90.                scanf("%s", p1->mat[nm].nombre);
  91.                printf("\nIngrese calificacion de la materia: ");
  92.                scanf("%f", &(A->mat[nm].cal));
  93.                printf("\nDesea agregar otra materia?\n1. Si\n2. No\nOpcion: ");
  94.                scanf("%d", &op);
  95.                if(op==1)
  96.                {
  97.                    nm++;
  98.                }
  99.            }
  100.            for( op=0;op<=nm;op++){
  101.                printf("\n%s. Y la calificación ingresada es:", p1->mat[op].nombre);
  102.                printf("%f\n",p1->mat[op].cal);
  103.            }
  104.    break;
  105.        case 2 :
  106.            break;
  107.  
  108.  
  109.    return p1;
  110. }
  111. }
  112. void mostrar(alumno *p1){
  113.    int i=1;
  114.    printf("\n\nNombre\t\t\tNUA\tCalificacion\tCarrera\n");
  115.    while(p1!=NULL)
  116.    {
  117.        printf("%d. %s %s %s %d, %s\t\n", i++, p1->nombre, p1->apellidoP, p1->apellidoM, p1->nua, p1->carrera);
  118.        p1=p1->s;
  119.    }
  120. }
  121. int main(){
  122.    alumno *p1=NULL;
  123.    int op;
  124.    do{
  125.        printf("MENU:\n");
  126.        printf("1. Ingresar un alumno.\n");
  127.        printf("2. Mostrar alumnos.\n");
  128.        printf("3. Buscar.\n");
  129.        printf("Opcion: ");
  130.        scanf("%d", &op);
  131.        switch(op)
  132.        {
  133.            case 1:
  134.                p1=ingresar(p1);
  135.                break;
  136.            case 2:
  137.                mostrar(p1);
  138.                break;
  139.            case 3:
  140.                buscar(p1);
  141.                break;
  142.            default:
  143.                printf("Opcion no valida.\n");
  144.        }
  145.    }while(op!=8);
  146.  
  147.    return 0;
  148.  
  149. }
  150.  
Gracias de antemano.


« Última modificación: 8 Diciembre 2016, 02:56 am por Samuelfrm » En línea

jvm1994

Desconectado Desconectado

Mensajes: 29



Ver Perfil
Re: Calificaciones en C - Error al mostrar.
« Respuesta #1 en: 8 Diciembre 2016, 16:58 pm »

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.

Código
  1. #define CANTIDAD_ALUMNOS 10
  2.  
  3. alumnos activos[CANTIDAD_ALUMNOS];
  4. // De esta manera vas a tener espacio en memoria para 10 alumnos.
  5.  
  6. ///Entonces podrías recorrerlo de la siguente manera
  7.  
  8. for(i=0; i <= CANTIDAD_ALUMNOS; i++)
  9. {
  10. printf("Alumno: %s"), activos[i].nombre;
  11. }
  12.  
  13. // Lo que deberías tener en cuenta es que en este caso
  14. // Te va a imprimir tus 10 espacios en memoria
  15. // Por lo que deberías agregar a tu estructura un FLAG
  16. // Que indique si el alumno está activo o no
  17. // Y A la hora de hacer el alta, cuando das el alta al alumno
  18. // Le pones el flag en 1
  19.  
  20. // Entonces imprimis así
  21.  
  22.  
  23. for(i=0; i <= CANTIDAD_ALUMNOS; i++)
  24. {
  25.    if(activos[i].flagEstado == 1)
  26.    {
  27.    printf("Alumno: %s"), activos[i].nombre;
  28.    }
  29. }
  30.  
  31.  

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."
Código
  1. int main()
  2. {
  3. eMundo * Own = world_new();
  4. if(Own != NULL)
  5. {
  6.    world_create(Own);
  7. }
  8.  
  9. return 0;
  10. }
Samuelfrm

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Calificaciones en C - Error al mostrar.
« Respuesta #2 en: 9 Diciembre 2016, 01:25 am »

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 Desconectado

Mensajes: 29



Ver Perfil
Re: Calificaciones en C - Error al mostrar.
« Respuesta #3 en: 9 Diciembre 2016, 16:28 pm »

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.

Código
  1. alumno *puntero = NULL;
  2. // Actualmente el puntero apunta a null.
  3.  
  4. agregarAlumno(puntero);
  5. // Se agrega un alumno
  6. // Actualmente puntero apunta a la dirección 1.
  7. agregarAlumno(puntero);
  8. // Se agrega otro alumno
  9. // Actualmente puntero apunta a la dirección 2.
  10.  
  11. // Ahora no tenes manera de volver a apuntar a la dirección uno.
  12. // De modo que perdiste la referencia a tu alumno anterior.
  13. // Por lo que no es posible "mostrar tu alumno"
  14.  
  15.  

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.

Código
  1. int CANTIDAD_DE_ALUMNOS = 10;
  2. alumno **alumnos[CANTIDAD_DE_ALUMNOS];
  3.  
  4. // De esta manera tendrías espacio para almacenar diez alumnos.
  5. // Lo único que deberías hacer es almacenar la dirección de memoria en alguno de //los indices
  6.  
  7. // Por ejemplo.
  8.  
  9. alumno *puntero = NULL;
  10. agregarAlumno(puntero);
  11. // Puntero apunta a la direccion 1 y tiene un alumno cargado.
  12.  
  13. alumnos[0] = p1; // Guardamos la dirección del alumno anterior.
  14. // alumnos[0]  apunta a la direccion 1
  15.  
  16. agregarAlumno(puntero);
  17. // Puntero apunta a 2 y tiene un alumno cargado.
  18.  
  19. alumnos[1] = p1; // Guardamos la dirección del alumno anterior.
  20. // alumnos[0]  apunta a la direccion 2
  21.  
  22.  
En línea

"La posibilidad de crear tu mundo."
Código
  1. int main()
  2. {
  3. eMundo * Own = world_new();
  4. if(Own != NULL)
  5. {
  6.    world_create(Own);
  7. }
  8.  
  9. return 0;
  10. }
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error Al Mostrar Datos
Programación Visual Basic
Rudy21 1 1,696 Último mensaje 16 Noviembre 2008, 18:22 pm
por seba123neo
Pregunta Error al mostrar reporte en IIS
Desarrollo Web
javb2018 0 2,988 Último mensaje 31 Agosto 2012, 23:37 pm
por javb2018
Asunto De Calificaciones (Ayuda!)
Programación Visual Basic
LuisM_23 1 1,463 Último mensaje 14 Julio 2015, 16:13 pm
por 79137913
Error al mostrar variable en un jlabel
Java
JenselG 1 2,949 Último mensaje 17 Octubre 2017, 16:42 pm
por Angel wing
Selectividad 2020: Cómo consultar calificaciones y notas de corte
Noticias
El_Andaluz 1 1,947 Último mensaje 23 Junio 2020, 11:13 am
por crazykenny
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines