• Viernes 5 de Julio de 2024, 09:16

Autor Tema:  problema con fechas,consejos por favor  (Leído 2448 veces)

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
problema con fechas,consejos por favor
« en: Lunes 20 de Octubre de 2008, 13:49 »
0
Hola,mirar yo quiero que de una fecha asi 1.1.2008 me saque 01/01/2008 pero yo en mi función hago lo siguiente:

FECHA conv1(char yytext[], int yyleng)
{
   FECHA f;
        int i, resultado=0;
   string cadena,dia1,mes1,anyo1;
   cadena=yytext;
   
        for (i=0; i< yyleng; ++i){
               
      while(yytext!='.'){
         dia1+=yytext;
      i++;
      }
      i++;
      f.dia=atoi(dia1.c_str());
      cout.fill('0');cout.width(2);
      
      //ahora vamos con los meses
      while(yytext!='.'){
         mes1+=yytext;
      i++;
      }
      i++;
      f.mes=atoi(mes1.c_str());
      cout.fill('0');cout.width(2);
      
      while(i<yyleng){
         anyo1+=yytext;
      i++;
      }
      f.anyo=atoi(anyo1.c_str());
      
   }
        return f;
}

yytext,es porque la fecha se la meto como cadena y yyleng es la longitud de la cadena.

el dia si me sale bien,pero el mes no me sale si mete el 4 me sale el 4, y me tiene que salir el 04,me decir otra forma si de esta forma no sale?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problema con fechas,consejos por favor
« Respuesta #1 en: Lunes 20 de Octubre de 2008, 15:27 »
0
Primero comentarte que cometes un error fundamental de metodología y es no modificar la variable del conteo del for dentro del for. Esto es considerado mala programación. De hecho, ¿para qué necesitas el for si realmente los que hacen todo el trabajo son los while, ya que el for jamás hará más de un pase? Lo puedes eliminar sin más. Aparte, ¿por qué usas nombres tan poco inteligibles como yytext[] para una fecha e yyleng para su longitud? ¿No es más lógico llamarle fecha[] y long_fecha? Tampoco necesitas el parámetro yyleng porque puedes calcularlo dentro de la función. Intenta que las funciones reciban el mínimo número de parámetros para su funcionamiento correcto.

Aclarado esto, te comento:

Código: C
  1. f.mes=atoi(mes1.c_str());
  2. if (f.mes < 10)
  3.     cout << "0";
  4. cout << f.mes;
  5.  

Debería darte el resultado que buscas.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: problema con fechas,consejos por favor
« Respuesta #2 en: Lunes 20 de Octubre de 2008, 15:40 »
0
el motivo de utilizar todas esas funciones,es porque es programaion en lex,pero puse el código ya que las funciones se hacen igual que en C.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problema con fechas,consejos por favor
« Respuesta #3 en: Lunes 20 de Octubre de 2008, 16:06 »
0
Da igual que sea Lex, es mala programación (en general, no en C en particular, es algo genérico, sin especificar, globalmente, no sé si me explico...) cambiar la variable del FOR dentro del FOR. Y también poner un FOR que no hace nada.

Cita de: "pacorubio77"
el motivo de utilizar todas esas funciones

 :blink: No sé a qué funciones te refieres...

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: problema con fechas,consejos por favor
« Respuesta #4 en: Lunes 20 de Octubre de 2008, 16:54 »
0
HOla,creo que al decir :

   1. f.mes=atoi(mes1.c_str());
   2. if (f.mes < 10)
   3.     cout << "0";
   4. cout << f.mes;

te equivocas,porque si ves la funcion devuelve un registro f,que es de tipo FECHA;

y si yo meto 1.4.2008 y quiero que salga 01/04/2008..de su forma saldria 001/4/2008..me entiende?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problema con fechas,consejos por favor
« Respuesta #5 en: Lunes 20 de Octubre de 2008, 17:23 »
0
:wacko:  :wacko:

Si escribo el "0" inmediatamente antes de sacar por pantalla f.mes, ¿cómo se va a escribir donde el día? ¿seguro que has probado el código?

Y pregunta fundamental: ¿día/mes/año (como todo el mundo) o mes/día/año (como los yankis y los british)?

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: problema con fechas,consejos por favor
« Respuesta #6 en: Lunes 20 de Octubre de 2008, 17:27 »
0
es dia ,mes y año lo que tiene que salir,pero está probado,mira si tu tienes esa funcion:


int main(){

Fecha f2;
f2=conv1(yytext,yyleng);
cout<<f2.dia<<"/"<<f2.mes<<"/"<<f2.anyo

}

si me meto antes en la funcion y pongo lo que usted me dijo,imprime primero eso, y despues los couts de fuera...

lo entendio?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problema con fechas,consejos por favor
« Respuesta #7 en: Lunes 20 de Octubre de 2008, 17:40 »
0
Aha, vale sí, se me había pasado que es una función que devuelve la fecha. Entonces hay que hacerlo fuera de la función:

Código: C
  1.  
  2. f2=conv1(yytext,yyleng);
  3. if (f2.dia<10)
  4.     cout << "0";
  5. cout<<f2.dia<<"/";
  6. if f2.mes<10)
  7.     cout << "0";
  8. cout<<f2.mes<<"/"<<f2.anyo;
  9.  
  10.  

Ten en cuenta que no puedes integrar el 0 a la izquierda en variables numéricas. Sí puedes hacerlo en cadenas de caracteres, así que a lo mejor te conviene que tu función devuelva char* y no FECHA (o bien que FECHA contenga campos char* y no int).

P.D: Y de todas formas te equivocas, porque sí que escribiría la fecha bien, pero dentro de la función solamente, no fuera (lo que demuestra que NO has probado el código).

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: problema con fechas,consejos por favor
« Respuesta #8 en: Lunes 20 de Octubre de 2008, 18:00 »
0
Hola,si probé el codigo pero yo queria mostrar la fecha fuera de la funcion,AHORA SI que sale lo que yo quiero,muchas gracias,de verdad.

Ahora tengo otra duda,si me introducen la siguiente fecha :

23 de septiembre de 2002 (por ejemplo) me tiene que salir 23/09/2008 ,pero la cuestion y no se como identificar el mes con un número, he pensado una cosa, hacer como si fuera un switch,pero en un switch,no le puedo meter cadenas ..verdad?

es decir switch (mes){
       case 'enero": f.mes=1;break;
y asi sucesivamente... o si se podria?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problema con fechas,consejos por favor
« Respuesta #9 en: Lunes 20 de Octubre de 2008, 19:30 »
0
Efectivamente, no puedes hacer un switch(mes) siendo mes un char *, dado que entonces mes es un número (la dirección de memoria en que comienza la cadena de caracteres). Lo que sí puedes hacer es usar la clase string de C++ (ya que usas cout, que es C++).

Código: C
  1.  
  2. #include <string>
  3.  
  4. string mes;
  5.  
  6. switch(mes)
  7. //etc...
  8.  
  9.  

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: problema con fechas,consejos por favor
« Respuesta #10 en: Lunes 20 de Octubre de 2008, 19:43 »
0
pero aunque pongas
#include<string>

si yo hago
string mes;
getline(cin,mes);

switch(mes){


}

aqui me da el mismo error aunque ponga la libreria string
seguro que a usted le va de esta manera?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: problema con fechas,consejos por favor
« Respuesta #11 en: Lunes 20 de Octubre de 2008, 20:42 »
0
No podes usar switch asi:
The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type. Integral promotion is performed as described in Integral Promotions.

Pasalo a numero primero o hace una clase llamada Mes -constructor recibe cadena y sobrecarga el operador () que hace una conversion a entero -.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problema con fechas,consejos por favor
« Respuesta #12 en: Lunes 20 de Octubre de 2008, 20:56 »
0
Disculpad, tenéis razón, de esa manera no se puede. En el otro post ya tienes las soluciones. ¡Un saludo!