NOIP 普及组初赛 · NOIP 2015 普及组初赛试题 第 27 题

完善程序 · 答案 offset = 4(offset + dayNum[i]) % 7dayNum[m]i(offset + i) % 7 · 考点:输入输出、位运算、分支结构、循环结构、字符串(string)、STL容器基础

← 整套速查表 NOIP 普及组初赛 全部真题

题目

完善程序: (打印日历) 输入月份 $m(1\leq m\leq 12)$,按一定格式打印 $2015$ 年第 $m$ 月的月历。(第三、四空 $2.5$ 分, 其余 $3$ 分) 例如,$2015$ 年 $1$ 月的月历打印效果如下(第一列为周日):

S	M	T	W	T	F	S
				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

---

#include <iostream>
#include <string>
using namespace std;
const int dayNum[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int m, offset, i;
int main()
{
    cin >> m;
    cout << "S\tM\tT\tW\tT\tF\tS" << endl; /* '\t'为 TAB 制表符 */
    ①;
    for (i = 1; i < m; i++)
        offset = ②;
    for (i = 0; i < offset; i++)
        cout << '\t';
    for (i = 1; i <= ③; i++)
    {
        cout << ④;
        if (i == dayNum[m] || ⑤ == 0)
            cout << endl;
        else
            cout << '\t';
    }
    return (0);
}
答案:offset = 4(offset + dayNum[i]) % 7dayNum[m]i(offset + i) % 7

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构循环结构字符串(string)STL容器基础 讲解 →STL容器基础 真题汇总 →

解题思维

看到打印日历 → 先定offset初值(2015年1月1日是周四→4),再用(offset+i)%7判周日换行

常见错误

offset初值易错:2015年1月1日是周四,对应数组下标4,若误写成3或0会导致整张日历错位

详细解析(节选)

考点:循环控制、取模运算、日期推算

程序在做什么

输入月份m后,先输出表头;接着通过循环计算当月首日偏移offset,打印前offset个制表符;然后逐日打印日期,遇到周日((offset+i)%7==0)换行。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断