• Viernes 8 de Noviembre de 2024, 19:47

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - huevofritopamojarpan

Páginas: [1]
1
C/C++ / Re: Error al imprimir un campo de un registro, devuelve "ZERO"
« en: Martes 23 de Junio de 2009, 22:49 »
Joder tío, mil gracias!  He cambiado eso pero sigo teniendo el mismo error. El error no viene de fseek, sino de un strlen.
Subo una captura de la terminal pa que veas. Estoy leyendo un manual de gdb, que no sé hacer prácticamente nada con él (avanzar línea y poco más  :P ).

Bueno, sigo investigando...
Agur!

PD: Que dios te pague la ayuda que prestas con pocos hijos y muchos intentos...

2
C/C++ / Re: Error al imprimir un campo de un registro, devuelve "ZERO"
« en: Martes 23 de Junio de 2009, 19:47 »
La madre que me parió... Ahora tengo otro problema. Será otra estupidez, pero no la veo.  :wacko:
Adjunto el código por si el error viene de otro lado.

Explico el error: Dentro de la función usuarios_inicializar llamo a la función usuario_cpy. Ahí esta el error (Bus error), porque si comento esta linea el error desaparece.
Al ejecutar gdb (todavía no sé utilizarlo bien), el error me sale en otro lado, en un strlen(), que hasta ahora funcionaba sin problemas.

Joer, cada vez estoy más desesperado  :argh:
Ayuda, please!

3
C/C++ / Re: Error al imprimir un campo de un registro, devuelve "ZERO"
« en: Martes 23 de Junio de 2009, 13:53 »
Gracias de nuevo tío.  :good:

Entiendo lo que dices. Modifiqué y ahora tengo la función así:
Código: C
  1. //      Inicializar usuarios. Carga los usuarios del archivo de texto en un array.
  2. int usuarios_inicializar(tipo_usuario **lista_usuarios)
  3. {
  4.     //Memoria dinámica!!!!!!
  5.     unsigned short int i;
  6.     char *aux, linea[128];
  7.     FILE *archivo_usuarios;
  8.     archivo_usuarios=fopen("usuarios.dat","r");
  9.     //Comprobar que existe el archivo
  10.     fscanf(archivo_usuarios,"%d",&i);
  11.     printf("n%p", *lista_usuarios);
  12.     *lista_usuarios=(tipo_usuario*)malloc(i*sizeof(tipo_usuario));
  13.     printf("n%p", *lista_usuarios);
  14.     fscanf(archivo_usuarios,"%c",linea);//para leer el salto de línea
  15.     i=0;
  16.     while(fgetc(archivo_usuarios)!=EOF)
  17.     {
  18.         fseek(archivo_usuarios,-1,SEEK_CUR);
  19.         fgets(linea,128,archivo_usuarios);
  20.         //login
  21.         aux=strtok(linea,":");
  22.         strcpy((*(lista_usuarios)+i)->login,aux);
  23.         //password
  24.         aux=aux+strlen((*(lista_usuarios)+i)->login)+1;
  25.         aux=strtok(aux,":");
  26.         strcpy((*(lista_usuarios)+i)->password,aux);
  27.         //nombre
  28.         aux=aux+strlen((*(lista_usuarios)+i)->password)+1;
  29.         aux=strtok(aux,":");
  30.         strcpy((*(lista_usuarios)+i)->nombre,aux);
  31.         //apellido
  32.         aux=aux+strlen((*(lista_usuarios)+i)->nombre)+1;
  33.         aux=strtok(aux,":");
  34.         strcpy((*(lista_usuarios)+i)->apellido,aux);
  35.         //extensión
  36.         aux=aux+strlen((*(lista_usuarios)+i)->apellido)+1;
  37.         aux=strtok(aux,":");
  38.         strcpy((*(lista_usuarios)+i)->ext,aux);
  39.         i++;
  40.         (*(lista_usuarios)+i)->activo=1;
  41.         printf("n%s %s",(*lista_usuarios+i)->nombre, (*lista_usuarios+i)->apellido);
  42.     }
  43.     fclose(archivo_usuarios);
  44.     return i;
  45. }
  46.  
E invoco la función así:
Código: C
  1. usuarios_size=usuarios_inicializar(&lista_usuarios);
  2.  

Pero esta línea, printf("n%s %s",(*lista_usuarios+i)->nombre, (*lista_usuarios+i)->apellido); , no muestra nada.
¿Sigo fallando en algo?

4
C/C++ / Re: Error al imprimir un campo de un registro, devuelve "ZERO"
« en: Martes 23 de Junio de 2009, 01:09 »
Muchísimas gracias Eternal Idol por contestar.  :beer:

El puntero no está definido, pero luego hago malloc dentro de la función. ¿Esto es un error?

Sobre la función usuario_add, nada, eso es una función a más, que aún tengo que hacer.No influye en el resto del programa, ya que mientras no doy solucionado  lo de ZERO intento avanzar por otros lados para no perder el tiempo.

Y por último !contador>0 equivale a contador<=0, sí, jeje. A mi me parecía normal ponerlo así :-P

Mil gracias!!
Agur!

5
C/C++ / Re: Error al imprimir un campo de un registro, devuelve "ZERO"
« en: Lunes 22 de Junio de 2009, 23:42 »
Bueno, planteo la pregunta de otro modo. ¿Cuando devuelve C "ZERO"?
A mi esto me parece muuuuuy raro.

Un saludo!

6
C/C++ / Re: Error al imprimir un campo de un registro, devuelve "ZERO"
« en: Lunes 22 de Junio de 2009, 17:01 »
Hola. Primero me dirijo a "mo0squit0". Si bien tu primero contestación me pareció sin duda graciosa, en la segundo noto un tono de superioridad que espero que sea sólo interpretación mía, porque aquí vengo a aprender y a enseñar lo que buenamente pueda, y no a perder el tiempo recordándole a nadie por qué su madre sale todas las noches de casa.

Me centro pues en el problema. Tengo un registro con varios campos, y al imprimir uno de estos campos, un array de caracteres, me imprime "ZERO". Adjunto de nuevo el código porque lo he modificado bastante. La línea a la que me refiero es ahora la número 365.

Un saludo y muchas gracias!

PD: Por qué es mejor scanf que gets?

7
C/C++ / Re: Error al imprimir un campo de un registro, devuelve "ZERO"
« en: Domingo 21 de Junio de 2009, 21:12 »
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!!!!!

8
C/C++ / Error al imprimir un campo de un registro, devuelve "ZERO"
« en: Sábado 20 de Junio de 2009, 21:23 »
Código: C
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. //Constantes
  9.  
  10. #define USUARIO "root"
  11. #define PASSWORD "7"
  12. #define STRING_CORTO 21
  13. #define STRING_LARGO 42
  14.  
  15.  
  16. ///////////////////////////////////////////////////////////////////////////////////////////////////
  17.  
  18.  
  19. //Declaración de los tipos de variables
  20.  
  21. //Tipo de dato fecha.
  22. typedef struct
  23. {
  24.     int ano, mes, dia, hora, min, seg;
  25. }tipo_fecha;
  26.  
  27. //Tipo de dato usuario.
  28. typedef struct
  29. {
  30.     char login[21], password[21], nombre[21], apellido[42], ext[6];
  31.     tipo_fecha ult_reserva;
  32. }tipo_usuario;
  33.  
  34. //Tipo de dato reserva
  35. typedef struct
  36. {
  37.     unsigned short int ocupado;
  38.     tipo_usuario usuario;
  39. }tipo_reserva;
  40.  
  41.  
  42. ///////////////////////////////////////////////////////////////////////////////////////////////////
  43. //OK    Inserta en el primer usuario los datos del segundo
  44. void copiar_usuario(tipo_usuario *usuario_d, tipo_usuario *usuario_s)
  45. {
  46.     strcpy(usuario_d->login,usuario_s->login);
  47.     strcpy(usuario_d->password,usuario_s->password);
  48.     strcpy(usuario_d->nombre,usuario_s->nombre);
  49.     strcpy(usuario_d->apellido,usuario_s->apellido);
  50.     strcpy(usuario_d->ext,usuario_s->ext);
  51. }
  52.  
  53. //OK    Compara dos usuarios, devuelve 0 si no coinciden en nada, 1 si coinciden en login y password, y 2 si coinciden en todo
  54. unsigned short int usuario_cmp(tipo_usuario *usuario1, tipo_usuario *usuario2)
  55. {
  56.     if ((strcmp(usuario1->login,    usuario2->login)==0) &&
  57.         (strcmp(usuario1->password, usuario2->password)==0) &&
  58.         (strcmp(usuario1->nombre,   usuario2->nombre)==0) &&
  59.         (strcmp(usuario1->apellido, usuario2->apellido)==0) &&
  60.         (strcmp(usuario1->ext,      usuario2->ext)==0)) {printf("2");return 2;}
  61.     else if (((strcmp(usuario1->login,usuario2->login)==0) && (strcmp(usuario1->password,usuario2->password)==0)) ||
  62.              ((strcmp(usuario1->nombre,usuario2->nombre)==0) && (strcmp(usuario1->apellido,usuario2->apellido)==0))) return 1;
  63.     else return 0;
  64. }
  65.  
  66. //OK    Devuelve un 1 si se loguea correctamente como usuario y un 0 si no. Si se loguea el root devuelve 2;
  67. unsigned short int login(tipo_usuario *usuario, tipo_usuario *lista_usuarios)
  68. {
  69.     unsigned short int i;
  70.     printf("Login: ");gets((usuario->nombre));
  71.     printf("Password %d: ",*(usuario->nombre));scanf("%20s",&(usuario->password));
  72.     if((strcmp(usuario->login,USUARIO)==0) && (strcmp(usuario->password,PASSWORD)==0)) {printf("nLogueado como administradorn"); return 2;}
  73.     else
  74.     {
  75.         for(i=0;i<10;i++)
  76.         {
  77.             if (usuario_cmp(usuario,lista_usuarios+i)==0)
  78.             {
  79.                 copiar_usuario(usuario,(lista_usuarios+i));
  80.                 printf("Hola %s",(usuario->nombre));
  81.                 return 1;
  82.                 break;
  83.                 break;
  84.             }  
  85.         }
  86.         return 0;
  87.     }
  88. }
  89.  
  90. //OK    Intruce en la matriz de reservas, en la fecha (formato real) una reserva realizada por el usuario.
  91. void reservar(tipo_reserva *matriz_reservas, tipo_fecha *fecha, tipo_usuario *usuario)
  92. {
  93.     if (usuario==NULL) (matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->ocupado=0;
  94.     else
  95.     {
  96.         (matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->ocupado=1;
  97.         copiar_usuario(&((matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->usuario),usuario);
  98.     }
  99. }
  100.  
  101. //OK    Inicializa a cero y luego carga el fichero de datos. El formato del fichero es "mes:dia:hora:nombre:apellidos:"
  102. void inicializar_reservas(tipo_reserva *matriz_reservas)
  103. {
  104.     tipo_fecha fecha;
  105.     unsigned short int i;
  106.     char linea[64],*aux;
  107.     tipo_usuario usuario;
  108.    
  109.     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++)
  110.     {(matriz_reservas+(31*13)*fecha.mes+13*fecha.dia+fecha.hora)->ocupado=0;}
  111.     FILE *archivo_reservas;
  112.     archivo_reservas=fopen("reservas.dat","r");
  113.     while(!feof(archivo_reservas))//Por qué no funciona ftell solo?
  114.     {
  115.         fseek(archivo_reservas,-1,SEEK_CUR);
  116.         fscanf(archivo_reservas,"%d",&fecha.mes);
  117.         fseek(archivo_reservas,1,SEEK_CUR);
  118.         fscanf(archivo_reservas,"%d",&fecha.dia);
  119.         fseek(archivo_reservas,1,SEEK_CUR);
  120.         fscanf(archivo_reservas,"%d",&fecha.hora);
  121.         fseek(archivo_reservas,1,SEEK_CUR);
  122.         fgets(linea,64,archivo_reservas);
  123.         //revisar, hay una forma mejor????
  124.         aux=linea;
  125.         aux=strtok(linea,":");
  126.         strcpy(usuario.nombre,aux);
  127.         aux+=strlen(usuario.nombre)+1;
  128.         aux=strtok(aux,":");
  129.         strcpy(usuario.apellido,aux);
  130.         reservar(matriz_reservas,&fecha,&usuario);
  131.     }
  132.     fclose(archivo_reservas);
  133. }
  134.  
  135. //      Inicializar usuarios. Carga los usuarios del archivo de texto en un array.
  136. void inicializar_usuarios(tipo_usuario *lista_usuarios)
  137. {
  138.     unsigned short int i;
  139.     char *aux, linea[128];
  140.     FILE *archivo_usuarios;
  141.     archivo_usuarios=fopen("usuarios.dat","r");
  142.     if (archivo_usuarios==NULL) printf("anArchivo de usuarios no encontradon");
  143.     else
  144.     {
  145.         fread(&i,1,1,archivo_usuarios);
  146.         i=(int)i;//????????????????????????Es imprescindible esto??????????????????
  147.         lista_usuarios=(tipo_usuario*)malloc(i*sizeof(tipo_usuario));
  148.         i=0;
  149.         while(!feof(archivo_usuarios))
  150.         {
  151.             //fseek(archivo_usuarios,-1,SEEK_CUR);
  152.             fgets(linea,128,archivo_usuarios);
  153.             //login
  154.             aux=strtok(linea,":");
  155.             strcpy((lista_usuarios+i)->login,aux);
  156.             //password
  157.             aux=aux+strlen((lista_usuarios+i)->login)+1;
  158.             aux=strtok(aux,":");
  159.             strcpy((lista_usuarios+i)->password,aux);
  160.             //nombre
  161.             aux=aux+strlen((lista_usuarios+i)->password)+1;
  162.             aux=strtok(aux,":");
  163.             strcpy((lista_usuarios+i)->nombre,aux);
  164.             //apellido
  165.             aux=aux+strlen((lista_usuarios+i)->nombre)+1;
  166.             aux=strtok(aux,":");
  167.             strcpy((lista_usuarios+i)->apellido,aux);
  168.             //extensión
  169.             aux=aux+strlen((lista_usuarios+i)->apellido)+1;
  170.             aux=strtok(aux,":");
  171.             strcpy((lista_usuarios+i)->ext,aux);
  172.             printf("%sn",(lista_usuarios+i)->apellido);
  173.             i++;
  174.         }
  175.     }
  176.     fclose(archivo_usuarios);
  177. }
  178.  
  179.  
  180.  
  181.  
  182.  
  183. //OK    Guarda las reservas en reservas.dat
  184. void guardar(tipo_reserva *matriz_reservas)
  185. {
  186.     unsigned short int hora,dia,mes;
  187.     FILE *archivo_reservas;
  188.     archivo_reservas=fopen("reservas.dat","w");
  189.     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)
  190.     {
  191.         fprintf(archivo_reservas,"%d:%d:%d:%s:%s:n",mes+1,dia+1,hora+8,
  192.                 (matriz_reservas+(31*13)*mes+13*dia+hora)->usuario.nombre,(matriz_reservas+(31*13)*mes+13*dia+hora)->usuario.apellido);
  193.     }    
  194.     fclose(archivo_reservas);
  195. }
  196.  
  197. //OK    Muestra el menú en pantalla y devuelve el int opción
  198. unsigned short int menu()
  199. {
  200.     unsigned short int opcion;
  201.     printf("n1 - Introduccion de datos personalesn");
  202.     printf("2 - Consulta de reservas por mesn");
  203.     printf("3 - Consulta de reservas del usuarion");
  204.     printf("4 - Creacion de reservasn");
  205.     printf("5 - Borrado de reservasn");
  206.     printf("6 - Volver al menu inicialn");
  207.     scanf("%d",&opcion);
  208.     return opcion;    
  209. }
  210.  
  211. //OK    Introduce usuario. Ahora es inútil. Dejo el código por si me fuese útil posteriormente.
  212. void introducir_datos(tipo_usuario *usuario)
  213. {
  214.     printf("nSu nombre: ");gets(usuario->nombre);
  215.     printf("nSus apellidos: ");gets(usuario->apellido);
  216.     printf("nSu extensión telefónica: ");gets(usuario->ext);
  217. }
  218.  
  219. //OK    Saca por pantalla una fecha de la matriz_reserva, y muestra si está ocupada o libre
  220. void imprimir_reserva(tipo_reserva *matriz_reservas, tipo_fecha *fecha)
  221. {
  222.     if ((matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->ocupado==1)
  223.     {
  224.         printf("nEl dia %d del mes %d a las %d la sala ha sido reservada por %s %sn",
  225.                fecha->dia,fecha->mes,fecha->hora,(matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->usuario.nombre,
  226.                (matriz_reservas+13*31*(fecha->mes-1)+13*(fecha->dia-1)+fecha->hora-8)->usuario.apellido);
  227.     }
  228.     else printf("nEl dia %d del mes %d a las %d el aula está libren",fecha->dia,fecha->mes,fecha->hora);
  229. }
  230.  
  231. //OK Presenta en pantalla las reservas de un mes o de un usuario    
  232. void consultar_reservas(tipo_reserva *matriz_reservas, tipo_usuario *usuario)
  233. {
  234.     tipo_fecha fecha;
  235.     int numero;
  236.     numero=0;
  237.     if (usuario==NULL)
  238.     {
  239.         while(1)
  240.         {
  241.             printf("nNumero del mes a consultar: ");
  242.             scanf("%d",&fecha.mes);
  243.             printf("%d",fecha.mes);
  244.             if ((fecha.mes>12) || (fecha.mes<1)) printf("nNumero de mes no valido.n");
  245.             else break;
  246.         }
  247.         for(fecha.dia=1;fecha.dia<32;fecha.dia++)for(fecha.hora=8;fecha.hora<21;fecha.hora++)
  248.         {
  249.             if ((matriz_reservas+(13*31*(fecha.mes-1))+(13*(fecha.dia-1))+(fecha.hora-8))->ocupado!=0)
  250.             {
  251.                 imprimir_reserva(matriz_reservas, &fecha);
  252.                 numero++;
  253.             }
  254.         }
  255.     }        
  256.     else
  257.     {
  258.         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++)
  259.             if (((matriz_reservas+(13*31*(fecha.mes-1))+(13*(fecha.dia-1))+(fecha.hora-8))->ocupado!=0) &&
  260.                 (usuario_cmp(&((matriz_reservas+(13*31*(fecha.mes-1))+(13*(fecha.dia-1))+(fecha.hora-8))->usuario),usuario)>0))
  261.             {
  262.                 imprimir_reserva(matriz_reservas, &fecha);
  263.                 numero++;
  264.             }
  265.     }
  266.     if(usuario!=NULL) printf("nEl usuario actual ha realizado %d reservasn",numero);
  267.     else printf("nHay %d reservas en el mes %dn",numero,fecha.mes);
  268. }
  269.  
  270. //OK    Funcion para comprobar que una fecha tiene un formato correcto
  271. unsigned short int validar_fecha(tipo_fecha f)
  272. {
  273.     unsigned short int valida=1;
  274.     //Compruebo si la fecha "existe"
  275.     if ((f.dia<1 || f.dia>31 || f.mes>12 || f.mes<1) || (f.hora<8 || f.hora>20)) valida=0;
  276.     else
  277.     {
  278.         if (f.mes==2)
  279.         {
  280.             if (f.dia>29) valida=0;
  281.             else if (((f.ano%4!=0) || ((f.ano%100==0) && (f.ano%400!=0)))    && (f.dia>28)) valida=0;    
  282.         }
  283.         else
  284.         {
  285.             if (f.mes%2==0)
  286.             {
  287.                 if ((f.mes<=7) && (f.dia>30)) valida=0;
  288.             }
  289.             else if ((f.mes>8) && (f.dia>30)) valida=0;  
  290.         }
  291.     }
  292.     //Compruebo que la fecha sea mayor que el momento actual;  
  293.     if (valida==1)
  294.     {
  295.         struct tm *ahora;
  296.         time_t segundos=time(0);
  297.         ahora=localtime(&segundos);
  298.         if ( ahora->tm_mon+1>f.mes ||
  299.             (ahora->tm_mon+1==f.mes && ahora->tm_mday>f.dia) ||
  300.             (ahora->tm_mon+1==f.mes && ahora->tm_mday==f.dia && ahora->tm_hour>f.hora)) valida=0;
  301.     }
  302.    
  303.     return valida;
  304. }
  305.  
  306. //OK    Crear reserva
  307. void tratar_reserva(tipo_reserva *matriz_reservas, tipo_usuario *usuario, int opcion)
  308. {
  309.     tipo_fecha fecha, fecha1, fecha2;
  310.     //Cambiar esto para usar la librería time.h
  311.     fecha.ano=2009;
  312.     char confirmacion;
  313.     unsigned short int contador=0;
  314.     do
  315.     {
  316.         printf("nDatos de la reserva:n   Mes: ");scanf("%d",&fecha1.mes);
  317.         printf("   Dia: ");scanf("%d",&fecha1.dia);
  318.         printf("   Horas de la reserva (de 8 a 21)n    hora de inicio: ");scanf("%d",&fecha1.hora);
  319.         fecha2=fecha;
  320.         printf("    hora de finalizacion: ");scanf("%d",&fecha2.hora);
  321.         if (validar_fecha(fecha1) && (fecha2.hora<22) && (fecha2.hora>=fecha1.hora)) break;
  322.         else printf("anFecha y/u hora incorrectasn");
  323.     }while(1);
  324.    
  325.     fecha=fecha1;
  326.     //Comprobar si las horas están ocupadas o no
  327.     if (opcion==1) contador=fecha2.hora-fecha1.hora;
  328.     do
  329.     {
  330.         if ((opcion*(matriz_reservas+13*31*(fecha.mes-1)+13*(fecha.dia-1)+fecha.hora-8)->ocupado)==1) contador--;
  331.         else if (usuario_cmp(&((matriz_reservas+13*31*(fecha.mes-1)+13*(fecha.dia-1)+fecha.hora-8)->usuario),usuario)>0) contador++;
  332.         imprimir_reserva(matriz_reservas,&(fecha));
  333.         fecha.hora++;
  334.     }while(fecha.hora<fecha2.hora);
  335.     fecha=fecha1;
  336.     if (!contador>0)
  337.         if(opcion==1) printf("nHoras no disponiblesn");
  338.         else printf("No ha realizado ninguna reserva en estas horas");
  339.     if (contador>0)
  340.     {
  341.         if(opcion==1)
  342.         {
  343.             printf("nEstán disponibles %d de las %d horas que ha solicitado.nRealizar la reserva? (S/N): ",contador,fecha2.hora-fecha1.hora);
  344.             scanf("%s",&confirmacion);
  345.             if ((strcmp(&confirmacion,"S")==0) || (strcmp(&confirmacion,"s")==0))
  346.             {
  347.                 time_t segundos;
  348.                 segundos=time(0);
  349.                 struct tm *ahora;
  350.                 ahora=localtime(&segundos);
  351.                 //Esto es uan chapuza, hay que cambiar el tipo fecha por el estándar de time;
  352.                 usuario->ult_reserva.ano=ahora->tm_year;
  353.                 usuario->ult_reserva.mes=ahora->tm_mon;
  354.                 usuario->ult_reserva.dia=ahora->tm_mday;
  355.                 usuario->ult_reserva.hora=ahora->tm_hour;
  356.                 usuario->ult_reserva.min=ahora->tm_min;
  357.                 usuario->ult_reserva.seg=ahora->tm_sec;
  358.                 do
  359.                 {
  360.                     reservar(matriz_reservas, &fecha, usuario);
  361.                     imprimir_reserva(matriz_reservas, &fecha);
  362.                     fecha.hora++;
  363.                 }while(fecha.hora<fecha2.hora);
  364.             }
  365.             else printf("nReserva no realizadan");
  366.         }
  367.         if(opcion==0)
  368.         {
  369.             printf("nPueden borrarse %d de las %d horas que ha solicitado.nRealizar la reserva? (S/N): ",contador,fecha2.hora-fecha1.hora);
  370.             scanf("%s",&confirmacion);
  371.             if ((strcmp(&confirmacion,"S")==0) || (strcmp(&confirmacion,"s")==0))
  372.             {
  373.                 do
  374.                 {
  375.                     reservar(matriz_reservas, &fecha, NULL);
  376.                     imprimir_reserva(matriz_reservas, &fecha);
  377.                     fecha.hora++;
  378.                 }while(fecha.hora<fecha2.hora);
  379.                 printf("nBorrado realizadon");    
  380.             }
  381.             else printf("nBorrado no realizadon");
  382.         }
  383.     }
  384. }
  385.  
  386.  
  387. ///////////////////////////////////////////////////////////////////////////////      
  388.  
  389. int main()  
  390. {
  391.     //Declaración de las variables
  392.     char basura, log;
  393.     unsigned short int mes,dia,hora;
  394.     char opcion,confirmacion;
  395.     char nombre[STRING_CORTO], password[STRING_CORTO];
  396.     tipo_usuario usuario, *lista_usuarios;
  397.     tipo_fecha fecha;
  398.     //los índices de los arrays: mes,dia,hora
  399.     tipo_reserva matriz_reservas[122][31][13];
  400.     inicializar_reservas(&(matriz_reservas[0][0][0]));
  401.     inicializar_usuarios(lista_usuarios);
  402.     do
  403.     {
  404.         printf("nEscoja una opcion:n");
  405.         printf("n1 - Loguearsen2 - Salirn");
  406.         scanf("%d",&opcion);
  407.         scanf("%c",&basura);
  408.         if (opcion==1)
  409.         {
  410.             log=login(&usuario,lista_usuarios);
  411.             do
  412.             {
  413.                 opcion=menu(log);
  414.                 scanf("%c",&basura);
  415.                 switch(opcion)
  416.                 {
  417.                     case 1: introducir_datos(&usuario);break;
  418.                     case 2: consultar_reservas(&(matriz_reservas[0][0][0]),NULL);break;
  419.                     case 3: consultar_reservas(&(matriz_reservas[0][0][0]),&usuario);break;
  420.                     case 4: tratar_reserva(&(matriz_reservas[0][0][0]),&usuario,1);break;
  421.                     case 5: tratar_reserva(&(matriz_reservas[0][0][0]),&usuario,0);break;
  422.                     case 6: usuario.nombre[0]=0;usuario.apellido[0]=0;guardar(&(matriz_reservas[0][0][0]));break;  
  423.                     default: printf("anOpcion incorrectan");break;
  424.                 }
  425.             }while(opcion!=6);
  426.         }
  427.         else if (opcion==2) break;
  428.         else printf("anOpcion incorrectan");
  429.     }while(1);
  430.     printf("nFIN DEL PROGRAMAnn");
  431. }
  432.  
  433.  

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!

9
C/C++ / Re: Recorrer Un árbol Binario
« en: Jueves 8 de Mayo de 2008, 20:15 »
No tengo mucha idea, pero si cada nodo tiene un puntero al nodo raíz ya estaría solucionado, no?

Agur!

10
C/C++ / Re: Paso De Argumentos En C
« en: Miércoles 7 de Mayo de 2008, 16:26 »
Pues va a ser que no, soy gallego pero tengo raíces en el país vasco y mis abuelos estuvieron viviendo durante una época del franquismo en el Pais Vasco. Incluso mi madre nació en el País Vasco (en Aretxabaleta), pero vivió allí sólo hasta los 4 años.

Y vos, sos argentino, no? XDD

Encantado de conocerte.
Un saludo!

11
C/C++ / Re: Paso De Argumentos En C
« en: Miércoles 7 de Mayo de 2008, 15:57 »
Si te fijas sí que he tabulado bien, lo que pasa es que lo hago de forma distinta. Por ejemplo: pongo un if y abro la llave ya tabulada. Tú lo haces de otra forma, no tabulas la llave pero sí el código que contiene.

Mi forma:
Código: Text
  1. void corregir_espacios(char texto[1000], char texto2[1000])
  2.   {
  3.   int i = 0;
  4.   int j = 0;
  5.  



La tuya:
Código: Text
  1. void corregir_espacios(char *texto, char *texto2)
  2. {
  3.   int i = 0;
  4.  



¿Tu forma es la estándar? Si es así debería empezar a utilizarla.
Agur!!

12
C/C++ / Re: Paso De Argumentos En C
« en: Miércoles 7 de Mayo de 2008, 15:40 »
Ouch! Vaya error más estúpido.

Lo de NADA en mayúsculas me acaba de hundir la moral... jeje, es coña.  :P
Muchas gracias por ayudarme. La verdad es que tu código es bastante más compacto.
Yo vengo de MODULA-2, y todavía estoy iniciándome en C. Por eso, por ejemplo, casi nunca uso los incrementos (i++) y otras cosas.

Al final lo he dejado así:
Código: Text
  1. void corregir_espacios(char texto[1000], char texto2[1000])
  2.   {
  3.   int i = 0;
  4.   int j = 0;
  5.  
  6.   while (texto[i])
  7.     {
  8.     if (isspace(texto[i]) && ( ispunct(texto[i+1]) || isspace(texto[i+1]) ))  /*Salta los espacios antes de otro espacio o un signo de puntuación*/
  9.       {
  10.       i++;
  11.       }
  12.     else if (ispunct(texto[i]) && !isspace(texto[i+1]))  //Inserta un espacio después de un signo
  13.       {          
  14.       texto2[j++] = texto[i++];
  15.       texto2[j++] = ' ';
  16.       }
  17.     else
  18.       {  
  19.       texto2[j++] = texto[i++];
  20.       }
  21.     }
  22.   }
  23.  
  24.  


Bueno, lo dicho, he aprendido bastante con este post. :smartass:  Muchas gracias!!
 :hola:

PD: Eternal Ido, cuando dices que mi código no te gusta nada, ¿lo dices por estética, por poco compacto, o por eficiencia?

13
C/C++ / Re: Paso De Argumentos En C
« en: Miércoles 7 de Mayo de 2008, 13:09 »
Muchas gracias por las respuestas. :D

A ver, no quiero crear una variable estática, porque sería desperdiciar recursos. Lo que pretendo es hacer una función a la que se le pasen 2 arrays de caracteres, y guarde en el segundo array el primero modificado. Este es el código que tengo (que no me funciona):


Código: Text
  1. void corregir_espacios(char texto[1000], char texto2[1000])
  2.   {
  3.   int i;
  4.   int j;
  5.   char corregido[1000];
  6.   i=0;
  7.   j=0;
  8.   while (texto[i]!=0)  
  9.     {
  10.     if (isspace(texto[i]))  /*Salta los espacios antes de otro espacio o un signo de puntuación*/
  11.       {
  12.       if (ispunct(texto[i+1])||isspace(texto[i+1]))
  13.         {
  14.         i=i+1;  
  15.         }
  16.       else
  17.         {
  18.         corregido[j]=texto[i];
  19.         i=i+1;
  20.         j=j+1;
  21.         }
  22.       }
  23.     else if (ispunct(texto[i]))  //Inserta un espacio después de un signo
  24.       {          
  25.       corregido[j]=texto[i];
  26.       j=j+1;
  27.       corregido[j]=' ';
  28.       i=i+1;
  29.       j=j+1;
  30.       }
  31.     else
  32.       {  
  33.       corregido[j]=corregido[i];
  34.       i=i+1;
  35.       j=j+1;                  
  36.       }
  37.      
  38.     }
  39.   strcpy(texto2,corregido);
  40.   }
  41.  
  42.  

¿Por qué no funciona?
También he probado a hacer esta función de otra manera, pasándole un solo argumento y que devuelva el array modificado, y después, fuera del procedimiento ya hago es strcpy. Pero tampoco me ha funcionado.

Bueno, muchas gracias.
Un saludo! :hola:

14
C/C++ / Re: Paso De Argumentos En C
« en: Lunes 5 de Mayo de 2008, 14:25 »
Pero como hago para acceder a un elemento del array como array? ¿No se puede hacer como array y tengo que hacerlo con punteros?
Es que soy novato en esto y aunque entiendo los punteros y tal, prefiero no usarlos hasta dominar mejor el lenguaje.
Muchas gracias!

15
C/C++ / Paso De Argumentos En C
« en: Lunes 5 de Mayo de 2008, 07:02 »
Tengo dudas (es lo que tiene ser novato, jeje) respecto al paso de argumentos en funciones. ¿Cómo debería hacer para pasar un array de caracteres y poder modificarlo con la función? Es que mi duda es que el nombre del array es un puntero al primer elemento del array, entonces no debería usar punteros, pero al escribir la función si no indico que es un puntero la función entiende que es un caracter solo, creo, por lo sí debería usar punteros ¿Cuál es la solución?
La función podría servir para rellenar con ceros un array de caracteres, por ejemplo.
Muchas gracias!

16
C/C++ / Re: Problema Con Un If En C
« en: Miércoles 23 de Abril de 2008, 15:59 »
Ok. Ya está.
Muchas gracias!!
No me había fijado.
Un saludo.
 :hola:

17
C/C++ / Re: Problema Con Un If En C
« en: Miércoles 23 de Abril de 2008, 14:02 »
#define PREDEFINIDO      "Esto es un texto de prueba.Damian Franco Alvarez";
char texto[1000], basura;

He probado a poner el if como comentario y me sigue dando error.
No lo entiendo. Puede tener algo que ver que esa función sea de la librería string.h?

Muchas gracias!

18
C/C++ / Problema Con Un If En C
« en: Miércoles 23 de Abril de 2008, 13:34 »
Pues es que no encuentro el problema. Llevo muy poco programando en C. Este es el pedazo de código:

if (opcion==1)
   {   
   strcpy(texto, PREDEFINIDO);
   }

Uso Xcode en mac, igual tiene algo que ver. No lo sé. El error me lo marca justo ahí, en el strcpy.
A ver si alguien me puede ayudar.
Muchas gracias!!
 :hola:

19
C/C++ / Re: Problema Al Guardar En Una Variable
« en: Viernes 4 de Abril de 2008, 09:24 »
Ouch!
Muchas gracias pa empezar. En el original sí que que lo tengo sangrado, pero al enviarlo...
Corregiré eso y a ver si se soluciona.
Ya me olía yo que era un error estúpido. Pero es que llevo tan sólo un par de días programando en C, y vengo de MODULA-2...  :comp:

Un saludo!!
Agur!

20
C/C++ / Problema Al Guardar En Una Variable
« en: Viernes 4 de Abril de 2008, 02:34 »
#include <stdio.h>
#include <string.h>
#define PREDEFINIDO    "Esto es un texto de prueba"
int opcion, i, j;
char texto[1000], basura;
/*Registro de datos de una persona*/
typedef struct {
    char nombre[30], ap1[30], ap2[30], username[30];
} persona;
/*Registro de fecha*/
typedef struct {
    int ano;
    int mes;
    int dia;
    int hora;
    int minuto;
    int segundo;
} fecha;
/*Registro documento .autor .titulo . ncaracteres .npalabras */    
typedef struct {
    persona autor;
    char titulo[40];
    char texto[1000];
    fecha creacion;
    fecha modificacion;
    int numCaracteres, numPalabras;
} documento;
documento corregido;
main()
    {
    basura='a';
    printf("%i",basura);
    do
        {
        printf("\n¿Qué desea hacer?\n1.Introducir texto\n2.Visualizar documento original\n3.Visualizar documento corregido\n4.Visualizar los datos del docuemnto\n5.Salir\n\n");
        scanf( "%i", &opcion);
        if (opcion==1)    
            {
            printf("\n1.Predefinido\n2.Teclear\n\n");
            scanf( "%i", &opcion);
            scanf( "%c", &basura);                  
            if (opcion==1)    
                {
                 strcpy(texto, PREDEFINIDO);; /*Aquí es donde debería ir esa asignación*/
                }
            else if (opcion==2)
                {
                printf("\nIntroduzca el texto\n");                
                fgets(texto, 1000, stdin);        
                }
            else {printf("Introduzca una opcion correcta\n");}
            }
        else if (opcion==2)
            {
            if (texto[0]==0)
                {
                printf("\nIntroduzca primero el texto\n");
                }
            else     {
                printf("\nTexto Original: \n");
                printf("%s",&texto);
                printf("\n");        
                }
            }
        else if (opcion==3)
            {
            if (texto[0]==0)
                {
                printf("%s","\nIntroduzca primero el texto\n");
                }
            else    
                {
                i=0;
                j=0;
                while (texto!=0)    
                    {
/*Caso . minúsula*/            if ((texto>96 && (int)texto>123) &&                                                     ((texto[i-2]='.')||(texto[i-2]='!')||(texto[i-2]='?')))
                        {
                        corregido.texto[j]=texto+32;
                        i=i+1;
                        j=j+1;
                        }
                    else if (texto=' ')
                        {
/*Caso _puntuación final*/            if ((texto[i++]=' ')||(texto[i++]=',')||(texto[i++]=';')||(texto[i++]=':')||(texto[i++]='.')||
                            (texto[i++]='!')||(texto[i++]='?'))
                            {
                            i=i+2;    
                            }
                        else
                            {
                            corregido.texto[j]=texto;
                            i=i+1;
                            j=j+1;
                            }
                        }
                    else if ((texto='¿')||(texto='¡'))
                        {
                        corregido.texto[j]=texto;
                        j=j+1;
                        if (texto[i++]=' ')
                            {
                            i=i+2;
                            }
                        else
                            {
                            i=i+1;
                            }
                        }
                    else if ((texto[i++]='.')||(texto[i++]='?')||(texto[i++]='!'))
                        {                        
                        i=i+1;
                        }
                    else    {
                                corregido.texto[j]=texto;
                                i=i+1;
                                j=j+1;                                    
                            }
                        }
                    /*else if ((texto>64 && texto>91) || (texto>96 && texto>123)*/                
                printf("%s","\nTexto Corregido: \n");
                printf("%s", &corregido.texto);
                printf("\n");    
                   }        
            }
        } while (opcion!=5);
    }


¿Por qué no se alamacena nada en corregido.texto?  :huh:
A lo mejor es una estupidez pero es que sólo llevo dos días programando en C y tengo que entregar este trabajillo.

Muchas gracias!!
Un saludo!
 :hola:

21
C/C++ / Re: Cargar Una Constante En Uan Variable-principiante
« en: Miércoles 2 de Abril de 2008, 19:44 »
Muchas gracias!!!
Ahora ya funciona. Me vereis más por este foro. Acabo de empezar con C  y me surgen un montón de dudas. Espero no ser un pesao.
Un saludo!!  :D

22
C/C++ / Cargar Una Constante En Uan Variable-principiante
« en: Miércoles 2 de Abril de 2008, 19:22 »
Pues eso. Tengo definida una constante así:

#define PREDEFINIDO   "Esto es un texto de prueba"

Entonces quiero cargar esa cosntante en una variable.
Cómo tengo que hacer?

Muchas gracias!!

Páginas: [1]