Hola soy barbara, soy nueva en el foro y la verdad estoy saturadisima con un programa que tengo q entregar antes del viernes.
Lo que me esta faltando es calcular la diferecia de dias que hay entre una fecha cualquiera, y la actual.
se como sacar la fecha actual con la funcion localtime, todo en estructuras, pero no se como implementar el difftime - mktime.
la diferencia tiene que ser mayor a 4 dias....
jaja no se mucho de foros, pero por lo que vi hay gente que sabe bastante, espero que me puedan ayudar...
Si pusieras el código que tienes sería de gran ayuda para entender lo que tienes que hacer exactamente. Te dejo un código, que usa todas esas funciones a ver si te sirve de ayuda.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main( void )
{
int segundos;
time_t *actualPtr, alarma;
struct tm *alarmaPtr;
segundos = 0;
printf( "Introduzca los segundos: " );
scanf( "%d", &segundos );
*actualPtr = time( NULL );
alarmaPtr = localtime( actualPtr );
alarmaPtr->tm_sec += segundos;
alarma = mktime( alarmaPtr );
printf( "La hora local: %s\n", ctime(actualPtr) );
while( difftime( alarma, *actualPtr ) > 0)
*actualPtr = time( NULL );
printf ("La hora local: %s\n", ctime(actualPtr));
system ("pause");
return 0;
}
Suerte!!
hola,,aca agrego otro codigo,,fijate estan implementadas algunas de las funciones que mencionabas,espero que te sea de ayuda
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
time_t dato1,dato2;//tienen que ser de la estructura time_t
dato1 = time(NULL);//sacas el tiempo en ese instante
int i=0;
printf(ctime(&dato1));//lo muestra bonito :)
while(i++<3000000000){
//perdemos un poco el tiempo
}
dato2= time(NULL);
printf(ctime(&dato2));
printf("pasaron %.f segundos",difftime(dato2,dato1));//esto te muestra la diferencia en segundos
system("pause");
return 0;
}
/*
Name: Validar y calcular diferencia en dias
Author: Luis Mora Morales
Date: 15/02/12 22:20
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
int dias[2];
int meses[2];
int años[2];
int i = 0;
struct bmpFecha
{
unsigned short int dia:5;
unsigned short int mes:4;
unsigned short int anno:7;
}
fecha[2];
int diaMes[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
bool bisiesto (bmpFecha f);
bool validar (bmpFecha f);
void obtener_fecha();
char * mesLetra[] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",
"Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre",
"Diciembre"};
int diasMes[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
struct stFecha{
unsigned short int dia: 5; // Campo dia 5 bits; 32 valores
unsigned short int mes: 4; // Campo mes 4 bits; 16 valores
unsigned short int ano: 7; // Campo ano 7 bits; 128 valores
stFecha(){ almacenaFecha(1, 1, 1960); }
stFecha(short d, short m, short a)
{
if( !almacenaFecha(d, m, a) )
almacenaFecha(dias, meses, años);
}
bool almacenaFecha(short d, short m, short a)
{
bool almacenar = false;
if( validarFecha(&d, &m, &a) )
{
dia = d;
mes = m;
ano = a-1960;
almacenar = true;
}
return almacenar;
}
void mostrarFecha()
{
cout.fill('0');
cout.width(2);
cout << dia << "/";
cout.width(2);
cout << mes << "/" << ano + 1960 << endl;
cout.fill(' ');
}
bool bisiesto()
{
bisiesto( ano );
}
bool validarFecha();
int compararFechas( stFecha fecha2 );
int diferencia( stFecha fecha2 );
private :
bool bisiesto( int anno )
{
bool anoBisiesto = false;
if( !((anno+1960)%4) && ( (anno+1960)%100 || !((anno+1960)%400) ) )
anoBisiesto = true;
return anoBisiesto;
}
bool validarFecha( short *d, short *m, short *a);
};
void comparar_fechas();
int diferencia;
int main()
{
int subcidio;
int ultimo;
int penultimo;
int antepenultimo;
double total;
char salir;
do {
obtener_fecha();
i++;
obtener_fecha();
comparar_fechas();
if(diferencia>3){
subcidio=diferencia-3;
cout << "Ingrese el salario del ultimo mes sin incapacidad : ";
cin >> ultimo;
cout << "Ingrese el salario del penultimo mes sin incapacidad : ";
cin >> penultimo;
cout << "Ingrese el salario del antepenultimo mes sin incapacidad : ";
cin >> antepenultimo;
total=((ultimo+penultimo+antepenultimo)/3/30*subcidio)*0.60;
cout << "El subsidio correspondiente al empleado es de : " << total;
}
else cout << "No le corresponde ningun subsidio por incapacidad ";
cout << endl << endl;
system("pause");
cout << "Desea realizar otro calculo S/N : ";
cin >> salir;
i=0;
}while(salir=='S' || salir=='s');
return 0;
}
bool stFecha::validarFecha()
{
bool fechaValida = false;
if( mes >= 1 && mes <= 12 && ano <= 127 )
{
if( mes == 2 && bisiesto() )
{
if( dia >= 1 && dia <= 29 )
fechaValida = true;
}
else
{
if( dia >= 1 && dia <= diasMes[mes-1] )
fechaValida = true;
}
}
return fechaValida;
}
int stFecha::compararFechas( stFecha fecha2 )
{
int fechaPeso1, fechaPeso2, difPeso, resComp;
// Convertimos las fechas en numeros con peso significativo
fechaPeso1 = ano * 10000 + mes * 100 + dia;
fechaPeso2 = fecha2.ano * 10000 + fecha2.mes * 100 + fecha2.dia;
// Las restamos y comparamos la diferencia
if( (difPeso = fechaPeso1 - fechaPeso2) > 0 )
// La primera es mayor; 1
resComp = 1;
else
if(difPeso < 0)
// La segunda es mayor; -1
resComp = -1;
else
// Son iguales; 0
resComp = 0;
return resComp;
}
int stFecha::diferencia( stFecha fecha2 )
{
// Con vuestro permiso voy a usar punteros a las estructuras;
// para referenciar correctamente a la menor y mayor fecha
// y no crear mas estructuras en memoria
stFecha *refFechMen, *refFechMay;
int i, antBis;
float acumDias;
if( compararFechas( fecha2 ) > 0 )
{ // Si compararFechas es cierto (mayor que cero); es decir 1
// La primera fecha es mayor
refFechMen = &fecha2;
refFechMay = this;
}
else
{ // Si compararFechas es falso (menor o igual que cero);
// es decir 0 o -1
// La segunda fecha es mayor o ambas son iguales.
refFechMen = this;
refFechMay = &fecha2;
}
// Calculo de los dias contenidos en años completos
// Consideremos el año de la fecha menor como completo
//---------------------------------------------------------------------
// Buscamos el anterior bisiesto al año del fecha menor
for( antBis = refFechMen->ano - 1; !bisiesto(antBis); antBis-- );
// Calculamos la fracción de día erronea que llevamos a partir del año
// bisiesto: 0, 0.25, 0.50 o 0.75
acumDias = ((refFechMen->ano - antBis) * 0.25) - 0.25;
// Acumulamos los años con su fraccion de dias erroneos
acumDias += (refFechMay->ano - refFechMen->ano) * 365.25;
// Acumulamos dias desde principio de año hasta la fecha mayor
//---------------------------------------------------------------------
for( i = 1; i < refFechMay->mes; i++ )
acumDias += diasMes[i-1];
( bisiesto(refFechMay->ano) && refFechMay->mes > 2 )?
acumDias += refFechMay->dia : acumDias += refFechMay->dia - 1;
// Desacumulamos los dias desde principio de año hasta la fecha menor;
// para quitar la diferencia de dias que hemos sumado de más
// al considerar el primer año completo
//---------------------------------------------------------------------
for( i = 1; i < refFechMen->mes; i++ )
acumDias -= diasMes[i-1];
( bisiesto(refFechMen->ano) && refFechMen->mes > 2 )?
acumDias -= refFechMen->dia : acumDias -= refFechMen->dia - 1;
// Finalmente retornamos acumulados despreciando la parte decimal
//---------------------------------------------------------------------
return (int) acumDias;
}
bool stFecha::validarFecha( short *d, short *m, short *a)
{
bool fechaValida = false;
if( *m >= 1 && *m <= 12
&& *a >= 1960 && *a <= 2087 )
{
if( *m == 2 && bisiesto((int) *a ))
{
if( *d >= 1 && *d <= 29 )
fechaValida = true;
}
else
{
if( *d >= 1 && *d <= diasMes[*m-1] )
fechaValida = true;
}
}
return fechaValida;
}
void obtener_fecha()
{
int valido = 0;
while(valido != 1){
do{
system("cls");
if(i==0)
cout << "Ingrese la fecha de inicio de la incapacidad : " << endl << endl;
else cout << "Ingrese la fecha de fin de la incapacidad : " << endl << endl;
cout << "Introduzca el dia : ";
cin >> dias;
fecha.dia = dias;}while (dias > 31 || dias < 1);
do{
system("cls");
cout << "Introduzca el mes : ";
cin >> meses;
fecha.mes = meses;}while (meses > 12 || meses < 1);
do{
system("cls");
cout << "Introduzca el a\244o mayor a 1960 y menor a 2087 : ";
cin >> años;
fecha.anno = años - 1960;}while (años < 1960 || años > 2087 );
if (validar(fecha)){ cout << "\nFecha correcta" << endl << endl;
valido = 1;}
else {
cout << "\nFecha incorrecta" << endl << endl;
}
system("pause");
}// Fin del while
}
bool validar (bmpFecha f)
{
if (f.dia > diaMes[f.mes-1]) {
if ((f.mes == 2) && (f.dia == 29) && bisiesto(f)) return true;
else return false;
}
else return true;
}
bool bisiesto (bmpFecha f)
{
if (((f.anno + 1960) % 4 == 0) && ((f.anno + 1960) % 100 != 0))
return true;
else {
if ((f.anno + 1960) % 400 ==0) {
return true;
}
else return false;
}
}
void comparar_fechas()
{
stFecha fechaPrueba1(dias[0],meses[0],años[0]);
cout << "\nResultado de la validacion: "
<< fechaPrueba1.validarFecha() << endl; // y comprobamos si es valida
fechaPrueba1.mostrarFecha(); cout << endl; // La mostramos
stFecha fechaPrueba2(dias[1],meses[1],años[1]); // Creamos otra fecha
cout << "\nResultado de la validacion: "
<< fechaPrueba2.validarFecha() << endl; // y comprobamos si es valida
fechaPrueba2.mostrarFecha(); cout << endl; // La mostramos
//Comparamos las fechas
cout << "\nResultado de la comparacion: "
<< fechaPrueba1.compararFechas(fechaPrueba2) << endl;
// Vemos la diferencia en dias entre las fechas anteriores
cout << "Resultado de la diferencia: "
<< fechaPrueba1.diferencia(fechaPrueba2) << endl << endl;
diferencia=fechaPrueba1.diferencia(fechaPrueba2);
}
Este post, tiene una clase Fecha que tiene al final un par de funciones sobre algo así, aunque es para saber si una fecha está dentro de un dos fechas.
http://foro.elhacker.net/programacion_cc/clase_fecha_con_modificaciones-t358396.0.html
EDIT:
daaaaaaaaa mirá la fecha del tema quien se mandó el bump XD