Duda básica en C++

Iniciado por dorkam, 6 Junio 2013, 02:55 AM

0 Miembros y 2 Visitantes están viendo este tema.

dorkam

Hola, estoy empezando a aprender algo de C++, tengo que hacer un programa en el que se inserten un número INDETERMINADO de fechas y te diga si las fechas son correctas o no.

El programa que determina si la fecha es correcta o no ya lo tengo creado, el problema está en que solo está creado para leer una fecha, es decir 3 enteros, pero el programa deberia leer un numero indeterminado de fechas y mostrar el resultado de cada una de ellas.

A ver si alguien puede explicarme como solucionarlo.

Aquí les dejo el codigo para que vean lo que tengo hasta ahora


#include <iostream>
using namespace std;

int main() {
   int a, b, c;
   cin >> a >> b >> c;
if ((b == 1 || b == 3 || b == 5 || b == 7 || b == 8 || b == 10 ||
b == 12) && (a > 0 && a <= 31)) {
cout << "Correct Date" << endl;
} else {
if ((b == 4 || b == 6 || b == 9 || b == 11) &&
(a > 0 && a <= 30)) {
cout << "Correct Date" << endl;
} else {
if (b == 2 && a > 0 && a <= 28) {
cout << "Correct Date" << endl;
} else {
if ((b == 2 && a == 29) && (((c % 4 == 0) &&
(c % 100 != 0)) || ((c % 4 == 0) &&
(c % 100 == 0) && (c % 400 == 0)))) {
cout << "Correct Date" << endl;
} else {
cout << "Incorrect Date" << endl;
}
}
}


   }
   }



Gracias

amchacon

#1
Las fechas como las introduces exactamente?

Si usas una estructura fecha se me ocurre que uses la clase vector:

Código (cpp) [Seleccionar]
#include <vector>

struct Fecha
{
int Dia;
int Mes;
int Anyo;
};

//...

vector<Fecha> fechas;

Fecha Auxiliar;
char Respuesta;

do
{
 cout<<endl<<endl<<"Introduce un dia para la fecha: ";
 cin>>Auxiliar.Dia;
 cout<<"Introduce un mes para la fecha: ";
 cin>>Auxiliar.Mes;
 cout<<"Introduce un anyo para la fecha: ";
 cin>>Auxiliar.Anyo;

 fechas.push_back(Auxiliar); // Anyado la fecha al vector

 cout<<"Quiere introducir una nueva fecha? (s/n) ";
 cin>>Repuesta
} while (Respuesta == 'n');


El vector puede usarse como un array normal (fecha[0] para el elemento 0, fecha[1] para el elemento 1).

Puedes obtener el tamanyo del vector usando el método interno size:

Código (cpp) [Seleccionar]
fecha.size()

Documentación de la clase vector:
http://www.cplusplus.com/reference/vector/vector/


EDITO:

Vale ya he visto tú edite con el código. Creo que te falta un poco de nivel antes de empezar con lo que te he dicho (aun no sabes usar un for por lo que veo).

Repasate y aprendete todos los elementos del lenguaje.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

dorkam

Como digo, recien estoy empezando con esto de la programacion y este es un ejercicio judge.org en el que enviando el archivo .cpp te dice si el programa esta bien o no...

el ejercicio dice que el input seria:

30 10 2008
17 04 2012
15 08 1885
...

y segun el numero de fechas introducido debe poner de cada una si es correcta o no.

La clase vector aún no he visto nada, este ejercicio es para trabajar con los if/else pero no se como hacer que pueda tomar 1 fecha, 2 fechas o n fechas...

Gracias por la respuesta

leosansan

Cita de: dorkam en  6 Junio 2013, 02:55 AM
..............................................................................
pero el programa deberia leer un numero indeterminado de fechas y mostrar el resultado de cada una de ellas.


Supongo que te refieres a poder introducir sucesivamente varias fechas, indicando en cada caso sin son correctas o no, ya que para guardarlas habría que hacer uso, como mínimo, de arrays y tú solo quieres if/else.

Pero para lograr tu objetivo se necesito un bucle que repita la operación de introducir datos, un for o while o do-while. Yo me he decantado por esta última opción. Además si hay un bucle debe introducirse la opción de salir.

Una salida como la que quieres podría ser:


Código (cpp) [Seleccionar]
Introduzca dia mes anyo (0 para salir):
Dia :12
Mes :3
Anyo :2012
Dia 12 mes 3 y anyo 2012 Datos correctos
Introduzca dia mes anyo (0 para salir):
Dia :28
Mes :2
Anyo :2000
Dia 28 mes 2 y anyo 2000 Datos correctos
Introduzca dia mes anyo (0 para salir):
Dia :31
Mes :2
Anyo :2013
Dia 31 mes 2 y anyo 2013 Datos incorrectos
Introduzca dia mes anyo (0 para salir):
Dia :0

Process returned 0 (0x0)   execution time :


Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main() {
   int a, b, c;
   do
   {
    cout << "Introduzca dia mes anyo (0 para salir):"<<endl;
    cout <<"Dia :"; cin >> a ;
    if (a==0)
        break;
    cout <<"Mes :"; cin >> b ;
    cout <<"Anyo :"; cin >> c ;
if ((b == 1 || b == 3 || b == 5 || b == 7 || b == 8 || b == 10 ||
b == 12) && (a > 0 && a <= 31)) {
cout << "Dia "<< a<<  " mes "<< b<< " y anyo "<< c<< " Datos correctos" << endl;
} else {
if ((b == 4 || b == 6 || b == 9 || b == 11) &&
(a > 0 && a <= 30)) {
cout << "Dia "<< a<<  " mes "<< b<< " y anyo "<< c<< " Datos correctos" << endl;
} else {
if (b == 2 && a > 0 && a <= 28) {
cout << "Dia "<< a<<  " mes "<< b<< " y anyo "<< c<< " Datos correctos" << endl;
} else {
if ((b == 2 && a == 29) && (((c % 4 == 0) &&
(c % 100 != 0)) || ((c % 4 == 0) &&
(c % 100 == 0) && (c % 400 == 0)))) {
cout << "Dia "<< a<<  " mes "<< b<< " y anyo "<< c<< " Datos correctos" << endl;
} else {
cout << " Dia "<< a<<  " mes "<< b<< " y anyo "<< c<< " Datos incorrectos" << endl;

}
}
}


   }
   }while (a!=0);
    return 0;
}


Saluditos! .... ..

rir3760

Cita de: dorkam en  6 Junio 2013, 03:28 AM
Como digo, recien estoy empezando con esto de la programacion y este es un ejercicio judge.org en el que enviando el archivo .cpp te dice si el programa esta bien o no...

el ejercicio dice que el input seria:

30 10 2008
17 04 2012
15 08 1885
...

y segun el numero de fechas introducido debe poner de cada una si es correcta o no.
Debes leer linea por linea la entrada estándar. Aquí lo mas sencillo es utilizar la clase string y la función getline, un ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;
using std::getline;

int main()
{
   string linea;
   
   while (getline(cin, linea)){
      // Algun proceso ...
      cout << linea << endl;
   }
   
   return 0;
}


Cada linea debes procesarla, primero extraes de esta tres enteros (por ejemplo utilizando la clase stringstream) y validas estos mediante tu función. Si cualquiera de los dos pasos falla la fecha no es valida, caso contrario lo es.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan

Cita de: rir3760 en  6 Junio 2013, 15:06 PM

Cada linea debes procesarla, primero extraes de esta tres enteros (por ejemplo utilizando la clase stringstream) y validas estos mediante tu función. Si cualquiera de los dos pasos falla la fecha no es valida, caso contrario lo es.


¡Uffff!, que fuerte. La idea es muy interesante, pero ¿podrías orientarme en la función a emplear para dicha extracción?. Te aseguro que la busco pero no la encuentro. Gracias de antemano.

Saluditos! .... ..

Por el día de Canarias

amchacon

#6
Cita de: leosansan en  6 Junio 2013, 17:15 PM
¡Uffff!, que fuerte. La idea es muy interesante, pero ¿podrías orientarme en la función a emplear para dicha extracción?. Te aseguro que la busco pero no la encuentro. Gracias de antemano.

Saluditos! .... ..

Por el día de Canarias
Creo que lo que pretende es:

Código (cpp) [Seleccionar]

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
   string linea;
   stringstream Nuevo;
   int dia;
   int mes;
   int anyo;

   while (getline(cin, linea))
   {
       Nuevo.str(string(linea)); // Metemos la linea en el stream

       Nuevo>>dia;
       Nuevo>>mes;
       Nuevo>>anyo;

       cout << dia << " "<<mes<<" "<<anyo<<endl;
   }

   return 0;
}


PD: Feliz día de Canarias  ;-)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

Cita de: amchacon en  6 Junio 2013, 17:54 PM
Creo que lo que pretende es:
....................................

PD: Feliz día de Canarias  ;-)

Gracias mil "maestro", nada como un ejemplo para los cortitos de vista como yo.  ;-) ;-) ;-)

¡Ya me he hecho un File con los consejitos de mi colegüita amchacon!.


Saluditos! .... ..


amchacon

Cita de: leosansan en  6 Junio 2013, 18:16 PM
¡Ya me he hecho un File con los consejitos de mi colegüita amchacon!.[/size]
¡He ascendido! Ya tengo mi propio archivo y todo  ;-)

Una anotación, en esta linea:

Código (cpp) [Seleccionar]
Nuevo.str(string(linea)); // Metemos la linea en el stream

Dado que linea es un string y no un char*. Se puede eliminar el constructor de string:

Código (cpp) [Seleccionar]
Nuevo.str(linea); // Metemos la linea en el stream
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan