?如需全部代码,关注公众号(coding加油站)回复“C语言学生成绩管理系统”免费领取。
1、思路 学生成绩管理系统,首先要初始化系统,首页选择教师还是学生,教师拥有全部的权限,开始一个新的学生成绩系统初始化记录学生姓名,学号,院系,然后输入学生各科成绩,数学,英语,语文成绩。记录完各课成绩以后,可查看学生平均成绩和是否及格,成绩查询其中有学号查询,姓名查询,院系查询,还有全部输出,可以清晰的看到及格人数,按照分数高低排列,最后还可以添加和删除学生成绩,或者更改学生成绩,避免人为录入成绩错误。
2、相关功能
? (1)录入每个学生的学号、姓名和各科考试成绩; (2)计算每门课程的总分和平均分; (3)计算每个学生的总分和平均分; (4)按每个学生的总分由高到低排出名次表; (5)按每个学生的总分由低到高排出名次表; (6)按学号由小到大排出成绩表; (7)按姓名的字典顺序排出成绩表; (8)按学号查询学生排名及其考试成绩; (9)按姓名查询学生排名及其考试成绩; (10)按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比; (11)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分; (12)设置公共课程
(13)保存相关信息到文件
(14)学生管理,学生可以查看自己的排名
视频演示:
如下是一些效果图:
主要代码如下:
class student_Node //学生的信息类,存储学生的信息,并修改信息
{
private:
string Name; //姓名
long Number; //学号
string Sex; //性别
string Academy; //学院
string Class; //班级
Lesson Less; //课程
student_Node *next;
public:
student_Node(string na="空",long num=0,string sex="男",string aca="空",string cla="空") //对成绩和姓名所以成员都进行初始化??需要优化?
:Less(L)
{
SetName(na);
SetNumber(num);
SetSex(sex);
SetAcademy(aca);
SetClass(cla);
next=NULL;
}
~student_Node() //析构
{
Name="";Number=0;Sex="";Academy="";Class="";next=NULL;
}
student_Node& operator =(const student_Node&rhs)
{
Name=rhs.Name;
Number=rhs.Number;
Sex=rhs.Sex;
Academy=rhs.Academy;
Class=rhs.Class;
Less=rhs.Less;//这里又调用课程类的赋值函数
return *this;
}
void SetName(string name) //设置名字
{
Name=name;
}
void SetNumber(long num ) //设置学号
{
Number=num;
}
void SetSex(string sex) //设置性别
{
Sex=sex;
}
void SetAcademy(string acad) //设置学院
{
Academy=acad;
}
void SetClass(string cla ) //设置班级
{
Class=cla;
}
void SetLesson() //单人课程设置
{
Less.SetPersonLesson();
}
friend istream& operator>>(istream&is,student_Node &rhs)//输入数据
{
string tmp;
long num;
cout<<"请输入姓名:"; //输入名字,到临时变量中,然后通过设置函数设置好成员中的名字,下面的都相同
is>>tmp;
rhs.SetName(tmp);
cout<<"请输入学号:";
is>>tmp;
num=atol(tmp.c_str()); //字符型转化为长整形(解决了输入字符时会出现的bug)
rhs.SetNumber(num);
cout<<"请输入性别:";
is>>tmp;
rhs.SetSex(tmp);
cout<<"请输入学院:";
is>>tmp;
rhs.SetAcademy(tmp);
cout<<"请输入班级:";
is>>tmp;
rhs.SetClass(tmp);
is>>rhs.Less; //输入课程
return is;
}
friend ostream& operator<<(ostream&os,student_Node &rhs)//输出数据
{
cout<<left<<setw(8)<<rhs.Name<<left<<setw(15)<<rhs.Number<<left<<setw(8)<<rhs.Sex<<left<<setw(10)<<rhs.Academy<<left<<setw(10)<<rhs.Class<<left<<setw(8)<<rhs.Less.ReturnMount_s()<<left<<setw(8)<<rhs.Less.ReturnAverg_s()<<endl;
cout<<rhs.Less<<endl; //输出课程
return os;
}
friend class student_List; //友元类设置
};
class student_List //学生的信息链表类,主要进行链表的操作,查找输出
{
private:
student_Node *head;
public:
student_List() //学生链表的初始化,建立头结点,并从文件中读取信息建立链表
{
head=new student_Node;
head->next=NULL;
ifstream ifs(filename);
if(!ifs) //如果文件不存在
{
Filewrite(); //建立文件
}
}
~student_List()
{
student_Node *p=head->next,*q;
while(p!=NULL)
{
q=p;
p=p->next;
delete q;
}
delete head;
}
void Fileread() //读取文件中的信息建立链表
{
ifstream ifs(filename);
if(!ifs)
{
cout<<"文件打开失败"<<endl;
exit(0);
}
student_Node *q=head;
while(ifs.peek()!=EOF) //判断是否读取到文件末尾了 采用这个peek函数而不采用ifs.eof()是防止文件为空时还进入循环
{
student_Node *p=new student_Node;
ifs>>p->Name
>>ws
>>p->Number
>>ws
>>p->Sex
>>ws
>>p->Academy
>>ws
>>p->Class
>>ws;
ifs>>p->Less.n>>ws;
for(int i=0;i<p->Less.n;i++)
ifs>>p->Less.lesson[i].L_name>>ws>>p->Less.lesson[i].grade>>ws;
p->Less.SetA_M();
q->next=p;
p->next=NULL;
q=p;
}
}
void Filewrite() //通过文件的读写将链表中的内容写到文件中
{
student_Node *p=head->next;
ofstream ofs(filename);
if(!ofs)
{
cout<<"文件打开失败"<<endl;
exit(0);
}
while(p!=NULL)
{
ofs<<p->Name<<'\t'
<<p->Number<<'\t'<<p->Sex<<'\t'<<p->Academy<<'\t'<<p->Class
<<endl;
ofs<<p->Less.n;
for(int i=0;i<p->Less.n;i++)
ofs<<'\t'<<p->Less.lesson[i].L_name<<'\t'<<p->Less.lesson[i].grade;
ofs<<endl;
p=p->next;
}
ofs.close();
}
/********************************** 操作部分 ***********************************/
void Putin(int n=1) //输入,参数的含义是区别与是操作1的输入还好插入函数....默认是输入函数
{
char x='0';
int i=1; //计数
int num_0,num_1;//插入位置
student_Node *q;
if(n==1) //这是操作输入数据是需要的,如果插入数据则不需要
{
cout<<"是否清空原来数据 0.是的 1.不,添加进去 3.返回 ";
cin>>x;
if(x=='1')//添加进去
{
Fileread(); //读取文件形成链表
Putin(0); //参数的改变,就是插入函数的调用
return ;
}
}
if(x=='0')
{
while(x=='0')
{
cout<<i++<<endl;
student_Node *p=new student_Node;
cin>>*p;
if(n!=3)//节点的插法
{
p->next=head->next;
head->next=p;
}
else//节点的任意位置插入
{
Display(2);
cout<<"----------------------------------------------------------------"<<endl;
cout<<"请选择插入位置:";
cin>>x;
num_0=x-'0';
q=head;
num_1=0;//寻找位置
while (q->next!=NULL)
{
num_1++;
if(num_0==num_1)
break;
q=q->next;
}
p->next=q->next;
q->next=p;
Display(2);
}
cout<<"请问是要继续么?(0.是 1.不是) ";
cin>>x;
cout<<"----------------------------------------------------------------"<<endl;
}
Filewrite();
}
}
void Display(int x=1) //显示输出cout<<left<<setw(40)<<"靠左输出"<<left<<setw(35)<<"靠左输出"<<endl;
{
if(x==1)
Fileread();
cout<<left<<setw(5)<<"·序号·"<<left<<setw(8)<<" ·姓名·"<<left<<setw(15)<<" ·学号·"<<left<<setw(8)<<"·性别·"<<left<<setw(10)<<"·学院·"<<left<<setw(10)<<"·班级·"<<left<<setw(8)<<"|总分|"<<left<<setw(8)<<"|平均分|"<<endl<<endl;
student_Node *p=head->next;
int i=1;
while(p!=NULL)
{
cout<<left<<setw(3)<<" "<<left<<setw(3)<<i++<<" "<<*p;
p=p->next;
}
cin.get();
cin.get();
}
void Insert() //插入(添加)
{
Fileread(); //读取文件形成链表
Putin(3); //参数的改变,就是插入函数的调用
}
void Delete() //删除
{
Find(2);
Filewrite(); //写入文件
}
void Find(int i=1) //查找
{
Fileread();//读取文件形成链表
char x='0';
while(x=='0')
{
cout<<"选择查找方式:1.姓名 2.学号 3.学院 0.返回";
cin>>x;
switch(x)
{
case '1':
Find_01name(i);
break;
case '2':
Find_02number(i);
break;
case '3':
Find_03academy(i);
break;
case '0':return;
default:
cout<<"选择错误!!!";
}
cout<<"是否继续查找 0.继续 1.不了 ";
cin>>x;
}
}
void Find_01name(int x=1) //查找名字 参数 1.查找 2.删除 3.修改
{
int i=0;
string na;
char x_0='1';
student_Node *p=head->next,*q=head;
cout<<"请输入要查找的姓名:";
cin>>na;
cout<<left<<setw(5)<<"·序号·"<<left<<setw(8)<<" ·姓名·"<<left<<setw(15)<<" ·学号·"<<left<<setw(8)<<"·性别·"<<left<<setw(10)<<"·学院·"<<left<<setw(10)<<"·班级·"<<left<<setw(8)<<"|总分|"<<left<<setw(8)<<"|平均分|"<<endl<<endl;
while(p!=NULL)
{
if(p->Name==na)
{
cout<<left<<setw(3)<<" "<<left<<setw(3)<<i++<<" "<<*p;
if(x==2)//删除数据
{
cout<<"是否删除这条数据 0.是 1.否";
cin>>x_0;
if(x_0=='0')
{
q->next=p->next;
delete p;
p=q;
}
}
if(x==3)//修改数据
{
cout<<"是否修该这条数据 0.是 1.否";
cin>>x_0;
if(x_0=='0')
{
Modify_small(p);
}
}
}
q=p;
p=p->next;
}cout<<"-------------------------------------------------------"<<endl;
if(i==0)
cout<<"你能认真点么,没有需要的数据"<<endl;
}
void Find_02number(int x=1)//学号查找
{
int i=0;
long num;
string tmp;
char x_0='1';
student_Node *p=head->next,*q=head;
cout<<"请输入要查找的学号:";
cin>>tmp;
num=atol(tmp.c_str());
cout<<left<<setw(5)<<"·序号·"<<left<<setw(8)<<" ·姓名·"<<left<<setw(15)<<" ·学号·"<<left<<setw(8)<<"·性别·"<<left<<setw(10)<<"·学院·"<<left<<setw(10)<<"·班级·"<<left<<setw(8)<<"|总分|"<<left<<setw(8)<<"|平均分|"<<endl<<endl;
while(p!=NULL)
{
if(p->Number==num)
{
cout<<left<<setw(3)<<" "<<left<<setw(3)<<i++<<" "<<*p;
if(x==2)//删除数据
{
cout<<"是否删除这条数据 0.是 1.否";
cin>>x_0;
if(x_0=='0')
{
q->next=p->next;
delete p;
p=q;
}
}
if(x==3)//修改数据
{
cout<<"是否修该这条数据 0.是 1.否";
cin>>x_0;
if(x_0=='0')
{
Modify_small(p);
}
}
}
q=p;
p=p->next;
}
cout<<"-------------------------------------------------------"<<endl;
if(i==0)
cout<<"你能认真点么,没有需要的数据"<<endl;
}
void Find_03academy(int x=1)//学院查找
{
int i=0;
string tmp;
char x_0='1';
student_Node *p=head->next,*q=head;
cout<<"请输入要查找的学院:";
cin>>tmp;
cout<<left<<setw(5)<<"·序号·"<<left<<setw(8)<<" ·姓名·"<<left<<setw(15)<<" ·学号·"<<left<<setw(8)<<"·性别·"<<left<<setw(10)<<"·学院·"<<left<<setw(10)<<"·班级·"<<left<<setw(8)<<"|总分|"<<left<<setw(8)<<"|平均分|"<<endl<<endl;
while(p!=NULL)
{
if(p->Academy==tmp)
{
cout<<left<<setw(3)<<" "<<left<<setw(3)<<++i<<" "<<*p;
if(x==2)
{
cout<<"是否删除这条数据 0.是 1.否";
cin>>x_0;
if(x_0=='0')
{
q->next=p->next;
delete p;
p=q;
}
}
if(x==3)//修改数据
{
cout<<"是否修该这条数据 0.是 1.否";
cin>>x_0;
if(x_0=='0')
{
Modify_small(p);
}
}
}
q=p;
p=p->next;
}
cout<<"-------------------------------------------------------"<<endl;
if(i==0)
cout<<"你能认真点么,没有需要的数据"<<endl;
}
void Modify() //修改 界面里加上一些划线增加美观度
{
Find(3);
Filewrite(); //写入文件
}
void Modify_small(student_Node *p)
{
char a='0';
string tmp;
long num;
while(a=='0')
{
cout<<"-------------------------------------------------------"<<endl;
cout<<"请选择修改选项 1.姓名 2.学号 3.性别 4.学院 5.班级 6.成绩";
cin>>a;
cout<<"-------------------------------------------------------"<<endl;
switch(a)
{
case '1':
cout<<"输入名字:";
cin>>tmp;
p->SetName(tmp);
break;
case '2':
cout<<"输入学号:";
cin>>tmp;
num=atol(tmp.c_str());
p->SetNumber(num);
break;
case '3':
cout<<"输入性别:";
cin>>tmp;
p->SetSex(tmp);
break;
case '4':
cout<<"输入学院:";
cin>>tmp;
p->SetAcademy(tmp);
break;
case '5':
cout<<"请输入班级:";
cin>>tmp;
p->SetClass(tmp);
break;
case '6':
p->SetLesson();//修改课程
break;
default:
cout<<"你可爱哦,输错啦,亲~"<<endl;
}
cout<<*p;
cout<<"-------------------------------------------------------"<<endl;//美化视觉效果
cout<<"是否继续修改其他选项 0.继续 1.不了";
cin>>a;
}
}
void Sort() //排序
{
Fileread();
char t='0';
while (t=='0')
{
cout<<"------------------------------------------------------------"<<endl;
cout<<"1.学号 2.单科成绩 3.总成绩 0.返回";
cin>>t;
switch (t)
{
case '1':
Sort_small(1);break;//学号排序
case '2':
Sort_small(2);break;//单科成绩排序
case '3':
Sort_small(3);break;//总成绩排序
default:
Filewrite();//
return ;
}
Display(0);
cout<<"是否继续排序 0.继续 1.不了,并保存结果";
cin>>t;
}
Filewrite(); //写入文件
}
void Sort_small(int i=1)//排序函数分支,根据参数的不同进行不同选项的排序1.默认学号 2.单科成绩 3.总成绩
{
char t;int x;
if(i==2)//单科成绩排序时输出
{
L.Dislesson();//显示公共课程
cin>>t;
x=t-'0';//课程的下标
if(x>L.n||x<0)
{
cout<<"选择错误"<<endl;
return ;
}
}
cout<<"1.递增 2.递减";
student_Node *p1,*p2;
student_Node tmp;
int flag=1;
cin>>t;
while(1)//冒泡排序
{
flag=1;
p1=head->next;p2=p1->next;
while(p2!=NULL)
{
switch (t)
{
case '1':
if(i==3)//总分排序
if(p1->Less.Mount_s>p2->Less.Mount_s)
{
tmp=*p1;
*p1=*p2;
*p2=tmp;
flag=0;
}
if(i==2)//成绩排序
if(p1->Less.lesson[x-1].grade>p2->Less.lesson[x-1].grade)
{
tmp=*p1;
*p1=*p2;
*p2=tmp;
flag=0;
}
if(i==1)//学号排序
if(p1->Number>p2->Number)
{
tmp=*p1;
*p1=*p2;
*p2=tmp;
flag=0;
};break;
case '2':
if(i==3)//总分排序
if(p1->Less.Mount_s<p2->Less.Mount_s)
{
tmp=*p1;
*p1=*p2;
*p2=tmp;
flag=0;
}
if(i==2)//成绩排序
if(p1->Less.lesson[x-1].grade<p2->Less.lesson[x-1].grade)
{
tmp=*p1;
*p1=*p2;
*p2=tmp;
flag=0;
}
if(i==1)//学号排序
if(p1->Number<p2->Number)
{
tmp=*p1;
*p1=*p2;
*p2=tmp;
flag=0;
};break;
default:
break;
}
p1=p1->next;
p2=p2->next;
}
if(flag==1)
break;
}
}
?如需全部代码,关注公众号(coding加油站)回复“C语言学生成绩管理系统”免费领取。
|