ClearView 题库 - C 程序设计第 5 版程序设计问题解析 (2)
前言
????作者简介:在校学生,为全栈方向努力拼搏的一名小学生。 ????个人主页:吉师职业混子的博客_****博客-python学习,HTML学习领域博主 ????题目来源:清览题库 ????相应专栏:https://blog.****.net/m0_55400802/category_12003021.html?spm=1001.2014.3001.5482
实在是没办法,本来打算向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); }
按题目要求进行输出,不过多赘述。