目录
1、问题定义
从team.txt中读取参赛队伍的基本信息,能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。
2、问题分析
在问题中要求能够管理各参赛队的基本信息,因此在结构体定义时,结构体中的成员列表就应该包含指向这些信息的成员数据。在读取文件时,将每个队伍的基本信息保存在结构体数组中,在此基础上创建可以增加、删除、修改参赛队伍信息的函数以实现对队伍的增加、删除、修改参赛队伍的信息等操作。
任务中当用户需要增加队伍时,可以直接定义一个结构体变量来存储要添加的队伍信息,然后将该变量放在队伍数组末尾。
任务中当用户需要删除队伍时,先输入要删除队伍的编号,通过线性表按值查找算法,找到该队伍在数组中的位置,然后将其删除。因为线性表是随机存取,因此删除操作的时间复杂度是O(n^2)。
任务中当用户需要修改队伍的信息时,先输入要修改的队伍的编号,通过线性表按值查找,找到该队伍数组中的位置,然后修改队伍的基本信息。该算法最好的时间复杂度是O(1),最坏的时间复杂度是O(n)。在等概率情况下,平均比较次数比表长即元素个数的一半多一点,故T(n)=O(n)。
3、概要设计
定义结点信息的数据结构,包含各参赛队的基本信息
struct Team {
//参赛作品编号
int number;
//参赛作品名称
string offering;
//参赛学校
string school;
//赛事类别
string category;
//参赛者
string name;
//指导老师
string teacher;
//答辩时间
int time;
}teams[Max];
去除字符串中的空格
void Del_space(string& s) { //去除字符串中的空格
int index = 0;
if (!s.empty()) {
while ((index = s.find('\t', index)) != string::npos) {
s.erase(index, 1);
}
}
}
读取文件中队伍基本信息
//读取文件
void Read() {
ifstream file("team.txt");
if (!file){
cout << "打开文件失败" << endl;
}
string line;
while (getline(file, line)) {
Team t;
string s;
Del_space(line); //去除该行空格
stringstream ss(line); //实现字符串的输入,初始化ss
getline(ss >> std::ws, s, '#');
getline(ss >> std::ws, t.offering, '#');
getline(ss >> std::ws, t.school, '#');
getline(ss >> std::ws, t.category, '#');
getline(ss >> std::ws, t.name, '#');
getline(ss >> std::ws, t.teacher, '#');
t.number = atoi(s.c_str()); //将编号转化为整形
teams[Count] = t;
Count++;
}
for (int i = 0; i < Count - 1; i++) { //去除首行,整体前移一位
teams[i] = teams[i + 1];
}
Count--;
for (int i = 0; i < Count; i++)
cout << "参赛队编号:" << teams[i].number
<< "参赛作品名称:" << teams[i].offering
<< "参赛学校:" << teams[i].school
<< "赛事类别:" << teams[i].category
<< "参赛者:" << teams[i].name
<< "指导老师:" << teams[i].teacher << endl;
file.close();
cout << "总共有 " << Count << " 个队伍" << endl;
}
添加队伍
//插入队伍
void Insert() {
Team a;
cout << "请输入添加队伍编号:";
cin >> a.number;
cout << "请输入添加队伍的作品名称:";
cin >> a.offering;
cout << "请输入添加队伍学校:";
cin >> a.school;
cout << "请输入添加队伍的赛事类别:";
cin >> a.category;
cout << "请输入添加参赛者:";
cin >> a.name;
cout << "请输入添加队伍指导老师:";
cin >> a.teacher;
teams[Count] = a;
cout << "添加成功" << '\n';
cout << "参赛队编号:" << teams[Count].number << "参赛作品名称:" << teams[Count].offering
<< "参赛学校:" << teams[Count].school << "赛事类别:" << teams[Count].category
<< "参赛者:" << teams[Count].name << "指导老师:" << teams[Count].teacher << endl;
Count++;
}
删除队伍
//删除队伍
void Delete(){
int num;
cout << "请输入要删除的队伍编号:" << endl;
cin >> num;
for(int i=0;i<Count;i++){
if (teams[i].number == num){
cout << "删除队伍信息:" << endl;
cout << "参赛队编号:" << teams[i].number << '\t' << "参赛作品名称:" << teams[i].offering<< '\t'
<< "参赛学校:" << teams[i].school << '\t' << "赛事类别:" << teams[i].category << '\t'
<< "参赛者:" << teams[i].name << '\t' << "指导老师:" << teams[i].teacher << endl;
for (int j = i; j < Count; j++) {
teams[j] = teams[j + 1];
}
Count--;
cout << "删除成功" << endl;
return;
}
}
cout << "不存在此队伍" << endl;
}
修改队伍基本信息
//更改队伍信息
void Exchange() {
int num;
cout << "输入你要修改那个队伍的信息(输入编号):";
cin >> num;
for (int i = 0; i < Count; i++) {
if (teams[i].number == num) {
string s1,s2,s3,s4,s5;
cout << "请输入更改后参赛作品名称:";
cin >> s1;
teams[i].offering = s1;
cout << "请输入更改后队伍学校:";
cin >> s2;
teams[i].school = s2;
cout << "请输入更改后的队伍的赛事类别:";
cin >> s3;
teams[i].category = s3;
cout << "请输入更改后参赛者:";
cin >> s4;
teams[i].name = s4;
cout << "请输入更改后队伍指导老师:";
cin >> s5;
teams[i].teacher = s5;
break;
}
}
cout << "修改成功" << endl;
}