不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

判断与循环_给程序加上处理逻辑

任务

如果我给你一个由年月日组成的日期,再给你一个数字 X,你能否准确地让程序输出 X 天后的日期呢?
例如

1
2
3
1989 11 20
20
1989 12 10

数据中给出了 1989 年 11 月 20 日这个日期,然后问你 20 天后的日期是多少,你的程序应该输出 1989 年 12 月 10 日。特别需要注意的是,在这个任务中,你需要考虑到闰年中 2 月份的特殊性,闰年的 2 月有 29 天。

编码

思路

  • 首先需要有一个循环,循环每一次,让计算机帮我们计算一次下一天的日期。
  • 每次在计算下一天日期的过程中,先让日子加1,判断是否跨月,如果跨过了一个月份,就让日子从1开始,让月份加1,再判断是否跨年,如果跨年了,就让月份从1开始,年份加1。
  • 注意2月份的月份天数的计算方法。
    闰年的判断方法,满足其一即可:能被4整除,但不能被100整除;能被400整除。因此代码逻辑应该是这样
    1
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>

int main() {
int y, m, d, X; // 定义存储 年月日 和 X 的变量
scanf("%d%d%d", &y, &m, &d); // 读入年月日
scanf("%d", &X); // 读入 X 值
for (int i = 0; i < X; i++) { // 循环 X 次,每次向后推一天
d += 1;
switch (m) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:{ // 第一部分逻辑
if (d > 31) d = 1, m += 1;
if (m == 13) m = 1, y += 1;
}; break;
case 4:
case 6:
case 9:
case 11: { // 第二部分逻辑
if (d > 30) d = 1, m += 1;
} break;
case 2: { // 第三部分逻辑
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
if (d > 29) d = 1, m += 1;
} else if (d > 28) {
d = 1, m += 1;
}
} break;
}
}
printf("%d %d %d\n", y, m, d);
return 0;
}

思考题

1,打印乘法表

使用循环和条件判断,打印一个格式优美的 66 乘法表
要求 1:输出内容及样式参照下面给出的样例
要求 2:每两列之间用 \t 字符进行分隔,行尾无多余 \t 字符

例子

1
2
3
4
5
6
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36

实现

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main() {
for (int i = 1; i <= 6; i++) { //外层循环控制行
for (int j = 1; j <= i; j++) { //内层循环控制每一行的列数
//第 i 行应该有 i 列,所以内层循环是从 1 循环到 i 为止。
j == 1 || printf("\t"); //如果左边条件不满足,就不会执行右边的的代码,所以:第一列前面不会多输出一个 \t 字符。而其他的情况呢,均会执行 printf("\t") 代码
printf("%d * %d = %d", j, i, i * j);
}
printf("\n");
}
return 0;
}
------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!