Calificaciones en C - Error al mostrar.

Mensajes
4
Puntuación de reacción
0
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

PHP:
#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: ");
    scanf("%d", &nua);
    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));
    printf("Nombre: ");
    gets(A->nombre);
    printf("Apellido paterno: ");
    scanf("%s", A->apellidoP);
    printf("Apellido materno: ");
    scanf("%s", A->apellidoM);
    printf("NUA: ");
    scanf("%d", &(A->nua));
    printf("Carrera: ");
    {
        int ch;
 
        while ((ch = getchar()) != EOF && ch != '\n')
            ;
    }
    gets(A->carrera);
    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: ");
    scanf("%d", &op);
    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: ");
                scanf("%d", &op);
                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("MENU:\n");
        printf("1. Ingresar un alumno.\n");
        printf("2. Mostrar alumnos.\n");
        printf("3. Buscar.\n");
        printf("Opcion: ");
        scanf("%d", &op);
        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.

Relajarse: message tones download, happy new year abba ringtone, best ringtone
 
Última edición:
Arriba