#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include <malloc.h>
//枚举定义
enum studentcategory { UNDERGRADUATE = 1, POSTGRADUATE = 2 }category;//本科生 研究生
typedef struct node{
int id;//学号:主键,唯一
char name[10];//姓名
char sex[3];//性别:男或女
char specialty[30];//专业
char classes[30];//班级:唯一,不同班级不同
enum studentcategory category;//枚举型学生类别;本科生、研究生
int math;//高数
int english;//英语
int clanguage;//C语言
int comprehensive;//课程综合
int thesis;//毕业论文
int totalscore;//总成绩
int classrank;//班级排名
int schoolrank;//校级排名
struct node * next;
}student_info;
//学生信息链表
extern student_info* student_list; //全局变量声明
//判断学生信息链表是否为空
int student_list_empty();
//函数声明
int add_student_info(enum studentcategory category); //添加学生信息
int modify_student_info(enum studentcategory category, int num); //根据学号修改学生信息
int delete_student_info(int num); //根据学号删除学生信息
student_info* search_student_info(enum studentcategory category); //根据学号查找结点
student_info* search_student_num(enum studentcategory category); //根据学号查找学生信息
student_info* search_student_name(enum studentcategory category); //根据姓名查找学生信息
student_info* search_student_classes(enum studentcategory category);//根据班级号查找学生信息
student_info* search_student_subject(enum studentcategory category);//查找某班级某科目不合格的学生信息
int query_student_info();//排序函数
student_info* sort_student_totalscore(enum studentcategory category);//从高到低排序所有学生的总成绩
student_info* sort_some_totalscore(enum studentcategory category); //从高到低排序某个班学生的总成绩
int count_student_info(); //统计函数
student_info* count_student_one(enum studentcategory category); //统计方式一
student_info* count_student_two(enum studentcategory category); //统计方式二
void display_student_info(enum studentcategory category); //显示所有学生信息
int read_file(enum studentcategory category); //从文件中读取学生信息
int save_file(enum studentcategory category); //将学生信息保存到文件
//判断学生信息链表是否为空
int student_list_empty()
{
return student_list->next == NULL;
}
int menu_enum()
{
printf("请输入选择的学生类别:\n");
printf("1.本科生 2.研究生\n");
printf("请输入(1-2):");
scanf("%d", &category);
while (category != 1 && category != 2){
printf("输入学生类别的范围错误!\n");
printf("请重新输入(1或2):\n");
scanf("%d", &category);
}
return category;
}
//添加学生信息
int add_student_info(category)
{
student_info *pstu = (student_info*)malloc(sizeof(student_info));
if (pstu == NULL)
{
printf("内存分配失败.\n");
return 0;
}
switch (category)
{
case UNDERGRADUATE:
printf("添加本科生的信息:\n");
printf("学号 姓名 性别 专业 班别 高数 英语 C语言 \n");
scanf(" %d%s%s%s%s %d%d%d", &pstu->id, pstu->name, pstu->sex, pstu->specialty, pstu->classes,
&pstu->math, &pstu->english, &pstu->clanguage);
pstu->totalscore = pstu->math + pstu->english + pstu->clanguage;
break;
case POSTGRADUATE:
printf("添加研究生的信息:\n");
printf("学号 姓名 性别 专业 班别 课程综合 毕业论文 \n");
scanf(" %d%s%s%s%s %d%d", &pstu->id, pstu->name, pstu->sex, pstu->specialty, pstu->classes,
&pstu->comprehensive, &pstu->thesis);
pstu->totalscore = pstu->comprehensive + pstu->thesis;
break;
default: break;
}
//判断该学号是否已经存在
if (search_student_info(pstu->id) != NULL)
{
printf("该学号已经存在学生信息表中.\n");
printf("此次输入失败!\n");
return 0;
}
//每次从学生信息链表的头部插入;
pstu->next = student_list->next;
student_list->next = pstu;
return 1;
}
//根据学号修改学生信息
int modify_student_info(num, category)
{
int choice;
student_info *pstu = search_student_info(num);
if (pstu == NULL)
{
printf("不存在学号为%d的学生信息.\n", num);
return 0;
}
printf("请选择要修改信息的序号:\n");
switch (category)
{
case UNDERGRADUATE:
printf("1.姓名 2.性别 3.专业 4.班级 5.高数成绩\n");
printf("6.英语成绩 7.C语言成绩 0.修改整条本科生信息\n");
printf("请输入(1-7或0): ");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请输入新的姓名: ");
getchar();
gets(pstu->name);
break;
case 2:
printf("请输入新的性别: ");
scanf("%s", pstu->sex);
break;
case 3:
printf("请输入新的专业: ");
scanf("%s", pstu->specialty);
break;
case 4:
printf("请输入新的班级: ");
scanf("%s", pstu->classes);
break;
case 5:
printf("请输入新的数学成绩: ");
scanf("%d", &pstu->math);
pstu->totalscore = pstu->math + pstu->english + pstu->clanguage;
break;
case 6:
printf("请输入新的英语成绩: ");
scanf("%d", &pstu->english);
pstu->totalscore = pstu->math + pstu->english + pstu->clanguage;
break;
case 7:
printf("请输入新的C语言成绩: ");
scanf("%d", &pstu->clanguage);
pstu->totalscore = pstu->math + pstu->english + pstu->clanguage;
break;
case 0:
printf("请输入新的学生信息:\n");
printf("姓名 性别 专业 班别 高数 英语 C语言 \n");
scanf("%s%s%s%s %d%d%d", pstu->name,
pstu->sex, pstu->specialty, pstu->classes,
&pstu->math, &pstu->english, &pstu->clanguage);
pstu->totalscore = pstu->math + pstu->english + pstu->clanguage;
break;
default:
printf("操作错误,修改学生信息失败\n");
}
break;
case POSTGRADUATE:
printf("1.姓名 2.性别 3.专业 4.班级 5.课程综合\n");
printf("6.毕业论文 0.修改整条研究生信息\n");
printf("请输入(1-6或0): ");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请输入新的姓名: ");
getchar();
gets(pstu->name);
break;
case 2:
printf("请输入新的性别: ");
scanf("%s", pstu->sex);
break;
case 3:
printf("请输入新的专业: ");
scanf("%s", pstu->specialty);
break;
case 4:
printf("请输入新的班级: ");
scanf("%s", pstu->classes);
break;
case 5:
printf("请输入新的课程综合成绩: ");
scanf("%d", &pstu->math);
pstu->totalscore = pstu->comprehensive + pstu->thesis;
break;
case 6:
printf("请输入新的毕业论文成绩: ");
scanf("%d", &pstu->english);
pstu->totalscore = pstu->comprehensive + pstu->thesis;
break;
case 0:
printf("请输入新的学生信息:\n");
printf("姓名 性别 专业 班别 课程综合 毕业论文 \n");
scanf("%s%s%s%s %d%d%d", pstu->name,
pstu->sex, pstu->specialty, pstu->classes,
&pstu->comprehensive, &pstu->thesis);
pstu->totalscore = pstu->comprehensive + pstu->thesis;
break;
default:
printf("操作错误,修改学生信息失败\n");
}
break;
default: break;
}
return 1;
}
//删除函数
int delete_student_info(num)
{
student_info *pstu;
student_info *qstu;
if (search_student_info(num) == NULL)
{
printf("不存在学号为%d的学生信息.\n", num);
return 0;
}
pstu = student_list->next;
qstu = student_list;
while (pstu->id != num)
{
qstu = pstu;
pstu = pstu->next;
}
qstu->next = pstu->next;
free(pstu);
return 1;
}
//显示所有学生信息
void display_student_info(category)
{
student_info *pstu;
pstu = student_list->next;
switch (category)
{
case UNDERGRADUATE:
printf("所有本科生信息:\n");
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu)
{
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
pstu = pstu->next;
}
break;
case POSTGRADUATE:
printf("所有研究生信息:\n");
printf("学号\t姓名\t性别\t专业\t班别\t课程综合 毕业论文 总成绩 \n");
while (pstu)
{
printf("%d\t%s\t%s\t%s\t%s\t %d\t %d\t %d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore);
pstu = pstu->next;
}
break;
default: break;
}
}
void query_menu() //查询菜单
{
printf(" 请选择查询方式:\n");
printf("1、根据班级显示本班全部信息\n");
printf("2、根据学号查询学生信息\n");
printf("3、根据姓名查询学生信息\n");
printf("4、查询某班级某门课不及格的学生\n");
}
//查询函数
int query_student_info()
{
int choice;
query_menu(); //查询菜单
printf("请输入要查询方式(1-4):\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
search_student_classes(category);
break;
case 2:
search_student_num(category);
break;
case 3:
search_student_name(category);
break;
case 4:
search_student_subject(category);
break;
default:
printf("操作错误,输入查询方式错误!\n");
}
return 1;
}
//根据班级号查找学生信息
student_info* search_student_classes(category)
{
char classes[20];
student_info *pstu;
pstu = student_list->next;
printf("请输入要查找学生信息的班级号\n");
scanf("%s", classes);
printf("班级号为‘%s’的全部学生信息为:\n", classes);
if (category == UNDERGRADUATE || category == 1){
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (strcmp(pstu->classes, classes) == 0)
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
pstu = pstu->next;
}
}
else {
printf("学号\t姓名\t性别\t专业\t班别\t课程设计\t毕业论文\t总成绩 \n");
while (pstu != NULL)
{
if (strcmp(pstu->classes, classes) == 0)
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore);
pstu = pstu->next;
}
}
return 0;
}
//根据学号查找学生信息
student_info* search_student_num(category)
{
int num;
student_info *pstu;
pstu = student_list->next;
printf("请输入要查找学生信息的学号:\n");
scanf("%d", &num);
while (pstu != NULL && pstu->id != num)
{
pstu = pstu->next;
}
if (pstu == NULL)
{
printf("结点指针为空,查询失败!\n");
return 0;
}
printf("学号为‘%d’的学生信息为:\n", num);
if (category == UNDERGRADUATE || category == 1){
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
}
else {
printf("学号\t姓名\t性别\t专业\t班别\t课程综合\t毕业论文\t总成绩 \n");
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore);
}
return 0;
}
//根据姓名查找学生信息
student_info* search_student_name(category)
{
char name[20];
student_info *pstu;
pstu = student_list->next;
printf("请输入要查找学生信息的姓名:\n");
scanf("%s", name);
getchar();
while (strcmp(pstu->name, name) != 0 && pstu != NULL)
{
pstu = pstu->next;
}
if (pstu == NULL)
{
printf("结点指针为空,查询失败!\n");
return 0;
}
printf("姓名为‘%s’的学生信息为:\n", name);
if (category == UNDERGRADUATE || category == 1){
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
printf("%d\t%s\t%s\t%s\t %s\t\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
}
else {
printf("学号\t姓名\t性别\t专业\t班别\t课程综合\t毕业论文\t总成绩 \n");
printf("%d\t%s\t%s\t%s\t %s\t\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore);
}
return 0;
}
//根据班级号和某科目来查找不及格学生信息
student_info* search_student_subject(category)
{
char classes[20];
int chioce;
student_info *pstu;
pstu = student_list->next;
printf("请输入要查找学生信息的班级号\n");
scanf("%s", classes);
printf("请输入要查找学生信息的不及格科目\n");
printf("1.数学 2.英语 3.C语言\n");
scanf("%d", &chioce);
if (category == UNDERGRADUATE || category == 1){
switch (chioce)
{
case 1:
printf("班级号为‘%s’,科目为‘数学’的不及格学生信息:\n", classes);
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->math<60 && strcmp(pstu->classes, classes) == 0)
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
pstu = pstu->next;
}
break;
case 2:
printf("班级号为‘%s’,科目为‘英语’的不及格学生信息:\n", classes);
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->english<60)
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
pstu = pstu->next;
}
break;
case 3:
printf("班级号为‘%s’,科目为‘C语言’的不及格学生信息:\n", classes);
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->clanguage<60)
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
pstu = pstu->next;
}
break;
default:
printf("请输入正确的序号(1-3):\n"); break;
}
}
else {
switch (chioce)
{
case 1:
printf("班级号为‘%s’,科目为‘课程综合’的不及格学生信息:\n", classes);
printf("学号\t姓名\t性别\t专业\t班别\t课程综合\t毕业论文\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->comprehensive <60 && strcmp(pstu->classes, classes) == 0)
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore);
pstu = pstu->next;
}
break;
case 2:
printf("班级号为‘%s’,科目为‘毕业论文’的不及格学生信息:\n", classes);
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->thesis<60 && strcmp(pstu->classes, classes) == 0)
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore);
pstu = pstu->next;
}
break;
default:
printf("请输入正确的序号(1-2):\n"); break;
}
}
return 0;
}
//根据学号查找对应链表
student_info* search_student_info(int num)
{
student_info *pstu;
pstu = student_list->next;
while (pstu != NULL && pstu->id != num)
{
pstu = pstu->next;
}
return pstu;
}
//排序函数
int sort_student_info()
{
int choice;
printf("1.从高到低排序所有学生的总成绩.\n");
printf("2.从高到低排序某个班学生的总成绩\n");
printf("请输入排序方式(1-2):\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
sort_student_totalscore(category);
break;
case 2:
sort_some_totalscore(category);
break;
default:
printf("操作错误,请输入正确序号!\n");
}
return 1;
}
//排序所有学生
student_info* sort_student_totalscore(category)
{
int jiesheng = 0, t = 0;
char ch[20] = { "黄杰胜" };
student_info *p, *temp, *pstu;
p = student_list->next;
temp = student_list->next;
pstu = student_list->next;
//冒泡排序
for (temp = student_list->next; temp->next != NULL; temp = temp->next){
for (p = student_list->next; p->next != NULL; p = p->next){
if (p->totalscore < p->next->totalscore){
t = p->id; p->id = p->next->id; p->next->id = t;
strcpy(ch, p->name); strcpy(p->name, p->next->name); strcpy(p->next->name, ch);
strcpy(ch, p->sex); strcpy(p->sex, p->next->sex); strcpy(p->next->sex, ch);
strcpy(ch, p->specialty); strcpy(p->specialty, p->next->specialty); strcpy(p->next->specialty, ch);
strcpy(ch, p->classes); strcpy(p->classes, p->next->classes); strcpy(p->next->classes, ch);
if (category == UNDERGRADUATE || category == 1){
t = p->math; p->math = p->next->math; p->next->math = t;
t = p->english; p->english = p->next->english; p->next->english = t;
t = p->clanguage; p->clanguage = p->next->clanguage; p->next->clanguage = t;
}
else {
t = p->comprehensive; p->comprehensive = p->next->comprehensive; p->next->comprehensive = t;
t = p->thesis; p->thesis = p->next->thesis; p->next->thesis = t;
}
t = p->totalscore; p->totalscore = p->next->totalscore; p->next->totalscore = t;
}
}
}
printf("排序后的学生信息:\n");
if (category == UNDERGRADUATE || category == 1){
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩\t校级排名 \n");
while (pstu != NULL)
{
jiesheng++;
pstu->classrank = jiesheng;
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore, pstu->classrank);
pstu = pstu->next;
}
}
else {
printf("学号\t姓名\t性别\t专业\t班别\t课程综合\t毕业论文\t总成绩\t校级排名 \n");
while (pstu != NULL)
{
jiesheng++;
pstu->classrank = jiesheng;
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore, pstu->classrank);
pstu = pstu->next;
}
}
return 0;
}
//排序某个班学生
student_info* sort_some_totalscore(category)
{
int jiesheng = 0;
char classes[20];
student_info *p, *temp, *pstu;
pstu = student_list->next;
int t = 0;
char ch[20] = { "黄杰胜" };
//冒泡排序
for (temp = student_list->next; temp->next != NULL; temp = temp->next){
for (p = student_list->next; p->next != NULL; p = p->next){
if (p->totalscore < p->next->totalscore){
t = p->id; p->id = p->next->id; p->next->id = t;
strcpy(ch, p->name); strcpy(p->name, p->next->name); strcpy(p->next->name, ch);
strcpy(ch, p->sex); strcpy(p->sex, p->next->sex); strcpy(p->next->sex, ch);
strcpy(ch, p->specialty); strcpy(p->specialty, p->next->specialty); strcpy(p->next->specialty, ch);
strcpy(ch, p->classes); strcpy(p->classes, p->next->classes); strcpy(p->next->classes, ch);
if (category == UNDERGRADUATE || category == 1){
t = p->math; p->math = p->next->math; p->next->math = t;
t = p->english; p->english = p->next->english; p->next->english = t;
t = p->clanguage; p->clanguage = p->next->clanguage; p->next->clanguage = t;
}
else {
t = p->comprehensive; p->comprehensive = p->next->comprehensive; p->next->comprehensive = t;
t = p->thesis; p->thesis = p->next->thesis; p->next->thesis = t;
}
t = p->totalscore; p->totalscore = p->next->totalscore; p->next->totalscore = t;
}
}
}
printf("请输入要查找学生信息的班级号\n");
scanf("%s", classes);
printf("班级号为‘%s’的学生信息:\n", classes);
if (category == UNDERGRADUATE || category == 1){
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩\t班级排名\n");
while (pstu != NULL)
{
if (strcmp(pstu->classes, classes) == 0)
{
jiesheng++;
pstu->classrank = jiesheng;
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore, pstu->classrank);
}
pstu = pstu->next;
}
}
else {
printf("学号\t姓名\t性别\t专业\t班别\t课程综合\t毕业论文\t总成绩\t班级排名\n");
while (pstu != NULL)
{
if (strcmp(pstu->classes, classes) == 0)
{
jiesheng++;
pstu->classrank = jiesheng;
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore, pstu->classrank);
}
pstu = pstu->next;
}
}
return 0;
}
void count_meun()//统计菜单
{
printf(" 请选择排序方式:\n");
printf(" 1.统计某班级某课程的 平均成绩、 最高成绩、 最低成绩、\n");
printf(" 超过课程平均成绩的学生名单及人数\n");
printf(" 2.统计某班级某课程不及格学生名单及人数、不同等级的学生人数\n\n");
}
//统计函数
int count_student_info()
{
int choice;
count_meun();//统计菜单
printf("请输入要统计的方式(1-2):\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
count_student_one(category);
break;
case 2:
count_student_two(category);
break;
default:
printf("选择失败,请输入正确的序号(1-2):\n");
}
return 1;
}
//统计方式一:
student_info* count_student_one(category)
{
char classes[20];
int chioce, count = 0;//记录总学生人数
int count_ave = 0; //记录超平均成绩人数
double average_mark = 0, max_mark = 0, min_mark = 100;
student_info *pstu;
pstu = student_list->next;
printf("请输入要查找学生信息的班级号\n");
scanf("%s", classes);
printf("请输入要统计的科目:\n");
if (category == UNDERGRADUATE || category == 1){
printf("1.数学 2.英语 3.C语言\n");
scanf("%d", &chioce);
switch (chioce)
{
case 1:
printf("班级'%s'的'数学'科的平均成绩、最高成绩、最低成绩:\n", classes);
while (pstu != NULL)
{
if (strcmp(pstu->classes, classes) == 0)
{//平均成绩
count++;
average_mark = average_mark + pstu->math;
}
if (pstu->math > max_mark && strcmp(pstu->classes, classes) == 0)
max_mark = pstu->math; //最高成绩
if (pstu->math < min_mark && strcmp(pstu->classes, classes) == 0)
min_mark = pstu->math; //最低成绩
pstu = pstu->next;
}average_mark = average_mark / count;
printf("该班数学的平均成绩为:%.2lf,最高分为:%.2lf,最低分为:%.2lf\n", average_mark, max_mark, min_mark);
pstu = student_list->next;//重新初始化
printf("该班超过数学平均分的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->math > average_mark && strcmp(pstu->classes, classes) == 0)
{//超过平均成绩的学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
count_ave++;
}
pstu = pstu->next;
}printf("共计超过数学平均分人数为:%d人\n", count_ave);
break;
case 2:
printf("班级'%s'的'英语'科的平均成绩、最高成绩、最低成绩:\n", classes);
while (pstu != NULL)
{
if (strcmp(pstu->classes, classes) == 0)
{//平均成绩
count++;
average_mark = average_mark + pstu->english;
}
if (pstu->english > max_mark && strcmp(pstu->classes, classes) == 0)
max_mark = pstu->english; //最高成绩
if (pstu->english < min_mark && strcmp(pstu->classes, classes) == 0)
min_mark = pstu->english; //最低成绩
pstu = pstu->next;
}average_mark = average_mark / count;
printf("该班英语的平均成绩为:%.2lf,最高分为:%.2lf,最低分为:%.2lf\n", average_mark, max_mark, min_mark);
pstu = student_list->next;//重新初始化
printf("该班超过英语平均分的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->english > average_mark && strcmp(pstu->classes, classes) == 0)
{//超过平均成绩的学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
count_ave++;
}
pstu = pstu->next;
}printf("共计超过英语平均分人数为:%d人\n", count_ave);
break;
case 3:
printf("班级'%s'的'C语言'科的平均成绩、最高成绩、最低成绩:\n", classes);
while (pstu != NULL)
{
if (strcmp(pstu->classes, classes) == 0)
{//平均成绩
count++;
average_mark = average_mark + pstu->clanguage;
}
if (pstu->clanguage > max_mark && strcmp(pstu->classes, classes) == 0)
max_mark = pstu->clanguage; //最高成绩
if (pstu->clanguage < min_mark && strcmp(pstu->classes, classes) == 0)
min_mark = pstu->clanguage; //最低成绩
pstu = pstu->next;
}average_mark = average_mark / count;
printf("该班C语言的平均成绩为:%.2lf,最高分为:%.2lf,最低分为:%.2lf\n", average_mark, max_mark, min_mark);
pstu = student_list->next;//重新初始化
printf("该班超过C语言平均分的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->clanguage > average_mark && strcmp(pstu->classes, classes) == 0)
{//超过平均成绩的学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
count_ave++;
}
pstu = pstu->next;
}printf("共计超过C语言平均分人数为:%d人\n", count_ave);
break;
default:
printf("请输入正确的序号(1-3):\n");
}
}
//以下是研究生的
else {
printf("1.课程综合 2.毕业论文\n");
scanf("%d", &chioce);
if (chioce == 1){
printf("班级'%s'的'课程综合'科的平均成绩、最高成绩、最低成绩:\n", classes);
while (pstu != NULL)
{
if (strcmp(pstu->classes, classes) == 0)
{//平均成绩
count++;
average_mark = average_mark + pstu->comprehensive;
}
if (pstu->comprehensive > max_mark && strcmp(pstu->classes, classes) == 0)
max_mark = pstu->comprehensive; //最高成绩
if (pstu->comprehensive < min_mark && strcmp(pstu->classes, classes) == 0)
min_mark = pstu->comprehensive; //最低成绩
pstu = pstu->next;
}average_mark = average_mark / count;
printf("该班数学的平均成绩为:%.2lf,最高分为:%.2lf,最低分为:%.2lf\n", average_mark, max_mark, min_mark);
pstu = student_list->next;//重新初始化
printf("该班超过数学平均分的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t课程综合 毕业论文 总成绩 \n");
while (pstu != NULL)
{
if (pstu->comprehensive > average_mark && strcmp(pstu->classes, classes) == 0)
{//超过平均成绩的学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore);
count_ave++;
}
pstu = pstu->next;
}printf("共计超过课程综合平均分人数为:%d人\n", count_ave);
}
else{
printf("班级'%s'的'毕业论文'科的平均成绩、最高成绩、最低成绩:\n", classes);
while (pstu != NULL)
{
if (strcmp(pstu->classes, classes) == 0)
{//平均成绩
count++;
average_mark = average_mark + pstu->thesis;
}
if (pstu->thesis > max_mark && strcmp(pstu->classes, classes) == 0)
max_mark = pstu->thesis; //最高成绩
if (pstu->thesis < min_mark && strcmp(pstu->classes, classes) == 0)
min_mark = pstu->thesis; //最低成绩
pstu = pstu->next;
}average_mark = average_mark / count;
printf("该班英语的平均成绩为:%.2lf,最高分为:%.2lf,最低分为:%.2lf\n", average_mark, max_mark, min_mark);
pstu = student_list->next;//重新初始化
printf("该班超过英语平均分的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t课程综合 毕业论文 总成绩 \n");
while (pstu != NULL)
{
if (pstu->thesis > average_mark && strcmp(pstu->classes, classes) == 0)
{//超过平均成绩的学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore);
count_ave++;
}
pstu = pstu->next;
}printf("共计超过毕业论文平均分人数为:%d人\n", count_ave);
}
}
return 0;
}
//统计方式二
student_info* count_student_two(category)
{
char classes[20];
int chioce;
int count_fail = 0; //记录不及格人数
int count_1 = 0, count_2 = 0, count_3 = 0, count_4 = 0, count_5 = 0;//优 良 中 及格 不及格
student_info *pstu;
pstu = student_list->next;
printf("请输入要查找学生信息的班级号\n");
scanf("%s", classes);
printf("请输入要统计的科目:\n");
if (category == UNDERGRADUATE || category == 1){
printf("1.数学 2.英语 3.C语言\n");
scanf("%d", &chioce);
switch (chioce)
{
case 1:
printf("该班数学不及格的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->math < 60 && strcmp(pstu->classes, classes) == 0)
{//不及格学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
count_fail++;
}
pstu = pstu->next;
}printf("共计数学不及格人数为:%d人\n\n\n", count_fail);
pstu = student_list->next; //链表重新初始化
while (pstu != NULL)
{
if (pstu->math >= 90 && pstu->math <= 100 && strcmp(pstu->classes, classes) == 0) count_1++; //优
if (pstu->math >= 80 && pstu->math < 90 && strcmp(pstu->classes, classes) == 0) count_2++; //良
if (pstu->math >= 70 && pstu->math < 80 && strcmp(pstu->classes, classes) == 0) count_3++; //中
if (pstu->math >= 60 && pstu->math < 70 && strcmp(pstu->classes, classes) == 0) count_4++; //及格
if (pstu->math >= 0 && pstu->math < 60 && strcmp(pstu->classes, classes) == 0) count_5++; //不及格
pstu = pstu->next;
}
printf("班级'%s'的'数学'科的成绩等级情况:\n", classes);
printf("优秀人数:%d;良好人数:%d;中等人数:%d;及格的人数:%d;不及格的人数:%d;\n", count_1, count_2, count_3, count_4, count_5);
break;
case 2:
printf("该班英语不及格的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->english < 60 && strcmp(pstu->classes, classes) == 0)
{//不及格学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
count_fail++;
}
pstu = pstu->next;
}printf("共计英语不及格人数为:%d人\n\n\n", count_fail);
pstu = student_list->next; //链表重新初始化
while (pstu != NULL)
{
if (pstu->english >= 90 && pstu->english <= 100 && strcmp(pstu->classes, classes) == 0) count_1++; //优
if (pstu->english >= 80 && pstu->english < 90 && strcmp(pstu->classes, classes) == 0) count_2++; //良
if (pstu->english >= 70 && pstu->english < 80 && strcmp(pstu->classes, classes) == 0) count_3++; //中
if (pstu->english >= 60 && pstu->english < 70 && strcmp(pstu->classes, classes) == 0) count_4++; //及格
if (pstu->english >= 0 && pstu->english < 60 && strcmp(pstu->classes, classes) == 0) count_5++; //不及格
pstu = pstu->next;
}printf("班级'%s'的'英语'科的成绩等级情况:\n", classes);
printf("该班英语中,优秀人数:%d;良好人数:%d;中等人数:%d;及格的人数:%d;不及格的人数:%d;\n", count_1, count_2, count_3, count_4, count_5);
break;
case 3:
printf("该班C语言不及格的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t高数\t英语\tC语言\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->clanguage < 60 && strcmp(pstu->classes, classes) == 0)
{//不及格学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
count_fail++;
}
pstu = pstu->next;
}
printf("共计C语言不及格人数为:%d人\n\n\n", count_fail);
pstu = student_list->next; //链表重新初始化
while (pstu != NULL)
{
if (pstu->clanguage >= 90 && pstu->clanguage <= 100 && strcmp(pstu->classes, classes) == 0) count_1++; //优
if (pstu->clanguage >= 80 && pstu->clanguage < 90 && strcmp(pstu->classes, classes) == 0) count_2++; //良
if (pstu->clanguage >= 70 && pstu->clanguage < 80 && strcmp(pstu->classes, classes) == 0) count_3++; //中
if (pstu->clanguage >= 60 && pstu->clanguage < 70 && strcmp(pstu->classes, classes) == 0) count_4++; //及格
if (pstu->clanguage >= 0 && pstu->clanguage < 60 && strcmp(pstu->classes, classes) == 0) count_5++; //不及格
pstu = pstu->next;
}printf("班级'%s'的'C语言'科的成绩等级情况:\n", classes);
printf("该班C语言中,优秀人数:%d;良好人数:%d;中等人数:%d;及格的人数:%d;不及格的人数:%d;\n", count_1, count_2, count_3, count_4, count_5);
break;
default:
printf("请输入正确的序号(1-3):\n");
}
}
else {
printf("1.数学 2.英语 3.C语言\n");
scanf("%d", &chioce);
switch (chioce)
{
case 1:
printf("该班课程综合不及格的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t课程综合\t毕业论文\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->comprehensive < 60 && strcmp(pstu->classes, classes) == 0)
{//不及格学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->comprehensive, pstu->thesis, pstu->totalscore);
count_fail++;
}
pstu = pstu->next;
}printf("共计课程综合不及格人数为:%d人\n\n\n", count_fail);
pstu = student_list->next; //链表重新初始化
while (pstu != NULL)
{
if (pstu->comprehensive >= 90 && pstu->comprehensive <= 100 && strcmp(pstu->classes, classes) == 0) count_1++; //优
if (pstu->comprehensive >= 80 && pstu->comprehensive < 90 && strcmp(pstu->classes, classes) == 0) count_2++; //良
if (pstu->comprehensive >= 70 && pstu->comprehensive < 80 && strcmp(pstu->classes, classes) == 0) count_3++; //中
if (pstu->comprehensive >= 60 && pstu->comprehensive < 70 && strcmp(pstu->classes, classes) == 0) count_4++; //及格
if (pstu->comprehensive >= 0 && pstu->comprehensive < 60 && strcmp(pstu->classes, classes) == 0) count_5++; //不及格
pstu = pstu->next;
}
printf("班级'%s'的'课程综合'科的成绩等级情况:\n", classes);
printf("优秀人数:%d;良好人数:%d;中等人数:%d;及格的人数:%d;不及格的人数:%d;\n", count_1, count_2, count_3, count_4, count_5);
break;
case 2:
printf("该班毕业论文不及格的学生名单如下:\n");
printf("学号\t姓名\t性别\t专业\t班别\t课程综合\t毕业论文\t总成绩 \n");
while (pstu != NULL)
{
if (pstu->thesis < 60 && strcmp(pstu->classes, classes) == 0)
{//不及格学生显示及人数统计
printf("%d\t%s\t%s\t%s\t%s\t%d\t%d\t%d\n", pstu->id, pstu->name, pstu->sex, pstu->specialty,
pstu->classes, pstu->math, pstu->thesis, pstu->totalscore);
count_fail++;
}
pstu = pstu->next;
}printf("共计英语不及格人数为:%d人\n\n\n", count_fail);
pstu = student_list->next; //链表重新初始化
while (pstu != NULL)
{
if (pstu->thesis >= 90 && pstu->thesis <= 100 && strcmp(pstu->classes, classes) == 0) count_1++; //优
if (pstu->thesis >= 80 && pstu->thesis < 90 && strcmp(pstu->classes, classes) == 0) count_2++; //良
if (pstu->thesis >= 70 && pstu->thesis < 80 && strcmp(pstu->classes, classes) == 0) count_3++; //中
if (pstu->thesis >= 60 && pstu->thesis < 70 && strcmp(pstu->classes, classes) == 0) count_4++; //及格
if (pstu->thesis >= 0 && pstu->thesis < 60 && strcmp(pstu->classes, classes) == 0) count_5++; //不及格
pstu = pstu->next;
}printf("班级'%s'的'毕业论文'科的成绩等级情况:\n", classes);
printf("优秀人数:%d;良好人数:%d;中等人数:%d;及格的人数:%d;不及格的人数:%d;\n", count_1, count_2, count_3, count_4, count_5);
break;
default:
printf("请输入正确的序号(1-2):\n"); break;
}
}
return 0;
}
//从文件中读取学生信息
int read_file(category)
{
FILE *fp, *fp2;
student_info *pstu;
switch (category)
{
case UNDERGRADUATE:
fp = fopen("stu.txt", "r");
if (fp == NULL)
{
printf("打开文件失败.\n");
return 0;
}
while (!feof(fp))
{
pstu = (student_info*)malloc(sizeof(student_info));
fscanf(fp, "%5d%15s%5s%5s%5s %4d%4d%4d%4d", &pstu->id, pstu->name, pstu->sex, pstu->specialty, pstu->classes,
&pstu->math, &pstu->english, &pstu->clanguage, &pstu->totalscore);
pstu->totalscore = pstu->math + pstu->english + pstu->clanguage;
//每次从学生信息链表的头部插入;
pstu->next = student_list->next;
student_list->next = pstu;
}
fclose(fp);
break;
case POSTGRADUATE:
fp2 = fopen("stu3.txt", "r");
if (fp2 == NULL)
{
printf("打开文件失败.\n");
return 0;
}
while (!feof(fp2))
{
pstu = (student_info*)malloc(sizeof(student_info));
fscanf(fp2, "%5d%15s%5s%5s%5s %4d%4d%4d", &pstu->id, pstu->name, pstu->sex, pstu->specialty, pstu->classes,
&pstu->comprehensive, &pstu->thesis, &pstu->totalscore);
pstu->totalscore = pstu->comprehensive + pstu->thesis;
//每次从学生信息链表的头部插入;
pstu->next = student_list->next;
student_list->next = pstu;
}
fclose(fp2);
break;
default: break;
}
return 1;
}
//将学生信息保存到文件
int save_file(category)
{
FILE *fp, *fp2;
student_info *pstu;
switch (category)
{
case UNDERGRADUATE:
fp = fopen("stu.txt", "w");
if (fp == NULL)
{
printf("打开文件失败.\n");
return 0;
}
pstu = student_list->next;
while (pstu)
{
fprintf(fp, "%5d%15s%5s%5s%5s %4d%4d%4d%4d", pstu->id, pstu->name, pstu->sex, pstu->specialty, pstu->classes,
pstu->math, pstu->english, pstu->clanguage, pstu->totalscore);
pstu = pstu->next;
}
fclose(fp);
break;
case POSTGRADUATE:
fp2 = fopen("stu3.txt", "w");
if (fp2 == NULL)
{
printf("打开文件失败.\n");
return 0;
}
pstu = student_list->next;
while (pstu)
{
fprintf(fp2, "%5d%15s%5s%5s%5s %4d%4d%4d", pstu->id, pstu->name, pstu->sex, pstu->specialty, pstu->classes,
pstu->comprehensive, pstu->thesis, pstu->totalscore);
pstu = pstu->next;
}
fclose(fp2);
break;
default: break;
}
return 1;
}
//主菜单
void menu(enum studentcategory category)
{
system("cls"); //清屏
if (category == UNDERGRADUATE || category == 1){
printf(" 欢迎进入'本科生'成绩管理系统 \n");
}
else {
printf(" 欢迎进入'研究生'成绩管理系统 \n");
}
printf("------------------------------------------\n");
printf("1.添加学生信息 2.修改学生信息\n");
printf("3.删除学生信息 4.显示学生信息\n");
printf("5.查询学生信息 6.排列学生信息\n");
printf("7.统计学生信息 8.保存学生信息\n");
printf("0.退出系统操作 \n");
printf("------------------------------------------\n");
}
//学生信息链表
student_info* student_list;
int main()
{
int chose;
int num;
//初始化学生信息链表
student_list = (student_info*)malloc(sizeof(student_info));
student_list->next = NULL;
category = menu_enum();
read_file(category); //文件读取
menu(category);
while (1)
{
printf("请选择(1-8或0): ");
scanf("%d", &chose);
switch (chose)
{
case 1:
menu(category);
if (add_student_info(category))
printf("添加学生信息成功!\n");
else
printf("添加学生信息失败!\n");
break;
case 2:
if (student_list_empty())
printf("学生信息表为空,请先添加学生信息.\n");
else
{
printf("请输入要修改学生信息的学号: ");
scanf("%d", &num);
if (modify_student_info(category, num))
printf("修改成功!\n");
else
printf("修改失败!\n");
}
break;
case 3:
if (student_list_empty())
printf("学生信息表为空,请先添加学生信息.\n");
else
{
printf("请输入要删除学生信息的学号: ");
scanf("%d", &num);
if (delete_student_info(num))
printf("删除成功\n");
else
printf("删除失败.\n");
}
break;
case 4:
menu(category);
if (student_list_empty())
printf("学生信息表为空,请先添加学生信息.\n");
else
display_student_info(category);
break;
case 5:
menu(category);
if (student_list_empty())
printf("学生信息表为空,请先添加学生信息.\n");
else
query_student_info(); //查询函数
break;
case 6:
menu(category);
if (student_list_empty())
printf("学生信息表为空,请先添加学生信息.\n");
else
sort_student_info(); //排列函数
break;
case 7:
menu(category);
if (student_list_empty())
printf("学生信息表为空,请先添加学生信息.\n");
else
count_student_info(); //统计函数
break;
case 8:
if (student_list_empty())
printf("学生信息表为空,请先添加学生信息.\n");
else
if (save_file(category))
printf("保存学生信息成功!\n");
else
printf("保存学生信息失败!\n");
break;
case 0:
printf("欢迎下次使用,再见!\n");
system("pause");
exit(0);
break;
default:
printf("输入错误,请重新操作!\n");
}
}
system("pause");
return 0;
}