题目
本题是谭浩强《C程序设计课后习题》题7.18。
题目:
给出年,月,日。计算该天是该年的第几天。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj
一、解题思路
思路:
按题目给出思路:
1,首先,我们需要写出主函数,用于输入年月入,然后经过函数Seekday处理后,得到结果输出即可。
2,定义Seekday函数用于求天数,把当前月份之前的月份按天数相加即可,但其中有一个条件就是,并不是每个月的天数都一样,也不是每年的2月份天数都相同,这里牵扯到闰年和平年,闰年的2月份有29天,平年的2月份只有28天,月份是1,3,9,7,8,10,12为31天,其余为30天。
3.因为求月份部分比较复杂,我们把其单列为一个函数Seekmonth,只传入年份和月份即可,然后返回当月的天数。
具体实现请看代码部分,重要的地方已经标明注释。
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.函数部分
代码如下(示例):
int Seekmonth(year, month)
{
int days[13] = { 29,31,28,31,30,31,30,31,31,30,31,30,31 };
if (month == 2 && (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)))
{
return days[0];
}
return days[month];
}
int Seekday(int year, int month, int day)//按照月份求。
{
int days = 0;
for (int i = 1; i < month; i++)//为什么不是《=month?因为当月还没过完,不满一月,后面把天数加进去即可。
{
days += Seekmonth(year, i);//因为每个月的天数不一样,所以我们再定义一个函数用来对每个月的值进行遍历。
}
days += day;
return days;
}
2.主函数部分
代码如下(示例):
int main() {
int year, month, day;
printf("请输入年,月,日:>");
scanf("%d %d %d", &year, &month, & day);
int days = Seekday(year, month, day);
printf("%d年%d月%d日是这一年的第%d天\n", year, month, day, days);
return 0;
}
三、执行结果
输出:
请输入年,月,日:>2021 7 20
2021年7月20日是这一年的第201天
四,下面给出另外一种更优的算法
一、解题思路
1,主函数输入年月日
2,将年月日传入seek函数
3,在seek函数中定义一个整形数组,用于存放每个月份的值
4,从1到当前月份每月的天数相加到sum
5,Sum加上当前天数
6,判断如果月份大于2且当前年是闰年的话给总天数加1,因为闰年的2月份比平年多1天
7,输出sum即可
二、代码
#define _CRT_SECURE_NO_WARNINGS
#include<Stdio.h>
//18、给出年、月、日, 计算该日是该年的第几天。
void seek(int year, int mouth,int day)
{
int m[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int sum = 0;
for (int i = 1; i < mouth; i++)//i不能等于当前月份,因为当前月份没过完不能将天数计入总值
sum += m[i];
sum += day;
if ((mouth > 2) && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))//判断如果月份大于2且当前年是闰年的话给总天数加1,因为闰年的2月份比平年多1天
sum += 1;
printf("该日是该年的第%d天。", sum);
}
void main()
{
int year, mouth, day;
printf("请输入年月日:");
scanf("%d %d %d", &year, &mouth, &day);
seek(year, mouth, day);
}