写点什么

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

  • 2022 年 9 月 24 日
    吉林
  • 本文字数:1754 字

    阅读完需:约 6 分钟

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

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

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

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

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


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

1、可以被 4 整除

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

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

#include <stdio.h>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 <stdio.h>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 <stdio.h>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);}

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

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2022.08.25 加入

还未添加个人简介

评论

发布
暂无评论
清览题库--C语言程序设计第五版编程题解析(2)_九月月更_吉师职业混子_InfoQ写作社区