设计并实现一个学生管理系统,即定义一个包含学生信息(学号,姓名,成绩)的顺序表,可以不考虑重名的情况,系统至少包含以下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 给定一个学生信息,插入到表中指定的位置; (4) 删除指定位置的学生记录; (5) 统计表中学生个数; (6) 利用直接插入排序或者折半插入排序按照姓名进行排序; (7) 利用快速排序按照学号进行排序; (8) 根据姓名进行折半查找,要求使用递归算法实现,成功返回此学生的学号和成绩;
时间: 2024-03-01 22:49:29 浏览: 146
好的,我可以为您解答关于学生管理系统的问题。这个系统可以用C++语言来实现,我们可以使用结构体来存储学生的信息,然后用顺序表来存储所有学生的信息。
(1) 根据指定学生个数,逐个输入学生信息:
我们可以先定义一个结构体来存储学生的信息:
```cpp
struct Student {
int id;
string name;
float score;
};
```
然后在主函数中,先要输入学生的个数,再逐个输入每个学生的信息:
```cpp
int main() {
int n;
cout << "请输入学生个数:";
cin >> n;
vector<Student> students(n);
for (int i = 0; i < n; i++) {
cout << "请输入第" << i + 1 << "个学生的信息:" << endl;
cout << "学号:";
cin >> students[i].id;
cout << "姓名:";
cin >> students[i].name;
cout << "成绩:";
cin >> students[i].score;
}
return 0;
}
```
(2) 逐个显示学生表中所有学生的相关信息:
我们可以用一个for循环来逐个显示所有学生的信息:
```cpp
for (int i = 0; i < n; i++) {
cout << "学号:" << students[i].id << ",姓名:" << students[i].name << ",成绩:" << students[i].score << endl;
}
```
(3) 给定一个学生信息,插入到表中指定的位置:
我们可以先输入要插入的学生信息,然后再输入要插入的位置,最后在该位置插入学生信息即可:
```cpp
cout << "请输入要插入的学生信息:" << endl;
cout << "学号:";
cin >> newStudent.id;
cout << "姓名:";
cin >> newStudent.name;
cout << "成绩:";
cin >> newStudent.score;
cout << "请输入要插入的位置:";
int pos;
cin >> pos;
students.insert(students.begin() + pos - 1, newStudent);
n++;
```
(4) 删除指定位置的学生记录:
和插入操作类似,我们先输入要删除的位置,然后在该位置删除学生信息即可:
```cpp
cout << "请输入要删除的位置:";
int pos;
cin >> pos;
students.erase(students.begin() + pos - 1);
n--;
```
(5) 统计表中学生个数:
学生个数已经在输入时记录了,我们只需要输出即可:
```cpp
cout << "学生个数:" << n << endl;
```
(6) 利用直接插入排序或者折半插入排序按照姓名进行排序:
我们可以使用STL中的sort函数来实现排序,只需要重载比较函数即可:
```cpp
bool cmpByName(Student a, Student b) {
return a.name < b.name;
}
sort(students.begin(), students.end(), cmpByName);
```
(7) 利用快速排序按照学号进行排序:
同样使用STL中的sort函数来实现排序,只需要重载比较函数即可:
```cpp
bool cmpById(Student a, Student b) {
return a.id < b.id;
}
sort(students.begin(), students.end(), cmpById);
```
(8) 根据姓名进行折半查找,要求使用递归算法实现,成功返回此学生的学号和成绩:
我们可以先用sort函数按照姓名进行排序,然后使用递归的二分查找算法实现查找:
```cpp
bool cmp(Student a, string name) {
return a.name < name;
}
int binarySearch(vector<Student>& students, string name, int left, int right) {
if (left > right) {
return -1;
}
int mid = (left + right) / 2;
if (cmp(students[mid], name)) {
return binarySearch(students, name, mid + 1, right);
} else if (cmp(name, students[mid].name)) {
return binarySearch(students, name, left, mid - 1);
} else {
return mid;
}
}
```
然后在主函数中,输入要查找的姓名,调用二分查找函数即可:
```cpp
cout << "请输入要查找的姓名:";
string name;
cin >> name;
sort(students.begin(), students.end(), cmpByName);
int pos = binarySearch(students, name, 0, n - 1);
if (pos == -1) {
cout << "查无此人!" << endl;
} else {
cout << "学号:" << students[pos].id << ",成绩:" << students[pos].score << endl;
}
```
阅读全文