实验目的:
1.熟悉C程序设计中的选择和循环等语句。
2.熟悉C程序设计中的switch语句来实现多分支选择结构
3.熟悉C程序设计中的自定义函数
实验原理:
1. 需先自定义一个函数来判断是否是闰年,并根据年份输出对应每个月的天数。
2. 通过起始日期与截止日期的年月情况,用年差dy,月差dm,天差dd来方面计算。
实验内容:
天数统计
1)键盘输入起始日期和结束日期,统计从起始日期至结束日期,经历的天数;
2)注意大小月、闰年等问题。
实验结果:
#include <stdio.h>
int year(int year) {
if ((year % 4==0) && (year % 100!=0)|| year % 400 ==0)
return 1;
else
return 0;
}
int month(int month,int year1) {
int day = 0;
if ((year(year1))==1)
{
switch (month)
{
case(1):day = 31; break;
case(2):day = 29; break;
case(3):day = 31; break;
case(5):day = 31; break;
case(7):day = 31; break;
case(8):day = 31; break;
case(10):day = 31; break;
case(12):day = 31; break;
default: day = 30;
}
}
else
switch (month)
{
case(1):day = 31; break;
case(2):day = 28; break;
case(3):day = 31; break;
case(5):day = 31; break;
case(7):day = 31; break;
case(8):day = 31; break;
case(10):day = 31; break;
case(12):day = 31; break;
default: day = 30;
}
return day;
}
int yearday(int j) {
int dd = 0;
int year = j;
for (int i = 1; i <= 12; i++)
dd += month(i,year);
return dd;
}
int main() {
int year1, month1, day1;
int year2, month2, day2;
int dy = 0, dm = 0, dd = 0;
printf("起始日期:");
scanf("%d/%d/%d", &year1, &month1, &day1);
printf("截至日期:");
scanf("%d/%d/%d", &year2, &month2, &day2);
if (year1 == year2)
{
if (month1 == month2)
{
dd = day2 - day1;
}
else
{
int year = year1;
dm = month2 - month1;
for (dm = dm - 1; dm > 0; dm--)
{
dd += month(month1 + dm,year);
}
dd += ((month(month1,year) - day1));
dd += day2;
}
}
else
{
dy = year2 - year1;
for (dy = dy - 1; dy > 0; dy--)
{
int year = year1 + dy;
for(int i=1;i<=12;i++)
dd += month(i,year);
}
int year = year2;
for (int i = 1; i < month2; i++)
{
dd += month(i,year);
}
dd += day2;
year = year1;
int dd1 = 0;
for (int i = 1; i < month1; i++)
{
dd1 += month(i,year);
}
dd1 += day1;
dd += (yearday(year1) - dd1);
}
printf("间距%d天", dd);
}
总结与思考
统计天数与打印日历在计算天数时有着相同的方法,但统计天数有着起始日期和结束日期,不需要自己人为设定一个初始年份,在计算过程中只要依次累加每个月的天数和起始、截止月的天数就行,思路条理比较清晰。