学生成绩管理系统
来源:互联网 发布:做美工有什么发展前景 编辑:程序博客网 时间:2024/05/01 22:53
学生成绩管理系统
1)至少能够管理100位同学的个人信息和成绩信息,个人信息和成绩需要有纠错功能。
2)个人信息包括:学号(53开头的实际学号8位),姓名(至少可以保存4个汉字),性别,民族,出生年月(年份为4位数字,月份为2位数字),行政职务(班长、学委、无)。
3)成绩信息包括:5门课程和总成绩的相关信息。5门课程包括:高级语言程序设计、高级语言程序设计实验、高级语言课程设计、面向对象程序设计、面向对象程序设计实验;每门课程的相关信息包括:课程名、课程学时、课程学分、所得成绩。总成绩的相关信息包括:平均成绩、加权平均成绩。
注:要明确区别百分制和五分制的成绩;在折算平均成绩和加权平均成绩时,五分制成绩中优秀、良好、中等、及格、不及格分别对应百分制成绩的95、85、75、65、0;平均成绩不考虑学分因素,为每门课程的算术平均值;加权平均成绩需要考虑学分因素,为每门课程的加权平均值。
一共有4个cpp
Student.cpp
Main.cpp
file1.cpp
file2.cpp
//Student.h#ifndef STUDENT_H_INCLUDED#define STUDENT_H_INCLUDED#include<cstdio>#include<cstring>#include<cstdlib>#define WrongMark 0#define N 20enum POSITION {Monitor,Study_Commissar,None,Undefined_Position};enum GENDER {Male,Female,Undefined_Gender};struct Course{ char Name[20]; int Time; int Credit;};struct Student{ int ID; char Name[N]; bool Have_Name; //在有Name情况下Have_name为真,反之为假。 Name项不具备纠错功能 GENDER Gender; //0为男,1为女,2为出错 char Nationality[N]; bool Have_Nationality;//在有Nationality情况下Have_Nationality为真,反之为假。 Nationality项不具备纠错功能 int Birth; //-1为出错,反之为6位的出生年月(年4位月2位) float Average; float Weighted_Average; POSITION Position; //0为班长,1为学委,2为无职务,3为出错 int Mark[5]; //出错时当-1算 Student* Next;};extern Course Cour[5];extern int Input_From_Screen,Have_Open_Input;extern FILE *File_Input,*File_Output;extern Student *tail,*head;extern bool ID_exist[10002];extern bool Monitor_exist[102];extern bool Study_Commissar_exist[102];//-----------------------------------void prepare();void Start2();void Start3();//--------------------------------void Init(); //【增加】void Modify(); //【修改】void Delete(); //【删除】void Store_To_File(); //【存储】void Print_Personal_Information();//【输出同学的个人信息】void Compare_Two_Student();//【同行输出两个学生信息】void Sort(Student**, int);void PrintClassGrade(Student**,int);void PrintClassCourseGrade(Student**,int,int);void Print_Search_Mark(int,Student**);void Print_Excellent_Mark(Student**, int);void Print_Mark2(Student*,int);void Print_Mark1(Student*,int);void Print_Total_Mark(Student**, int);//-------------------------------void Delete_Student_Information(Student*,int);//only from screenvoid Alter_Student_Information(Student*,int); //only from screenvoid Get_New_Student_Information(Student*,int);void Print_Student_Information(Student*,int);void Calculate( Student* ) ;//计算单个同学成绩//--------------------------------int init_ID();void init_Name(Student*);void init_Gender(Student*);void init_Nationality(Student*);void init_Birth(Student*);void init_Position(Student*,int);void init_ALL_Mark(Student*);int find_Related_Course();void init_One_Mark(Student*);void init_One_Specific_Mark(Student*,int);void delete_Name(Student*);void delete_Gender(Student*);void delete_Nationality(Student*);void delete_Birth(Student*);void delete_Position(Student*,int);void delete_One_Mark(Student*);Student* find_Student(int);void Print_Five(int mark);#endif // STUDENT_H_INCLUDED
//main.cpp#include"Student.h"int Input_From_Screen;int Have_Open_Input;FILE *File_Input,*File_Output;Student *tail=NULL,*head=NULL;Course Cour[5];bool ID_exist[10002];bool Monitor_exist[102];bool Study_Commissar_exist[102];int main(){ prepare(); Start2(); return 0;}void prepare(){ printf("\n\n\n"); printf("\t********************************************************\n"); printf("\t* *\n"); printf("\t* *\n"); printf("\t* *\n");printf("\t* 亲 欢迎使用学生管理系统!! *\n");printf("\t* *\n");printf("\t* *\n");printf("\t* *\n");printf("\t* *\n");printf("\t* *\n");printf("\t* *\n");printf("\t* 希望您玩得愉快!! *\n");printf("\t* *\n");printf("\t* *\n"); printf("\t********************************************************\n"); for (int i=1;i<=400000000;i++); Input_From_Screen=1; if (File_Input=fopen("D:\in.txt","r")) Have_Open_Input=1; else {printf("读入文件未成功打开\n"); Have_Open_Input=0; } strcpy(Cour[0].Name,"高级语言程序设计"); strcpy(Cour[1].Name,"高级语言程序设计实验"); strcpy(Cour[2].Name,"高级语言课程设计"); strcpy(Cour[3].Name,"面向对象程序设计"); strcpy(Cour[4].Name,"面向对象程序设计实验"); Cour[0].Time=64; Cour[1].Time=32; Cour[2].Time=32; Cour[3].Time=64; Cour[4].Time=32; Cour[0].Credit=4; Cour[1].Credit=1; Cour[2].Credit=1; Cour[3].Credit=4; Cour[4].Credit=1; memset(ID_exist,0,sizeof(ID_exist)); memset(Monitor_exist,0,sizeof(Monitor_exist)); memset(Study_Commissar_exist,0,sizeof(Study_Commissar_exist));}void Start2(){ system("cls"); while (1) { printf("\t***********************************************************\n"); printf("\t* *\n"); printf("\t* 请输入您需要的服务项目! *\n"); printf("\t* 1 增加新同学的信息 *\n"); printf("\t* 2 修改同学信息 *\n"); printf("\t* 3 删除同学信息 *\n"); printf("\t* 4 打印所有或部分同学的成绩信息 *\n"); printf("\t* 5 打印某同学的个人信息 *\n"); printf("\t* 6 存储信息到文件 *\n"); printf("\t* 0 退出 *\n"); printf("\t* *\n"); printf("\t***********************************************************\n"); int result2; scanf("%d",&result2); system("cls"); int exit_flag=0; switch(result2) { case 1:Init();break; case 2:Modify();break; case 3:Delete();break; case 4:Start3();break; case 5:Print_Personal_Information();break; case 6:Store_To_File();break; case 0:exit_flag=1;break; } if (exit_flag==1) { system("cls"); printf("\t\t*************************************\n"); printf("\t\t* *\n"); printf("\t\t* *\n"); printf("\t\t* 程序结束,感谢使用 ^_^ *\n"); printf("\t\t* 欢迎下次使用! *\n"); printf("\t\t* *\n"); printf("\t\t* *\n"); printf("\t\t*************************************\n"); } }}void Start3(){ system("cls"); while(1) { printf("\t***********************************************************\n"); printf("\t* *\n"); printf("\t* 请输入您需要的服务项目! *\n"); printf("\t* 1 按照某位同学的学号或者姓名查找打印成绩 *\n"); printf("\t* 2 打印某班成绩 *\n"); printf("\t* 3 按照某科打印某班成绩 *\n"); printf("\t* 4 打印同学总成绩 *\n"); printf("\t* 5 打印优秀同学成绩 *\n"); printf("\t* 6 同行输出两个同学信息 *\n"); printf("\t* 0 退出 *\n"); printf("\t* *\n"); printf("\t***********************************************************\n"); int result3; int exit_flage=0; scanf("%d",&result3); system("cls"); switch(result3) { case 1: printf("请输入查找方式 0按学号1 按照姓名"); int result3_1; scanf("%d",&result3_1); Print_Search_Mark(result3_1 ,&head); break; case 2:printf("请输入所需查找的班级"); int result3_2; scanf("%d",&result3_2); PrintClassGrade(&head,result3_2 ); break; case 3:printf("请输入打印的班级和课程名称(0 高程1 高程实验2 课程设计3 面向对象程序设计4 面向对象实验)"); int result3_3_1,result3_3_2; scanf("%d%d",&result3_3_1,&result3_3_2); PrintClassCourseGrade(&head, result3_3_1, result3_3_2); break; case 4:printf("请输入打印成绩单的方法0按照学号顺序打印1按照平均成绩排名打印2按照加权平均成绩打印"); int result3_4; scanf("%d",&result3_4); Print_Total_Mark(&head, result3_4); break; case 5:printf("请输入打 印的班级和课程名称(0 高程1 高程实验2 课程设计3 面向对象程序设计4 面向对象实验)"); int result3_5; scanf("%d",&result3_5); Print_Excellent_Mark(&head, result3_5); break; case 6:Compare_Two_Student(); break; case 0:exit_flage=1;break; } if(exit_flage==1)break; }}
//file1.cpp#include"Student.h"void Init() //【增加】{ system("cls"); printf("\t\t*************************************\n"); printf("\t\t* 请选择输出方式 *\n"); printf("\t\t* 输入0:从文件读入 *\n"); printf("\t\t* 输入非0:从屏幕读入 *\n"); printf("\t\t*************************************\n"); scanf("%d",&Input_From_Screen); system("cls"); if (Input_From_Screen) {printf("将从屏幕读入,waiting...\n"); while (1) { printf("请输入新同学的id\n"); int id=init_ID(); if (id!=-1) { printf("***********************************************************\n"); printf("*请输入该同学的个人信息:姓名,性别,民族,出生年月,行政职务*\n"); printf("*以及5门课程的成绩: *\n"); printf("* 高级语言程序设计 *\n"); printf("* 高级语言程序设计实验 *\n"); printf("* 高级语言课程设计 *\n"); printf("* 面向对象程序设计 *\n"); printf("* 面向对象程序设计实验 *\n"); printf("*亲!请注意:如果哪一项没有数据,请输入*代替 *\n"); printf("***********************************************************\n"); Student* newp=(Student*)malloc(sizeof(Student)); newp->ID=id; Get_New_Student_Information(newp,id); if (tail==NULL) { tail=newp; head=tail; } else {tail->Next=newp; tail=newp; } } printf("继续读入新同学请输入1,退出请输入0\n"); int opt=-1;scanf("%d",&opt);system("cls"); while (opt!=0&&opt!=1){printf("您输入的不是0或1,继续读入新同学请输入1,退出请输入0\n"); scanf("%d",&opt);} if (!opt) break; } printf("此次屏幕读入结束,waiting...\n"); } if (Input_From_Screen==0) {int have_input=0,should_input; printf("将从文件读入,waiting...\n"); printf("请输入将读入几个同学的信息\n"); printf("输入n(n为大于0的整数),则读入n个\n"); printf("输入-1,则读到文件尾\n"); scanf("%d",&should_input); while (1) { int id=init_ID(); if (id==-2) {printf("error---已读到文件尾\n"); break;} if (id!=-1) { Student* newp=(Student*)malloc(sizeof(Student)); newp->ID=id; Get_New_Student_Information(newp,id); if (tail==NULL) { tail=newp; head=tail; } else {tail->Next=newp; tail=newp; } have_input++;printf("成功读入第%d个同学的信息,该同学id为%d\n",have_input,id); } if (id==-1) {printf("由于id错误,接下来读入的相应信息将作废\n"); Student* newp=(Student*)malloc(sizeof(Student)); Get_New_Student_Information(newp,0); } if (have_input==should_input) break; } printf("在这次文件读入中,共成功读入%d名同学的信息\n",have_input); printf("此次文件读入结束,waiting...\n"); } Input_From_Screen=1; printf("\n\n"); }void Modify() //【修改】{ while (1) { printf("请输入要修改信息的同学的id\n"); int id=init_ID(),find_it=0; for (Student *bl=head;bl!=NULL;bl=bl->Next) if (bl->ID==id) {Alter_Student_Information(bl,id);find_it=1; break;} if (!find_it) printf("额,此id不存在\n"); printf("继续修改其他同学请输入1,退出请输入0\n"); int opt=-1;scanf("%d",&opt); system("cls"); while (opt!=0&&opt!=1){printf("您输入的不是0或1,继续修改其他同学请输入1,退出请输入0\n"); scanf("%d",&opt);} if (!opt) break; } printf("\n\n");}void Delete() //【删除】{ while (1) { printf("请输入要删除信息的同学的id\n"); int id=init_ID(),find_it=0; for (Student *bl=head;bl!=NULL;bl=bl->Next) if (bl->ID==id) {Delete_Student_Information(bl,id);find_it=1; break;} if (!find_it) printf("额,此id不存在\n"); printf("继续删除其他同学请输入1,退出请输入0\n"); int opt=-1; scanf("%d",&opt); system("cls"); while (opt!=0&&opt!=1){printf("您输入的不是0或1,继续删除其他同学请输入1,退出请输入0\n"); scanf("%d",&opt);} if (!opt) break; } printf("\n\n");}void Store_To_File()//【存储】{ File_Output=fopen("D:\out.txt","w"); printf("重新打开了输出文件\n"); int num=0; for (Student *bl=head;bl!=NULL;bl=bl->Next) {fprintf(File_Output,"%d %s ",bl->ID,bl->Name); if (bl->Gender==0) fprintf(File_Output,"Male "); else if (bl->Gender==1) fprintf(File_Output,"Female "); else fprintf(File_Output,"* "); fprintf(File_Output,"%s ",bl->Nationality); fprintf(File_Output,"%d ",bl->Birth); if (bl->Position==0) fprintf(File_Output,"Monitor "); else if (bl->Position==1) fprintf(File_Output,"Study_Commissar "); else if (bl->Position==2) fprintf(File_Output,"None "); else fprintf(File_Output,"* "); for (int i=0;i<5;i++) fprintf(File_Output,"%d ",bl->Mark[i]); num++; fprintf(File_Output,"\n"); } printf("成功写入%d个同学的信息到文件\n",num);}void Print_Personal_Information() //【输出同学的个人信息】{ while (1) { system("cls"); printf("请输入要输出信息的同学的id\n"); int id=init_ID(),find_it=0; for (Student *bl=head;bl!=NULL;bl=bl->Next) if (bl->ID==id) {Print_Student_Information(bl,id);find_it=1; break;} if (!find_it) printf("额,此id不存在\n"); printf("继续输出新同学请输入1,退出请输入0\n"); int opt=-1; scanf("%d",&opt); while (opt!=0&&opt!=1){printf("您输入的不是0或1,继续输出其他同学请输入1,退出请输入0\n"); scanf("%d",&opt);} if (!opt) break; } printf("\n\n");}void Compare_Two_Student()//【同行输出两个学生信息】{ int id1,id2; char ch[N]; Student*stu1,*stu2; printf("请输入学生1的id\n"); while ((stu1=find_Student(id1=init_ID()))==NULL) printf("请输入学生1的id\n"); printf("请输入学生2的id\n"); while ((stu2=find_Student(id2=init_ID()))==NULL) printf("请输入学生2的id\n"); printf("-------------------------\n"); printf("\t学号: %d\t%d\n",id1,id2); printf("\t姓名: %s\t%s\n",stu1->Name,stu2->Name); for (int i=0;i<5;i++) printf("\t%s: %d\t%d\n",Cour[i].Name,stu1->Mark[i],stu2->Mark[i]); printf("-------------------------\n"); printf("按任意键退出程序\n"); scanf("%s",ch);}//计算平均成绩和加权void Calculate(Student *p){ p->Average=(p->Mark[0]+p->Mark[1]+p->Mark[2]+p->Mark[3]+p->Mark[4])/5.0; p->Weighted_Average=(4*p->Mark[0]+p->Mark[1]+p->Mark[2]+4*p->Mark[3]+p->Mark[4])/11.0;}/********************************************************************************************************************************/bool Is_Integer(char *str){ int len=strlen(str); for (int i=0;i<len;i++) if (str[i]<'0'||str[i]>'9') return 0; return 1;}int init_ID(){ char now_id[N]; int eof; if (Input_From_Screen) eof=(scanf("%s",now_id)==EOF); else eof=(fscanf(File_Input,"%s",now_id)==EOF); if (eof==1) return -2; int val; if (Is_Integer(now_id)&&strlen(now_id)==8&&now_id[0]=='5'&&now_id[1]=='3'&&now_id[2]=='1'&&now_id[3]=='2') { val=atoi(now_id); if (val%100==0) {val=-1;printf("error!---Undefined_id\n");} else if (val/100%100==0) {val=-1;printf("error!---Undefined_id\n");} } else {val=-1;printf("error!---Undefined_id\n");} if (ID_exist[val%10000]==1) { val=-1; printf("error!---have beed exist id\n"); } if (val!=-1) ID_exist[val%10000]=1; return val;}void init_Name(Student* st)//读入姓名{ if (Input_From_Screen) scanf("%s",st->Name);else fscanf(File_Input,"%s",st->Name); st->Have_Name=1;}void init_Gender(Student* st)//读入性别,看是否是Male、Female两者之一,若不是则报错{ char now_gender[N]; if (Input_From_Screen) scanf("%s",now_gender);else fscanf(File_Input,"%s",now_gender); if (strcmp(now_gender,"Male")==0) st->Gender=Male; else if (strcmp(now_gender,"Female")==0) st->Gender=Female; else {st->Gender=Undefined_Gender;printf("error!---Undefined_Gender\n");}}void init_Nationality(Student* st)//读入民族{ if (Input_From_Screen) scanf("%s",st->Nationality);else fscanf(File_Input,"%s",st->Nationality); st->Have_Nationality=1;}void init_Birth(Student* st)//读入出生年月,若出现以下任一种情况则报错(读入不为整数|出生年份大于2013或小于1000|出生月份大于12或小于1){ char now_birth[N]; if (Input_From_Screen) scanf("%s",now_birth);else fscanf(File_Input,"%s",now_birth); if (Is_Integer(now_birth)) {int val=atoi(now_birth); int month=val%100; int year=val/100; if (year>2013||year<1000||month>12||month<1) {st->Birth=-1;printf("error!---Undefined_birth\n");} else st->Birth=val; } else {st->Birth=-1;printf("error!---Undefined_birth\n");}}void init_Position(Student* st,int now_class)//读入职位,看是否为Monitor、Study_Commissar、None三者之一,若不是则报错{ char now_pos[N]; if (Input_From_Screen) scanf("%s",now_pos);else fscanf(File_Input,"%s",now_pos); if (strcmp(now_pos,"Monitor")==0) { if (Monitor_exist[now_class]) {printf("error---this class Monitor already existed\n"); st->Position=Undefined_Position; return; } st->Position=Monitor; Monitor_exist[now_class]=1; printf("!%d班的班长有人当了\n",now_class); } else if (strcmp(now_pos,"Study_Commissar")==0) { { if (Study_Commissar_exist[now_class]) {printf("error---this class Study_Commissar already existed\n"); st->Position=Undefined_Position; return; } st->Position=Study_Commissar; Study_Commissar_exist[now_class]=1; printf("!%d班的学委有人当了\n",now_class); } } else if (strcmp(now_pos,"None")==0) st->Position=None; else {st->Position=Undefined_Position;printf("error!---Undefined_Position\n");}}void init_One_Specific_Mark(Student *st,int i)//读入成绩,若读入不为整数或成绩大于100或成绩小于0则报错,并且该门成绩计为-1{ char now_mark[N]; if (Input_From_Screen) scanf("%s",now_mark);else fscanf(File_Input,"%s",now_mark); if (Cour[i].Credit==4) {if (Is_Integer(now_mark)) {int val=atoi(now_mark); if (val>100||val<0) {st->Mark[i]=WrongMark;printf("error!---Undefined_%s_mark\n",Cour[i].Name);} else st->Mark[i]=val; } else {st->Mark[i]=WrongMark;printf("error!---Undefined_%s_mark\n",Cour[i].Name);} } if (Cour[i].Credit==1) { int len=strlen(now_mark); if (len!=1) {st->Mark[i]=WrongMark;printf("error!---Undefined_%s_mark\n",Cour[i].Name); return;} if (now_mark[0]=='A'){st->Mark[i]=95;return;} if (now_mark[0]=='B'){st->Mark[i]=85;return;} if (now_mark[0]=='C'){st->Mark[i]=75;return;} if (now_mark[0]=='D'){st->Mark[i]=65;return;} if (now_mark[0]=='E'){st->Mark[i]=0; return;} st->Mark[i]=WrongMark; printf("error!---Undefined_%s_mark\n",Cour[i].Name); }}void init_ALL_Mark(Student* st)//依次读入高程、高程实验、高程设计、面向、面向实验五门课的成绩{ for (int i=0;i<5;i++) init_One_Specific_Mark(st,i);}int find_Related_Course()//找到要修改的课程的对应编号{ char now_cour[N]; if (Input_From_Screen) scanf("%s",now_cour);else fscanf(File_Input,"%s",now_cour); int i; for (i=0;i<5;i++) if (strcmp(Cour[i].Name,now_cour)==0)break; if (i==5) {printf("error---no related course\n"); return -1;} return i;}void init_One_Mark(Student* st) //读人某一门成绩,先找到其对应的0-4之间的编号,再具体读入{ int i=find_Related_Course(); if (i!=-1) init_One_Specific_Mark(st,i);}void delete_Name(Student* st){ st->Have_Name=0;}void delete_Gender(Student* st){ st->Gender=Undefined_Gender;}void delete_Nationality(Student* st){ st->Have_Nationality=0;}void delete_Birth(Student* st){ st->Birth=-1;}void delete_Position(Student* st,int now_class){ if (st->Position==Monitor) {Monitor_exist[now_class]=0; printf("!%d班的班长空出来了\n",now_class); } if (st->Position==Study_Commissar) {Study_Commissar_exist[now_class]=0; printf("!%d班的学委空出来了\n",now_class); } st->Position=Undefined_Position;}void delete_One_Mark(Student* st)//删除某一门成绩,先找到其对应的0-4之间的编号,再删除{ int i=find_Related_Course(); if (i!=-1)st->Mark[i]=-1;}Student* find_Student(int id){ for (Student *p=head;p!=NULL;p=p->Next) if (p->ID==id) return p; Student* p=NULL; return p;}void Alter_Student_Information(Student* st,int id) //only from screen{ printf("请输入想更改的项目对应的编号\n"); int opt; while (1) { printf("\t姓名>>0 性别>>1 民族>>2 出生年月>>3 职位>>4 成绩>>5 不想修改了>>6\n"); scanf("%d",&opt); if (opt==0)init_Name(st); if (opt==1)init_Gender(st); if (opt==2)init_Nationality(st); if (opt==3)init_Birth(st); if (opt==4)init_Position(st,id/100%100); if (opt==5){init_One_Mark(st);Calculate(st);} if (opt==6)return; }}void Delete_Student_Information(Student* st,int id) //only from screen{ printf("请输入想删除的项目对应的编号\n"); int opt; while (1) { printf("\t姓名>>0 性别>>1 民族>>2 出生年月>>3 职位>>4 成绩>>5 不想再删了>>6\n"); scanf("%d",&opt); if (opt==0)delete_Name(st); if (opt==1)delete_Gender(st); if (opt==2)delete_Nationality(st); if (opt==3)delete_Birth(st); if (opt==4)delete_Position(st,id/100%100); if (opt==5){delete_One_Mark(st);Calculate(st);} if (opt==6)return; }}void Get_New_Student_Information(Student* st,int id){ init_Name(st); init_Gender(st); init_Nationality(st); init_Birth(st); init_Position(st,id/100%100); init_ALL_Mark(st); Calculate(st); st->Next=NULL; printf("亲!如果输入的信息有错误,请在稍后调用修改函数进行修改\n");}void Print_Student_Information(Student* st,int id) //only from screen{ printf("-------------------------\n"); printf("下面将输出编号为%d的同学的个人信息\n",id); printf("姓名:"); if (st->Have_Name) printf("%s\n",st->Name); else printf("未录入\n"); printf("性别:"); if (st->Gender==0) printf("男\n"); else if (st->Gender==1) printf("女\n"); else printf("未录入\n"); printf("民族:"); if (st->Have_Nationality) printf("%s\n",st->Nationality); else printf("未录入\n"); printf("出生年月:"); if (st->Birth!=-1) printf("%d\n",st->Birth); else printf("未录入\n"); printf("职位:"); if (st->Position==0) printf("班长\n"); else if (st->Position==1) printf("学委\n"); else if (st->Position==2) printf("无\n"); else printf("未录入\n"); printf("下面将输出编号为%d的同学的成绩信息\n",id); for (int i=0;i<5;i++) printf("%s :%d\n",Cour[i].Name,st->Mark[i]); printf("-------------------------\n"); printf("\n\n");}
//File2.cpp#include"Student.h"//排序函数//排序方式 0.按学号排序;1.按姓名排序;2.按Mark1排序;3.按Mark2排序// 4.按Mark3排序;5.按Mark4排序;6.按Mark5排序;7.按平均成绩排序// 8.按加权平均成绩排序void Sort(struct Student** head, int SortStyle){struct Student* First;//有序链表的头指针struct Student* Tail;//有序链表的尾指针struct Student* p_Min;//当前最小的前驱指针struct Student* Min;//当前最小的指针struct Student* p;//当前比较的节点First = NULL;while(*head != NULL)//在链表中找到最小值{for(p = *head, Min = *head; p->Next != NULL; p = p->Next){switch(SortStyle){case 0:if(p->Next->ID < Min->ID)//找到了更小的节点{p_Min = p;//保存当前最小的前驱指针Min = p->Next;//保存当前最小的指针}break;case 1:if((strcmp(p->Next->Name , Min->Name)) < 0)//找到了更小的节点{p_Min = p;//保存当前最小的前驱指针Min = p->Next;//保存当前最小的指针}break;case 2:if(p->Next->Mark[0] > Min->Mark[0])//找到了更小的节点{p_Min = p;//保存当前最小的前驱指针Min = p->Next;//保存当前最小的指针}break;case 3:if(p->Next->Mark[1] > Min->Mark[1])//找到了更小的节点{p_Min = p;//保存当前最小的前驱指针Min = p->Next;//保存当前最小的指针}break;case 4:if(p->Next->Mark[2] > Min->Mark[2])//找到了更小的节点{p_Min = p;//保存当前最小的前驱指针Min = p->Next;//保存当前最小的指针}break;case 5:if(p->Next->Mark[3] > Min->Mark[3])//找到了更小的节点{p_Min = p;//保存当前最小的前驱指针Min = p->Next;//保存当前最小的指针}break;case 6:if(p->Next->Mark[4] > Min->Mark[4])//找到了更小的节点{p_Min = p;//保存当前最小的前驱指针Min = p->Next;//保存当前最小的指针}break;case 7:if(p->Next->Average > Min->Average)//找到了更小的节点{p_Min = p;//保存当前最小的前驱指针Min = p->Next;//保存当前最小的指针}break;case 8:if(p->Next->Weighted_Average > Min->Weighted_Average)//找到了更小的节点{p_Min = p;//保存当前最小的前驱指针Min = p->Next;//保存当前最小的指针}break;default:printf("科目选择错误,排序失败!\n");}} //添加到有序链表中 if(First == NULL)//有序表是空表 {First = Min; Tail = Min; } else//有序表有节点 {Tail->Next = Min; Tail = Min;//Tail = Tail->Next; } //在原表中移除已添加的Min if(Min == *head) { (*head) = (*head)->Next; } else{ p_Min->Next = Min->Next;}} //排序结束,得到有序链表,返回if(First != NULL) {Tail->Next = NULL; }*head = First;}void Print_Five(int mark){if(mark == 95){printf("优秀\t\t");}else if(mark == 85){printf("良好\t\t");}else if(mark == 75){printf("中等\t\t");}else if(mark == 65){printf("及格\t\t");}else if(mark == 0){printf("不及格\t\t");}}//按学号打印某班成绩单void PrintClassGrade(struct Student** head, int Class){ Sort(head,0);int count = 0;for (struct Student *p = *head; p != NULL; p = p->Next){ if (p->ID / 100 % 100 == Class){ count++; if(count == 1){ printf("学号\t\t姓名\t高程\t高程实验\t高级设计\t面向对象\t面向对象实验\t平均成绩\t加权平均\n");} printf("%d\t%s\t%d\t", p->ID,p->Name,p->Mark[0]); Print_Five(p->Mark[1]); Print_Five(p->Mark[2]); printf("%d\t\t",p->Mark[3]); Print_Five(p->Mark[4]); printf("%.2f\t\t%.2f\n", p->Average, p->Weighted_Average);}}if(count == 0){printf("非常抱歉,暂时没有录入该班级成绩信息!\n");}}//按某课程成绩打印某班成绩单void PrintClassCourseGrade(struct Student** head, int Class, int course){Sort(head,course+2);int count = 0;for(struct Student* p = *head; p != NULL; p = p->Next){if(p->ID / 100 % 100 == Class){count++; if(count == 1){ printf("学号\t\t姓名\t"); printf("%s\n",Cour[course ].Name);}printf("%d\t%s\t", p->ID, p->Name);if(Cour[course].Credit == 1){Print_Five(p->Mark[course]);printf("\n");}else{printf("%d\n", p->Mark[course]);}}}if(count == 0){printf("非常抱歉,暂时没有录入该班级成绩信息!\n");}}void Print_Mark1(Student* p,int a_or_wa)//打印一个人的成绩0.包括平均成绩,1,包括加权平均成绩{ printf("学号\t\t姓名\t高程\t高程实验\t高级设计\t面向对象\t面向对象实验\t"); if(a_or_wa == 0){ printf("平均成绩\n"); }else { printf("加权平均成绩\n"); } printf("%d\t%s\t%d\t", p->ID,p->Name,p->Mark[0]); Print_Five(p->Mark[1]); Print_Five(p->Mark[2]); printf("%d\t\t",p->Mark[3]); Print_Five(p->Mark[4]); if(a_or_wa == 0){ printf("%.2f\n", p->Average); }else { printf("%.2f\n", p->Weighted_Average); }}void Print_Mark2(Student* p,int a_or_wa)//打印一个人的成绩0.包括平均成绩,1,包括加权平均成绩{ printf("学号\t\t姓名\t高程\t高程学分\t高程实验\t高程实验学分\t高级设计\t高级设计学分\t面向对象\t面向对象学分\t面向对象实验\t面向对象实验学分\t"); if(a_or_wa == 0){ printf("平均成绩\n"); }else { printf("加权平均成绩\n"); } printf("%d\t%s\t%d\t%d\t\t", p->ID,p->Name,p->Mark[0],Cour[0].Credit); Print_Five(p->Mark[1]); printf("%d\t\t",Cour[1].Credit); Print_Five(p->Mark[2]); printf("%d\t\t",Cour[2].Credit); printf("%d\t\t%d\t\t",p->Mark[3],Cour[3].Credit); Print_Five(p->Mark[4]); printf("%d\t\t\t",Cour[4].Credit); if(a_or_wa == 0){ printf("%.2f\n", p->Average); }else { printf("%.2f\n", p->Weighted_Average); }}void Print_Search_Mark( int ID_or_Name ,Student** head)//按照学号(0)或姓名(1)输出当前平均成绩排名,加权成绩排名,{ int ID = 0; char Name[20] = "no name"; if(ID_or_Name == 0) { printf("请输入你想要查找的学号(8位数):"); scanf("%d",&ID); }else { printf("请输入你想要查找的姓名:"); scanf("%s",Name); } Sort(head,7); Student * p = *head; int count = 1; bool flag = false; while(p != NULL){ if(p->ID == ID || strcmp(p->Name ,Name) == 0){ flag = true; Print_Mark1(p,0); printf("该同学当前平均成绩排名为:%d\n",count); break; } count++; p = p->Next; } if(!flag){ printf("对不起,暂时没有录入该生的信息!"); } count = 1; flag = false; Sort(head,8); p = *head; while(p != NULL){ if(p->ID == ID || strcmp(p->Name ,Name) == 0) { flag = true; Print_Mark2(p,1); printf("该同学当前加权平均成绩排名为:%d\n",count); break; } count++; p = p->Next; } if(!flag){ printf("对不起,暂时没有录入该生成绩!"); }}void Print_Excellent_Mark(Student** head, int course)//打印优秀同学成绩信息,0,1,2,3,4代表五门成绩{ int count = 0; Sort(head,0); for (struct Student *p = *head; p != NULL; p = p->Next){ if (p->Position !=2&&p->Position !=3&& p->Mark[course] >= 90)//<=100{ count++; if(count == 1){ printf("学号\t\t姓名\t高程\t高程实验\t高级设计\t面向对象\t面向对象实验\t平均成绩\t加权平均\n");} printf("%d\t%s\t%d\t", p->ID,p->Name,p->Mark[0]); Print_Five(p->Mark[1]); Print_Five(p->Mark[2]); printf("%d\t\t",p->Mark[3]); Print_Five(p->Mark[4]); printf("%.2f\t\t%.2f\n", p->Average, p->Weighted_Average);}}if(count == 0){printf("非常抱歉,暂时没有录入优秀同学的信息!\n");}}void Print_Total_Mark(Student** head, int SortStyle)//打印系统中所有同学的成绩单[总成绩单]0.按学号打印{ //1.按平均成绩打印;2,按加权平均成绩打印 switch(SortStyle) { case 0: Sort(head,0); break; case 1: Sort(head,7); break; case 2: Sort(head,8); break; default: printf("选择排序方式错误!"); return; } if(head != NULL){ printf("学号\t\t姓名\t高程\t高程实验\t高级设计\t面向对象\t面向对象实验\t平均成绩\t加权平均\n"); for (struct Student *p = *head; p != NULL; p = p->Next){ printf("%d\t%s\t%d\t", p->ID,p->Name,p->Mark[0]); Print_Five(p->Mark[1]); Print_Five(p->Mark[2]); printf("%d\t\t",p->Mark[3]); Print_Five(p->Mark[4]); printf("%.2f\t\t%.2f\n", p->Average, p->Weighted_Average); }}else{ printf("对不起,系统暂时没有录入信息。");}}
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- 学生成绩管理系统
- quartus ii 11.0使用教程
- 面试经典算法3之选择排序
- 查看init进程的日志输出
- Ubuntu12.04安装中文输入法(ibus)和开机自动启动ibus应用
- 开机过程动画
- 学生成绩管理系统
- google校招笔试题 2.1 写函数,输出前N个素数
- UVa 10054 - The Necklace(欧拉回路)
- hdu 1540 Tunnel Warfare(线段树区间统计)
- hierarchyviewer使用方法简介
- google校招笔试题 2.2 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序。
- java.io.EOFException异常解决方案(无故出现此问题)
- 浅谈BIOS和CMOS的区别
- ISS安装后的服务器错误 500