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判断两个日期间隔几个工作日 方法:使用存储过程 /** * 判断两个日期间隔几个工作日 */ ...
随机推荐
- Mysql的学习研究
2017年5月16日11:26:17 从今天开始过一遍数据库的基础教程,加油!!!!! 看了之后对一些基础知识有了理解,加油... 笔记: 2017年5月16日11:35:46mysql的基础教程1. ...
- [原创]关于absolute、relative和float的一些思考
absolute: 元素完全脱离文档流,不占文档流的位置,不使用top.left等属性时,仍然在原文档流位置上(但是不在文档流中,也不占用位置),设置了top.left等之后,向上寻找到第一个非sta ...
- EasyDSS流媒体解决方案实现的RTMP/HLS视频直播、直播鉴权(如何完美将EasyDSS过渡到新版)
上一篇博文介绍了EasyDSS点播功能,然后作为RTMP流媒体服务器,接受RTMP推流.进行实时的直播流分发又是自身一大核心功能. 需求背景: 写本篇博文的一个目的是向大家介绍一下EasyDSS新版的 ...
- Java内部类{[普通内部类][静态内部类]}
package Learn.com.seven; /** * * @author tqw * 本例主要学习内部类的使用 * Java的内部类分成两部分来讲: * 1:内部类 * 2:静态内部类 * * ...
- SpringMVC拦截器实现登录认证
项目结构如图: 需要的jar:有springMVC配置需要的jar和jstl需要的jar SpringMVC包的作用说明: aopalliance.jar:这个包是AOP联盟的API包,里面包含了针对 ...
- 九度OJ 1337:寻找最长合法括号序列 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...
- Centos 6 安装 python2.7 和 pip
一.安装 python2.7 [root@crazy-acong ~]# cd /data/tools/ [root@crazy-acong tools]# yum groupinstall &quo ...
- Django之stark组件1
stark组件 stark组件是根据Django admin为原型写的一个组件,能够让我们告别增删改查.stark组件是可插拔试的组件, 移植性强,而且只用配置文件就能够得到想要的数据 一.stark ...
- 在函数中如何获取 线程对象、线程唯一ID
threading.current_thread() threading.current_thread().ident
- inux c编程:读写锁
前面介绍的互斥量加锁要么是锁状态,要么就是不加锁状态.而且只有一次只有一个线程可以对其加锁.这样的目的是为了防止变量被不同的线程修改.但是如果有线程只是想读而不会去写的话,这有不会导致变量被修改.但是 ...