跳到主要内容C++二级操作题真题及解析 | 极客日志C++算法
C++二级操作题真题及解析
本文整理了四道 C++ 二级操作题真题及详细解析。内容涵盖 Score 类设计与字符串处理、Shape 抽象类与多态应用、链表栈的实现以及设备开关的多态控制。重点讲解了构造函数初始化、虚函数机制、内存管理技巧及对象组合关系,适合备考计算机等级考试的考生参考。
指针猎手1 浏览 C++二级操作题真题及解析
题目一:总评计算(Score 类)
题目描述:
设计一个 Score 类,用于存储课程名、学号、平时成绩、期中成绩、期末成绩。
- 通过构造函数初始化全部数据
- 修正学号拷贝错误
- 实现
getFinal() 函数计算总评成绩,公式为:平时 20% + 期中 30% + 期末 50%,结果四舍五入为整数
- 输出学号、课程名和总评成绩
初始代码
#include <iostream>
#include <cstring>
using namespace std;
class Score {
public:
Score(const char* the_course, const char* the_id, int the_normal, int the_midterm, int the_end_of_term)
: course(the_course), normal(the_normal), midterm(the_midterm), end_of_term(the_end_of_term) {
strcpy(__1__, __2__);
}
const char* getCourse() const { return course; }
const char* getID() const { return __3__; }
int getNormal { normal; }
{ midterm; }
{ end_of_term; }
;
:
* course;
student_id[];
normal;
midterm;
end_of_term;
};
{
()(normal * + midterm * + end_of_term * + );
}
{
English[] = ;
;
cout << << score.() << ;
cout << << score.() << ;
cout << << score.() << endl;
;
}
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown 转 HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
- HTML 转 Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
()
const
return
int getMidterm() const
return
int getEndOfTerm() const
return
int getFinal() const
private
const
char
char
12
int
int
int
int Score::getFinal() const
return
int
0.2
0.3
0.5
0.5
int main()
char
"英语"
Score score(English, "12345678", 68, 83, 92)
"学号:"
getID
" "
"课程:"
getCourse
" "
"总评成绩:"
getFinal
return
0
填空答案
| 位置 | 填写内容 | 说明 |
|---|
| 1 | student_id | 目标数组,存放学号字符串 |
| 2 | the_id | 源字符串,构造函数参数传入的学号 |
| 3 | student_id | 返回学号成员变量地址,注意是数组名代表指针 |
代码逐句讲解
Score(const char* the_course, const char* the_id, int the_normal, int the_midterm, int the_end_of_term)
: course(the_course), normal(the_normal), midterm(the_midterm), end_of_term(the_end_of_term) {
strcpy(student_id, the_id);
}
- 构造函数使用初始化列表给课程名和成绩赋值。
- 注意学号是
char student_id[12],数组不能直接赋值,必须用 strcpy 复制字符串。
- 这里传入的学号
the_id 复制到成员数组 student_id。
const char* getID() const { return student_id; }
- 返回学号字符数组的地址,
student_id 本身是指向字符数组的指针。
- 注意不要写成
&student_id,那是数组地址,不是字符串指针。
int Score::getFinal() const {
return (int)(normal * 0.2 + midterm * 0.3 + end_of_term * 0.5 + 0.5);
}
- 计算总评成绩,平时占 20%,期中占 30%,期末占 50%。
- 最后加
0.5 是四舍五入技巧,转换成整数。
题目二:图形解码(抽象类与派生类)
题目描述:
给定抽象类 Shape 和派生类 Triangle,实现一个 show(Shape *shape) 函数,输出图形名称、周长、面积。
初始代码
#include "shape.h"
#include <iostream>
using namespace std;
Triangle::Triangle(Point a, Point b, Point c) : p1(a), p2(b), p3(c) {}
string Triangle::name() { return "三角形"; }
double Triangle::perimeter() {
return p1.distance(p2) + p2.distance(p3) + p3.distance(p1);
}
double Triangle::area() {
double a = p1.distance(p2);
double b = p2.distance(p3);
double c = p3.distance(p1);
double s = (a + b + c) / 2.0;
return sqrt(s * (s - a) * (s - b) * (s - c));
}
void show(Shape *shape) {
cout << "此图形是一个" << shape->name() << ", 周长=" << shape->perimeter() << ", 面积=" << shape->area() << endl;
}
int main() {
Triangle *tri = new Triangle(Point(0, 2), Point(2, 0), Point(0, 0));
show(tri);
return 0;
}
代码逐句讲解
void show(Shape *shape) {
cout << "此图形是一个" << shape->name() << ", 周长=" << shape->perimeter() << ", 面积=" << shape->area() << endl;
}
- 接收一个
Shape 类指针,可以指向基类或派生类对象。
- 通过虚函数调用输出图形名称、周长、面积。
- 多态机制:
shape->name() 实际调用派生类 Triangle 的 name()。
题目三:链式栈操作
题目描述:
实现基于链表的栈类 Stack,支持 push 和 pop。
- 数据项类
Entry 包含数据和指向下一结点的指针。
- 主函数中将数组元素依次压栈,再依次弹栈输出。
初始代码
#include <iostream>
using namespace std;
class Entry {
public:
Entry* next;
int data;
Entry(Entry* n, int d) : next(n), data(d) {}
};
class Stack {
Entry* top;
public:
Stack() : top(0) {}
~Stack() {
while (top != 0) {
Entry* tmp = top;
top = top->next;
delete tmp;
}
}
void push(int data) {
top = new Entry(top, data);
}
int pop() {
if (top == 0) return 0;
int result = top->data;
top = top->next;
return result;
}
};
int main() {
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Stack s;
for (int i = 0; i < 10; i++) {
cout << a[i] << ' ';
s.push(a[i]);
}
cout << endl;
for (int i = 0; i < 10; i++) {
cout << s.pop() << ' ';
}
cout << endl;
return 0;
}
代码逐句讲解
Entry(Entry* n, int d) : next(n), data(d) {}
- 构造函数初始化,
next 指向传入的结点,data 存储传入数据。
~Stack() {
while (top != 0) {
Entry* tmp = top;
top = top->next;
delete tmp;
}
}
void push(int data) {
top = new Entry(top, data);
}
int pop() {
if (top == 0) return 0;
int result = top->data;
top = top->next;
return result;
}
题目四:灯光开关(多态和控制)
题目描述:
基类 Switchable 表示可开关的设备,派生类 Lamp 表示灯,Button 控制设备开关。
- 实现
Switchable::isOn() 返回设备状态
Switchable::getDeviceName() 为纯虚函数
Button 构造函数正确初始化设备指针
Button::push() 切换设备状态
初始代码
#include <iostream>
using namespace std;
class Switchable {
bool is_on;
public:
Switchable() : is_on(false) {}
void switchOn() { is_on = true; }
void switchOff() { is_on = false; }
bool isOn() { return is_on; }
virtual const char* getDeviceName() = 0;
};
class Lamp : public Switchable {
public:
const char* getDeviceName() { return "Lamp"; }
};
class Button {
Switchable *device;
public:
Button(Switchable &dev) : device(&dev) {}
bool isOn() { return device->isOn(); }
void push() {
if (isOn()) device->switchOff();
else device->switchOn();
}
};
int main() {
Lamp lamp;
Button button(lamp);
cout << "灯的状态:" << (lamp.isOn() ? "开" : "关") << endl;
cout << "按钮的状态:" << (button.isOn() ? "开" : "关") << endl;
button.push();
cout << "灯的状态:" << (lamp.isOn() ? "开" : "关") << endl;
cout << "按钮的状态:" << (button.isOn() ? "开" : "关") << endl;
return 0;
}
代码逐句讲解
bool isOn() { return is_on; }
- 返回当前设备状态,
true 为开,false 为关。
virtual const char* getDeviceName() = 0;
Button(Switchable &dev) : device(&dev) {}
void push() {
if (isOn()) device->switchOff();
else device->switchOn();
}