1、#include iostream。h include iomanip。h include fstream #include include malloc.h include stdlib.h #include string #include process。h include stdio。h define LEN sizeof(struct student) using namespace std; int n=0; /定义一个全局变量统计学生人数 struct student/定义一个学生信息的结构体 char name20; /用来存放姓名的 char sex20; /用来存放性别的 c
2、har yuanxi20;/用来存放院系的 long int id; /用来存放学号的 int score4; /用来存放分数的 int total; /用来存放总分数的 struct student *next; ; vector stu; class Information public: Information() ; /构造函数. Information() ; /析构函数。 student creat();/建立链表函数。 void output(student head); int count(student head);/定义函数count()统计考生总数 student *in
3、sert(studenthead);/指针函数insert()用来添加考生信息。 student cancel(student head,long int num);/指针函数*cancel()用来删除考生信息. student *find(student head,long int num); /指针函数*find()用来查找考生信息。 void inorder(student *head);/定义inorder()函数将考生的总分从大到小排列并输出 void average( student head);/求学生成绩的平均分的函数 void save(student head);/保存函数
4、 student Read();/读取函数 private: student p1,p2,*p3,head,st; ; Information::Information() /构造函数 cout” *n; cout” -欢迎您使用学生信息管理系统-n”; cout *nn”; Information:Information() /构造函数 cout” *n”; cout -n”; cout” *n”; student Information::creat(void) /定义一个指向struct student的结构体指针函数*creat()用来增加学生信息. char ch20;n=0; /用
5、来存放姓名的 p1=p2=(student *)malloc(LEN);/调用malloc()函数用来开辟一个新的存储单元 cout” -请建立学生考试信息表,在姓名处输入 ! 结束输入.-endl; coutch; head=NULL; /给指针head赋初值 while (strcmp(ch,”!)!=0) /调用字符比较函数strcmp()用来判断是否继续输入 char str10; int flag=0; p1=(student )malloc(LEN);/调用malloc()函数用来开辟一个新的存储单元 strcpy(p1name,ch); /将循环结构前面输入的姓名复制到结构体名为
6、p1的数组name中 cout” 性别:; cinp1-sex; cout院系: ; cinstr; coutid=atol(str); flag=1; while(flag=0); flag=0; coutstr; if(atoi(str)100 atoi(str)1) cout”对不起,请输入1100之间的数字!!n; else p1-score0=atoi(str); flag=1; while(flag=0); flag=0; coutstr; if(atoi(str)100 | atoi(str)1) cout”对不起,请输入1100之间的数字!n; else p1-score1=a
7、toi(str); flag=1; while(flag=0); flag=0; cout” 数学成绩:”; do cinstr; if(atoi(str)100 atoi(str)1) coutscore2=atoi(str); flag=1; while(flag=0); flag=0; cout” C+成绩:”; do cinstr; if(atoi(str)100 | atoi(str)1) couttotal=p1score0+p1score1+p1score2+p1score3;/计算总分 if(n=0)head=p1;/如果是输入第一组学生考试信息就将指针p1赋给指针head e
8、lse p2next=p1;/否则将p1赋给p2所指结构体的next指针 p2=p1;/将指针p1赋给指针p2 n+; /将n的值加1 coutch;/将输入的姓名存放到字符数组ch中 p2-next=NULL;/将p2所指结构体的next指针重新赋空值 return (head);/将输入的第一组学生考试信息返回 void Information:output(student *head) /定义output()函数将学生的信息从头指针所指内容开始输出 if(head=NULL) cout” 这是一个空表,请先输入考生成绩。n”; else cout-n”; cout 学生成绩信息表*n”;
9、 cout-n”; cout”学号 姓 名 性别 院系 语文 英语 数学 C+ 平均成绩 总分n; cout”-n”; p1=head;/将头指针赋给p do coutsetw(8)p1-id setw(9)p1-name sex score0 score1 setw(10)p1score2 setw(9)p1-score3 totalendl; coutnext;/将下一组学生信息的next指针赋给p while(p1!=NULL);/若指针p非空则继续,目的是把所有的学生信息都传给指针p然后输出. /统计学生人数的函数 int Information:count(struct studen
10、t *head)/定义函数count()统计考生总数 if(head=NULL) /若指针head为空返回值为0 return(0); else return(1+count(headnext));/函数的递归调用 /插入学生的成绩信息的函数 student Information:insert( student head) /插入新结点定义一个指向struct student的结构体指针函数insert()用来添加考生信息。 char str10; int flag=0; coutt-请输入新增学生成绩信息-nendl; p1=(student )malloc(LEN); /使p1指向插入的
11、新结点 cout” 姓名:”; cinp1name; /将输入的姓名存放到结构体名为p1的数组name中 coutp1sex; cout” 学号(9位):”; do cinstr; if(atol(str)99999999 atol(str)1) coutid=atol(str); flag=1; while(flag=0); flag=0; coutstr; if(atoi(str)100 atoi(str)1) cout对不起,请输入1-100之间的数字!n”; else p1-score0=atoi(str); flag=1; while(flag=0); flag=0; cout 外语
12、成绩:”; do cinstr; if(atoi(str)100 atoi(str)1) coutstr; if(atoi(str)100 | atoi(str)1) cout”对不起,请输入1100之间的数字!n; else p1-score2=atoi(str); flag=1; while(flag=0); flag=0; coutstr; if(atoi(str)100 atoi(str)1) coutscore0+p1-score1+p1score2+p1-score3;/计算总分 p2=head;/将头指针赋给p2 if(head=NULL) /若没调用次函数以前的头指针head为
13、空 head=p1;p1next=NULL;/则将p1赋给头指针head并将p1所指结构体成员指针next赋空值 else while((p1-idp2id)&(p2next!=NULL)) p3=p2;/p3指向原p2指向的结点 p2=p2next; /p2后移一个结点 if(p1id=p2id) if(head=p2) p1next=head; head=p1; /插入到第一个结点之前 else p3next=p1; p1next=p2; /插入到p3所指结点之后 else p2next=p1; p1-next=NULL; /插入到尾结点之后 n+;/将学生人数加1 coutt你输入的学生
14、信息已经成功插入id)/如果输入的学生准考证号是p1所指的学号结点找到后删除 if(p1=head) head=p1-next;/如果head指针和p1指针相等则将下一个结点赋给指针head else p2next=p1next;/否则将p1所指结点赋给p2所指结点将要删除的学生信息跳过去 cout” 删除学号为”next!=NULL) /寻找结点当p1所指的学号不是输入的学生学号并且p1所指的next指针不为空 p1=p1next; /p1后移一个结点 if(num=p1id)/如果要查找的学号是p1所指的学号 cout”-n”; cout学号 姓名 性别 院系 语文 英语 数学 C+ 平均
15、分 总分 n; cout-n”; coutsetw(8)p1id name setw(8)sex setw(13)p1score0 setw(16)p1score1 setw(10)p1score2 setw(9)p1score3 setw(6)p1-total/4。0 setw(11)totalendl; cout”-n; else cout 没找到学号为”num的学生.n; /结点没找到 return(head); void Information:inorder(student head) /定义inorder()函数将考生的总分从大到小排列并输出 int i,k,m=0,j; stud
16、ent p20;/定义一个指向struct student的结构体指针数组p if(head!=NULL)/如果头指针是空则继续 m=count(head); cout-n”; cout”学生成绩统计表n; cout”-n”; cout”学号 姓 名 性别 院系 语文 英语 数学 C+ 平均分 总分 名次n”; cout”-n”; p1=head; for(k=0;ktotalpj-total) p2=pk; pk=pj; pj=p2; for(i=0;im;i+) coutsetw(8)p1id name setw(8)p1sex setw(13)p1score0 score2 setw(9
17、)p1-score3 setw(6)p1total/4.0 setw(11)p1-totalendl; cout”-n; void Information::average(student *head) /求各科平均成绩的函数 int k,m; float arg1=0,arg2=0,arg3=0,arg4=0; if(head=NULL)/如果头指针是空则继续 cout” 这是一个空表,请先输入学生成绩.n; else m=count(head); p1=head; for(k=0;km;k+) arg1+=p1score0; arg2+=p1score1; arg3+=p1-score2;
18、 arg4+=p1score3; p1=p1-next; arg1/=m;arg2/=m;arg3/=m;arg4/=m; cout全班单科成绩平均分n; cout”-n”; cout” 语文平均分:”setw(7)arg1 ” 英语平均分:”setw(7)arg2 数学平均分:setw(7)arg3 ” C+平均分:”setw(7)arg4endl; cout”-n; void Information::save(student *head) /保存函数。 ofstream out(data。txt”,ios::out); outcount(head)endl; while(head!=NU
19、LL) outhead-nameid”t”t” sexscore1t” head-score2”t headscore3”t” i; if(i=0)cout” data。txt 文件中的数据为空,请先输入数据。”endl; return 0; else cout0;i-) p1=(student )malloc(LEN); cinst。namest。idst。sex st。score0st.score1st。score2st。score3 st。total; strcpy(p1name,st.name); p1id=st.id; strcpy(p1sex,st。sex); p1score0=s
20、t。score0; p1score1=st。score1; p1score2=st.score2; p1score3=st.score3; p1-total=st.total; if(n=0)head=p1;/如果是输入第一组学生考试信息就将指针p1赋给指针head else p2next=p1;/否则将p1赋给p2所指结构体的next指针 p2=p1;/将指针p1赋给指针p2 n+; /将n的值加1 cout p1-namet /显示读入数据 p1idt”t sex”t” p1score0”t p1score1score2”t p1-score3”t totalendl; cout” ”en
21、dl; / cout” 数据已经成功读取完毕.”endl; p2-next=NULL; return (head); int main() /主函数. system(color 4f”);/改变登陆界面颜色 Information person; student head=NULL; char str5; int flag=0; int choice; long int i; char admin20; char pass30; coutadmin; cout”请输入密码n”; cinpass; if(strcmp(admin,”1111”)=0&strcmp(pass,222”)=0) do
22、 cout” *”endl; cout 学生信息管理系统主菜单界面 *endl ; cout” ”endl; cout”endl; cout.输入学生信息 ”endl; cout。显示学生信息 endl; cout”.排序统计成绩 ”endl; cout”.查找学生信息 ”endl; cout”。增加学生信息 ”endl; cout.删除学生信息 ”endl; cout。保存退出系统 endl; cout”endl; coutstr; if(atoi(str)7 | atoi(str)1) cout”对不起,请输入17这几个数字!n”; else choice=atoi(str); switc
23、h(choice) case 1: head=person.creat(); break; case 2: person。output(head); break; case 3: person。inorder(head); person.average(head); cout 学生人数为:”person。count(head)”人n; break; case 4: coutstr; if(atol(str)999999999 atol(str)str; if(atol(str)999999999 atol(str)1) cout”对不起,请输入正确输入!!hn”; else i=atol(str); flag=1; while(flag=0); flag=0; head=person.cancel(head,i); person.output(head); break; case 7: person。save(head); cout”文件已保存!可以安全退出!!endl; break; default :cout 对不起,您的输入有误,请重新输入。n; break; while(choice!=7); else cout密码不对,重新输入”; return 0;