SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: wien996 en Miércoles 10 de Noviembre de 2010, 08:23

Título: Leer una fecha con getline() y cin.ignore()
Publicado por: wien996 en Miércoles 10 de Noviembre de 2010, 08:23
Buenos días a todos... estoy realizando una práctica en la que debo validar unos tests y realizar un código sobre como recoger una fecha con constructores, leerla y mostrarla:
Esto es el fichero.h

#ifndef _FECHA_H
#define _FECHA_H

#include <string>
#include <iostream>

struct TFecha {
   int dia;
   int mes;
   int anyo;
};

//Construye una fecha, colocandola el día 1 de Enero de 1970.
void inicializaFecha (TFecha &f);

//Construye una fecha, colocandola el día 1 de Enero de 1970.
void inicializaFecha (TFecha &f, int dia, int mes, int anyo);

//Escribe la fecha por la salida estandar. El formato es dia/mes/año.
void muestraFecha (const TFecha &f);

//Lee por la entrada estandar una fecha, y la devuelve.
TFecha    leerFecha();
   

#endif

[b]Este es el fichero .cpp de la fecha:[/b]

#include "Fecha.h"

void inicializaFecha (TFecha &f){
   f.dia = 1;
   f.mes = 1;
   f.anyo = 1970;
}

void inicializaFecha(TFecha &f, int dia, int mes, int anyo)
{
   f.dia = dia;
   f.mes = mes;
   f.anyo = anyo;
}

TFecha leerFecha(){
   int d, m, a;
   TFecha fec;
   std::cout << "Introduzca el día de la fecha: " << std::endl;
   std::cin >> d;
   std::cout << "Introduzca el mes de la fecha: " << std::endl;
   std::cin >> m;
   std::cout << "Introduzca el año de la fecha: " << std::endl;
   std::cin >> a;

   fec.dia = d;
   fec.mes = m;
   fec.anyo = a;

   return fec;
}

void muestraFecha(const TFecha &f){
   std::cout << f.dia << "/" << f.mes << "/" << f.anyo << std::endl;
};

y por último aquí estan los dichosos tests que no soy capaz de pasar:

TEST(ConstructorPorDefecto) {
   TFecha f;
   inicializaFecha(f);
   muestraFecha(f);
   CHECK_OUTPUT("1/1/1970");
}

TEST(InitYEscribe) {
   TFecha f;
   inicializaFecha(f, 12, 10, 1492);
   muestraFecha(f);
   CHECK_OUTPUT("12/10/1492");

   inicializaFecha(f, 21, 10, 1492);
   muestraFecha(f);
   CHECK_OUTPUT("21/10/1492");
}

LOS ERRORES QUE ME DAN AL COMPILAR LOS TESTS SON : error failure in ConstructorPordefecto: expected "1/1/1970" but was "1/1/1970"
                                                                                        error failure in InitYEscribe: expected "1/1/1970" but was "1/1/1970"
                                                                                         error failure in InitYEscribe: expected "21/10/1942" but was "21/10/1942"

si me pudiérais echar una mano...muchas gracias y un saludo!!!
Título: Re: Leer una fecha con getline() y cin.ignore()
Publicado por: Amilius en Miércoles 10 de Noviembre de 2010, 20:24
1. Define CHECK_OUTPUT
2. Puede ser el fin de línea extra en tu cout. No deberías incluir ese fin de línea por que haces que la función no pueda usarse en otros contextos, por ejemplo si es necesario mostrar una fecha en medio de una oración.
3. Como estás usando C++ deberías definir un constructor en tu struct en lugar de usar una función de inicialización :
Código: C++
  1.  
  2. struct TFecha
  3. {
  4.     TFecha(int dia = 1, int mes = 1, int año = 1970) : dia(dia), mes(mes), año(año)
  5.     {
  6.     }
  7.  
  8.     void mostrar()
  9.     {
  10.         std::cout << dia << "/" << mes << "/" << año;
  11.     }
  12.  
  13.     int dia;
  14.     int mes;
  15.     int año;
  16. };
  17.  
  18.  
  19.