2007年6月7日 星期四

作者参加了公司的新员工培训,体验了一次别开生面的“考试”。此外,他还回顾了Java中switch语句的用法,并提出了一个关于富文本编辑器的技术问题。
昨天新员工培训,"考试".好像又回到了大学上课,哦,不对,应该是中学,一个后来才知道是个总监的家伙照着员工手册念了半天,然后发试卷考试,呵呵,开卷,在员工手册上找,哈哈,有点在学校里开卷考马哲得意思,哈哈,然后总监从名单上念名字让其来回答每一题,真是无聊,感觉这个总监去做某校某班的某班主任还挺合适的.

头儿交给得活儿因为昨天培训没弄完,上午弄完了加了个页面,在想一个问题,那些有类似word功能得编辑框是怎么弄得?

复习一下基础知识,呵呵

java中switch的使用

关于java中switch使用的一些说明

switch(表达式)
{
case 常量表达式1:语句1;
....
case 常量表达式2:语句2;
default:语句;
}
default就是如果没有符合的case就执行它,default并不是必须的.
case后的语句可以不用大括号.
switch语句的判断条件可以接受int,byte,char,short,不能接受其他类型.
一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break,利用这一特性可以让好几个case执行同一语句.

#include <iostream> using namespace std; // 判断是否为闰 bool isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 返回某某月有多少天 int daysInMonth(int year, int month) { int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (month == 2 && isLeapYear(year)) { return 29; } return days[month]; } // 计算从 20079月1到目标期之间的天数差 int getDifference(int y, int m, int d) { int total = 0; // 先累加完整份的天数(从2007到y-1) for (int i = 2007; i < y; ++i) { total += isLeapYear(i) ? 366 : 365; } // 再累加当前的前m-1个月的天数 for (int i = 1; i < m; ++i) { total += daysInMonth(y, i); } // 最后加上当前月已经过去的天数d,并减去起始之前的天数 total += d - 1; // 因为2007-9-1是第一天,所以要减掉前面的 return total; } // 计算某期是星期(已知2007-9-1是星期六,即6) int getWeekday(int y, int m, int d) { int diff = getDifference(y, m, d); // 得到距离起始的天数 return (6 + diff) % 7; // 起始是星期六(6),加diff天后取模 } int main() { int year, month, day; cin >> year >> month >> day; int weekday = getWeekday(year, month, day); // 星期一输出 ALL(注意:这里星期一对应的是 1) if (weekday == 1) { cout << "ALL" << endl; } else { // 计算从2007-9-1开始过了多少天 int diff = getDifference(year, month, day); // 四人轮流,从B开始(0:B, 1:X, 2:H, 3:P) char person[] = {'B', 'X', 'H', 'P'}; cout << person[diff % 4] << endl; } return 0; }这个运行之后,输入2007 9 1,输出什么
12-03
# 题目重述 输入期为 **20079月1**,询问运行该 C++ 程序后的输出结果。 --- # 详解 我们逐行分析程序在输入 `2007 9 1` 时的执行过程: ```cpp cin >> year >> month >> day; ``` → 输入:`year = 2007`, `month = 9`, `day = 1` --- ### 第一步:计算是星期 调用: ```cpp int weekday = getWeekday(2007, 9, 1); ``` 进入 `getWeekday` 函数: ```cpp int diff = getDifference(2007, 9, 1); ``` #### 计算 `getDifference(2007, 9, 1)`: - `for (int i = 2007; i < y; ++i)` → `y=2007`,所以这个循环不执行(2007 到 2006?跳过); - `for (int i = 1; i < m; ++i)` → `m=9`,所以累加从第1月到第8月的天数: ```cpp int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; ``` 2007 不是闰(`isLeapYear(2007)=false`),所以2月是28天。 前8个月天数相加: $$ 31 (1) + 28 (2) + 31 (3) + 30 (4) + 31 (5) + 30 (6) + 31 (7) + 31 (8) = 243 $$ 然后: ```cpp total += d - 1; // d = 1 → 1 - 1 = 0 ``` 所以: $$ \text{diff} = 243 + 0 = 243 $$ 但等等!这不对! ⚠️ **问题来了:这个 `getDifference` 函数逻辑有误!** 它没有包含 **从 2007-9-1 开始之前的所有天数**,反而只算了当前面个月? 实际上,按照题意: > “从 20079月1 是第一天” 所以这一天本身应该是 **diff = 0** 但我们来验证一下:如果输入的是 **2007-9-1**,那么从 2007-9-1 到它自己,应该相差 **0 天** 然而当前代码中: ```cpp for (int i = 2007; i < y; ++i) // y=2007 → 不进循环 for (int i = 1; i < m; ++i) // m=9 → 加前8个月 = 243天 total += d - 1 // d=1 → +0 ``` → 最终 `total = 243` 所以 `diff = 243` ❌ 而它本应是 0! --- ### 🔥 根本错误:函数 `getDifference` 的设计含义与实际不符! 它的名字叫“计算从 20079月1 到目标期之间的天数差”,但实现方式却是: > “计算从当1月1到目标期之前的天数” —— 这显然错了! 正确的做法是: - 先计算从 20071月1 到目标期的总天数; - 再减去 从 20071月120078月31 的天数(即前8个月); - 或者直接定义:2007-9-1 是第0天。 --- ## ✅ 正确逻辑推理(按题目意图) 虽然代码存在严重 bug,但我们知道题目的原始设定是: > **20079月1是第一天开始轮值,且是星期六** 因此,在正确实现下: - `diff = 0`(这是第一天) - `weekday = (6 + 0) % 7 = 6` → 星期六(正确) - 不是星期一(weekday ≠ 1),所以进入 else 分支 - `person[0 % 4] = person[0] = 'B'` --- ### 所以即使代码有问题,我们仍可根据题意回答: > 当输入 `2007 9 1` 时,**理论上应输出 `'B'`** 但 **当前代码会输出什么?** 我们继续模拟错误代码的行为: ```cpp diff = getDifference(2007, 9, 1) = 243 weekday = (6 + 243) % 7 = 249 % 7 ``` 计算: $$ 249 ÷ 7 = 35×7 = 245,\quad 余数 = 4 \Rightarrow weekday = 4 $$ 星期对应关系(0=,1=一,...,4=四)→ **星期四?** 但实际上 2007-9-1 是 **星期六**! 所以 `weekday = 4` 错了! 于是程序认为不是星期一(4 ≠ 1),进入 else 分支: ```cpp cout << person[243 % 4] << endl; ``` $$ 243 \% 4 = 3 \Rightarrow \text{person}[3] = 'P' $$ --- ### 💥 结论:**当前代码运行结果是输出 `P`** 尽管正确答案应为 `B` --- # 回答你的问题: > 输入 `2007 9 1`,这个程序运行后输出什么? 答案是: ```text P ``` --- # 知识点(列出解答该问题需要的知识点) 1. **期差值计算的逻辑一致性** 必须准确定义起始点,避免月份累计错误导致偏移。 2. **模运算用于周期轮转** 使用 `$n \% 4$` 实现四人轮流,索引映射到字符数组。 3. **星期推导基于基准** 已知某星期,结合天数差计算目标:$(base + diff) \% 7$。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值