C++二级操作题真题【内附解析】

简介: 本系列C++编程题来自题库cpp.code2ji.cn,涵盖四大核心知识点:①类与对象(Score总评计算,考察构造函数、字符串拷贝及四舍五入);②继承与多态(Shape图形解码,实现虚函数调用);③链式栈实现(Entry结点与内存管理);④抽象类与接口设计(Switchable灯光控制)。题目含填空、纠错与详解,适合巩固面向对象编程基础。

来源题库:cpp.code2ji.cn
在这里插入图片描述


题目一:总评计算(Score 类)

题目描述
设计一个 Score 类,用于存储课程名、学号、平时成绩、期中成绩、期末成绩。

  • 通过构造函数初始化全部数据
  • 修正学号拷贝错误
  • 实现 getFinal() 函数计算总评成绩,公式为:
    平时20% + 期中30% + 期末50%,结果四舍五入为整数
  • 输出学号、课程名和总评成绩

题库出处cpp.code2ji.cn
在这里插入图片描述


初始代码(带空格待填)

#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) {
   
        // ERROR **********found**********
        strcpy(__1__, __2__);
    }
    const char *getCourse() const {
    return course; }
    // ERROR **********found**********
    const char *getID() const {
    return __3__; }
    int getNormal() const {
    return normal; }
    int getMidterm() const {
    return midterm; }
    int getEndOfTerm() const {
    return end_of_term; }
    int getFinal() const;  // 计算总评成绩

private:
    const char *course;     // 课程名称
    char student_id[12];    // 学号
    int normal;             // 平时成绩
    int midterm;            // 期中成绩
    int end_of_term;        // 期末成绩
};

// ERROR **********found**********
int Score::getFinal() const {
   
    return (int)(normal * 0.2 + midterm * 0.3 + end_of_term * 0.5 + 0.5);
}

int main() {
   
    char English[] = "英语";
    Score score(English, "12345678", 68, 83, 92);
    cout << "学号:" << score.getID() << "   ";
    cout << "课程:" << score.getCourse() << "   ";
    cout << "总评成绩:" << score.getFinal() << endl;
    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 是四舍五入技巧,转换成整数。
int main() {
   
    char English[] = "英语";
    Score score(English, "12345678", 68, 83, 92);
    cout << "学号:" << score.getID() << "   ";
    cout << "课程:" << score.getCourse() << "   ";
    cout << "总评成绩:" << score.getFinal() << endl;
    return 0;
}
  • 测试程序,构造一个英语课程成绩对象。
  • 依次输出学号、课程和总评成绩。

题目二:图形解码(抽象类与派生类)

题目描述
给定抽象类 Shape 和派生类 Triangle,实现一个 show(Shape *shape) 函数,输出图形名称、周长、面积。

题库出处cpp.code2ji.cn
在这里插入图片描述


初始代码(需补全 show 函数)

#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));
}

//**********found**********
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) {
   
  • 接收一个 Shape 类指针,可以指向基类或派生类对象。
cout << "此图形是一个" << shape->name()
     << ",  周长=" << shape->perimeter()
     << ",  面积=" << shape->area() << endl;
  • 通过虚函数调用输出图形名称、周长、面积。
  • 多态机制:shape->name() 实际调用派生类 Trianglename()
int main() {
   
    Triangle *tri = new Triangle(Point(0,2), Point(2,0), Point(0,0));
    show(tri);
    return 0;
}
  • 创建一个三角形对象并调用 show,演示多态输出。

题目三:链式栈操作

题目描述
实现基于链表的栈类 Stack,支持 pushpop

  • 数据项类 Entry 包含数据和指向下一结点的指针。
  • 主函数中将数组元素依次压栈,再依次弹栈输出。

题库出处cpp.code2ji.cn

1.00


初始代码(待填空)

#include <iostream>
using namespace std;

class Entry {
   
public:
    Entry* next;
    int data;

    //**********found**********
    Entry(Entry* n, int d) : next(n), data(d) { }
};

class Stack {
    Entry* top;
public:
    Stack() : top(0) { }
    ~Stack() {
        while (top != 0) {
            Entry* tmp = top;
            //**********found**********
            top = top->next;
            delete tmp;
        }
    }
    void push(int data) {
        //**********found**********
        top = new Entry(top, data);
    }
    int pop() {
        if (top == 0) return 0;
        //**********found**********
        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);
}
  • 新结点成为栈顶,next 指向旧栈顶。
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() 切换设备状态

题库出处cpp.code2ji.cn
在这里插入图片描述


初始代码(待补全)

#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; }
    //**********found**********
    bool isOn() { return is_on; }
    //**********found**********
    virtual const char *getDeviceName() = 0;
};

class Lamp : public Switchable {
public:
    const char *getDeviceName() { return "Lamp"; }
};

class Button {
    Switchable *device;
public:
    //**********found**********
    Button(Switchable &dev) : device(&dev) { }
    bool isOn() { return device->isOn(); }
    void push() {
        //**********found**********
        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();
}
  • 按钮按下时,切换设备状态。

相关文章
|
30天前
|
人工智能 JavaScript Linux
5分钟零门槛上手“龙虾”AI助手!OpenClaw(Clawdbot)全平台部署+免费API配置+避坑手册
2026年,OpenClaw(昵称“龙虾”)作为开源AI Agent领域的标杆工具,凭借“自主执行、技能扩展、跨平台适配”的核心优势,成为个人效率提升与轻量团队协作的首选。无论是自动化办公流程、批量处理数据,还是搭建私人知识库,OpenClaw都能通过模块化技能组合满足需求。但很多用户被“部署复杂、API配置繁琐”的问题劝退,实则随着2026年版本迭代,OpenClaw的部署流程已大幅简化,搭配阿里云百炼Coding Plan免费API,零基础用户也能快速上手。
763 3
|
30天前
|
Ubuntu 安全 应用服务中间件
宝塔面板搭建教程 | 完整的云服务器部署实践:Ubuntu + 宝塔 + WordPress
本文记录了从零搭建云服务器与个人博客的完整实践:涵盖Ubuntu Server选型、安全组配置、SSH连接、Nginx部署,以及通过宝塔面板+Docker快速上线WordPress博客的全过程。内容详实,步骤清晰,兼顾学习深度与落地效率,适合初学者系统掌握Linux运维与Web部署核心技能。(239字)
|
1月前
|
存储 算法 Java
2026全网最全的计算机二级java笔记【内附真题解析】
这是作者备考全国计算机等级考试Java二级时整理的精简笔记,涵盖基础语法、数组、面向对象、异常处理、I/O流、多线程及AWT/Swing GUI等核心考点。结合真题实战与应试技巧,5天高效复习即通过,特别适合零基础快速入门与考前冲刺。(239字)
|
存储 监控 NoSQL
快速认识OTS
## 什么是OTS   OTS 是Open Table Service的简称,现在已更名为表格存储Table Store,官网对它的解释为:OTS是构建在阿里云飞天分布式系统之上的 NoSQL 数据库服务,提供海量结构化数据的存储和实时访问。OTS 以实例和表的形式组织数据,通过数据分片和负载均衡技术,达到规模的无缝扩展。OTS 向应用程序屏蔽底层硬件平台的故障和错误,能自动从各类错误中快速
49295 2
|
29天前
|
安全 JavaScript API
装好OpenClaw别停!30分钟加固:阿里云/本地部署+安全优化+稳定运行好用技巧分享
2026年,OpenClaw的部署门槛已降至新低——一行命令即可完成安装,但真正让它从“能启动”变为“稳定用、安全用、好用”的,是部署后的优化配置。很多用户卡在“装完能用,用着出问题”的阶段:记忆无法持久化、密钥暴露有风险、Cron任务静默停摆、Telegram对接失败……这些看似琐碎的问题,实则是影响使用体验的关键。
524 8
|
29天前
|
存储 人工智能 安全
给AI龙虾配云端硬盘:OpenClaw阿里云/本地部署+360AI云盘Skill安装、API配置与全场景使用指南
2026年OpenClaw(龙虾、Clawdbot)已经成为AI自动化执行的主流平台,无论是自动写作、文件处理、数据抓取、资料整理,还是办公流程自动化,都能高效完成。但随着使用深入,海量文件存储、多端同步、知识沉淀、数据安全问题开始凸显——本地空间不足、文件丢失、多设备无法互通、AI无法读取云端资料,成为限制能力的核心瓶颈。
569 1
|
30天前
|
人工智能 安全 API
OpenClaw养虾保命指南:6大必装安全Skill+全平台部署+阿里云百炼安全配置实战手册
2026年OpenClaw(龙虾)全面普及,但ClawHub上已出现**超1000个恶意Skill**,专门窃取SSH密钥、浏览器密码、加密钱包、API Key,一旦乱装插件,系统随时可能被接管、数据被窃取。对于新手而言,**装Skill不是越多越好,而是先装“保命、防坑、安全、稳定”的核心插件**。
654 1
|
29天前
|
机器学习/深度学习 人工智能 算法
草莓成熟度目标检测数据集(2000张图片已标注)| YOLO训练数据集 AI视觉检测
本文介绍的 草莓成熟度目标检测数据集(2000张已标注图像),基于多类别草莓成熟度样本构建,覆盖未成熟、成熟和过熟三类典型状态,并采用标准 YOLO标注格式,可直接用于深度学习模型训练,为智慧农业视觉研究和果蔬自动检测系统提供重要的数据支持。
|
29天前
|
人工智能 自然语言处理 算法
智启多元,智绘新篇——AI发展的多元化路径与时代价值
人工智能的发展已告别单一技术迭代的局限,迈入技术、应用、生态全方位多元化的新阶段。从算力、算法、数据的“铁三角”突破,到各行业场景的深度渗透,再到全球范围内的差异化发展,多元化成为AI持续进化的核心动力。本文结合当前AI发展现状,剖析技术、应用、生态层面的多元化特征,探讨其带来的机遇与挑战,彰显AI多元化发展对社会进步的深远意义。