金牌会员
 
- 积分
- 2099
- 金钱
- 2099
- 注册时间
- 2017-2-11
- 在线时间
- 306 小时
|
简单分析下面两个实际项目中用到的算法:
1.输入当前年,月,日和周期天数,计算预期的年,月,日
- #include <stdio.h>
- #include <stdlib.h>
- /* run this program using the console pauser or add your own getch, system("pause") or input loop */
- void get_data(int start_year, int start_month, int start_day, int days);
- struct GTE_NEWDATA
- {
- int year; //定义天
- int month; //定义月
- int day; //定义天
- };
- struct GTE_NEWDATA get_newdata;
- int main(int argc, char *argv[])
- {
- int year , mon , day , daycnt;
- while(1)
- {
- printf("input year/mouth/day/daycnt:");
- scanf("%d/%d/%d/%d" , &year , &mon , &day ,&daycnt);
-
- get_data(year,mon,day,daycnt);
- printf("new day:%d/%d/%d\n" , get_newdata.year , get_newdata.month , get_newdata.day );
- }
- return 0;
- }
- void get_data(int uiyear, int uimonth, int uiday, int uidaycnt)
- {
- static int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
-
- //请确保输入的数据是有效的日期,不然出错
- //根据年份确定当年是否闰年
- if ( (uiyear%4==0 && uiyear %100) || uiyear %400==0 )
- days[1]=29; //闰年二月29
- else
- days[1]=28;//平年二月28
-
- //目前只支持正数
- uiday += uidaycnt;
- while ( uiday > days[uimonth-1] ) //天数超过当前月最大天数,要过月
- {
- uiday -= days[uimonth-1] ;
- uimonth += 1 ;
- get_newdata.month = uimonth;
- if ( uimonth > 12 ) //月满则变年
- {
- uimonth = 1;
- uiyear += 1 ; //年变后,要重新确认下一年是否闰年
- if ( (uiyear%4==0 && uiyear %100) || uiyear %400==0 )
- days[1]=29;
- else
- days[1]=28;
- }
- }
-
- get_newdata.day = uiday;
- get_newdata.month = uimonth;
- get_newdata.year = uiyear;
- }
复制代码 得到的结果如下:
2.已知当前年、月、日和未来的年、月、日,计算两者之间的天数
- #include <stdio.h>
- #include <stdlib.h>
- /*******************************
- *Function: 计算任意日期间的天数
- *int start_year,start_month, start_day: 开始年,月,日
- *int end_year, end_month, end_day: 结束年,月,日
- *return: 计算的结果
- */
- double Count_day(int start_year, int start_month, int start_day, int end_year, int end_month, int end_day);
- /* run this program using the console pauser or add your own getch, system("pause") or input loop */
- int main(int argc, char *argv[])
- {
- char name[20]; //定义字符串数组
- double ret; //定义接受函数返回值的边量
- int start_year, start_month, start_day; //定义开始的年份,月份,天数变量
- int end_year, end_month, end_day; //定义结束的年份,月份,天数变量
- while(1) //循环输入判断
- {
- printf("请输入您的姓名:___\b\b\b");
- scanf("%s", name);
- printf("欢迎%s来到地球探险\n", name);
- printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
- printf("请输入你的生日时间(年-月-日):\n");
- scanf("%d-%d-%d", &start_year, &start_month, &start_day);
- printf("请输入你要查询的最后时间(年-月-日):\n");
- scanf("%d-%d-%d", &end_year, &end_month, &end_day);
- printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
- ret = Count_day(start_year, start_month, start_day, end_year, end_month, end_day); //调用日期函数
- printf("非常庆幸,您已经在地球上存活了%.0f天\n", ret);
- printf("欢迎您来到地球探险!\n");
- printf("\n");
- }
- return 0;
- }
- /*******************************
- *Function: 计算任意日期间的天数
- *int start_year,start_month, start_day: 开始年,月,日
- *int end_year, end_month, end_day: 结束年,月,日
- *return: 计算的结果
- */
- double Count_day(int start_year, int start_month, int start_day, int end_year, int end_month, int end_day)
- {
- //定义月份包含的天数一维数组
- int day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
- int i; //定义循环变量
- double sum_day = 0; //定义总的天数,并初始化为0
- int count_lyear = 0; //定义总的闰年数,并初始化为0
- int count_cyear = 0; //定义总的平年数,并初始化为0
- int count_sday = 0; //定义开始年的天数,并初始化为0
- int count_eday = 0; //定义结束年的天数,并初始化为0
- for(i = start_year + 1; i < end_year; i++) //记录整的闰年数和平年数
- {
- if(((i % 4) == 0 && (i % 100) != 0) || (i % 400) == 0)
- {
- count_lyear++; //闰年总数增加
- }else{
- count_cyear++; //平年总数增加
- }
- }
- if(start_year == end_year) //当两年分相同时
- {
- //判断是不是闰年,是闰年则将day[1]初始化为29,否则为28
- day[1] = (((start_year % 4) == 0 && (start_year % 100) != 0) || (start_year % 400) == 0) ? 29 : 28;
- for(i = start_month; i < end_month; i++) //循环记录开始月份到结束月份的天数
- {
- sum_day += day[start_month - 1];
- }
- sum_day = sum_day - start_day + end_day; //计算总天数,减去开始月的天数,加上最后一个月的天数
- }else{
- while(start_month <= 12) //循环记录开始年的天数
- {
- day[1] = (((start_year % 4) == 0 && (start_year % 100) != 0) || (start_year % 400) == 0) ? 29 : 28;
- count_sday += day[start_month - 1];
- start_month++;
- }
- count_sday -= start_day; //减去开始月份包含的天数
- int month = 1; //定义结束年份起始的月份,初始化为1
- while(month < end_month) //循环记录结束年份中结束月份之前的天数
- {
- day[1] = (((end_year % 4) == 0 && (end_year % 100) != 0) || (end_year % 400) == 0) ? 29 : 28;
- count_eday += day[month - 1];
- month++;
- }
- count_eday += end_day; //加上结束月份包含的天数
- //计算总天数
- sum_day += (count_lyear * 366) + (count_cyear * 365) + count_sday + count_eday;
- }
- return sum_day;
- }
复制代码 计算的结果如下:
伸手党记得点赞哦!~@@~
|
|