SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: pacorubio77 en Lunes 20 de Octubre de 2008, 13:49

Título: problema con fechas,consejos por favor
Publicado por: pacorubio77 en Lunes 20 de Octubre de 2008, 13:49
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?
Título: Re: problema con fechas,consejos por favor
Publicado por: m0skit0 en Lunes 20 de Octubre de 2008, 15:27
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.
Título: Re: problema con fechas,consejos por favor
Publicado por: pacorubio77 en Lunes 20 de Octubre de 2008, 15:40
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.
Título: Re: problema con fechas,consejos por favor
Publicado por: m0skit0 en Lunes 20 de Octubre de 2008, 16:06
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...
Título: Re: problema con fechas,consejos por favor
Publicado por: pacorubio77 en Lunes 20 de Octubre de 2008, 16:54
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?
Título: Re: problema con fechas,consejos por favor
Publicado por: m0skit0 en Lunes 20 de Octubre de 2008, 17:23
: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)?
Título: Re: problema con fechas,consejos por favor
Publicado por: pacorubio77 en Lunes 20 de Octubre de 2008, 17:27
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?
Título: Re: problema con fechas,consejos por favor
Publicado por: m0skit0 en Lunes 20 de Octubre de 2008, 17:40
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).
Título: Re: problema con fechas,consejos por favor
Publicado por: pacorubio77 en Lunes 20 de Octubre de 2008, 18:00
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?
Título: Re: problema con fechas,consejos por favor
Publicado por: m0skit0 en Lunes 20 de Octubre de 2008, 19:30
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.  
Título: Re: problema con fechas,consejos por favor
Publicado por: pacorubio77 en Lunes 20 de Octubre de 2008, 19:43
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?
Título: Re: problema con fechas,consejos por favor
Publicado por: Eternal Idol en Lunes 20 de Octubre de 2008, 20:42
No podes usar switch (http://msdn.microsoft.com/en-us/library/k0t5wee3(VS.80).aspx) 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 -.
Título: Re: problema con fechas,consejos por favor
Publicado por: m0skit0 en Lunes 20 de Octubre de 2008, 20:56
Disculpad, tenéis razón, de esa manera no se puede. En el otro post ya tienes las soluciones. ¡Un saludo!