1、二级 C+分类模拟 133 及答案解析(总分:100.00,做题时间:90 分钟)一、基本操作题(总题数:1,分数:30.00)1.请使用 VC6 或使用【答题】菜单打开 prog1 下的工程 prog1,该工程中包含程序文件 main.cpp,其中有 Salary(“工资”)类和主函数 main 的定义。程序中位于每个“/ ERROR *found*”之后的一行语句行有错误,请加以改正。改正后程序的输出结果应为: 应发合计:3500 应扣合计:67.5 实发工资:3432.5 注意:只修改每个“/ ERROR *found*”下的那一行,不要改动程序中的其他内容。 #include iost
2、ream using namespace std; class Salary public: Salary(const char * id, double the_base, double the_bonus, double the_tax) / ERROR *found* : the_base (base), the_bonus (bonus), the_tax (tax) staff_id = new charstrlen (id) +1; strcpy (staff_id, id); / ERROR *found* Salary() delete * staff_id; double g
3、etGrossPay() const return base + bonus; /返回应发项合计 double getNetPay() const return getGrossPay() - tax; /返回实发工资额 private: char * staff_id; /职工号 double base; /基本工资 double bonus; /奖金 double tax; /代扣个人所得税 ; int main() Salarypay(“888888“, 3000.0, 500.0, 67.50); cout “应发合计:“ pay.getGrossPay() “ “; cout “应扣
4、合计:“ pay.getGrossPay() - pay.getNetPay() “ “; / ERROR *found* cout “实发工资:“ pay:getNetPay() endl; return 0; (分数:30.00)_二、简单应用题(总题数:1,分数:30.00)2.请使用 VC6 或使用【答题】菜单打开 prog2 下的工程 prog2。此工程中包含一个程序文件 main.cpp,其中有“部门”类 Department 和“职工”类 Staff 的定义,还有主函数 main 的定义。在主函数中定义了两个“职工”对象,他们属于同一部门。程序展示,当该部门改换办公室后,这两个人
5、的办公室也同时得到改变。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 改换办公室前: 职工号:0789 姓名:张三 部门:人事处 办公室:521 职工号:0513 姓名:李四 部门:人事处 办公室:521 改换办公室后: 职工号:0789 姓名:张三 部门:人事处 办公室:311 职工号:0513 姓名:李四 部门:人事处 办公室:311 注意:只在横线处填写适当的代码,不要改动程序中的其他内容。 #include iostream using namespace std; class Department /“部门”类 public: Depart
6、ment (const char * name, const char * office) strcpy(this-name, name); / *found* _ const char * getName() const return name; /返回部门名称 / *found* const char * getOffice() const _ /返回办公室房号 void changeOfficeTo (const char * office) /改换为指定房号的另一个办公室 strcpy (this - office, office); private: char name20; /部门
7、名称 char office20; /部门所在办公室房号 ; class Staff /“职工”类 public: / *found* Staff (const char * my_id, const char * my_name, Department strcpy (this - name, my_name); const char * getID() const return staff id; const char * getName() const return name; Department getDepartment() const return dept; private:
8、char staff_id10; /职工号 char name20; /姓名 Department /所在部门 ; void showStaff(Staff cout “姓名:“ staff.getName() “ “; cout “部门:“ staff.getDepartment().getName() “ “; cout “办公室:“ staff.getDepartment().getOffice() endl; int main() Department dept (“人事处“, “521“); Staff Zhang (“0789“,“张三“,dept), Li (“0513“,“李四
9、“,dept); cout “改换办公室前:“ endl; showStaff (Zhang); showStaff (Li); /人事处办公室由 521 搬到 311 / *found* _ cout “改换办公室后:“ endl; showStaff (Zhang); showStaff (Li); return 0; (分数:30.00)_三、综合应用题(总题数:1,分数:40.00)3.请使用 VC6 或使用【答题】菜单打开 prog3 下的工程 prog3,其中包含了类 TaxCalculator(“个税计算器”)和主函数 main 的定义。创建“个税计算器”需要接收税率表信息和起征
10、额信息。在 main 函数中,通过两个数组创建了如下的税率表: 下标 适用收入段下限 (lower_limits) 适用税率 (rates) 说明: 适用的收入段为 0 0 5 大于 0 小于等于 500 1 500 10 大于 500 小于等于 2000 2 2000 15 大于 2000 小于等于 5000 3 5000 20 大于 5000 小于等于 20000 4 20000 25 大于 20000 小于等于 40000 5 40000 30 大于 40000 小于等于 60000 6 60000 35 大于 60000 小于等于 80000 7 80000 40 大于 80000 小
11、于等于 100000 8 100000 45 大于 100000 利用这个税率表创建“个税计算器”时,假定起征额为 2000 元(即不超过 2000 元的所得不征收个人所得税)。请补充完成计算应纳个人所得税额的成员函数 getTaxPayable,其中的参数 income 为月收入。此程序的正确输出结果应为: 月收入为 800 元时应缴纳个人所得税 0 元 月收入为 1800 元时应缴纳个人所得税 0 元 月收入为 2800 元时应缴纳个人所得税 55 元 月收入为 3800 元时应缴纳个人所得税 155 元 月收入为 4800 元时应缴纳个人所得税 295 元 月收入为 5800 元时应缴纳
12、个人所得税 455 元 注意:只能在函数 getTaxPayable 中的“/ *333*”和“/ *666*”之间填入若干语句,不要改动程序中的其他内容。 /TaxCalculator.h #include iostream #include iomanip using namespace std; class TaxCalculator public: TaxCalculator (double the_limits, double the_rates, int the_length, double the_threshold) : lower_limits (new doublethe_
13、length), rates(new doublethe_length), list_len (the_length), threshold(the_threshold) for(int i = 0; i list_len; i+) lower_limitsi = the_limitsi; ratesi = the_ratesi; TaxCalculator() deletelower_limits; delete rates; double getTaxPayable (double income)const; /返回指定月收入的应纳个人所得税额 void showTaxPayable (d
14、ouble income) const; /显示指定月收入的应纳个人所得税额 private: double * lower limits; /适用收入段下限 double * rates; /适用税率 int list_len; /税率表项数 double threshold; /起征额 ; void writeToFile(const char * path); /TaxCalcnlator.cpp #include “TaxCalculator.h“ double TaxCalculator:getTaxPayable(double income) const double taxabl
15、e = income-threshold; /应纳税工资额 double tax_payable = 0.0; /应纳个人所得税额 int i=list len-1; while(i = 0) / *333* / *666* -i; return taxpayable; void TaxCalculator:showTaxPayable (double income) const cout “月收入为“ setw(6) income “元时应缴纳个人所得税“ setw(4) getTaxPayable (income) “元“ endl; /main.cpp #include “TaxCalc
16、ulator.h“ int main() double limits = 0.0, 500.0, 2000.0, 5000.0, 20000.0, 40000.0, 60000.0, 80000.0, 100000.0; double rates = 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45; TaxCalculator calc (limits,rates,9,2000.0); calc.showTaxPayable(800.0); calc.showTaxPayable(1800.0); calc.showTaxPayable(280
17、0.0); calc.showTaxPayable(3800.0); calc.showTaxPayable(4800.0); calc.showTaxPayable(5800.0); writeToFile(“ “); return 0; (分数:40.00)_二级 C+分类模拟 133 答案解析(总分:100.00,做题时间:90 分钟)一、基本操作题(总题数:1,分数:30.00)1.请使用 VC6 或使用【答题】菜单打开 prog1 下的工程 prog1,该工程中包含程序文件 main.cpp,其中有 Salary(“工资”)类和主函数 main 的定义。程序中位于每个“/ ERROR
18、 *found*”之后的一行语句行有错误,请加以改正。改正后程序的输出结果应为: 应发合计:3500 应扣合计:67.5 实发工资:3432.5 注意:只修改每个“/ ERROR *found*”下的那一行,不要改动程序中的其他内容。 #include iostream using namespace std; class Salary public: Salary(const char * id, double the_base, double the_bonus, double the_tax) / ERROR *found* : the_base (base), the_bonus (b
19、onus), the_tax (tax) staff_id = new charstrlen (id) +1; strcpy (staff_id, id); / ERROR *found* Salary() delete * staff_id; double getGrossPay() const return base + bonus; /返回应发项合计 double getNetPay() const return getGrossPay() - tax; /返回实发工资额 private: char * staff_id; /职工号 double base; /基本工资 double b
20、onus; /奖金 double tax; /代扣个人所得税 ; int main() Salarypay(“888888“, 3000.0, 500.0, 67.50); cout “应发合计:“ pay.getGrossPay() “ “; cout “应扣合计:“ pay.getGrossPay() - pay.getNetPay() “ “; / ERROR *found* cout “实发工资:“ pay:getNetPay() endl; return 0; (分数:30.00)_正确答案:()解析:(1):base(the_base),bonus(the_bonus),tax(t
21、he_tax) (2)Salary() delete staff_id; (3)cout “实发工资:“ pay.getNetPay() endl; 答案考生文件夹 考点 本题考查的是 Salary 类,其中涉及动态数组、构造函数、析构函数和 const 函数。构造函数一般使用成员列表初始化,括号内应该为形参。析构函数使用 delete 语句释放指针,格式为:delete指针。 解析 (1)主要考查考生对构造函数的掌握情况,构造函数的成员初始列表要把形参放在括号内。 (2)主要考查考生对析构函数的掌握情况,析构函数使用 delete 释放指针,delete 后要跟标识符“”。(3)主要考查考生
22、对成员函数调用的掌握情况,调用类的成员函数使用标识符“.”,而不是作用域符“:”。二、简单应用题(总题数:1,分数:30.00)2.请使用 VC6 或使用【答题】菜单打开 prog2 下的工程 prog2。此工程中包含一个程序文件 main.cpp,其中有“部门”类 Department 和“职工”类 Staff 的定义,还有主函数 main 的定义。在主函数中定义了两个“职工”对象,他们属于同一部门。程序展示,当该部门改换办公室后,这两个人的办公室也同时得到改变。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为: 改换办公室前: 职工号:0789 姓名:
23、张三 部门:人事处 办公室:521 职工号:0513 姓名:李四 部门:人事处 办公室:521 改换办公室后: 职工号:0789 姓名:张三 部门:人事处 办公室:311 职工号:0513 姓名:李四 部门:人事处 办公室:311 注意:只在横线处填写适当的代码,不要改动程序中的其他内容。 #include iostream using namespace std; class Department /“部门”类 public: Department (const char * name, const char * office) strcpy(this-name, name); / *fou
24、nd* _ const char * getName() const return name; /返回部门名称 / *found* const char * getOffice() const _ /返回办公室房号 void changeOfficeTo (const char * office) /改换为指定房号的另一个办公室 strcpy (this - office, office); private: char name20; /部门名称 char office20; /部门所在办公室房号 ; class Staff /“职工”类 public: / *found* Staff (co
25、nst char * my_id, const char * my_name, Department strcpy (this - name, my_name); const char * getID() const return staff id; const char * getName() const return name; Department getDepartment() const return dept; private: char staff_id10; /职工号 char name20; /姓名 Department /所在部门 ; void showStaff(Staf
26、f cout “姓名:“ staff.getName() “ “; cout “部门:“ staff.getDepartment().getName() “ “; cout “办公室:“ staff.getDepartment().getOffice() endl; int main() Department dept (“人事处“, “521“); Staff Zhang (“0789“,“张三“,dept), Li (“0513“,“李四“,dept); cout “改换办公室前:“ endl; showStaff (Zhang); showStaff (Li); /人事处办公室由 521
27、 搬到 311 / *found* _ cout “改换办公室后:“ endl; showStaff (Zhang); showStaff (Li); return 0; (分数:30.00)_正确答案:()解析:(1)strcpy(this-office,office); (2)return office; (3)dept(my_dept) (4)dept.changeOfficeTo(“311“); 答案考生文件夹 考点 本题考查的是 Department 类和 Staff 类,其中涉及构造函数、strcpy()函数和const 函数。复制字符串使用函数 strcpy,构造函数的成员列表初
28、始化时不能初始化指针。 解析 (1)主要考查考生对 strcpy 函数的掌握情况,根据上一条语句:strcpy(this-name,name);可知,这条语句复制的是 office,即 strcpy(this-office,office);。 (2)主要考查考生对成员函数的掌握情况,根据语句的注释:返回办公室房号可知,要填写的是一条return 语句。在私有成员里:char office20;/部门所在办公室房号,表明 office 即为办公室房号。因此直接返回 office 即可。 (3)主要考查考生对构造函数的掌握情况,根据函数体: strcpy(this-staff_id,my_id);
29、 strcpy(this-name,my_name); 可知,只有 dept 没有初始化,而空格前有字符“:”,这是成员列表初始化的标识符,因此填写dept(my_dept)即可。 (4)主要考查考生对成员函数的调用的掌握情况,根据题目要求:人事处办公室由 521 搬到 311。在Department 类中有函数 void changeOfficeTo(const char*office)可以修改办公室的房间号,直接调用即可。 主要考查考生对 strcpy()函数及构造函数的掌握情况,strcpy(参数一,参数二)函数的功能是复制参数二的字符串给参数一。三、综合应用题(总题数:1,分数:40.
30、00)3.请使用 VC6 或使用【答题】菜单打开 prog3 下的工程 prog3,其中包含了类 TaxCalculator(“个税计算器”)和主函数 main 的定义。创建“个税计算器”需要接收税率表信息和起征额信息。在 main 函数中,通过两个数组创建了如下的税率表: 下标 适用收入段下限 (lower_limits) 适用税率 (rates) 说明: 适用的收入段为 0 0 5 大于 0 小于等于 500 1 500 10 大于 500 小于等于 2000 2 2000 15 大于 2000 小于等于 5000 3 5000 20 大于 5000 小于等于 20000 4 20000
31、25 大于 20000 小于等于 40000 5 40000 30 大于 40000 小于等于 60000 6 60000 35 大于 60000 小于等于 80000 7 80000 40 大于 80000 小于等于 100000 8 100000 45 大于 100000 利用这个税率表创建“个税计算器”时,假定起征额为 2000 元(即不超过 2000 元的所得不征收个人所得税)。请补充完成计算应纳个人所得税额的成员函数 getTaxPayable,其中的参数 income 为月收入。此程序的正确输出结果应为: 月收入为 800 元时应缴纳个人所得税 0 元 月收入为 1800 元时应缴
32、纳个人所得税 0 元 月收入为 2800 元时应缴纳个人所得税 55 元 月收入为 3800 元时应缴纳个人所得税 155 元 月收入为 4800 元时应缴纳个人所得税 295 元 月收入为 5800 元时应缴纳个人所得税 455 元 注意:只能在函数 getTaxPayable 中的“/ *333*”和“/ *666*”之间填入若干语句,不要改动程序中的其他内容。 /TaxCalculator.h #include iostream #include iomanip using namespace std; class TaxCalculator public: TaxCalculator
33、(double the_limits, double the_rates, int the_length, double the_threshold) : lower_limits (new doublethe_length), rates(new doublethe_length), list_len (the_length), threshold(the_threshold) for(int i = 0; i list_len; i+) lower_limitsi = the_limitsi; ratesi = the_ratesi; TaxCalculator() deletelower
34、_limits; delete rates; double getTaxPayable (double income)const; /返回指定月收入的应纳个人所得税额 void showTaxPayable (double income) const; /显示指定月收入的应纳个人所得税额 private: double * lower limits; /适用收入段下限 double * rates; /适用税率 int list_len; /税率表项数 double threshold; /起征额 ; void writeToFile(const char * path); /TaxCalcn
35、lator.cpp #include “TaxCalculator.h“ double TaxCalculator:getTaxPayable(double income) const double taxable = income-threshold; /应纳税工资额 double tax_payable = 0.0; /应纳个人所得税额 int i=list len-1; while(i = 0) / *333* / *666* -i; return taxpayable; void TaxCalculator:showTaxPayable (double income) const co
36、ut “月收入为“ setw(6) income “元时应缴纳个人所得税“ setw(4) getTaxPayable (income) “元“ endl; /main.cpp #include “TaxCalculator.h“ int main() double limits = 0.0, 500.0, 2000.0, 5000.0, 20000.0, 40000.0, 60000.0, 80000.0, 100000.0; double rates = 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45; TaxCalculator calc
37、 (limits,rates,9,2000.0); calc.showTaxPayable(800.0); calc.showTaxPayable(1800.0); calc.showTaxPayable(2800.0); calc.showTaxPayable(3800.0); calc.showTaxPayable(4800.0); calc.showTaxPayable(5800.0); writeToFile(“ “); return 0; (分数:40.00)_正确答案:()解析:if (income = 2000) /如果收入小于 2000 return tax_payable;
38、/直接 tex_payable(初始代为零) if (taxable lower_limitsi) /如果 taxable(收入超出起征额的部分)大于 lower_limitsi阶段最低限额 tax_payable += (taxable - lower_limitsi) * ratesi; /把起过阶段最低限额的部分乘以该阶段的税率后,加到 tax_payable(个人所得税) taxable = lower_limitsi; /把 fower_limitsi赋值于 taxable 答案考生文件夹 考点 本题考查的是 TaxCalculator 类,其中涉及构造函数、析构函数和动态数组。TaxCalculator 类是个税计算器,首先要明白如何计算税率,然后结合类中的成员完成函数。 解析 主要考查考生对成员函数的掌握情况,根据题目要求可知,完成计算应纳个人所得税额的成员函数 getTaxPayable,其中参数 income 为月收入。同时题目还表明:不超过 2000 元的所得不征收个人所得税。因此先用 if 语句判断是否要征收个人所得税。然后根据题目所给表格,来判断收入多少及应该收多少个人所得税。 主要考查考生对成员函数的掌握,程序和生活息息相关,关于这类程序考生仔细琢磨题目。