设计一个学生成绩查询统计系统 内容要求: (1)分析数据的逻辑结构。 (2)设计数据的存储结构。(诸如一个记录应包括哪些字段数据,每个字段的数据是什么类型的,应用什么数据结构来保存众多的记录) (3)根据学生姓名进行字典排序。 (4)根据成绩进行由高到低排序。(用冒泡算法) (5)根据学号或姓名查找学生成绩。(采用二分查找法,并实现查找结构的打印) (6)统计各分数段(≥90分、80-89分、70-79分、60-69分、60分以下)的学生人数及其所占比例,并打印统计的结果。 (7)编写主要的C语言代码,尤其是对函数头部涉及的主要参数要进行注释说明。 (8)系统的程序结构可以考虑采用多文件组合框架,也可以采用单文件多模块组合框架。
时间: 2024-03-18 21:45:50 浏览: 66
学生成绩管理系统 数据结构课程设计
分析数据的逻辑结构:
该系统需要存储每个学生的信息,包括学号、姓名、语文成绩、数学成绩、英语成绩等字段。每个学生的信息可以看作一个记录。
设计数据的存储结构:
可以采用结构体数组的方式来存储学生的信息,每个结构体包含一个学生的所有信息。具体实现如下:
```c
typedef struct student {
char id[20];
char name[20];
float chinese;
float math;
float english;
float total; // 总分
} Student;
Student students[100]; // 最多存储100个学生的信息
int count = 0; // 学生数量
```
根据学生姓名进行字典排序:
可以采用字符串比较的方式,使用strcmp()函数进行比较。具体实现如下:
```c
int cmp_by_name(const void* a, const void* b) {
Student* s1 = (Student*)a;
Student* s2 = (Student*)b;
return strcmp(s1->name, s2->name);
}
// 排序
qsort(students, count, sizeof(Student), cmp_by_name);
```
根据成绩进行由高到低排序:
可以采用冒泡排序的方式,具体实现如下:
```c
void sort_by_total() {
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (students[j].total < students[j + 1].total) {
swap(&students[j], &students[j + 1]);
}
}
}
}
// 交换两个学生的信息
void swap(Student* s1, Student* s2) {
Student temp = *s1;
*s1 = *s2;
*s2 = temp;
}
```
根据学号或姓名查找学生成绩:
可以采用二分查找法,需要先将学生信息按照学号或姓名进行排序。具体实现如下:
```c
int cmp_by_id(const void* a, const void* b) {
Student* s1 = (Student*)a;
Student* s2 = (Student*)b;
return strcmp(s1->id, s2->id);
}
// 排序
qsort(students, count, sizeof(Student), cmp_by_id);
// 二分查找
int binary_search(char* key, int type) {
int left = 0;
int right = count - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (type == 0) {
if (strcmp(students[mid].id, key) == 0) {
return mid;
} else if (strcmp(students[mid].id, key) < 0) {
left = mid + 1;
} else {
right = mid - 1;
}
} else if (type == 1) {
if (strcmp(students[mid].name, key) == 0) {
return mid;
} else if (strcmp(students[mid].name, key) < 0) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1; // 没有找到
}
```
统计各分数段的学生人数及其所占比例:
可以遍历所有学生信息,根据分数段进行统计。具体实现如下:
```c
void count_by_score() {
int a = 0, b = 0, c = 0, d = 0, e = 0;
for (int i = 0; i < count; i++) {
if (students[i].total >= 90) {
a++;
} else if (students[i].total >= 80) {
b++;
} else if (students[i].total >= 70) {
c++;
} else if (students[i].total >= 60) {
d++;
} else {
e++;
}
}
printf(">=90: %d, %.2f%%\n", a, a * 100.0 / count);
printf("80-89: %d, %.2f%%\n", b, b * 100.0 / count);
printf("70-79: %d, %.2f%%\n", c, c * 100.0 / count);
printf("60-69: %d, %.2f%%\n", d, d * 100.0 / count);
printf("<60: %d, %.2f%%\n", e, e * 100.0 / count);
}
```
完整代码如下:
阅读全文