📄 学生成绩管理系统源代码.cpp
字号:
while(p->num!=n)
{
if(p->next==null)
{
cout<<"修改失败."<<endl<<"===>提示:系统里没有关于该学号的资料记录."<<endl;
return(h);
}
else
{
p=p->next;
}
}
if(p!=null)
{
minput(p);
p->total=p->C_score+p->E_score+p->M_score;
p->ave1=p->total/3;
cout<<"修改成功."<<endl;
}
}
h->show_menu(h);
return(h);
}
Listnode *Listnode::stat(Listnode *p)//统计
{
float Listnode::ave(Listnode *p,string n);
Listnode *h;
h=p;
if(p==null)
{
cout<<"出错."<<endl<<"===>提示:没有学生资料的记录."<<endl;
return(p);
}
else
{
int n;
cout<<"1查询全班的数学成绩 2查询全班的外语成绩 3查询全班的C++成绩 4查询个人情况"<<endl;
cout<<"请输入你的选择:";
cin>>n;
if(n==1)
{
cout<<"全班数学平均分为:";
cout<<h->ave(h,"M_score")<<endl;//调用求平均分的函数
cout<<"全班数学及格率为:";
cout<<h->pass(h,"M_score")<<"%"<<endl;//调用求及格率的函数
}
else if(n==2)
{
cout<<"全班外语平均分为:";
cout<<h->ave(h,"E_score")<<endl;
cout<<"全班外语及格率为:";
cout<<h->pass(h,"E_score")<<"%"<<endl;
}
else if(n==3)
{
cout<<"全班C++平均分为:";
cout<<h->ave(h,"C_score")<<endl;
cout<<"全班C++及格率为:";
cout<<h->pass(h,"C_score")<<"%"<<endl;
}
else if(n==4)
{
int r=0;
r=inum(r);
int count=0;
if(p==null)
{
cout<<"系统里没有学生资料记录."<<endl;
return(h);
}
else
{
while(p->num!=r)
{
if(p->num==r)
{
break;
}
p=p->next;
if(p==null)
{
cout<<"没有关于你的资料记录."<<endl;
return(h);
break;
}
}
}
cout<<"学号"<<setw(10)<<"姓名"<<setw(10)<<"性别"<<setw(10)<<"数学"<<setw(10)<<"外语"<<setw(10)<<"C++"<<setw(10)<<"总分"<<setw(10)<<"平均分"<<endl;
cout<<p->num<<setw(10)<<p->name<<setw(10)<<p->sex<<setw(10)<<p->M_score<<setw(10)<<p->E_score<<setw(10)<<p->C_score<<setw(10)<<p->total<<setw(10)<<p->ave1<<endl;
cout<<"你的数学为班上第"<<h->position(h, "M_score",p)<<"名"<<endl;
cout<<"你的外语为班上第"<<h->position(h, "E_score",p)<<"名"<<endl;
cout<<"你的C++为班上第"<<h->position(h, "C_score",p)<<"名"<<endl;
cout<<"你的总分为班上第"<<h->position(h, "total",p)<<"名"<<endl;
}
else
{
cout<<"你的输入有误,请重新输入."<<endl;
h->stat(h);
}
}
return(h);
}
float Listnode::ave(Listnode *p,string n)//求平均分
{
float ave,total=0;
int count=0;
if(p==null)
{
cout<<"系统里没有学生资料记录."<<endl;
}
else {
while(p!=null)
{
if(n == "M_score")
{
total=total+p->M_score;
count++;
p=p->next;
}
if(n == "E_score")
{
total=total+p->E_score;
count++;
p=p->next;
}
if(n == "C_score")
{
total=total+p->C_score;
count++;
p=p->next;
}
}
ave=total/count;
}
return(ave);
}
double Listnode::pass(Listnode *p, string n)//求及格率
{
int count1=0,count2=0;
float pass;
if(p==null)
{
cout<<"系统里没有学生资料记录."<<endl;
return(0);
}
else
{
while(p!=null)
{
if(n=="M_score"&&p->M_score>=60)
{
count1++;
}
if(n=="E_score"&&p->E_score>=60)
{
count1++;
}
if(n=="C_score"&&p->C_score>=60)
{
count1++;
}
count2++;
p=p->next;
}
}
pass=count1*100/count2;
return(pass);
}
int Listnode::position(Listnode *q,string n,Listnode *p)//求个人在班上的名字
{
Listnode *h;
h=q;
int count=0;
if(q==null)
{
cout<<"没有学生资料的记录."<<endl;
return(0);
}
else
{
while(q!=null)
{
if(n=="M_score"&&(q->M_score>p->M_score))
{
count++;
}
if(n=="E_score"&&(q->E_score>p->E_score))
{
count++;
}
if(n=="C_score"&&(q->C_score>p->C_score))
{
count++;
}
if(n=="total"&&(q->total>p->total))
{
count++;
}
q=q->next;
}
}
return(++count);
}
Listnode *Listnode::arrange(Listnode *p)//对总分进行排名
{
Listnode *show_menu(Listnode *);
Listnode *h,*q,*r,*t;
int count=0;
t=q=h=p;
if(q==null)
{
cout<<"===>提示:没有学生资料的记录."<<endl;
return(q);
}
else
{
while(q!=null)
{
count++;//用来统计结点个数
q=q->next;
}
}
delete q;
r=p->next;
for(int i=0;i<count-1;i++)//冒泡法排序
{
for(int j=i+1;j<count;j++)
{
if(p->total<r->total)
{
float t1=p->total;p->total=r->total;r->total=t1;
float t2=p->ave1;p->ave1=r->ave1;r->ave1=t2;
float t3=p->C_score;p->C_score=r->C_score;r->C_score=t3;
float t4=p->M_score;p->M_score=r->M_score;r->M_score=t4;
float t5=p->E_score;p->E_score=r->E_score;r->E_score=t5;
int t6=p->num;p->num=r->num;r->num=t6;
string t7=p->name;p->name=r->name;r->name=t7;
string t8=p->sex;p->sex=r->sex;r->sex=t8;
}
p=p->next;
r=p->next;
}
p=t;
r=p->next;
}
h->show_menu(h);
p=r=t=null;
return(h);
}
Listnode *Listnode::save(Listnode *p)//生成文件保存资料,以便下次接着操作
{
Listnode *h,*q;int count=0;
q=h=p;
ofstream outfile("student.txt",ios::out|ios::trunc);
if(!outfile)
{
cerr<<"没有找到文件,导入记录失败."<<endl;
exit(1);
}
if(p==null)
{
cerr<<"没有资料导入,导入记录失败."<<endl;
return(h);
}
else
{
while(q!=null)
{
count++;//统计要保存的记录的条数
q=q->next;
}
outfile<<count<<endl;
while(p!=null)
{
outfile<<p->num<<setw(10)<<p->name<<setw(10)<<p->sex<<setw(10)<<p->M_score<<setw(10)<<p->E_score<<setw(10)<<p->C_score<<setw(10)<<p->total<<setw(10)<<p->ave1<<endl;
p=p->next;
}
delete p;
}
outfile.close();
return(h);
}
Listnode *open()//打开文件,导出记录
{
Listnode *h=NULL,*p=NULL,*pTemp=NULL;
int count=0;
ifstream infile("student.txt",ios::in);
if (!infile)
{
cerr<<"没有找到文件,导出记录失败."<<endl;
return(h);
}
else
{
int iCount = 0;
infile >> iCount;//导出结点个数
for(int i=0;i<iCount;i++)//用结点个数控制循环次数
{
p=new Listnode;
p->next=NULL;
infile>>p->num>>setw(10)>>p->name>>setw(10)>>p->sex>>setw(10)>>p->M_score>>setw(10)>>p->E_score>>setw(10)>>p->C_score>>setw(10)>>p->total>>setw(10)>>p->ave1;
count++;//记录导出记录的条数
if(h==NULL)
{
h=p;
pTemp=p;
}
else
{
pTemp->next=p;
pTemp=p;
}
}
cout<<"正在导出记录。。。。请等待。。。。"<<endl;
cout<<"导出成功,共导出"<<count<<"条记录"<<endl;
}
infile.close();
return(h);
}
void sfnc(Listnode *p)//释放内存
{
if(p==null)
{
delete p;
}
while(p!=null)
{
Listnode *q;
q=p;
p=p->next;
delete q;
}
}
int main()//主函数
{
int n,m,e;
e=password();
cout<<"请输入密码:";
cin>>m;
if(m!=e)//从这里开始判断密码是否正确
{
while(m!=e)
{
cout<<"你输入的密码不正确,请重新输入."<<endl;
cout<<"请输入密码:";
cin>>m;
if(m==e)
{
cout<<"欢迎进入学生成绩管理系统."<<endl;
break;
}
password();
e=password();
}
}
else if(m==e)
{
cout<<"欢迎进入学生成绩管理系统."<<endl;//输出欢迎信息
}
Listnode student,*p;
p=open();
if(p==null)/*如果没有从文件中导出记录,则要控制用记的第一次输入,如果选择对数据的删除查找什么的操作,将会报错。。。*/
{
menu();
cout<<"请你选择操作:";
cin>>n;
while(n!=1&&n!=10)
{
if(n>1&&n<10)
{
if(n==9)
{
announce();
cout<<"请你选择操作:";
cin>>n;
}
else
{
cout<<"在你还没有建立资料库之前,你只能进行1,9或者10操作:";
cin>>n;
}
}
else
{
cout<<"===>提示:菜单里没有你输入的选项."<<endl;
cout<<"你的输入有误,请重新输入:";
cin>>n;
}
}
if(n==1)
{
p=student.creat();
}
else
{
exit(0);
}
}
else
{;}
do
{
menu();
cout<<"请你选择操作:";
cin>>n;
while(n<=1&&n>=10)
{
cout<<"===>提示:菜单里没有你输入的选项."<<endl;
cout<<"你的输入有误,请重新输入:";
cin>>n;
}
string t;
switch(n)//选择操作,并在每一次操作后返回该操作完成后的头指针,以便保存该操作。。。
{
case 1:
p=student.creat();break;
case 2:
p=student.search(p);break;
case 3:
p=student.del(p);break;
case 4:
p=student.add(p);break;
case 5:
p=student.show_menu(p);break;
case 6:
p=student.modify(p);break;
case 7:
p=student.stat(p);
break;
case 8:
p=student.arrange(p);break;
case 9:
announce();break;
case 10:
cout<<"是否保存资料(Y\\N):";
cin>>t;
while((t!="Y"&&t!="y")&&(t!="N"&&t!="n"))//输入大小写的Y或N都可以。。。
{
cout<<"===>提示:只能输入大写或小写的Y与N来进选择是否保存."<<endl;
cout<<"你的输入有误,请重新输入:";
cin>>t;
}
if(t=="Y"||t=="y")
{
p=student.save(p);
cout<<"保存成功,退出系统,再见."<<endl;
sfnc(p);//保存并释放内存
exit(0);
}
else if(t=="N"||t=="n")
{
cout<<"退出系统,再见."<<endl;
sfnc(p);//释放链表内存
exit(0);
}
default ://输入选择的操作,如果菜单里没有,报错。。。
n=0;
cout<<"===>提示:菜单里没有你输入的选项."<<endl;
cout<<"你的输入有误,请重新输入."<<endl;
}
}
while(n<=10);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -