Entendidos en C... No doy con el fallo


  • 0

    Es un programa basico de gestion de datos, con un menu simple con opciones para dar de alta un usuario, etc etc. No tengo errores de sintaxis parece, pues el compilador no me salta errores, pero al ejecutar el programa y meter la opcion numero 1, no hace nada, no ejecuta el bloque de codigo asociado

    Como digo, meto la opcion uno y no ocurre nada...

    Gracias de antepolla



  • 1

    Pff mirarlo así me da mucha pereza, justo aprobé C el año pasado, lo tienes en un archivito o algo para que lo ejecute yo? (sin coñas, para un lenguaje del que tengo idea...)
    PD: en qué ide programas?



  • 2

    @OuterDemons dijo:

    Pff mirarlo así me da mucha pereza, justo aprobé C el año pasado, lo tienes en un archivito o algo para que lo ejecute yo? (sin coñas, para un lenguaje del que tengo idea...)
    PD: en qué ide programas?

    Si tengo el archivo.c obviamente, uso en Notepad++ y para poder compilar me baje MinGW (no tengo mucha idea aun, llevo un mes de clase)

    Aqui lo tienes; http://depositfiles.com/files/wlk0a4ubi



  • 3

    Voy a mirarlo, yo uso Eclipse y me va bastante bien con él la verdad.



  • 4

    Hace bastante que no programo en C... Prueba a imprimir la variable opción y ver que has cogido bien el número.

    Si no prueba con fgets, fscanf... hay varias opciones para leer de teclado.



  • 5

    Usa for en lugar de while, por favor.. :facepalm:
    Y separa bien las condiciones, no hagas i<MAX_CLASE&&encontrado==0)...

    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    
    
    #define LON_NOMBRE 200
    #define LON_DNI 10
    #define MAX_CLASE 20 //Aqui marcas el limite de los huecos de la tabla
    
    //MODELO DE DATOS 
    typedef char TDni[LON_DNI];
    typedef char TNombre[LON_NOMBRE];
    
    
    typedef struct{
        TNombre nombre; 
        TDni dni;
        int edad; 
        double altura; 
        int faltas; 
        int asistencias;   
    }TPersona; 
    
    typedef struct
    {
        TPersona datos; 
        int ocupado; 
    }TUnaPersona; 
    
    typedef TUnaPersona TClase [MAX_CLASE]; 
    
    int main(void) 
    {
        TClase miClase;
        //NOTA: Usar el tipo TClase es equivalente a: 
        //TUnaPersona otraClase[MAX_CLASE]; 
        int i; 
        int encontrado;
        int opcion;
        TDni dniBuscar;
        int posicionHueco;
        
        
        for(i=0; i<MAX_CLASE; i++)
        {
            miClase[i].ocupado=0; 
        }
        
        do
        {
            printf("***************************\n");
            printf("GESTION CLASE\n");
            printf("***************************\n");      
            printf("1.Dar alta de una persona:\n");
            printf("2.Dar de baja a una persona:\n");
            printf("3.Modificar una persona:\n");
            printf("4.Mostrar una persona:\n");
            printf("5.Mostrar todas las personas:\n");
            printf("6.Salir:\n");
            printf("Introduzca una opcion:\n");
            scanf("%d", &opcion); 
            fflush(stdin); 
        
    
            printf("Iuauau:\n");
            printf("\nELEGIDA: %d", opcion);
        
                switch(opcion)
                {
                    case 1: //Opcion 1 ____________________________________________________________________________________________________________________________________________________
    				
                    //BUSCANDO UN HUECO EN LA TABLA
    				
                    i=0;
                    encontrado=0;
                    printf("ENTRANDO:\n");
                    for(i=0;i<MAX_CLASE;i++)
                    {
                        if(miClase[i].ocupado==0)  // Si la posicion no esta ocupada: ponemos emcnontrado=1, si esta ocupada, seguimos buscando i++
                        {
                            encontrado=1;
                            break;                  
                        }
                    }
                    if (encontrado==1)  //SALVAR POSICION DEL HUECO EN UNA VARIABLE
                    {
                       
                        
                        posicionHueco=i;
                        printf("Hueco encontrado en:%d\n",i);
                        
                        
                        //LEER EL DNI
                        
                        
                        //miClase[i].ocupado=1; aqui ocupa la posicion que estaba libre (lo pongo para verificar que va bien)
                        printf("Intro dni:\n");
                        gets(dniBuscar);
                        
                        
                        //BUSCAR EL DNI EN LA TABLA
                        i=0;
                        encontrado=0;
                        for(i=0;i<MAX_CLASE;i++)
                        {
                            if(miClase[i].ocupado==1 && strcmp(miClase[i].datos.dni,dniBuscar)==0)
                            {
                                encontrado=1;
                                break;
                            }
                        }
                        if(encontrado==0)
                        {
                            //copiar dni, pedir resto de datos, poner ocupado a 1
                            strcpy(miClase[posicionHueco].datos.dni,dniBuscar);
                            miClase[posicionHueco].ocupado=1;
                            printf("Alta de %s en la posicion %d",dniBuscar,posicionHueco);
                        }
                        else
                        {
                            printf("Error Dni: %s repetido!!\n",dniBuscar);
                        }
                        
                        
                        
                    }
                    else
                    {
                        printf("La tabla esta llena\n");
                    }
                    
                    
                    break; 
                    
                    
                    
                    case 2:
                    break;
                    
                    case 3:
                    break; 
                    
                    case 4:
                    break; 
                    
                    case 5:
                    break; 
                    
                    case 6:
                    break; 
                    
                    default:
    				
                        printf("Opcion no valida:\n"); 
    					
                    break; 
                    
                    
               
                } 
    			system("pause");
    			system("cls");
                
                
        }
        while (opcion!=6);
        {
    		printf("Error, opciones solo de 1 a 6");
    	}	
        
        
        return 0; 
        
        
        
       
    }
    

    En principio debe funcionar, aunque el gets me lo bloquea en mi sistema por que es inseguro..



  • 6

    @msf dijo:

    Usa for en lugar de while, por favor.. :facepalm:
    Y separa bien las condiciones, no hagas i<MAX_CLASE&&encontrado==0)...

    #include <stdio.h> #include <stdlib.h>
    #include <string.h>
    #define LON_NOMBRE 200
    #define LON_DNI 10
    #define MAX_CLASE 20 //Aqui marcas el limite de los huecos de la tabla
    //MODELO DE DATOS 
    typedef char TDni[LON_DNI];
    typedef char TNombre[LON_NOMBRE];
    typedef struct{
        TNombre nombre; 
        TDni dni;
        int edad; 
        double altura; 
        int faltas; 
        int asistencias;   
    }TPersona; 
    typedef struct
    {
        TPersona datos; 
        int ocupado; 
    }TUnaPersona; 
    typedef TUnaPersona TClase [MAX_CLASE]; 
    int main(void) 
    {
        TClase miClase;
        //NOTA: Usar el tipo TClase es equivalente a: 
        //TUnaPersona otraClase[MAX_CLASE]; 
        int i; 
        int encontrado;
        int opcion;
        TDni dniBuscar;
        int posicionHueco;
        
        
        for(i=0; i<MAX_CLASE; i++)
        {
            miClase[i].ocupado=0; 
        }
        
        do
        {
            printf("***************************\n");
            printf("GESTION CLASE\n");
            printf("***************************\n");      
            printf("1.Dar alta de una persona:\n");
            printf("2.Dar de baja a una persona:\n");
            printf("3.Modificar una persona:\n");
            printf("4.Mostrar una persona:\n");
            printf("5.Mostrar todas las personas:\n");
            printf("6.Salir:\n");
            printf("Introduzca una opcion:\n");
            scanf("%d", &opcion); 
            fflush(stdin); 
        
            printf("Iuauau:\n");
            printf("\nELEGIDA: %d", opcion);
        
                switch(opcion)
                {
                    case 1: //Opcion 1 ____________________________________________________________________________________________________________________________________________________
    				
                    //BUSCANDO UN HUECO EN LA TABLA
    				
                    i=0;
                    encontrado=0;
                    printf("ENTRANDO:\n");
                    for(i=0;i<MAX_CLASE;i++)
                    {
                        if(miClase[i].ocupado==0)  // Si la posicion no esta ocupada: ponemos emcnontrado=1, si esta ocupada, seguimos buscando i++
                        {
                            encontrado=1;
                            break;                  
                        }
                    }
                    if (encontrado==1)  //SALVAR POSICION DEL HUECO EN UNA VARIABLE
                    {
                       
                        
                        posicionHueco=i;
                        printf("Hueco encontrado en:%d\n",i);
                        
                        
                        //LEER EL DNI
                        
                        
                        //miClase[i].ocupado=1; aqui ocupa la posicion que estaba libre (lo pongo para verificar que va bien)
                        printf("Intro dni:\n");
                        gets(dniBuscar);
                        
                        
                        //BUSCAR EL DNI EN LA TABLA
                        i=0;
                        encontrado=0;
                        for(i=0;i<MAX_CLASE;i++)
                        {
                            if(miClase[i].ocupado==1 && strcmp(miClase[i].datos.dni,dniBuscar)==0)
                            {
                                encontrado=1;
                                break;
                            }
                        }
                        if(encontrado==0)
                        {
                            //copiar dni, pedir resto de datos, poner ocupado a 1
                            strcpy(miClase[posicionHueco].datos.dni,dniBuscar);
                            miClase[posicionHueco].ocupado=1;
                            printf("Alta de %s en la posicion %d",dniBuscar,posicionHueco);
                        }
                        else
                        {
                            printf("Error Dni: %s repetido!!\n",dniBuscar);
                        }
                        
                        
                        
                    }
                    else
                    {
                        printf("La tabla esta llena\n");
                    }
                    
                    
                    break; 
                    
                    
                    
                    case 2:
                    break;
                    
                    case 3:
                    break; 
                    
                    case 4:
                    break; 
                    
                    case 5:
                    break; 
                    
                    case 6:
                    break; 
                    
                    default:
    				
                        printf("Opcion no valida:\n"); 
    					
                    break; 
                    
                    
               
                } 
    			system("pause");
    			system("cls");
                
                
        }
        while (opcion!=6);
        {
    		printf("Error, opciones solo de 1 a 6");
    	}	
        
        
        return 0; 
        
        
        
       
    }
    

    En principio debe funcionar, aunque el gets me lo bloquea en mi sistema por que es inseguro..

    Coño, que ha dicho el shur que lleva un mes de clase...



  • 7

    usa una tabla de dispersión, eso es altamente ineficiente.



  • 8

    Como os digo llevo un mes de clase, el codigo es tal cual lo puso el profesor, que evidentemente habra forma mas eficiente de hacer un programa asi pero en sentido didactico me fio de que el profesor vaya usando unas maneras para ir aprendiendo progresivamente



  • 9

    @farray no lo he dicho con el tono con el que puede sonar mi comentario, no lo tomes así :) habrá influido un poco algunas cosas que me han pasado últimamente y no me he dado cuenta del tono que podría parecer que lleva. Ánimo con C!



  • 10

    @msf dijo:

    Usa for en lugar de while, por favor.. :facepalm:
    Y separa bien las condiciones, no hagas i<MAX_CLASE&&encontrado==0)...

    #include <stdio.h> #include <stdlib.h>
    #include <string.h>
    #define LON_NOMBRE 200
    #define LON_DNI 10
    #define MAX_CLASE 20 //Aqui marcas el limite de los huecos de la tabla
    //MODELO DE DATOS 
    typedef char TDni[LON_DNI];
    typedef char TNombre[LON_NOMBRE];
    typedef struct{
        TNombre nombre; 
        TDni dni;
        int edad; 
        double altura; 
        int faltas; 
        int asistencias;   
    }TPersona; 
    typedef struct
    {
        TPersona datos; 
        int ocupado; 
    }TUnaPersona; 
    typedef TUnaPersona TClase [MAX_CLASE]; 
    int main(void) 
    {
        TClase miClase;
        //NOTA: Usar el tipo TClase es equivalente a: 
        //TUnaPersona otraClase[MAX_CLASE]; 
        int i; 
        int encontrado;
        int opcion;
        TDni dniBuscar;
        int posicionHueco;
        
        
        for(i=0; i<MAX_CLASE; i++)
        {
            miClase[i].ocupado=0; 
        }
        
        do
        {
            printf("***************************\n");
            printf("GESTION CLASE\n");
            printf("***************************\n");      
            printf("1.Dar alta de una persona:\n");
            printf("2.Dar de baja a una persona:\n");
            printf("3.Modificar una persona:\n");
            printf("4.Mostrar una persona:\n");
            printf("5.Mostrar todas las personas:\n");
            printf("6.Salir:\n");
            printf("Introduzca una opcion:\n");
            scanf("%d", &opcion); 
            fflush(stdin); 
        
            printf("Iuauau:\n");
            printf("\nELEGIDA: %d", opcion);
        
                switch(opcion)
                {
                    case 1: //Opcion 1 ____________________________________________________________________________________________________________________________________________________
    				
                    //BUSCANDO UN HUECO EN LA TABLA
    				
                    i=0;
                    encontrado=0;
                    printf("ENTRANDO:\n");
                    for(i=0;i<MAX_CLASE;i++)
                    {
                        if(miClase[i].ocupado==0)  // Si la posicion no esta ocupada: ponemos emcnontrado=1, si esta ocupada, seguimos buscando i++
                        {
                            encontrado=1;
                            break;                  
                        }
                    }
                    if (encontrado==1)  //SALVAR POSICION DEL HUECO EN UNA VARIABLE
                    {
                       
                        
                        posicionHueco=i;
                        printf("Hueco encontrado en:%d\n",i);
                        
                        
                        //LEER EL DNI
                        
                        
                        //miClase[i].ocupado=1; aqui ocupa la posicion que estaba libre (lo pongo para verificar que va bien)
                        printf("Intro dni:\n");
                        gets(dniBuscar);
                        
                        
                        //BUSCAR EL DNI EN LA TABLA
                        i=0;
                        encontrado=0;
                        for(i=0;i<MAX_CLASE;i++)
                        {
                            if(miClase[i].ocupado==1 && strcmp(miClase[i].datos.dni,dniBuscar)==0)
                            {
                                encontrado=1;
                                break;
                            }
                        }
                        if(encontrado==0)
                        {
                            //copiar dni, pedir resto de datos, poner ocupado a 1
                            strcpy(miClase[posicionHueco].datos.dni,dniBuscar);
                            miClase[posicionHueco].ocupado=1;
                            printf("Alta de %s en la posicion %d",dniBuscar,posicionHueco);
                        }
                        else
                        {
                            printf("Error Dni: %s repetido!!\n",dniBuscar);
                        }
                        
                        
                        
                    }
                    else
                    {
                        printf("La tabla esta llena\n");
                    }
                    
                    
                    break; 
                    
                    
                    
                    case 2:
                    break;
                    
                    case 3:
                    break; 
                    
                    case 4:
                    break; 
                    
                    case 5:
                    break; 
                    
                    case 6:
                    break; 
                    
                    default:
    				
                        printf("Opcion no valida:\n"); 
    					
                    break; 
                    
                    
               
                } 
    			system("pause");
    			system("cls");
                
                
        }
        while (opcion!=6);
        {
    		printf("Error, opciones solo de 1 a 6");
    	}	
        
        
        return 0; 
        
        
        
       
    }
    

    En principio debe funcionar, aunque el gets me lo bloquea en mi sistema por que es inseguro..

    No hay problema. Entonces el fallo por lo que no funcionaba era por tener un While en vez de for? O el fallo de que metieses el 1 y no hiciese nada esta en otro sitio?



  • 11

    @Farray dijo:

    No hay problema. Entonces el fallo por lo que no funcionaba era por tener un While en vez de for? O el fallo de que metieses el 1 y no hiciese nada esta en otro sitio?

    El fallo estaba en que la sentencia while dentro del case 1 lo acababas en punto y coma

    while(i<MAX_CLASE && encontrado==0);
    
    

    quedándose en un bucle infinito

    Hazle caso a @msf o quítale el punto y coma. La verdad es que la lógica no la he mirado, así que no sé si es correcta o no.



  • 12

    @Farray dijo:

    No hay problema. Entonces el fallo por lo que no funcionaba era por tener un While en vez de for? O el fallo de que metieses el 1 y no hiciese nada esta en otro sitio?

    Revisa tu código, tienes errores graves de sintaxis a la hora de crear los while :

    por ejemplo muchos while los inicias de esta forma while(foo);
    si pones un ";" al inicio del while, el while no entrará dentro del cuerpo del bucle, esto solo se hace generalmente en sentencias del tipo "do{}while();" , pero no en un simple while.

    por lo demás lo tienes bien si no fuera porque utilizas la función get/fget junto a la función scanf(), esto suele dar problemas a la hora de leer los caracteres sobre todo en los saltos de linea, mi consejo es que lo sustituyas por scanf.

    Si quieres el código corregido envíame un mp.



  • 13

    Perfecto, el fallo era simplemente los ; en los while que ni habia caido que al ponerlos pasaba eso. Ya me funciona todo como debe.

    Gracias por la ayuda!!



  • 14

    Enero 2015
    277 mensajes

    :facepalm:




Has perdido la conexión. Reconectando a Éxodo.