设计一个学生成绩查询统计系统,要求如下:
(1)分析数据的逻辑结构,(2)设计数据的存储结构,
(3)可以根据学生姓名进行字典排序,(4)可以根据成绩进行由高到低排序,(5)可以根据学号或姓名查找学生成绩,
(6)统计及格、中、良、优秀和不及格学生人数及其所占比例,
(7)编写主要的C语言代码,尤其是对函数头部涉及的主要参数要进行注释说明
call proc@PLT
调用被调函数前,会把调用代码的的下一条执行指令压栈,方便从被调函数中返回到主函数时候,还能往下执行。
数据逻辑结构: 学生成绩系统应包含学生信息和学生成绩两部分。学生信息包括学号、姓名、班级等,学生成绩包括每个学生每门课程的成绩。因此,可以采用关系型数据库的方式,将学生信息和学生成绩两个部分以表格的形式进行存储。其中学生信息可以作为两个表的主键进行关联,形成一个一对多的关系,具体而言,应分别建立学生和成绩两张表,且成绩表的每个学生应当对应一条或多条记录,反之亦然。 数据的存储结构: 可以采用关系型数据库或文件存储的方式。采用文件存储的方式需用一定的存储格式规范,例如采用逗号、制表符或json格式等进行存储。
根据学生姓名进行字典排序可以采用快速排序或归并排序等,具体方法如下:
快速排序:
/*
@param s[] 待排序的学生信息
l 序列起始位置
r 序列终止位置
*/
void QuickSort(Student s[], int l, int r) {
if (l < r) {
int i = l, j = r;
Student x = s[l];
while (i < j) {
while (i < j && strcmp(s[j].name,x.name) >= 0)
j--;
if (i < j)
s[i++] = s[j];
while (i < j && strcmp(s[i].name,x.name) < 0)
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;
QuickSort(s, l, i - 1);
QuickSort(s, i + 1, r);
}
}
根据成绩进行由高到低排序同样也可以采用快速排序或归并排序等,具体方法如下:
快速排序:
/*
@param s[] 待排序的学生信息
l 序列起始位置
r 序列终止位置
*/
void QuickSort(Student s[], int l, int r) {
if (l < r) {
int i = l, j = r;
Student x = s[l];
while (i < j) {
while (i < j && s[j].score >= x.score)
j--;
if (i < j)
s[i++] = s[j];
while (i < j && s[i].score < x.score)
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;
QuickSort(s, l, i - 1);
QuickSort(s, i + 1, r);
}
}
typedef struct Student {
int num;
char name[20];
float score;
} Student;
/*
@param s[] 待查找的学生信息/成绩
len 学生信息/成绩的数量
x 待查找学生姓名或学号
*/
void find(Student s[], int len, char* x) {
for (int i = 0; i < len; i++) {
if (strcmp(s[i].name, x) == 0 || s[i].num == atoi(x)) {
printf("%d %s %.2f\n", s[i].num, s[i].name, s[i].score);
return;
}
}
printf("Not Found\n");
}
其中 atoi 可以将输入的字符串转换为相应的整数。
void statistic(Student s[], int len, int *pass, int *average, int *good, int *excellent, int *fail) {
*pass = *average = *good = *excellent = *fail = 0;
for (int i = 0; i < len; i++) {
if (s[i].score >= 60 && s[i].score < 70) {
(*pass)++;
}else if (s[i].score >= 70 && s[i].score < 80) {
(*average)++;
}else if (s[i].score >= 80 && s[i].score < 90) {
(*good)++;
}else if (s[i].score >= 90) {
(*excellent)++;
}else {
(*fail)++;
}
}
printf("及格人数:%d,占比%f%%\n", *pass, (float)*pass / len * 100);
printf("中等人数:%d,占比%f%%\n", *average, (float)*average / len * 100);
printf("良好人数:%d,占比%f%%\n", *good, (float)*good / len * 100);
printf("优秀人数:%d,占比%f%%\n", *excellent, (float)*excellent / len * 100);
printf("不及格人数:%d,占比%f%%\n", *fail, (float)*fail / len * 100);
}
```c
/ 定义学生结构体 / typedef struct Student { int num; char name[20]; float score[5]; float avg;//平均成绩 } Student;
/ 输入学生信息,包括学号、姓名和成绩 / void input(Student* s, int n) { printf("请按以下格式输入学生信息:学号 姓名 成绩1 成绩2 成绩3 成绩4 成绩5\n"); for (int i = 0; i < n; i++) { scanf("%d %s %f %f %f %f %f", &s[i].num, s[i].name, &s[i].score[0], &s[i].score[1], &s[i].score[2], &s[i].score[3], &s[i].score[4]); s[i].avg = (s[i].score[0] + s[i].score[1] + s[i].score[2] + s[i].score[3] + s[i].score[4]) / 5; } }
/ 根据姓名进行字典排序 / void QuickSortByName(Student* s, int l, int r) { if (l < r) { int i = l, j = r; Student x = s[l]; while (i < j) { while (i < j && strcmp(s[j].name, x.name) >= 0) j--; if (i < j) s[i++] = s[j]; while (i < j && strcmp(s[i].name, x.name) < 0) i++; if (i < j) s[j--] = s[i]; } s[i] = x; QuickSortByName(s, l, i - 1); QuickSortByName(s, i + 1, r); } }
/ 根据平均成绩进行排序,由高到低 / void QuickSortByScore(Student* s, int l, int r) { if (l < r) { int i = l, j = r; Student x = s[l]; while (i < j) { while (i < j && s[j].avg >= x.avg) j--; if (i < j) s[i++] = s[j]; while (i < j && s[i].avg < x.avg) i++; if (i < j) s[j--] = s[i]; } s[i] = x; QuickSortByScore(s, l, i - 1); QuickSortByScore(s, i + 1, r); } }
/ 根据学号或姓名查找学生成绩 / void search(Student s, int n, char name_or_num) { int flag = 0;//查找标志 for (int i = 0; i < n; i++) { if (strcmp(s[i].name, name_or_num) == 0 || s[i].num == atoi(name_or_num)) { printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", s[i].num, s[i].name, s[i].score[0], s[i].score[1], s[i].score[2], s[i].score[3], s[i].score[4]); flag = 1; } } if (!flag) printf("没有找到该学生信息\n"); }
/ 统计及格、中、良、优秀和不及格学生的人数以及其所占比例 / void statistic(Student s, int n, int pass, int general_pass, int good, int excellent, int fail) { pass = general_pass = good = excellent = fail = 0; for (int i = 0; i < n; i++) { float sum = 0; for (int j = 0; j < 5; j++) { sum += s[i].score[j]; } s[i].avg = sum / 5; if (s[i].avg >= 90) { (excellent)++; }else if (s[i].avg >= 80) { (good)++; }else if (s[i].avg >= 70) { (general_pass)++; }else if (s[i].avg >= 60) { (pass)++; }else { (fail)++; } } printf("及格人数:%d,占比%.2f%%\n", pass, (float)pass / n * 100); printf("中等人数:%d,占比%.2f%%\n", general_pass, (float)general_pass / n * 100); printf("良好人数:%d,占比%.2f%%\n", good, (float)good / n * 100); printf("优秀人数:%d,占比%.2f%%\n", excellent, (float)excellent / n