#defineLENsizeof(structstudent)
usingnamespacestd;
intn=0;//定义一个全局变量统计学生人数
structstudent//定义一个学生信息的结构体
{
charname[20];//用来存放姓名的
charsex[20];//用来存放性别的
charyuanxi[20];//用来存放院系的
longintid;//用来存放学号的
intscore[4];//用来存放分数的
inttotal;//用来存放总分数的
structstudent*next;
};
vector〈student>stu;
classInformation
{
public:
Information();//构造函数。
~Information();//析构函数。
student*creat();//建立链表函数。
voidoutput(student*head);
intcount(student*head);//定义函数count()统计考生总数
student*insert(student*head);//指针函数*insert()用来添加考生信息.
student*cancel(student*head,longintnum);//指针函数*cancel()用来删除考生信息。
student*find(student*head,longintnum);//指针函数*find()用来查找考生信息.
voidinorder(student*head);//定义inorder()函数将考生的总分从大到小排列并输出
voidaverage(student*head);//求学生成绩的平均分的函数
voidsave(student*head);//保存函数
student*Read();//读取函数
private:
student*p1,*p2,*p3,*head,st;
};
Information:
:
Information()//构造函数
{
cout<〈”******************************************************************************\n";
cout〈〈”---———————-———————-——-——〈〈欢迎您使用学生信息管理系统〉>—————-———-——————--——-—--\n”;
cout〈<”******************************************************************************\n\n”;
}
Information:
:
~Information()//构造函数
{
cout〈〈"******************************************************************************\n”;
cout〈<”———-——————--—-——----——--<〈谢谢您使用学生信息管理系统〉>—--—————-————————-—-—-——\n”;
cout<〈"******************************************************************************\n”;
}
student*Information:
:
creat(void)//定义一个指向structstudent的结构体指针函数*creat()用来增加学生信息。
{
charch[20];n=0;//用来存放姓名的
p1=p2=(student*)malloc(LEN);//调用malloc()函数用来开辟一个新的存储单元
cout<〈”———-———-——-——〈〈请建立学生考试信息表,在姓名处输入!
结束输入。
〉〉-————————-—-—-”<〈endl;
cout<<”姓名:
”;
cin〉〉ch;
head=NULL;//给指针head赋初值
while(strcmp(ch,”!
")!
=0)//调用字符比较函数strcmp()用来判断是否继续输入
{
charstr[10];
intflag=0;
p1=(student*)malloc(LEN);//调用malloc()函数用来开辟一个新的存储单元
strcpy(p1—>name,ch);//将循环结构前面输入的姓名复制到结构体名为p1的数组name中
cout<<"性别:
”;
cin〉>p1—〉sex;
cout〈<”院系:
”;
cin〉〉str;
cout〈<”学号(9位):
";
do{
cin〉>str;
if(atol(str)〉999999999||atol(str)〈1)
cout〈〈"对不起,请正确输入!
\n”;
else
{
p1—〉id=atol(str);flag=1;
}
}while(flag==0);
flag=0;
cout〈〈”语文成绩:
";
do{
cin>>str;
if(atoi(str)>100||atoi(str)〈1)
cout〈<”对不起,请输入1—100之间的数字!
!
\n”;
else
{
p1—>score[0]=atoi(str);flag=1;
}
}while(flag==0);
flag=0;
cout<<”外语成绩:
";
do{
cin>〉str;
if(atoi(str)〉100||atoi(str)〈1)
cout<〈”对不起,请输入1—100之间的数字!
!
\n";
else
{p1->score[1]=atoi(str);flag=1;}
}while(flag==0);
flag=0;
cout<〈"数学成绩:
”;
do{
cin>〉str;
if(atoi(str)>100||atoi(str)<1)
cout<〈”对不起,请输入1-100之间的数字!
!
\n”;
else
{p1—〉score[2]=atoi(str);flag=1;}
}while(flag==0);
flag=0;
cout〈〈"C++成绩:
";
do{
cin〉>str;
if(atoi(str)>100||atoi(str)<1)
cout<〈"对不起,请输入1—100之间的数字!
!
\n";
else
{p1—>score[3]=atoi(str);flag=1;}
}while(flag==0);
flag=0;
p1—〉total=p1-〉score[0]+p1-〉score[1]+p1—>score[2]+p1->score[3];//计算总分
if(n==0)head=p1;//如果是输入第一组学生考试信息就将指针p1赋给指针head
elsep2—>next=p1;//否则将p1赋给p2所指结构体的next指针
p2=p1;//将指针p1赋给指针p2
n++;//将n的值加1
cout〈<"姓名:
”;
cin〉〉ch;//将输入的姓名存放到字符数组ch中
}
p2—>next=NULL;//将p2所指结构体的next指针重新赋空值
return(head);//将输入的第一组学生考试信息返回
}
voidInformation:
:
output(student*head)//定义output()函数将学生的信息从头指针所指内容开始输出
{
if(head==NULL)cout〈〈”这是一个空表,请先输入考生成绩。
\n”;
else{
cout〈〈”—————---————-———————-——--——————-—-—--———————---—-—-—-—-—-——-———-——————-—--—————\n”;
cout<〈”*学生成绩信息表*\n”;
cout〈<”————————-—-———-————————--——-—-—————--———————-———-——---——-—-—————————-————--——--\n";
cout〈<”学号姓名性别院系语文英语数学C++平均成绩总分\n”;
cout〈〈"----——--————-——-—-—-—---—---———————---—-——--—-——-—-——--————---—---—-——--—---———\n”;
p1=head;//将头指针赋给p
do
{
cout〈<<〈setw(8)〈〈p1—〉sex
〈〈setw(13)〈〈p1-〉score[0]
〈〈setw(16)〈〈〈setw(10)〈〈p1—>score[2]
〈score[3]
〈〈setw(6)〈〈p1—〉total/4.0
〈〈setw(11)<〈p1—〉total〈〈endl;
cout〈〈"——--—-————--——-——--—-----——-————-——--——--———--—-—-—————-————-—————-——-——---————\n”;
p1=p1—〉next;//将下一组学生信息的next指针赋给p
}while(p1!
=NULL);//若指针p非空则继续,目的是把所有的学生信息都传给指针p然后输出。
}
}
//统计学生人数的函数
intInformation:
:
count(structstudent*head)//定义函数count()统计考生总数
{
if(head==NULL)//若指针head为空返回值为0
return(0);
elsereturn(1+count(head—〉next));//函数的递归调用
}
//插入学生的成绩信息的函数
student*Information:
:
insert(student*head)//插入新结点定义一个指向structstudent的结构体指针函数*insert()用来添加考生信息.
{
charstr[10];
intflag=0;
cout<〈”\t———————————-——--<〈请输入新增学生成绩信息〉>—————————--—-———\n”<〈endl;
p1=(student*)malloc(LEN);//使p1指向插入的新结点
cout<<"姓名:
";
cin>〉p1-〉name;//将输入的姓名存放到结构体名为p1的数组name中
cout<〈”性别:
”;
cin>>p1-〉sex;
cout<〈"学号(9位):
”;
do{
cin>〉str;
if(atol(str)〉99999999||atol(str)<1)
cout〈<”对不起,请请正确输入!
!
!
\n";
else
{p1—>id=atol(str);flag=1;}
}while(flag==0);
flag=0;
cout<<”语文成绩:
";
do{
cin>>str;
if(atoi(str)〉100||atoi(str)<1)
cout〈<”对不起,请输入1—100之间的数字!
!
\n”;
else
{p1—>score[0]=atoi(str);flag=1;}
}while(flag==0);
flag=0;
cout〈〈”外语成绩:
”;
do{
cin>>str;
if(atoi(str)>100||atoi(str)<1)
cout<〈”对不起,请输入1—100之间的数字!
!
\n”;
else
{p1—〉score[1]=atoi(str);flag=1;}
}while(flag==0);
flag=0;
cout〈<”数学成绩:
”;
do{
cin〉>str;
if(atoi(str)〉100||atoi(str)〈1)
cout<〈"对不起,请输入1—100之间的数字!
!
\n";
else
{p1—>score[2]=atoi(str);flag=1;}
}while(flag==0);
flag=0;
cout〈〈”C++成绩:
”;
do{
cin〉>str;
if(atoi(str)〉100||atoi(str)〈1)
cout〈〈”对不起,请输入1—100之间的数字!
!
\n”;
else
{p1—>score[3]=atoi(str);flag=1;}
}while(flag==0);
flag=0;
p1—〉total=p1-〉score[0]+p1—〉score[1]+p1—>score[2]+p1->score[3];//计算总分
p2=head;//将头指针赋给p2
if(head==NULL)//若没调用次函数以前的头指针head为空
{
head=p1;p1-〉next=NULL;//则将p1赋给头指针head并将p1所指结构体成员指针next赋空值
}
else
{
while((p1—>id>p2—〉id)&&(p2—〉next!
=NULL))
{
p3=p2;//p3指向原p2指向的结点
p2=p2—〉next;
}//p2后移一个结点
if(p1—〉id<=p2—〉id)
{
if(head==p2)
{
p1-〉next=head;
head=p1;
}//插入到第一个结点之前
else
{
p3->next=p1;
p1—>next=p2;
}//插入到p3所指结点之后
}
else
{
p2—>next=p1;
p1->next=NULL;
}//插入到尾结点之后
}
n++;//将学生人数加1
cout<<”\t你输入的学生信息已经成功插入”〈〈endl;
return(head);
}
//删除学生信息函数
student*Information:
:
cancel(student*head,longintnum)//定义一个指向structstudent的结构体指针函数*delete()用来删除考生信息。
{
if(head==NULL)//若调用次函数以前的头指针head为空
{
return(head);
}
else
{
p1=head;//否则将头指针赋给p1
while(num!
=p1—>id&&p1—>next!
=NULL)//寻找要删除的结点当p1所指的学号不是输入的学号并且p1所指的next指针不为空
{
p2=p1;
p1=p1—〉next;//p2指向原p1指向的结点p1后移一个结点
}
if(num==p1—>id)//如果输入的学生准考证号是p1所指的学号结点找到后删除
{
if(p1==head)head=p1-〉next;//如果head指针和p1指针相等则将下一个结点赋给指针head
else
p2—〉next=p1—〉next;//否则将p1所指结点赋给p2所指结点将要删除的学生信息跳过去
cout<<”删除学号为”<〈num<〈”的学生\n";
n——;//将学生人数减1
}
return(head);//将头指针返回
}
}
//查找学生信息函数
student*Information:
:
find(student*head,longintnum)//定义一个指向structstudent的结构体指针函数*find()用来查找学生信息.
{
if(head==NULL)//若调用次函数以前的头指针head为空
{
cout<〈”这是一个空表,请先输入考生成绩.\n”;
return(head);
}
else
{
p1=head;//否则将头指针赋给p1
while(num!
=p1—〉id&&p1—〉next!
=NULL)
//寻找结点当p1所指的学号不是输入的学生学号并且p1所指的next指针不为空
{
p1=p1—>next;//p1后移一个结点
}
if(num==p1->id)//如果要查找的学号是p1所指的学号
{
cout〈<”——-——-———-——————-—-—-—--———-——--————-—-————--—--———-———————————————----———————\n”;
cout〈〈”学号姓名性别院系语文英语数学C++平均分总分\n”;
cout<〈”-——---——-————-———-——--——————-—--—--———--—--—--—-—-——--——-—-—-—--—-—————-——-——-\n”;
cout<〈setw(8)<〈p1—>id
<〈setw(9)〈name
<〈setw(8)〈〈p1—>sex
<〈setw(13)〈〈〈setw(16)〈<〈<<total〈〈endl;
cout〈〈”——-—————-———-——-—--—--——-————---———————————-—-————————-———-——————-———--—-----—\n";
}
else
cout<<”没找到学号为”〈\n";//结点没找到
return(head);
}
}
voidInformation:
:
inorder(student*head)//定义inorder()函数将考生的总分从大到小排列并输出
{
inti,k,m=0,j;
student*p[20];//定义一个指向structstudent的结构体指针数组p
if(head!
=NULL)//如果头指针是空则继续
{m=count(head);
cout〈〈"————————————--———-—-———-——-—--—-—-———-—--———-—-————--——-—————-————---—-—-————-\n”;
cout〈〈"学生成绩统计表\n”;
cout〈〈”———-—--——-———-—-———————-——————--———-———-——--——————-———-——--———---——---————--—-\n";
cout<<”学号姓名性别院系语文英语数学C++平均分总分名次\n";
cout〈<"-——-———--————--——-——-—————————----——-——-———————————-—--------—————--———-———-——\n";
p1=head;
for(k=0;k〈m;k++)
{
p[k]=p1;
p1=p1—〉next;
}
for(k=0;k〈m—1;k++)//选择排序法
for(j=k+1;j〈m;j++)
if(p[k]—>total
{
p2=p[k];
p[k]=p[j];
p[j]=p2;
}
for(i=0;i{
cout〈〈setw(8)〈〈p1—〉id
<〈setw(9)<〈p1—>name
<<〈setw(13)〈〈p1—>score[0]
〈〈setw(16)〈〈p1—〉score[1]
〈〈setw(10)<〈p1—〉score[2]
〈〈setw(9)〈score[3]
〈<〈setw(11)〈〈p1—>total〈〈endl;
cout〈〈"—--—-————————————-————-————-——————————-——-———-———-————-——————————————-—--—————\n";
}
}
}
voidInformation:
:
average(student*head)//求各科平均成绩的函数
{
intk,m;
floatarg1=0,arg2=0,arg3=0,arg4=0;
if(head==NULL)//如果头指针是空则继续
{
cout〈〈"这是一个空表,请先输入学生成绩.\n”;
}
else
{
m=count(head);
p1=head;
for(k=0;k〈m;k++)
{
arg1+=p1—>score[0];
arg2+=p1-〉score[1];
arg3+=p1—〉score[2];
arg4+=p1—〉score[3];
p1=p1—〉next;
}
arg1/=m;arg2/=m;arg3/=m;arg4/=m;
cout〈〈"全班单科成绩平均分\n";
cout〈<”--—————-——-—-——————-———---————-——---—----—-———-—-————--————--——-—--—-——-—-—-—-\n";
cout<