设计并实现一个学生管理程序,即定义一个包含学生信息(学号,姓名,成绩)的的顺序表,可以不考虑重名的情况,系统包含以下功能: 1.根据指定学生个数,逐个输入学生信息; 2.逐个显示学生表中所有学生的相关信息; 3.给定一个学生信息,插入到表中指定的位置; 3.删除指定位置的学生记录; 4.利用直接插入排序或者折半插入排序按照姓名进行排序; 5.利用快速排序按照学号进行排序; 6.根据姓名进行折半查找,成功返回此学生的学号和成绩;使用C语言
时间: 2024-03-10 09:45:25 浏览: 238
好的,我会为您详细介绍如何实现这个学生管理程序。
首先,我们需要定义一个结构体来存储学生信息,包括学号、姓名和成绩:
```c
typedef struct {
int no; // 学号
char name[20]; // 姓名
float score; // 成绩
} Student;
```
然后,我们定义一个动态数组来存储学生信息:
```c
#define MAX_SIZE 100 // 学生表的最大容量
Student students[MAX_SIZE]; // 学生表
int count = 0; // 学生表中已有的学生数量
```
接下来,我们就可以实现学生管理程序的各个功能了。
1. 根据指定学生个数,逐个输入学生信息
```c
void addStudents(int n) {
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的信息:\n", i+1);
printf("学号:");
scanf("%d", &students[count].no);
printf("姓名:");
scanf("%s", students[count].name);
printf("成绩:");
scanf("%f", &students[count].score);
count++; // 添加一个学生后,学生数量加1
}
}
```
2. 逐个显示学生表中所有学生的相关信息
```c
void showStudents() {
printf("学号\t姓名\t成绩\n");
for (int i = 0; i < count; i++) {
printf("%d\t%s\t%.2f\n", students[i].no, students[i].name, students[i].score);
}
}
```
3. 给定一个学生信息,插入到表中指定的位置
```c
void insertStudent(int pos, Student student) {
if (pos < 1 || pos > count+1) {
printf("插入位置不合法!\n");
return;
}
if (count == MAX_SIZE) {
printf("学生表已满,无法插入!\n");
return;
}
// 将插入位置后面的学生往后移一位
for (int i = count; i >= pos; i--) {
students[i] = students[i-1];
}
students[pos-1] = student;
count++; // 添加一个学生后,学生数量加1
}
```
4. 删除指定位置的学生记录
```c
void deleteStudent(int pos) {
if (pos < 1 || pos > count) {
printf("删除位置不合法!\n");
return;
}
// 将删除位置后面的学生往前移一位
for (int i = pos-1; i < count-1; i++) {
students[i] = students[i+1];
}
count--; // 删除一个学生后,学生数量减1
}
```
5. 利用直接插入排序或者折半插入排序按照姓名进行排序
```c
void insertSortByName() {
for (int i = 1; i < count; i++) {
Student temp = students[i];
int j = i - 1;
while (j >= 0 && strcmp(students[j].name, temp.name) > 0) {
students[j+1] = students[j];
j--;
}
students[j+1] = temp;
}
}
```
6. 利用快速排序按照学号进行排序
```c
void quickSortByNo(int left, int right) {
if (left >= right) return;
int i = left, j = right;
Student pivot = students[left];
while (i < j) {
while (i < j && students[j].no >= pivot.no) j--;
students[i] = students[j];
while (i < j && students[i].no <= pivot.no) i++;
students[j] = students[i];
}
students[i] = pivot;
quickSortByNo(left, i-1);
quickSortByNo(i+1, right);
}
```
7. 根据姓名进行折半查找,成功返回此学生的学号和成绩
```c
int binarySearchByName(char *name) {
int left = 0, right = count-1;
while (left <= right) {
int mid = (left + right) / 2;
if (strcmp(students[mid].name, name) == 0) {
printf("找到了学生%s,学号为%d,成绩为%.2f\n", name, students[mid].no, students[mid].score);
return mid;
} else if (strcmp(students[mid].name, name) > 0) {
right = mid - 1;
} else {
left = mid + 1;
}
}
printf("没有找到学生%s!\n", name);
return -1;
}
```
至此,我们已经完成了学生管理程序的所有功能。完整代码如下:
阅读全文