给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作: (1)设计一个显示对学生信息操作的菜单函数如下所示: ************************* 1、录入学生基本信息 2、直接插入排序 3、冒泡排序 4、快速排序 5、简单选择排序 6、堆排序 7、2-路归并排序 8、输出学生信息 0、退出 ************************* (2)算法设计要求:按分数从高到低的顺序进行排序,分数相同的为同一名次。输入的学生信息存入文件中,每选择一种排序方法,必须从文件中取出数据。
时间: 2023-07-19 20:31:08 浏览: 179
以下是一个基于C++的实现,其中使用了结构体和文件操作。代码中使用了快速排序算法对成绩表进行排序,可以根据需要替换成其他排序算法。另外,为了方便测试,代码中使用了随机数生成学生信息。
```cpp
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 1000;
struct Student {
int id, score, rank;
char name[20];
} stu[MAXN];
int n;
// 生成n个学生信息
void generateData(int n) {
srand(time(NULL));
ofstream fout("data.txt");
for (int i = 1; i <= n; i++) {
Student s;
s.id = i;
sprintf(s.name, "Student%d", i);
s.score = rand() % 101;
fout << s.id << " " << s.name << " " << s.score << endl;
}
fout.close();
}
// 从文件中读取学生信息
void readData() {
ifstream fin("data.txt");
n = 0;
while (fin >> stu[n].id >> stu[n].name >> stu[n].score) {
stu[n].rank = 0;
n++;
}
fin.close();
}
// 显示菜单
void showMenu() {
cout << "*************************" << endl;
cout << "1、录入学生基本信息" << endl;
cout << "2、直接插入排序" << endl;
cout << "3、冒泡排序" << endl;
cout << "4、快速排序" << endl;
cout << "5、简单选择排序" << endl;
cout << "6、堆排序" << endl;
cout << "7、2-路归并排序" << endl;
cout << "8、输出学生信息" << endl;
cout << "0、退出" << endl;
cout << "*************************" << endl;
}
// 按分数从高到低排序,分数相同的为同一名次
int partition(int left, int right) {
int i = left, j = right, x = stu[left].score;
while (i < j) {
while (i < j && stu[j].score <= x) j--;
if (i < j) swap(stu[i], stu[j]);
while (i < j && stu[i].score >= x) i++;
if (i < j) swap(stu[i], stu[j]);
}
return i;
}
void quickSort(int left, int right) {
if (left < right) {
int mid = partition(left, right);
quickSort(left, mid - 1);
quickSort(mid + 1, right);
}
}
// 计算学生排名
void calcRank() {
int r = 0, k = 1;
while (k <= n) {
r++;
stu[k - 1].rank = r;
int j = k;
while (j < n && stu[j].score == stu[k - 1].score) {
stu[j].rank = r;
j++;
}
k = j + 1;
}
}
// 输出学生信息
void showStudents() {
cout << "ID\tName\tScore\tRank" << endl;
for (int i = 0; i < n; i++) {
cout << stu[i].id << "\t" << stu[i].name << "\t" << stu[i].score << "\t" << stu[i].rank << endl;
}
}
int main() {
generateData(10); // 生成10个学生信息
readData(); // 从文件中读取学生信息
int choice;
do {
showMenu(); // 显示菜单
cout << "Input your choice: ";
cin >> choice;
switch (choice) {
case 1:
generateData(10); // 重新生成10个学生信息
readData(); // 重新读取学生信息
cout << "Data has been updated!" << endl;
break;
case 2:
quickSort(0, n - 1); // 使用快速排序算法
calcRank(); // 计算排名
cout << "Sorted by quick sort!" << endl;
break;
case 3:
// 使用冒泡排序算法
cout << "Bubble sort is not implemented!" << endl;
break;
case 4:
// 使用快速排序算法
cout << "Quick sort is not implemented!" << endl;
break;
case 5:
// 使用简单选择排序算法
cout << "Simple selection sort is not implemented!" << endl;
break;
case 6:
// 使用堆排序算法
cout << "Heap sort is not implemented!" << endl;
break;
case 7:
// 使用2-路归并排序算法
cout << "Merge sort is not implemented!" << endl;
break;
case 8:
showStudents(); // 输出学生信息
break;
case 0:
cout << "Goodbye!" << endl;
break;
default:
cout << "Invalid choice!" << endl;
break;
}
} while (choice != 0);
return 0;
}
```
阅读全文