Ayuda del programa calendario perpetuo c
#define ENTER 0x1C0D /* Ingresar clave */
int año, mes, día
carácter estático *días[ 8 ] = {" ", "Domingo ", "Lunes ", "Martes ","
"Miércoles ", "Jueves ", "Viernes ", "Sábado"};
struct TIMEDATE {
int año; /* año 1980..2099 */
int mes; /* mes 1=2 de enero=febrero, etc.
int día; /* mes día 0...31 */
int horas; /* hora 0...23 */
int minutos /* minuto 0 ...59 */
int segundos; /* segundo 0...59 */
int hsecs /* 1/100s de segundo 0,99 */
char dateline[47]; /* fecha y hora juntas */
};
estructura estática TIMEDATE hoy
main();
{
char cmes[3];
char cday[3]
char caño[5]; >
double getdays();
double daynumb, numbnow;
int día laborable, retcode, dayer,
dayer = datetime(&. hoy
clrscn();
para (i=0;i<3;++i)cmonth[i]='\0'; p> para (i=0;i<3;++i)cdía[i]='\0';
para (i=0;i<5;++i)caño[i ]='\0';
putstr(5,8,14, "Ingrese la fecha en formato MM DD AAAA:");
while (retcode! = ENTER)
{
retcode = bufinp(5,41,13,2,cmonth);
if (retcode ! = ENTER) retcode = bufinp (5,44,13,2,cdía);
if (retcode ! = ENTER) retcode = bufinp(5,47,13,4,cyear); /p>
Año = atoi(&caño);
Mes = atoi(&cmes);
Día = atoi(&. cdía); daynumb = getdays(año, mes, día);
entumecido = getdays(hoy.año, hoy.mes, hoy.
día);
día de la semana = días de la semana( día entumecido);
if (numbnow - día entumecido == 0)
printf("\n\n%02d- %02d-%d es",mes, día, año);
if (numbnow - daynumb > 0)
printf("\n\n%02d-%02d- %d era",mes, día, año);
if (numbnow - daynumb < 0)
printf("\n\n%02d-%02d-%d ser",mes, día, año);
printf("\n\n%02d-%02d-%d será",mes, día, año);
printf(" a %s\n",días[día de la semana]);
}/* end MAIN */
/************ ********************************************
* GETDAYS: basándose en el valor entero del año (AAAA), mes *
* día (DD), esta subrutina devuelve un *
* número de punto flotante doble que representa los años transcurridos desde 1980 El *
* número de días desde el 1 de enero (Día 1).
*Esta rutina es lo opuesto a GETDATE.
******************************************* *******************/
double getdays(año, mes, día)
int año, mes, día;
p>{
int y,m;
doble a,b,d, día entumecido; intg();
doble piso(),intg()
/***************************; **** ****
** Corrección sin año 0 **
******************** **** **********/
if (año & lt; 0) y = año + 1
else y = año ; p>
/********************************************* **** *********
** En este cálculo, enero y febrero son los meses 13 y 14**
****** ************************************************** * */
m = mes
si (mes < 3)
{
m = m + 12
p >
y = y - 1
}
/************************ * **
** Calcular el día juliano**
********************** ** /
d = piso(365.25 * y) + intg(30.6001 * (m + 1)) + día - 723244.0
/************ **********************************
** Si en Octubre de 1582 Antes del 5 del mes, utilice el calendario juliano**
****************************** ** ************/
if (d < -145068.0) daynumb = d
/ ******** ** ***************************
**En caso contrario, utilice el calendario gregoriano**
***********************************/
más
{
a = piso(y / 100.0);
b = 2 - a + piso(a / 4.0);
díaentumecido = d); + b;
}
return(daynumb);
}/* Fin GETDAYS */
/***** ************************************************** * *
* GETDATE - Esta rutina obtiene un número de punto flotante doble *
* * que representa la fecha desde el 1 de enero de 1980 (día 1)
El número de días y devuelve el año, mes, *
* día*
* Esta rutina es lo opuesto a GETDAYS*
*** * ************************************************** ***/
getdate(numb)
doble entumecido
{
doble a,aa,b,c,d ,e,z;
fecha doble;
fecha = entumecido;
z = intg(fecha + 2444239.0); (fecha < - 145078.0) a = z;
en caso contrario
{
aa = piso((z - 1867216.25) / 36524.25);
a = z + 1 + aa - piso(aa/4.0);
}
b = a + 1524.0;
c = intg((b - 122.1) / 365.25);
d = intg(365.25 * c);
e = intg((b - d) / 30.6001); /p>
día = b - d - intg(30.6001 * e);
if (e >.13.5) mes = e - 13.0
else mes = e; - 1,0;
si (mes > 2) año = c - 4716,0
más año = c - 4715,0
si (año < 1) - año;
retorno;
}/* Fin GETDATE */
/****************** ******* ****************************************
* DÍAS DE LA SEMANA: esta rutina obtiene un número de punto flotante doble *
* que representa el número de días desde el 1 de enero de 1980 (día 1) y devuelve el día de la semana *
* donde 1 = domingo, 2 = martes, etc.
******************************************* ************/
int días laborables(entumecido)
doble entumecido
{
doble dd;
int día;
dd = entumecido
mientras (dd > 28000.0) dd = dd - 28000.0; > mientras (dd < 0) dd = dd + 28000.0;
día = dd
día = ((día + 1) % 7) + 1; p> retorno(día);
}
/*************************** *** *******************************
*FRACT - Esta rutina recibe un número de coma flotante doble * p>
* Y la parte decimal como doble*
* Devuelve un número de coma flotante*
*********** ****** *************************************/
doble frac(entumecido )
doble entumecido
{
int inumb;
doble fnumb; >
doble fnumb); (int inumb;
doble fnumb)
mientras (numb <-32767) entumecido += 32767
mientras (entumecido > 32767 ) entumecido -= 32767;
entumecido = entumecido;
fnumb = entumecido
return( entumecido-fnumb);
} /* Fin FRACT */
/********************************* **** ************************
*PISO - Esta rutina recibe un número de coma flotante doble *
* y devuelve el siguiente entero más pequeño*
****************************** ******** *******************/
doble piso(entumecido)
doble entumecimiento <; /p>
{
doble fract(), intg();
doble salida
salida = intg(entumecido); >
if (entumecido < 0 & & fract(entumecido), intg(entumecido), intg(entumecido), intg(entumecido), intg(entumecido), intg(entumecido), intg(entumecido), intg(entumecido) ) amp;& frac(adormecido) ! = 0) salida -= 1.0;
return(salida);
}/* final PISO */
/******* *************************
************************
*INTG - Esta rutina obtiene un número de punto flotante doble*
* Y devolver la parte entera como un número de coma flotante doble*
* Número de coma flotante*
****************** *** ***** *******************************/
doble intg(entumecido )
p>doble entumecido
{
doble fracta();
retorno(entumecido - fracta(entumecido));
}/* Fin INTG */