清览题库--C语言程序设计第五版编程题解析(2)

前言

作者简介:在校学生,为全栈方向努力拼搏的一名小学生。

个人主页:吉师职业混子的博客_CSDN博客-python学习,HTML学习领域博主

题目来源:清览题库

相应专栏:https://blog.csdn.net/m0_55400802/category_12003021.html?spm=1001.2014.3001.5482

实在是没办法,本来打算向web方向努力,结果被学校通知所有专业都必须学习C语言,,

谁又想做一名吃力不讨好的全栈呢。

一、如何通过C语言判断闰年/非闰年(入门)

想要通过程序来判断是某个年份是/不是闰年,首先我们要明白闰年的判断方式

清览题库--C语言程序设计第五版编程题解析(2)_第1张图片

 通过查询可知,闰年的判断方式有两种:

1、可以被4整除

2、可以被400整除但是不可以被100整除

由此,可以通过使用if语句来实现代码

#include 
int main() {
	int y;//定义变量y
	scanf_s("%d", &y);//等待从键盘上读取
	if (y % 400 == 0 || y % 100 != 0 && y % 4 == 0)

if (y % 400 == 0 || y % 100 != 0 && y % 4 == 0)

 注意看这段if语句,通过“&&”符(或者)将整个条件分成了两个部分

第一部分是:

y % 400 == 0 || y % 100 != 0

 即为“可以被400整除但是不可以被100整除”。“||”符意为“并且”,本段代码意思是y除以400没有余数即为整除,并且,y除以100有余数。

第二部分是:

 y % 4 == 0

 除以4没有余数。

完整代码如下:

#include 
int main() {
	int y;
	scanf_s("%d", &y);
	if (y % 400 == 0 || y % 100 != 0 && y % 4 == 0)
		printf("闰年");
	else
		printf("非闰年");
	return 0;
}

二、三天打鱼两天晒网(困难)

题目

中国有句俗语叫“三天打鱼两天晒网”。某人从2000年1月1日起开始“三天打鱼两天晒网”,编写程序判断这个人在以后的某一天中是“打鱼”还是“晒网”。

输入用例:

2001/3/1

输出用例:

fishing

分析

本题之所以困难,是因为涉及到了闰年、2月份天数等需要额外排除的情况。先将整段代码放出来,我们将其拆分,逐段分析。

整段代码:

#include 
int main()
{
	int y, m, d, days = 0;
	scanf("%d/%d/%d", &y, &m, &d);
	days = 365 * (y - 2000);                /* 计算整年的天数 */
	for (int i = 2000; i < y; i++)        /* 修正闰年的366天 */
		if ((i % 400 == 0) || ((i % 100 != 0) && (i % 4 == 0)))
			days++;
	for (int i = 1; i < m; i++)           /* 计算整月的天数 */
	{
		switch (i)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			days = days + 31; break;
		case 4:
		case 6:
		case 9:
		case 11:
			days = days + 30; break;
		case 2:
			days = days + 28;
			if ((y % 400 == 0) || ((y % 100 != 0) && (y % 4 == 0)))
				days++;
			break;
		}
	}
	days = days + d; /* 计算当月已经过去的天数 */
	if (days % 5 == 1 || days % 5 == 2 || days % 5 == 3)
		printf("fishing\n");
	else
		printf("sleeping\n");
	return(0);
}

第一段:

int y, m, d, days = 0;
    scanf("%d/%d/%d", &y, &m, &d);
    days = 365 * (y - 2000);        

定义y,m,d三个变量分别代表年月日,并等待从键盘读取。

因为题目要求是在2000年及2000年之后,所以出现了(y-2000)*365并存储在days变量中

 第二段:

for (int i = 2000; i < y; i++)        /* 修正闰年的366天 */
        if ((i % 400 == 0) || ((i % 100 != 0) && (i % 4 == 0)))
            days++;

 该段代码中的if语句,即为题目一所分析,不再过多赘述。

days++意为如果是闰年,则加一天。

第三段:

for (int i = 1; i < m; i++)           /* 计算整月的天数 */
    {
        switch (i)
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            days = days + 31; break;
        case 4:
        case 6:
        case 9:
        case 11:
            days = days + 30; break;
        case 2:
            days = days + 28;

 此处代码是对月份天数进行规定,30天/31天/28天/29天

第四段:

if ((y % 400 == 0) || ((y % 100 != 0) && (y % 4 == 0)))
                days++;
            break;
        }
    }
    days = days + d; /* 计算当月已经过去的天数 */
    if (days % 5 == 1 || days % 5 == 2 || days % 5 == 3)
        printf("fishing\n");
    else
        printf("sleeping\n");
    return(0);
}

 按题目要求进行输出,不过多赘述。

你可能感兴趣的:(c++,c语言,开发语言)