### 东南大学电类C++08_09_3机试试卷知识点解析 #### 一、改错题(50分) ##### 题目背景 本题要求考生对给定的C++代码进行调试与修改,确保其能够正确地实现功能。题目中的程序旨在构建一个动态数组对象,该对象支持按升序插入元素的功能,并能够输出最终数组的内容。 ##### 题目要求 1. **程序中存在的问题**:程序中存在若干语法错误和逻辑错误,考生需要识别这些错误并进行修正。 2. **修改限制**:不允许改变程序的整体结构或删除/添加整行代码,仅能在已有语句基础上进行修改,可以适当添加少量的变量声明语句。 3. **文件保存**:修改后的程序需以文件名`f1.cpp`保存。 ##### 错误分析与改正 1. **构造函数参数缺失**: - 原始构造函数缺少参数名称,应修改为 `Array(int max = 20)`。 2. **数组初始化错误**: - 在构造函数中初始化数组时,应指定数组大小:`p = new int[max]`。 3. **插入函数参数错误**: - `insertOrder()` 函数缺少插入元素的参数,应修改为 `void insertOrder(int key)`。 4. **主函数中对象初始化错误**: - 主函数中创建数组对象时未提供参数,应修改为 `Array a(20);`。 5. **插入函数调用错误**: - 在主函数中调用 `insertOrder` 函数时,传递参数的方式错误,应改为 `a.insertOrder(t);`。 6. **输出函数调用错误**: - 主函数中调用 `print` 函数的方式错误,应改为 `a.print();`。 7. **其他细节问题**: - 在 `insertOrder` 函数中,`if (last = -1)` 应改为 `if (last == -1)`。 - `insertOrder` 函数中,需要添加形参 `int key`。 - `print` 函数不应在类的外部声明和定义。 ##### 修改后代码示例 ```cpp #include <iostream> #include <iomanip> using namespace std; class Array { int* p; int last; // 最后一个元素下标 public: Array(int max = 20); // 创建一定长度的空表, 给定长度缺省值为20 ~Array(); void insertOrder(int key); // 在升序表中插入一个元素,使之仍然升序 void print(); }; Array::Array(int max) { last = -1; p = new int[max]; // 初始化为给定长度 } Array::~Array() { delete[] p; } void Array::print() { for (int i = 0; i <= last; i++) cout << setw(4) << p[i]; cout << endl; } void Array::insertOrder(int key) { // 将关键字插入到数组中某个位置 if (last == -1) { last++; p[last] = key; } else { int i = last; while (i >= 0 && key < p[i]) { p[i + 1] = p[i]; i--; } p[i + 1] = key; last++; } } void main() { Array a(20); // 创建数组 int t; for (int i = 0; i < 10; i++) { // 读入10个数据创建一个升序数组 cin >> t; a.insertOrder(t); } a.print(); // 输出数组 } ``` #### 二、编程题(50分) ##### 题目背景 本题要求考生完成一个整型数组类 `Array` 的实现,该类支持从文件读取数据进行初始化和将数据保存回文件的功能。此外,还需实现向数组中添加新元素的功能。 ##### 题目要求 1. **文件操作**:创建数组对象时从文件 “vdata.txt” 读取数据初始化数组;程序结束时将数组数据保存回同一文件。 2. **添加元素**:实现 `insertAfter` 方法,向数组末尾添加一个新元素。 3. **输出数组**:重载 `<<` 运算符以支持直接输出数组对象。 ##### 实现思路 1. **文件读取与写入**:利用 `ifstream` 和 `ofstream` 类分别进行文件的读取和写入操作。 2. **添加元素**:修改 `insertAfter` 函数以实现向数组末尾添加新元素。 3. **重载输出运算符**:在 `operator<<` 函数中实现数组内容的输出。 ##### 完成代码示例 ```cpp #include <iostream> #include <fstream> using namespace std; class Array { int v[30]; int last; // 最后一个元素下标 public: Array(); // 创建表,从文件中读取数据进行初始化 ~Array(); // 数据保存到文件中 void insertAfter(int t); // 在当前表的最后添加一个元素 friend ostream& operator<<(ostream& os, Array& a); // 用于直接输出数组对象 }; Array::Array() { ifstream fin("vdata.txt"); last = -1; if (fin.is_open()) { while (!fin.eof() && last < 29) { fin >> v[++last]; } fin.close(); } } Array::~Array() { ofstream fout("vdata.txt"); if (fout.is_open()) { for (int i = 0; i <= last; i++) { fout << v[i] << " "; } fout.close(); } } void Array::insertAfter(int t) { last++; v[last] = t; } ostream& operator<<(ostream& os, Array& a) { for (int i = 0; i <= a.last; i++) { os << setw(4) << a.v[i]; } return os; } void main() { Array vector; // 创建数组 int t; cout << vector; cout << "向数组添加3个数: "; for (int i = 0; i < 3; i++) { // 向数组中添加3个数据 cin >> t; vector.insertAfter(t); } cout << "当前数组内容:\n"; cout << vector; } ``` 通过以上解析,我们可以清晰地了解两道题目的背景、要求以及具体实现过程,有助于深入理解C++编程的相关知识点。
- 粉丝: 0
- 资源: 14
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- “人力资源+大数据+薪酬报告+涨薪调薪”
- PVE系统配置优化脚本
- “人力资源+大数据+薪酬报告+涨薪调薪”
- 含源码java Swing基于socket实现的五子棋含客户端和服务端
- 【java毕业设计】鹿幸公司员工在线餐饮管理系统的设计与实现源码(springboot+vue+mysql+LW).zip
- OpenCV C++第三方库
- 毕设分享:基于SpringBoot+Vue的礼服租聘系统-后端
- 复合铜箔:预计到2025年,这一数字将跃升至291.5亿元,新材料革命下的市场蓝海
- 【java毕业设计】流浪动物管理系统源码(springboot+vue+mysql+说明文档+LW).zip
- 【源码+数据库】采用纯原生的方式,基于mybatis框架实现增删改查