/*
* 程序功能:计算出恋人相恋的天数
* 程序设计思想:总天数 = 年差 + 月差 + 日差
*
* 年差:用for循环从起始年累计,逢闰年+一天
* 月差:将月份与年份分离,先计算出该月与1月1日相差的天数,再在总天数上
* 进行加减
* 日差同理
* 2014/05/29 codor 第一次修改
* 新增功能:计算并显示出相恋第N天后的日期,加入选择界面 取名为code of love 1.0版
* 2014/06/03 codor 第二次修改
*/
#include <stdio.h>
#include <stdlib.h>
int confirm(int,int,int);//判断日期输入是否正确
int change_month(int,int);//用于计算输入天数求得的月份
int count_month(int); //用于计算除去整数年后,剩余整数月的天数的函数
void what_day(int,int,int,int,int,int);//计算恋爱的天数
void love_day(int,int,int,int);//用于计算相恋第几天后的日期
int welcome();//欢迎界面
void bye();//退出界面
void stop_it();//控制刷屏
int leap_or_not(int year){ //用于判断是否是闰年的函数
if(year % 400 == 0 || (year % 4 == 0 && year %100 != 0)){
return 366;
}
else {
return 365;
}
}
char name1[20],name2[20];
int main(){
int syear = 0, smonth = 0, sday = 0; //起始日期
int lyear = 0, lmonth = 0, lday = 0; //结束日期
int getdate = 0;
int boo = 0,option = 0;
int s_iffirm = 1,l_iffirm = 1;
welcome();
printf("请输入您的选择:");
scanf("%d",&boo);
if(boo == 0){
bye();
return 0;
}
printf("请输入你的名字:");
scanf("%s",name1);
printf("请输入你伴侣的名字:");
scanf("%s",name2);
while(s_iffirm){
printf("请输入相恋的年,月,日:\n");
scanf("%d%d%d",&syear,&smonth,&sday);
s_iffirm = confirm(syear,smonth,sday);
}
while(1){
system("clear");
printf("********************************************\n");
printf("********************************************\n");
printf("*********1、计算相恋的天数******************\n");
printf("*********2、显示相恋N天后的日期*************\n");
printf("*********0、退出程序************************\n");
printf("********************************************\n");
printf("********************************************\n");
printf("请选择:");
scanf("%d",&option);
if(option == 1){
while(l_iffirm){
printf("请输入今天的年,月,日:\n");
scanf("%d%d%d",&lyear,&lmonth,&lday);
l_iffirm = confirm(lyear,lmonth,lday);
if(lyear < syear){
printf("年份不能小于起始年份,请重新输入!\n");
l_iffirm = 1;
}
}
what_day(syear,smonth,sday,lyear,lmonth,lday);
stop_it();
}
else if(option == 2) {
printf("请输入你想要查看哪一天的日期:");
scanf("%d",&getdate);
love_day(syear,smonth,sday,getdate);
stop_it();
}
else {
bye();
return 0;
}
}
}
int welcome(){
system("clear");
printf("********************************************\n");
printf("********************************************\n");
printf("********************************************\n");
printf("********************************************\n");
printf("********************************************\n");
printf("**********欢迎使用计算日期功能!************\n");
printf("********************************************\n");
printf("**********继续请输入1,退出请输入0**********\n");
printf("********************************************\n");
printf("********************************************\n");
printf("********************************************\n");
printf("********************************************\n");
}
void bye(){
system("clear");
printf("\n********************************************\n");
printf("********************************************\n");
printf("**************Bye Bye !!********************\n");
printf("********************************************\n");
printf("********************************************\n");
}
void stop_it(){
char stoping[4];
printf("返回请输入任意数字:");
scanf("%s",stoping);
}
int confirm(year,mth,day){
if(year < 1900 || year > 2050 ||
mth < 1 || mth > 12 ||
day < 1 || day > 31){
printf("输入错误,请重新输入\n");
return 1;
}
if(mth == 2 || mth == 4 || mth == 6 || mth == 9 || mth == 11){
if((mth == 2 && day > 29) || day > 30){
printf("日期输入错误,小月不大于30,请重新输入\n");
return 1;
}
}
return 0;
}
int count_month(month){
int sum1 = 0;
switch(month){
case 1:sum1 = 0;break;
case 2:sum1 = 31;break;
case 3:sum1 = 59;break;
case 4:sum1 = 90;break;
case 5:sum1 =120;break;
case 6:sum1 =151;break;
case 7:sum1 =181;break;
case 8:sum1 =212;break;
case 9:sum1 =243;break;
case 10:sum1 =273;break;
case 11:sum1 =304;break;
case 12:sum1 =334;break;
default:printf("输入错误,请核对!dd");break;
}
return sum1;
}
int change_month(year,month){
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:return 31;
case 4:
case 6:
case 9:
case 11:return 30;
case 2:if(leap_or_not(year)%365){return 29;}
else {return 28;}
default:printf("输入错误,请核对!cc");break;
}
}
void what_day(syear,smonth,sday,lyear,lmonth,lday){
int ssum = 0,lsum = 0;
int ttl = 0;
int i = 0;//用于循环,无实际意义
ssum = count_month(smonth); //获得返回的天数
lsum = count_month(lmonth);
for(i = syear; i < lyear;i++){
ttl += leap_or_not(i);
}
if(leap_or_not(syear) == 366 && smonth >2){
//若为闰年,且日期在2月之后,则加1
ssum++;
}
if(leap_or_not(lyear) == 366 && lmonth >2){
lsum++;
}
ttl = ttl + lsum - ssum + lday - sday;
printf("%s和%s相恋了%d天\n",name1,name2,ttl);
}
void love_day(year,month,day,getdate){
int theday = getdate;
while (getdate / leap_or_not(year)){
getdate -= leap_or_not(year++);
}
while (getdate / (change_month(year,month))){
getdate -= change_month(year,month++);
if(month == 12){
month = month % 12;
year++;
}
}
day = day + getdate;
while (day / change_month(year,month)){
day -= change_month(year,month++);
if(month == 12){
month = month % 12;
year++;
}
printf("减去%d\n",day);
}
printf("你们相恋第%d天的日期是%d年%d月%d日\n",theday,year,month,day);
}