帮我用c语言设计一个学生成绩查询统计系统,以下是具体要求(1)分析数据的逻辑结构。 (2)设计数据的存储结构。(诸如一个记录应包括哪些字段数据,每个字段的数据是什么类型的,应用什么数据结构来保存众多的记录) (3)根据学生姓名进行字典排序。 (4)根据成绩进行由高到低排序。(可采用冒泡法或其他快速算法) (5)根据学号或姓名查找学生成绩。(可采用顺序查找或二分查找等方法,并实现查找结构的打印) (6)统计各分数段(≥90分、80-89分、70-79分、60-69分、60分以下)的学生人数及其所占比例,并打印统计的结果。 (7)编写主要的C语言代码,尤其是对函数头部涉及的主要参数要进行注释说明。 (8)系统的程序结构可以考虑采用多文件组合框架,也可以采用单文件多模块组合框架。
时间: 2024-04-04 22:32:59 浏览: 286
好的,以下是我给你的C语言代码,实现了上述要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生信息结构体
typedef struct {
char id[20]; // 学号
char name[20]; // 姓名
float scores[5]; // 各科成绩
} Student;
// 定义链表节点结构体
typedef struct Node {
Student data; // 学生信息
struct Node *next; // 指向下一个节点的指针
} Node;
// 定义全局变量,指向链表的头节点和尾节点
Node *head = NULL;
Node *tail = NULL;
// 定义函数,向链表中添加一个学生信息
void addStudent() {
// 申请一个新的节点空间
Node *node = (Node *)malloc(sizeof(Node));
// 申请动态内存分配空间来存储学生成绩数组
for (int i = 0; i < 5; i++) {
node->data.scores[i] = (float *)malloc(sizeof(float));
}
// 输入学生信息
printf("请输入学生学号:");
scanf("%s", node->data.id);
printf("请输入学生姓名:");
scanf("%s", node->data.name);
printf("请输入学生各科成绩(语文、数学、英语、物理、化学):\n");
for (int i = 0; i < 5; i++) {
scanf("%f", &node->data.scores[i]);
}
// 将新节点添加到链表中
node->next = NULL;
if (head == NULL) {
head = tail = node;
} else {
tail->next = node;
tail = node;
}
printf("添加成功!\n");
}
// 定义函数,根据学生姓名进行字典排序
void sortByName() {
Node *p, *q;
Student temp;
for (p = head; p != NULL; p = p->next) {
for (q = p->next; q != NULL; q = q->next) {
if (strcmp(p->data.name, q->data.name) > 0) {
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
}
printf("已按姓名排序!\n");
}
// 定义函数,根据成绩进行由高到低排序
void sortByScore() {
Node *p, *q;
Student temp;
for (p = head; p != NULL; p = p->next) {
for (q = p->next; q != NULL; q = q->next) {
float sum1 = 0, sum2 = 0;
for (int i = 0; i < 5; i++) {
sum1 += p->data.scores[i];
sum2 += q->data.scores[i];
}
if (sum1 < sum2) {
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
}
printf("已按成绩排序!\n");
}
// 定义函数,根据学号或姓名查找学生成绩
void search() {
char keyword[20];
printf("请输入要查找的学生学号或姓名:");
scanf("%s", keyword);
int flag = 0;
Node *p;
for (p = head; p != NULL; p = p->next) {
if (strcmp(p->data.id, keyword) == 0 || strcmp(p->data.name, keyword) == 0) {
printf("学号:%s\n", p->data.id);
printf("姓名:%s\n", p->data.name);
printf("成绩:语文 %.2f,数学 %.2f,英语 %.2f,物理 %.2f,化学 %.2f\n", p->data.scores[0], p->data.scores[1], p->data.scores[2], p->data.scores[3], p->data.scores[4]);
flag = 1;
}
}
if (!flag) {
printf("未找到对应学生信息!\n");
}
}
// 定义函数,统计各分数段的学生人数及其所占比例
void statistic() {
int count1 = 0, count2 = 0, count3 = 0, count4 = 0, count5 = 0;
for (Node *p = head; p != NULL; p = p->next) {
float sum = 0;
for (int i = 0; i < 5; i++) {
sum += p->data.scores[i];
}
float avg = sum / 5.0;
if (avg >= 90) {
count1++;
} else if (avg >= 80) {
count2++;
} else if (avg >= 70) {
count3++;
} else if (avg >= 60) {
count4++;
} else {
count5++;
}
}
printf("各分数段学生人数及所占比例如下:\n");
printf("90分及以上: %d 人,%.2f%%\n", count1, count1 * 100.0 / (count1 + count2 + count3 + count4 + count5));
printf("80分至89分: %d 人,%.2f%%\n", count2, count2 * 100.0 / (count1 + count2 + count3 + count4 + count5));
printf("70分至79分: %d 人,%.2f%%\n", count3, count3 * 100.0 / (count1 + count2 + count3 + count4 + count5));
printf("60分至69分: %d 人,%.2f%%\n", count4, count4 * 100.0 / (count1 + count2 + count3 + count4 + count5));
printf("60分以下: %d 人,%.2f%%\n", count5, count5 * 100.0 / (count1 + count2 + count3 + count4 + count5));
}
// 定义函数,释放链表的内存空间
void freeList() {
Node *p, *q;
for (p = head; p != NULL; p = q) {
q = p->next;
// 释放节点中动态分配的内存空间
for (int i = 0; i < 5; i++) {
free(p->data.scores[i]);
}
// 释放节点空间
free(p);
}
}
int main() {
int choice;
do {
printf("\n\n");
printf("*****************************************\n");
printf("* 学生成绩查询统计系统 *\n");
printf("*****************************************\n");
printf("* *\n");
printf("* 1. 添加学生信息 *\n");
printf("* 2. 按姓名排序 *\n");
printf("* 3. 按成绩排序 *\n");
printf("* 4. 查找学生信息 *\n");
printf("* 5. 统计各分数段人数及比例 *\n");
printf("* 0. 退出程序 *\n");
printf("* *\n");
printf("*****************************************\n");
printf("\n请输入操作选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
addStudent();
break;
case 2:
sortByName();
break;
case 3:
sortByScore();
break;
case 4:
search();
break;
case 5:
statistic();
break;
case 0:
// 释放链表的内存空间,并退出程序
freeList();
printf("程序已退出!\n");
exit(0);
default:
printf("无效操作!\n");
break;
}
} while (1);
return 0;
}
```
注意:上述代码中使用了动态内存分配的方式来存储学生成绩数组,并且在释放链表的内存空间时,需要先释放节点中动态分配的内存空间。
阅读全文