今天复习了会Program in c,有道题目计算任意两个日期之间的天数:
想了好久,最后写了一个很挫的程序.....
#include <stdio.h>
struct date
{
int year;
int month;
int day;
};
int main(void)
{
int isPrime(int year);
int dateDiff(struct date mindate,struct date maxdate);
struct date mindate,maxdate;
int days;
printf("please input the one date:");
scanf("%i-%i-%i",&mindate.year,&mindate.month,&mindate.day);
printf("please input other day:");
scanf("%i-%i-%i",&maxdate.year,&maxdate.month,&maxdate.day);
days=dateDiff(mindate,maxdate);
printf("the day is:%d\n",days);
return 0;
}
/************************************************************************/
/* 判断闰年函数(4年一润,100年不润,400年再润) */
/************************************************************************/
int isPrime(int year)
{
if ((year%4==0&&year%100!=0)||(year%400==0))
{
return 1;
}
else
{
return 0;
}
}
int dateDiff(struct date mindate,struct date maxdate)
{
int days=0, flag=1;
const int primeMonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};
const int notPrimeMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
/************************************************************************/
/* 交换两个日期函数,将小的日期给mindate,将大的日期给maxdate */
/************************************************************************/
struct date tmp;
if ((mindate.year>maxdate.year)|| (mindate.year==maxdate.year&&mindate.month>maxdate.month)||(mindate.year==maxdate.year&&mindate.month==maxdate.month&&mindate.day>maxdate.day))
{
tmp=mindate;
mindate=maxdate;
maxdate=tmp;
}
int maxmonth,minmonth;
/************************************************************************/
/* 主要思路:拿2002-8-8 2005-2-22来说 */
/* 将2004-8-8---2005-2-22----2005-7-8 */
/*一前一后刚好N年,算出2005-2-22到2005-7-8的天数,然后用总年*36(5|6)减掉) */
/* 2002-9-8 2005-11-22 */
/* 2002-9-8-----2005-9-8-----2005-11-22(这次是加上后面天数) */
/*如何判断是加还是减呢?年大而月小的,则是减,程序中用flag标示 */
/************************************************************************/
if (maxdate.month<mindate.month)
{
maxmonth=mindate.month;
minmonth=maxdate.month;
flag=-1;
}
else
{
maxmonth=maxdate.month;
minmonth=mindate.month;
flag=1;
}
/************************************************************************/
/* 从mindate.year开始累加到maxdate.year */
/************************************************************************/
for(int j=mindate.year;j<maxdate.year;++j)
{
if (isPrime(j)==1)
{
days+=366;
}
else
days+=365;
}
/************************************************************************/
/* 从minmonth累加到maxmonth,分闰年和平年 */
/************************************************************************/
int day;
if(isPrime(maxdate.year)==1)
{
for(int i=minmonth;i<maxmonth;i++)
{
day=primeMonth[i-1]*flag;
days=days+day;
}
days=days+maxdate.day-mindate.day;
}
else
{
for (int i=minmonth;i<maxmonth;i++)
{
day=notPrimeMonth[i-1]*flag;
days=days+day;
}
days=days+maxdate.day-mindate.day;
}
return days;
}
如果发现有错,请告诉我哦!!!!
测试一下,这里用mysql的datediff函数测试:
我的:
我的:
可能你测试的时候会发现,和mysql偏差一天,这我真不知道,也许是程序的问题吧,呵呵
突然发现,我想的有点问题,为什么不计算两个年份的日期到1月1号的日期呢,然后相减,哦,我想的有点复杂了,顺便将代码写的紧凑点.
#include <stdio.h>
#define isPrime(year) ((year%4==0&&year%100!=0)||(year%400==0))
struct date
{
int year;
int month;
int day;
};
int main(void)
{
// int isPrime(int year);
int dateDiff(struct date mindate,struct date maxdate);
struct date mindate,maxdate;
int days;
printf("please input the one date:");
scanf("%i-%i-%i",&mindate.year,&mindate.month,&mindate.day);
printf("please input other day:");
scanf("%i-%i-%i",&maxdate.year,&maxdate.month,&maxdate.day);
days=dateDiff(mindate,maxdate);
printf("the day is:%d\n",days);
return 0;
}
int dateDiff(struct date mindate,struct date maxdate)
{
int days=0,j,flag;
const int primeMonth[][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
/************************************************************************/
/* 交换两个日期函数,将小的日期给mindate,将大的日期给maxdate */
/************************************************************************/
struct date tmp;
if ((mindate.year>maxdate.year)|| (mindate.year==maxdate.year&&mindate.month>maxdate.month)||(mindate.year==maxdate.year&&mindate.month==maxdate.month&&mindate.day>maxdate.day))
{
tmp=mindate;
mindate=maxdate;
maxdate=tmp;
}
/************************************************************************/
/* 从mindate.year开始累加到maxdate.year */
/************************************************************************/
for(j=mindate.year;j<maxdate.year;++j)
days+=isPrime(j)?366:365;
//如果maxdate.year是闰年,则flag=1,后面调用primeMonth[1][12]
flag=isPrime(maxdate.year);
//加上maxdate.month到1月的天数
for (j=1;j<maxdate.month;j++)
days+=primeMonth[flag][j-1];
//减去mindate.month到1月的天数
flag=isPrime(maxdate.year);
for (j=1;j<mindate.month;j++)
days-=primeMonth[flag][j-1];
days=days+maxdate.day-mindate.day;
return days;
}
分享到:
相关推荐
C语言实现计算两个日期之间的天数的算法,原创!
c语言编写代码,输入年月日后可计算出输入年已过天数
两个功能,一个是计算两日期间隔的天数,一个是计算一个日前N天后(前)的日期
个人在进行C语言复习期间编写的一个进行日期计算的程序(算法优化),主要功能有:选择菜单,两个日期求间隔,按天数往后计算日期,按天数往前计算日期,功能循环。主要用了函数,指针,结构体等知识
C语言带参宏替换计算给定年份的二月天数,供初学者参考
c语言实现的任意日期和天数的转换程序~欢迎大家下载测试,有bug联系我^_^
自己写的计算任意给出的两个日期的天数 C语言代码 可参考下
简单的数学计算问题 计算数字的阶乘 使用C语言写的 可改变数字的大小
c语言求任意阶矩阵乘法,初学者或者学线性代数的可以用用。
主要介绍了C语言计算日期差的方法,结合具体实例形式分析了C语言针对日期转换、运算等相关操作技巧,需要的朋友可以参考下
利用C语言编写的计算天数的程序 本资源提供给需要用C语言编写天数的程序以供参考
用c语言实现了输入日期计算星期几,输入年份输出该年份各个月份的日历。其中包含了对日期输入的格式判断、闰年判断、星期几判断等判断功能。
C语言计算厄密多项式 例如,H3(2)的值是40。请编写一个递归函数,计算Hn(x)的值。你的函数应该与下面的原型匹配: int hermite( int n, int x); Hermite polynomials用于物理学和统计学。它们也可以作为递归练习在...
C语言训练程序_计算数组中n个数的和
C语言计算图片直方图,RGBA原图像,有四个颜色通道分别为R,G,B,A。本例循环分别将三个通道的RGB值取出,返回指针
选择好头尾日期后,计算两者之间天数,使用方式的话,可以下载下来之后,直接修改文件riqi网页版的文件名后缀,改成html就可以了,也可以直接在类似pycharm上面运行,还附带一个c语言版本的。统计日期数
C语言数值计算初步 C语言数值计算初步 C语言数值计算初步 C语言数值计算初步
有效值计算算法c语言实现,采用四分之一周波滑动平均,默认一周采样256点,采样点数可更改。实时计算,采一个点计算一次,精度较高,容易移植。
求任意两个数之间的所有素数,用C语言编程,并包含动态存储,指针等知识点。