C语言 学生成绩管理系统 文件 链表 枚举

#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;

}

猜你喜欢

转载自blog.csdn.net/jfjf164164/article/details/80848339