Programación General > C/C++

 Error al imprimir un campo de un registro, devuelve "ZERO"

(1/4) > >>

huevofritopamojarpan:

--- Código: C --- #include <stdio.h>#include <string.h>#include <time.h>#include <stdlib.h>  //Constantes #define USUARIO "root"#define PASSWORD "7"#define STRING_CORTO 21#define STRING_LARGO 42  ///////////////////////////////////////////////////////////////////////////////////////////////////  //Declaración de los tipos de variables //Tipo de dato fecha.typedef struct{     int ano, mes, dia, hora, min, seg; }tipo_fecha; //Tipo de dato usuario.typedef struct{     char login[21], password[21], nombre[21], apellido[42], ext[6];     tipo_fecha ult_reserva; }tipo_usuario; //Tipo de dato reservatypedef struct{    unsigned short int ocupado;    tipo_usuario usuario;}tipo_reserva;  /////////////////////////////////////////////////////////////////////////////////////////////////////OK    Inserta en el primer usuario los datos del segundovoid copiar_usuario(tipo_usuario *usuario_d, tipo_usuario *usuario_s){    strcpy(usuario_d->login,usuario_s->login);    strcpy(usuario_d->password,usuario_s->password);    strcpy(usuario_d->nombre,usuario_s->nombre);    strcpy(usuario_d->apellido,usuario_s->apellido);    strcpy(usuario_d->ext,usuario_s->ext);} //OK    Compara dos usuarios, devuelve 0 si no coinciden en nada, 1 si coinciden en login y password, y 2 si coinciden en todounsigned short int usuario_cmp(tipo_usuario *usuario1, tipo_usuario *usuario2){    if ((strcmp(usuario1->login,    usuario2->login)==0) &&        (strcmp(usuario1->password, usuario2->password)==0) &&        (strcmp(usuario1->nombre,   usuario2->nombre)==0) &&        (strcmp(usuario1->apellido, usuario2->apellido)==0) &&        (strcmp(usuario1->ext,      usuario2->ext)==0)) {printf("2");return 2;}    else if (((strcmp(usuario1->login,usuario2->login)==0) && (strcmp(usuario1->password,usuario2->password)==0)) ||             ((strcmp(usuario1->nombre,usuario2->nombre)==0) && (strcmp(usuario1->apellido,usuario2->apellido)==0))) return 1;    else return 0;} //OK    Devuelve un 1 si se loguea correctamente como usuario y un 0 si no. Si se loguea el root devuelve 2; unsigned short int login(tipo_usuario *usuario, tipo_usuario *lista_usuarios){    unsigned short int i;    printf("Login: ");gets((usuario->nombre));    printf("Password %d: ",*(usuario->nombre));scanf("%20s",&(usuario->password));    if((strcmp(usuario->login,USUARIO)==0) && (strcmp(usuario->password,PASSWORD)==0)) {printf("nLogueado como administradorn"); return 2;}    else    {         for(i=0;i<10;i++)        {            if (usuario_cmp(usuario,lista_usuarios+i)==0)            {                copiar_usuario(usuario,(lista_usuarios+i));                printf("Hola %s",(usuario->nombre));                return 1;                break;                break;             }           }        return 0;    }} //OK    Intruce en la matriz de reservas, en la fecha (formato real) una reserva realizada por el usuario.void reservar(tipo_reserva *matriz_reservas, tipo_fecha *fecha, tipo_usuario *usuario){    if (usuario==NULL) (matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->ocupado=0;    else    {        (matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->ocupado=1;        copiar_usuario(&((matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->usuario),usuario);    }} //OK    Inicializa a cero y luego carga el fichero de datos. El formato del fichero es "mes:dia:hora:nombre:apellidos:"void inicializar_reservas(tipo_reserva *matriz_reservas){    tipo_fecha fecha;    unsigned short int i;    char linea[64],*aux;    tipo_usuario usuario;        for(fecha.mes=0;fecha.mes<12;fecha.mes++)for(fecha.dia=0;fecha.dia<31;fecha.dia++)for(fecha.hora=0;fecha.hora<13;fecha.hora++)    {(matriz_reservas+(31*13)*fecha.mes+13*fecha.dia+fecha.hora)->ocupado=0;}    FILE *archivo_reservas;    archivo_reservas=fopen("reservas.dat","r");    while(!feof(archivo_reservas))//Por qué no funciona ftell solo?    {        fseek(archivo_reservas,-1,SEEK_CUR);        fscanf(archivo_reservas,"%d",&fecha.mes);        fseek(archivo_reservas,1,SEEK_CUR);        fscanf(archivo_reservas,"%d",&fecha.dia);        fseek(archivo_reservas,1,SEEK_CUR);        fscanf(archivo_reservas,"%d",&fecha.hora);        fseek(archivo_reservas,1,SEEK_CUR);        fgets(linea,64,archivo_reservas);        //revisar, hay una forma mejor????        aux=linea;        aux=strtok(linea,":");        strcpy(usuario.nombre,aux);        aux+=strlen(usuario.nombre)+1;        aux=strtok(aux,":");        strcpy(usuario.apellido,aux);        reservar(matriz_reservas,&fecha,&usuario);    }    fclose(archivo_reservas); } //      Inicializar usuarios. Carga los usuarios del archivo de texto en un array.void inicializar_usuarios(tipo_usuario *lista_usuarios){    unsigned short int i;    char *aux, linea[128];    FILE *archivo_usuarios;    archivo_usuarios=fopen("usuarios.dat","r");    if (archivo_usuarios==NULL) printf("anArchivo de usuarios no encontradon");    else    {        fread(&i,1,1,archivo_usuarios);        i=(int)i;//????????????????????????Es imprescindible esto??????????????????        lista_usuarios=(tipo_usuario*)malloc(i*sizeof(tipo_usuario));        i=0;        while(!feof(archivo_usuarios))        {            //fseek(archivo_usuarios,-1,SEEK_CUR);            fgets(linea,128,archivo_usuarios);            //login            aux=strtok(linea,":");            strcpy((lista_usuarios+i)->login,aux);            //password            aux=aux+strlen((lista_usuarios+i)->login)+1;            aux=strtok(aux,":");            strcpy((lista_usuarios+i)->password,aux);            //nombre            aux=aux+strlen((lista_usuarios+i)->password)+1;            aux=strtok(aux,":");            strcpy((lista_usuarios+i)->nombre,aux);            //apellido            aux=aux+strlen((lista_usuarios+i)->nombre)+1;            aux=strtok(aux,":");            strcpy((lista_usuarios+i)->apellido,aux);            //extensión            aux=aux+strlen((lista_usuarios+i)->apellido)+1;            aux=strtok(aux,":");            strcpy((lista_usuarios+i)->ext,aux);            printf("%sn",(lista_usuarios+i)->apellido);            i++;        }    }    fclose(archivo_usuarios);}     //OK    Guarda las reservas en reservas.datvoid guardar(tipo_reserva *matriz_reservas){    unsigned short int hora,dia,mes;    FILE *archivo_reservas;    archivo_reservas=fopen("reservas.dat","w");    for(mes=0;mes<12;mes++)for(dia=0;dia<31;dia++)for(hora=0;hora<13;hora++)if((matriz_reservas+(31*13)*mes+13*dia+hora)->ocupado==1)    {        fprintf(archivo_reservas,"%d:%d:%d:%s:%s:n",mes+1,dia+1,hora+8,                (matriz_reservas+(31*13)*mes+13*dia+hora)->usuario.nombre,(matriz_reservas+(31*13)*mes+13*dia+hora)->usuario.apellido);    }        fclose(archivo_reservas);} //OK    Muestra el menú en pantalla y devuelve el int opciónunsigned short int menu(){    unsigned short int opcion;    printf("n1 - Introduccion de datos personalesn");    printf("2 - Consulta de reservas por mesn");    printf("3 - Consulta de reservas del usuarion");    printf("4 - Creacion de reservasn");    printf("5 - Borrado de reservasn");    printf("6 - Volver al menu inicialn");    scanf("%d",&opcion);    return opcion;    } //OK    Introduce usuario. Ahora es inútil. Dejo el código por si me fuese útil posteriormente.void introducir_datos(tipo_usuario *usuario){    printf("nSu nombre: ");gets(usuario->nombre);    printf("nSus apellidos: ");gets(usuario->apellido);    printf("nSu extensión telefónica: ");gets(usuario->ext);} //OK    Saca por pantalla una fecha de la matriz_reserva, y muestra si está ocupada o librevoid imprimir_reserva(tipo_reserva *matriz_reservas, tipo_fecha *fecha){    if ((matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->ocupado==1)    {        printf("nEl dia %d del mes %d a las %d la sala ha sido reservada por %s %sn",               fecha->dia,fecha->mes,fecha->hora,(matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->usuario.nombre,               (matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->usuario.apellido);    }    else printf("nEl dia %d del mes %d a las %d el aula está libren",fecha->dia,fecha->mes,fecha->hora);} //OK Presenta en pantalla las reservas de un mes o de un usuario    void consultar_reservas(tipo_reserva *matriz_reservas, tipo_usuario *usuario){    tipo_fecha fecha;    int numero;    numero=0;    if (usuario==NULL)    {        while(1)        {            printf("nNumero del mes a consultar: ");            scanf("%d",&fecha.mes);            printf("%d",fecha.mes);            if ((fecha.mes>12) || (fecha.mes<1)) printf("nNumero de mes no valido.n");            else break;        }        for(fecha.dia=1;fecha.dia<32;fecha.dia++)for(fecha.hora=8;fecha.hora<21;fecha.hora++)        {            if ((matriz_reservas+(13*31*(fecha.mes-1))+(13*(fecha.dia-1))+(fecha.hora-8))->ocupado!=0)            {                imprimir_reserva(matriz_reservas, &fecha);                numero++;            }        }    }            else    {        for(fecha.mes=1;fecha.mes<13;fecha.mes++)for(fecha.dia=1;fecha.dia<32;fecha.dia++)for(fecha.hora=8;fecha.hora<21;fecha.hora++)            if (((matriz_reservas+(13*31*(fecha.mes-1))+(13*(fecha.dia-1))+(fecha.hora-8))->ocupado!=0) &&                (usuario_cmp(&((matriz_reservas+(13*31*(fecha.mes-1))+(13*(fecha.dia-1))+(fecha.hora-8))->usuario),usuario)>0))            {                imprimir_reserva(matriz_reservas, &fecha);                numero++;            }    }    if(usuario!=NULL) printf("nEl usuario actual ha realizado %d reservasn",numero);    else printf("nHay %d reservas en el mes %dn",numero,fecha.mes);} //OK    Funcion para comprobar que una fecha tiene un formato correctounsigned short int validar_fecha(tipo_fecha f){    unsigned short int valida=1;    //Compruebo si la fecha "existe"    if ((f.dia<1 || f.dia>31 || f.mes>12 || f.mes<1) || (f.hora<8 || f.hora>20)) valida=0;    else    {        if (f.mes==2)        {            if (f.dia>29) valida=0;            else if (((f.ano%4!=0) || ((f.ano%100==0) && (f.ano%400!=0)))    && (f.dia>28)) valida=0;             }        else        {            if (f.mes%2==0)            {                if ((f.mes<=7) && (f.dia>30)) valida=0;            }            else if ((f.mes>8) && (f.dia>30)) valida=0;          }    }    //Compruebo que la fecha sea mayor que el momento actual;      if (valida==1)    {        struct tm *ahora;        time_t segundos=time(0);        ahora=localtime(&segundos);        if ( ahora->tm_mon+1>f.mes ||            (ahora->tm_mon+1==f.mes && ahora->tm_mday>f.dia) ||            (ahora->tm_mon+1==f.mes && ahora->tm_mday==f.dia && ahora->tm_hour>f.hora)) valida=0;    }        return valida;} //OK    Crear reservavoid tratar_reserva(tipo_reserva *matriz_reservas, tipo_usuario *usuario, int opcion){    tipo_fecha fecha, fecha1, fecha2;    //Cambiar esto para usar la librería time.h    fecha.ano=2009;    char confirmacion;    unsigned short int contador=0;    do    {        printf("nDatos de la reserva:n   Mes: ");scanf("%d",&fecha1.mes);        printf("   Dia: ");scanf("%d",&fecha1.dia);        printf("   Horas de la reserva (de 8 a 21)n    hora de inicio: ");scanf("%d",&fecha1.hora);        fecha2=fecha;        printf("    hora de finalizacion: ");scanf("%d",&fecha2.hora);        if (validar_fecha(fecha1) && (fecha2.hora<22) && (fecha2.hora>=fecha1.hora)) break;        else printf("anFecha y/u hora incorrectasn");    }while(1);        fecha=fecha1;    //Comprobar si las horas están ocupadas o no    if (opcion==1) contador=fecha2.hora-fecha1.hora;    do    {        if ((opcion*(matriz_reservas+13*31*(fecha.mes-1)+13*(fecha.dia-1)+fecha.hora-8)->ocupado)==1) contador--;        else if (usuario_cmp(&((matriz_reservas+13*31*(fecha.mes-1)+13*(fecha.dia-1)+fecha.hora-8)->usuario),usuario)>0) contador++;        imprimir_reserva(matriz_reservas,&(fecha));        fecha.hora++;    }while(fecha.hora<fecha2.hora);    fecha=fecha1;    if (!contador>0)        if(opcion==1) printf("nHoras no disponiblesn");        else printf("No ha realizado ninguna reserva en estas horas");    if (contador>0)    {        if(opcion==1)        {            printf("nEstán disponibles %d de las %d horas que ha solicitado.nRealizar la reserva? (S/N): ",contador,fecha2.hora-fecha1.hora);            scanf("%s",&confirmacion);            if ((strcmp(&confirmacion,"S")==0) || (strcmp(&confirmacion,"s")==0))             {                time_t segundos;                segundos=time(0);                struct tm *ahora;                ahora=localtime(&segundos);                //Esto es uan chapuza, hay que cambiar el tipo fecha por el estándar de time;                usuario->ult_reserva.ano=ahora->tm_year;                usuario->ult_reserva.mes=ahora->tm_mon;                usuario->ult_reserva.dia=ahora->tm_mday;                usuario->ult_reserva.hora=ahora->tm_hour;                usuario->ult_reserva.min=ahora->tm_min;                usuario->ult_reserva.seg=ahora->tm_sec;                do                {                    reservar(matriz_reservas, &fecha, usuario);                    imprimir_reserva(matriz_reservas, &fecha);                    fecha.hora++;                }while(fecha.hora<fecha2.hora);            }            else printf("nReserva no realizadan");        }        if(opcion==0)        {            printf("nPueden borrarse %d de las %d horas que ha solicitado.nRealizar la reserva? (S/N): ",contador,fecha2.hora-fecha1.hora);            scanf("%s",&confirmacion);            if ((strcmp(&confirmacion,"S")==0) || (strcmp(&confirmacion,"s")==0))            {                do                {                    reservar(matriz_reservas, &fecha, NULL);                    imprimir_reserva(matriz_reservas, &fecha);                    fecha.hora++;                }while(fecha.hora<fecha2.hora);                printf("nBorrado realizadon");                 }            else printf("nBorrado no realizadon");         }    }}  ///////////////////////////////////////////////////////////////////////////////        int main()  {    //Declaración de las variables    char basura, log;    unsigned short int mes,dia,hora;    char opcion,confirmacion;    char nombre[STRING_CORTO], password[STRING_CORTO];    tipo_usuario usuario, *lista_usuarios;    tipo_fecha fecha;    //los índices de los arrays: mes,dia,hora    tipo_reserva matriz_reservas[122][31][13];    inicializar_reservas(&(matriz_reservas[0][0][0]));    inicializar_usuarios(lista_usuarios);    do    {        printf("nEscoja una opcion:n");        printf("n1 - Loguearsen2 - Salirn");        scanf("%d",&opcion);        scanf("%c",&basura);        if (opcion==1)        {            log=login(&usuario,lista_usuarios);            do            {                opcion=menu(log);                scanf("%c",&basura);                switch(opcion)                {                    case 1: introducir_datos(&usuario);break;                    case 2: consultar_reservas(&(matriz_reservas[0][0][0]),NULL);break;                    case 3: consultar_reservas(&(matriz_reservas[0][0][0]),&usuario);break;                    case 4: tratar_reserva(&(matriz_reservas[0][0][0]),&usuario,1);break;                    case 5: tratar_reserva(&(matriz_reservas[0][0][0]),&usuario,0);break;                    case 6: usuario.nombre[0]=0;usuario.apellido[0]=0;guardar(&(matriz_reservas[0][0][0]));break;                      default: printf("anOpcion incorrectan");break;                }            }while(opcion!=6);        }        else if (opcion==2) break;        else printf("anOpcion incorrectan");    }while(1);    printf("nFIN DEL PROGRAMAnn");}  
Por qué la linea 69 imprime "ZERO" en lugar del contenido del registro? Llevo rayándome pero no encuentro el error.  :argh:

Muchas gracias y un saludo!

m0skit0:
¡La hostia! ¡Un mudo! :lol:

locazopro:
jaoajaojaoja no pude evitar el no postear :P

huevofritopamojarpan:
Por qué la linea 69 imprime "ZERO" en lugar del contenido del registro? Llevo rayándome pero no encuentro el error.  :argh:

Muchas gracias y un saludo!

------------------------------------
He editado el post pero no he conseguido que mostrase el código, supongo que por ser demasiado extenso. Así que adjunto el código fuente.
Un saludo y muchas gracias!!!!!

m0skit0:
Ya te vale con el primer post, chavalot@

La línea 69 no imprime ningún registro, sino que recibe una cadena en el registro. A lo mejor te refieres a otra línea...

Y hacía tanto tiempo que no veía gets() que me emocionado. Usa scanf().

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa