编程实现:分别采用结构体数组和链表存储学生信息(包括学号、姓名、各科成绩),按成绩(总分)排序,按学号、姓名查找。 实验要求 : v 能够正确实现学生信息的存储、排序、查找等操作; v 对原程序进行注释,包括文件头注释和相应行注释; v 提交开发文档:源程序和运行结果。实现一下室友总结
时间: 2024-02-15 16:05:20 浏览: 84
数据结构:定义一个包含学生信息(学号、姓名、成绩)的顺序表_数据结构
5星 · 资源好评率100%
这是一道关于数据结构的编程实现题目,要求使用结构体数组和链表分别存储学生信息,并能够按照成绩进行排序,同时能够根据学号和姓名进行查找。
首先,我们需要定义一个学生信息的结构体,包括学号、姓名和各科成绩:
```c
struct student {
char num[10]; // 学号
char name[20]; // 姓名
int score1; // 第一科成绩
int score2; // 第二科成绩
int score3; // 第三科成绩
int total; // 总分
};
```
接下来,我们可以使用结构体数组来存储学生信息,定义一个数组,可以在程序中手动输入或者从文件中读取学生信息:
```c
struct student stu[N]; // 定义结构体数组,存储学生信息
int n; // 学生数量
// 从文件中读取学生信息
FILE *fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("Failed to open file.");
return 0;
}
n = 0;
while (fscanf(fp, "%s %s %d %d %d", stu[n].num, stu[n].name, &stu[n].score1, &stu[n].score2, &stu[n].score3) != EOF) {
stu[n].total = stu[n].score1 + stu[n].score2 + stu[n].score3;
n++;
}
fclose(fp);
```
然后,我们可以按照总分来对学生信息进行排序,可以使用冒泡排序或者快速排序等算法:
```c
// 冒泡排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (stu[j].total < stu[j + 1].total) {
struct student tmp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = tmp;
}
}
}
```
最后,我们可以根据学号或者姓名来查找学生信息,可以使用线性查找或者二分查找等算法:
```c
// 线性查找(按学号查找)
char num[10]; // 要查找的学生学号
printf("Please input student number: ");
scanf("%s", num);
int pos = -1; // 查找结果位置,初始为-1
for (int i = 0; i < n; i++) {
if (strcmp(stu[i].num, num) == 0) {
pos = i;
break;
}
}
if (pos == -1) {
printf("Student not found.\n");
} else {
printf("Student found: %s %s %d %d %d %d\n", stu[pos].num, stu[pos].name, stu[pos].score1, stu[pos].score2, stu[pos].score3, stu[pos].total);
}
// 二分查找(按姓名查找)
char name[20]; // 要查找的学生姓名
printf("Please input student name: ");
scanf("%s", name);
int left = 0, right = n - 1;
pos = -1; // 查找结果位置,初始为-1
while (left <= right) {
int mid = (left + right) / 2;
if (strcmp(stu[mid].name, name) == 0) {
pos = mid;
break;
} else if (strcmp(stu[mid].name, name) < 0) {
left = mid + 1;
} else {
right = mid - 1;
}
}
if (pos == -1) {
printf("Student not found.\n");
} else {
printf("Student found: %s %s %d %d %d %d\n", stu[pos].num, stu[pos].name, stu[pos].score1, stu[pos].score2, stu[pos].score3, stu[pos].total);
}
```
总的来说,这道题目要求我们综合运用数据结构和算法来实现学生信息的存储、排序和查找等操作,需要细心和耐心,同时也可以锻炼编程能力和解决问题的能力。
阅读全文