C语言小程序(三)、判断两个日期之差
输入两个日期,计算之间相差多少天。 用了两种方法实现,第二种利用结构体,代码比较清晰,其余的都一样。
1.普通的写法
#include <stdio.h> int leapyear(int year)
{
if((year%4==0 && year%100!=0) || year%400==0)
return 1;
else
return 0;
} int days(int *day1, int *day2)
{
int i=0;
int *tmp;
int diff = 0;
const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(day1[0] == day2[0])
{
if(day1[1] == day2[1])
{
diff = day1[2] - day2[2];
diff = (diff < 0)?(-diff):diff;
}
else
{
if(day1[1] < day2[1]) //day1=1991-5-8 day2=1991-6-2
{
tmp = day1; //day1=1991-6-2 day2=1991-5-8
day1 = day2;
day2 = tmp;
}
for(i=day2[1]+1; i<day1[1]; i++)
{
diff += month[i];
}
diff += month[day2[1]] - day2[2] + day1[2];
if(day2[1] <= 2 && day1[1] >2)
if(leapyear(day2[0]))
diff++;
}
}
else
{
if(day1[0] < day2[0])
{
tmp = day1;
day1 = day2;
day2 = tmp;
}
for(i=day2[0]+1; i<day1[0]; i++)
{
if(leapyear(i))
diff += 366;
else
diff += 365;
}
for(i=day2[1]+1; i<=12; i++) //day1=1992-1-1 day2=1991-1-1
{
diff += month[i];
}
diff += (month[day2[1]] - day2[2]);
if(day2[1] <= 2)
if(leapyear(day2[0]))
diff++;
for(i=1; i<day1[1]; i++)
{
diff += month[i];
}
diff += day1[2];
if(day1[1] > 2)
if(leapyear(day1[0]))
diff++;
} return diff;
} int main()
{
int day1[3], day2[3];
int day = 0;
printf("输入日期:");
scanf("%d-%d-%d",&day1[0], &day1[1], &day1[2]);
printf("输入另一个日期:");
scanf("%d-%d-%d",&day2[0], &day2[1], &day2[2]);
day = days(day1, day2);
printf("两个日期之间共有%d天。\n",day); return 0;
}
2.利用结构体,代码更整洁一些
#include <stdio.h> typedef struct date
{
int year;
int month;
int day;
}DATE; int leapyear(int year)
{
if((year%4==0 && year%100!=0) || year%400==0)
return 1;
else
return 0;
} int compare(DATE *d1, DATE *d2) //如果第一个日期比第二个日期大,交换日期
{
DATE *tmp;
if(d1->year == d2->year) //年数相等
{
if(d1->month > d2->month) //月数相等
{
tmp = d1;
d1 = d2;
d2 = d1;
}
else if(d1->month == d2->month) //日期相等
{
if(d1->day > d2->day)
{
tmp = d1;
d1 = d2;
d2 = d1;
}
}
}
else if(d1->year > d2->year)
{
tmp = d1;
d1 = d2;
d2 = tmp;
} return 0;
} int diff(DATE *date1, DATE *date2)
{
int i;
int diff = 0;
const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(date1->year == date2->year)
{
if(date1->month == date2->month)
{
diff = date2->day - date1->day;
}
else
{
for(i=date1->month+1; i<date2->month; i++)
{
diff += month[i];
}
diff += month[date1->month] - date1->day + date2->day;
if(leapyear(date1->year))
if(date1->month <=2 && date2->month >2)
diff++;
}
}
else
{
for(i=date1->year+1; i<date2->year; i++)
{
if(leapyear(i))
diff += 366;
else
diff += 365;
}
for(i=date1->month+1; i<=12; i++) //date1距离年末多少天
{
diff += month[i];
}
diff += month[date1->month] - date1->day;
if(date1->month <= 2)
if(leapyear(date1->year))
diff++;
for(i=1; i<date2->month; i++) //date2距离年初多少天
{
diff += month[i];
}
diff += date2->day;
if(date1->month > 2)
if(leapyear(date2->year))
diff++;
} return diff;
} int main()
{
int days = 0;
DATE day1, day2;
DATE *date1, *date2;
date1 = &day1;
date2 = &day2;
printf("输入日期:");
scanf("%d-%d-%d",&(date1->year), &(date1->month), &(date1->day));
printf("输入另一个日期:");
scanf("%d-%d-%d",&date2->year, &date2->month, &date2->day);
compare(date1, date2);
days = diff(date1, date2);
printf("两个日期之间共有%d天。\n",days);
return 0;
}
C语言小程序(三)、判断两个日期之差的更多相关文章
- C语言小程序——推箱子(窄字符和宽字符)
C语言小程序——推箱子(窄字符Version) 推箱子.c #include <stdio.h> #include <conio.h> #include <stdlib. ...
- Linux下简单C语言小程序的反汇编分析
韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...
- 通过反汇编C语言小程序学习Liunx汇编语言
大家好! 我是来自山东师范大学的吴乐. 今天在<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- c语言小程序以及java生成注释文档方法
c语言小程序:sizeof和strlen() sizeof运算符以字节为单位给出数据的大小,strlen()函数以字符为单位给出字符串的长度,字符和字节不是一回事. char类型用于存储字母和标点符号 ...
- Linux C语言小程序
Linux C语言小程序 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include & ...
- 小程序如何判断用户(后台使用Django)
小程序如何判断用户是哪个: 有Web开发经验的都知道,客户端用户发起请求,服务器收到请求后,可以通过把用户user_id记录到session里,然后下次通过session里面的user_id来辨别是哪 ...
- 微信小程序内判断是否关注公众号(JAVA)
微信小程序内判断是否关注公众号(JAVA) 思路来源(第二种): https://blog.csdn.net/Yanheeee/article/details/117295643 /** * 总体思路 ...
- 自己设计一个日期类,可以输入年月日作为构造时的参数,如果不使用参数,则设定为1900年1月1日;编写一个方法equals判断两个日期是否相等;另一个方法compareTo可以进行日期之间的比较,返回两个日期之间相差的天数.
import java.util.*; import java.lang.Math; class Date1{ private int year; private int month; private ...
- ORACLE判断两个日期间隔几个工作日
CreateTime--2017年9月7日17:14:56 Author:Marydon ORACLE判断两个日期间隔几个工作日 方法:使用存储过程 /** * 判断两个日期间隔几个工作日 */ ...
随机推荐
- -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
本文转载至 http://blog.csdn.net/m372897500/article/details/38293973 -[ASIDataCompressor compressBytes:len ...
- Xshell调节字体大小和样式
有时候没有看着字体太小的,好难受, 调节字体大小: ALT+P快捷键打开
- 修改maven的war包生成路径
因为要配合jenkins,所以控制了war包的生成目录: <plugins> <!--打war包到指定的目录下 --> <plugin> <groupId&g ...
- JS表单提交
测试一: function submit(){var form1=document.getElementById("form1")form1.action="/manag ...
- ElasticSearch(十八)初识分词器
1.什么是分词器 作用:切分词语,normalization(提升recall召回率),如给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单词进行normalization(时态转换 ...
- SocketAsyncEventArgs里的AcceptSocket能独立存在吗?
独立存在是什么意思? 先来看一个例子.我们知道一个Socket对象(我们叫他ListenScoket)可以调用AcceptAsync并接受一个SocketAsyncEventArgs对象,如果操作成功 ...
- 怎样将lua移植到arm平台的linux内核
将脚本移植到内核是一件非常酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核.仅仅可惜仅仅支持x86.不支持arm,在网上搜索了下,没有找到 ...
- windows10下载
http://care.dlservice.microsoft.com/dl/download/F/5/7/F574727C-B145-4A7D-B85B-11C4E8DC894B/9841.0.14 ...
- Office 2013“永久激活信息”备份
Office 2013“永久激活信息”备份还原简明教程及成功恢复的注意事项Office 2013永久激活后及时备份激活信息可以保证重装后快速激活.网上也有流行的各种备份工具,虽然操作简单,但是如果不理 ...
- 关于highcharts-ng
1.内容都正确但是不显示,使用parseInt()方法转换