课设预习报告示例
1、问题定义
能够管理各参赛队的基本信息,(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。
2、问题分析
增删改减一般需要用到的数据结构如下:
数据库:作为一种非常成熟的数据管理系统,数据库可以用于管理和存储大量的参赛数据。通过 SQL 查询语言,可以对数据进行快速查询、更新、删除等操作。
哈希表:如果数据量比较小,可以使用哈希表对参赛数据进行管理。可以将哈希表的 key 设计为参赛队伍唯一标识符,value 存储该队伍的基本信息。哈希表可以快速完成增删改查操作,并且时间复杂度为O(1)。
数组或链表:如果参赛数据的数量有限且不需要频繁的修改,可以使用数组或链表对参赛数据进行管理。数组可以快速定位元素,但在插入或删除时需要移动其他元素,时间复杂度较高;链表则可以快速添加或删除元素,但访问某个元素需要遍历整个链表,时间复杂度也较高。
但在这个系统当中为了方便使用我们主要用bst来实现数据的存取和查询删除等,具体代码如下:
#include<iostream>
#include<string>
using namespace std;
// 定义参赛队伍类型
struct Contestant {
int team_number; //参赛队编号
string work_name; //参赛作品名称
string school; //参赛学校
string contest_category; //参赛者类别
string contestant; //参赛者
string guide_teacher; //指导老师
};
// 定义BST节点类型
struct TreeNode {
Contestant data;
TreeNode* left;
TreeNode* right;
TreeNode(Contestant x) : data(x), left(NULL), right(NULL) {}
};
// BST插入节点操作
TreeNode* insert(TreeNode* root, const Contestant& data) {
if (root == nullptr) {
return new TreeNode{ data };
}
else if (data.team_number < root->data.team_number) {
root->left = insert(root->left, data);
}
else {
root->right = insert(root->right, data);
}
return root;
}
// BST查找操作
TreeNode* search(TreeNode* root, const int& team_number) {
if (root == nullptr || root->data.team_number == team_number) {
return root;
}
if (team_number < root->data.team_number) {
return search(root->left, team_number);
}
else {
return search(root->right, team_number);
}
}
// BST删除节点操作
TreeNode* deleteNode(TreeNode* root, const int& team_number) {
if (root == nullptr) { // 如果没有找到对应的节点,则返回原始树结构
return root;
}
if (team_number < root->data.team_number) { // 继续在左子树中查找
root->left = deleteNode(root->left, team_number);
}
else if (team_number > root->data.team_number) { // 继续在右子树中查找
root->right = deleteNode(root->right, team_number);
}
else { // 找到了需要删除的节点
if (root->left == nullptr) { // 当前节点只有右子树,则直接返回右子树
TreeNode* temp = root->right;
delete root;
return temp;
}
else if (root->right == nullptr) { // 当前节点只有左子树,则直接返回左子树
TreeNode* temp = root->left;
delete root;
return temp;
}
// 如果当前节点存在左右两个子树,找到当前节点右子树中的最小值节点(也可以改为左子树的最大值节点),将其替换当前节点,然后再删除该最小值节点即可
TreeNode* minRight = root->right;
while (minRight->left != nullptr) {
minRight = minRight->left;
}
root->data = minRight->data;
root->right = deleteNode(root->right, minRight->data.team_number);
}
return root;
}
// 修改参赛队伍信息
void modify(TreeNode* bst, const int& team_number) {
TreeNode* node = search(bst, team_number); // 查找需要修改的节点
if (node == nullptr) { // 没有找到对应的节点
cout << "未找到编号为" << team_number << "的参赛队伍!" << endl;
return;
}
Contestant data = node->data; // 获取需要修改的节点信息
int option; // 如果存在多个信息项,可以选择其中任一项进行修改
cout << "请输入需要修改的信息项序号:" << endl
<< "1. 参赛作品名称" << endl
<< "2. 参赛学校" << endl
<< "3. 赛事类别" << endl
<< "4. 参赛者" << endl
<< "5. 指导老师" << endl;
cin >> option;
cout << "请重新输入修改后的信息项内容:" << endl;
switch (option) { // 根据选项修改对应的信息项
case 1:
cin >> data.work_name;
break;
case 2:
cin >> data.school;
break;
case 3:
cin >> data.contest_category;
break;
case 4:
cin >> data.contestant;
break;
case 5:
cin >> data.guide_teacher;
break;
default:
cout << "无效的选项!" << endl;
return;
}
deleteNode(bst, team_number); // 先删除原节点,再将新的节点插入到BST中
bst = insert(bst, data);
cout << "编号为" << team_number << "的参赛队伍信息已经成功修改!" << endl;
}
int main() {
TreeNode* bst = nullptr;
Contestant data;
int option;
int team_number;
while (true) { // 通过循环菜单实现用户选择不同的操作
cout << "************欢迎使用参赛队伍管理系统************" << endl
<< "1. 增加参赛队伍信息" << endl
<< "2. 删除参赛队伍信息" << endl
<< "3. 修改参赛队伍信息" << endl
<< "4. 查询参赛队伍信息" << endl
<< "5. 退出" << endl;
cin >> option;
switch (option) {
case 1: // 插入节点
cout << "请输入以下信息(以空格隔开):" << endl;
cout << "参赛队编号 参赛作品名称 参赛学校 赛事类别 参赛者 指导老师" << endl;
cin >> data.team_number >> data.work_name >> data.school >> data.contest_category >> data.contestant >> data.guide_teacher;
bst = insert(bst, data);
cout << "参赛队伍 " << data.team_number << " 添加成功!" << endl;
break;
case 2: // 删除节点
cout << "请输入需要删除的参赛队伍编号:" << endl;
cout << "参赛队编号 参赛作品名称 参赛学校 赛事类别 参赛者 指导老师" << endl;
cin >> data.team_number >> data.work_name >> data.school >> data.contest_category >> data.contestant >> data.guide_teacher;
bst = deleteNode(bst, team_number);
cout << "参赛队伍 " << data.team_number << "删除成功!" << endl;
break;
case 3: //查询节点
cout << "请输入以下信息(以空格隔开):" << endl;
cout << "参赛队编号 参赛作品名称 参赛学校 赛事类别 参赛者 指导老师" << endl;
cin >> data.team_number >> data.work_name >> data.school >> data.contest_category >> data.contestant >> data.guide_teacher;
bst = search(bst, team_number);
cout << "参赛队伍 " << data.team_number << " 查询成功!" << endl;
break;
case 4: //修改队伍信息
cout << "请输入以下信息(以空格隔开):" << endl;
cout << "参赛队编号 参赛作品名称 参赛学校 赛事类别 参赛者 指导老师" << endl;
cin >> data.team_number >> data.work_name >> data.school >> data.contest_category >> data.contestant >> data.guide_teacher;
modify(bst, team_number);
cout << "参赛队伍 " << data.team_number << " 修改成功!" << endl;
break;
}
}
}
3、代码缺陷:增加参赛信息时需要手动输入,若信息量过大则不宜使用。