FRQ2019Q1

2019年 AP Computer Science A (AP CSA) 的 FRQ 第一题(Question 1)考察的是方法设计与控制结构 (Methods and Control Structures),主题为 APCalendar。 这道题是典型的“辅助方法调用”类题目,要求考生利用已给出的方法(API)来实现特定的业务逻辑。以下是对该题目的内容说明及核心分析: 1. 题目内容概览 题目定义了一个 APCalendar 类,其中提供了一些静态辅助方法,如: isLeapYear(int year):判断某一年是否为闰年。 firstDayOfYear(int year):返回某一年 1 月 1 日是星期几(0 为周日,1 为周一,以此类推)。 dayOfYear(int month, int day, int year):返回某一天是该年的第几天。 你需要实现两个方法: (a) numberOfLeapYears(int year1, int year2):统计从 year1 到 year2(包含两端)期间包含多少个闰年。 (b) dayOfWeek(int month, int day, int year):计算给定日期是星期几。 2. 题目核心分析 (a) numberOfLeapYears —— 考察循环与边界 核心目标: 在一个范围内进行遍历并统计。 关键点: * 循环控制: 需要从 year1 循环到 year2,要注意 year2 是包含在内的,因此循环条件应为 year lessthanorequal year2。 逻辑调用: 题目已给出 isLeapYear 方法,直接调用即可,无需关心其内部实现。 避坑指南: 这是一个典型的“Off-by-one”错误高发区,确保循环次数准确,不要漏掉端点。 (b) dayOfWeek —— 考察算法逻辑与取模运算 核心目标: 计算日期偏移量并转化为星期。 逻辑思路: 首先确定该年的 1 月 1 日是星期几(调用 firstDayOfYear)。 计算目标日期距离 1 月 1 日过了多少天(调用 dayOfYear 并减去 1,因为 1 月 1 日本身不算偏移量)。 利用取模运算 % 7 来循环处理星期(0-6 的循环)。 数学实现: return (firstDayOfYear(year) + dayOfYear(month, day, year) - 1) % 7; 3. 给考生的学习建议 对于此类“方法与控制结构”的题目,分析与解题模式如下: 观察题目给出的“工具箱”: 题目中提供的 /* Implementation not shown */ 方法是解题的关键。不要试图重新实现它们,直接调用即可。 明确题目要求: 题目通常要求你实现的功能比给出的工具复杂一点点,你需要做的就是串联这些逻辑。 注意数据类型与运算: * 涉及日期和周期性问题时,取模运算 (%) 是极其常用的技巧。 区分“包含”与“不包含”的边界条件(如 year1 到 year2 是否包含 year2)。 风格规范: 尽量写简洁的代码,能用一行数学公式解决的就不用复杂的循环(例如 dayOfWeek 的第二种解法),这样出错率更低。 如果你在练习 AP CSA 时经常在 for 循环的边界或者 if-else 的逻辑判断上出错,建议重点复习 AP CSA 的单元 4(迭代) 和 单元 5(类) 中的逻辑控制部分。