学生成绩管理系统功能的基本要求:
№1具备对成绩的管理功能(添加、删除、排序)。
№2具备对成绩的统计功能(及格率、优秀率等)。
№3具备对成具备按学号、姓名、或课程名查询成绩的功能。
# include <iostream>
# include <fstream>
# include <string.h>
#include<iomanip>
#include <conio.h>//用getch();
using namespace std;
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
class Student
{
public:
char name[20];
char Id[20];
char grade[20];
int Cnum; //C课程得分
int Mnum; //数学课程得分
int Enum; //英语课程得分
float sum; //总分
float average;
Student * Next;
void Input()
{
cout<<"\t\t请输入学生的姓名:"; cin>>name;
cout<<"\t\t请输入学生的学号:"; cin>>Id;
cout<<"\t\t请输入学生的班级:"; cin>>grade;
cout<<"\t\t请输入C课程的成绩:"; cin>>Cnum;
cout<<"\t\t请输入数学课程的成绩:"; cin>>Mnum;
cout<<"\t\t请输入英语课程的成绩:"; cin>>Enum;
sum=Cnum+Mnum+Enum;
average=sum/3.0;
}
void ReadFile(istream & in)
{
in>>name>>grade>>Id>>Cnum>>Mnum>>Enum>>sum>>average;
}
void Show()
{
cout<<"姓名:"<<name<<endl<<"学号:"<<Id<<endl<<"班级:"<<grade<<endl<<"C++:"<<Cnum<<endl
<<"数学:"<<Mnum<<endl<<"外语:"<<Enum<<endl<<"总成绩:"<<sum<<endl<<"平均分:"<<average<<endl;
}
};
class Studentmassage
{
public:
Studentmassage();
void ShowMenu();
void Find();
void ModifyItem();
void RemoveItem();
void Swap(Student *,Student *);
void Sort();
int ListCount();
void Display()
{
for(Student * p=Head->Next;p!=End;p=p->Next)
p->Show();
cout<<"输入任意字符!继续……";
getch();
}
void AddItem()
{
End->Input();
End->Next=new Student;
End=End->Next;
cout<<"添加成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
private:
Student * Head,* End;
ifstream in;
ofstream out;
Student *FindItem(char * name)
{
for(Student * p=Head;p->Next!=End;p=p->Next)
if(!strcmp(p->Next->name,name))return p;
return NULL;
}
Student *FindID(char * Id)
{
for(Student * p=Head;p->Next!=End;p=p->Next)
if(!strcmp(p->Next->Id,Id))return p;
return NULL;
}
};
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::Studentmassage()
{
Head=new Student;
Head->Next=new Student;
End=Head->Next;
in.open("sort.txt");
if(!in)
cout<<"这是一个新系统,无学生信息。请先输入。"<<endl;
else
{
while(!in.eof())
{
End->ReadFile(in);
if(End->name[0]=='\0')break;
End->Next=new Student;
End=End->Next;
}
in.close();
cout<<"\t\t读取学生信息成功!"<<endl;
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ShowMenu()
{
cout<<"〓〓〓〓〓〓〓〓〓〓 ☆ 学 生 成 绩 管 理 系 统 ☆ 〓〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓★★★★★ ★★★★★★★ ★★★★★〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 1.增加学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 2.显示学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 3.排序统计成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 4.查找学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 5.删除学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 6.修改学生信息 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 0.安全退出系统 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"\n\t\t\n\t\t请选择:";
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Find()
{
char name[20] ,Id[10];
int x;
int z;
Student * p=NULL;
cout<<"\n\t\t*********************************\n";
cout<<"\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找\n\t\t※ 3.查找学生课程成绩";
cout<<"\n\t\t*********************************\n请选择:";
cin>>x;
switch(x)
{
case 1:
{
cout<<"\t\t请输入要查找的学生的姓名:";
cin>>name;
if(p=FindItem(name))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该姓名的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
case 2:
{
cout<<"\t\t请输入要查找的学生的学号:";cin>>Id;
if(p=FindID(Id))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到该学号的学生!"<<'\n'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
case 3:
{
p=Head->Next;
cout<<"\t\t请选择你要查找的课程名称:";
cout<<"\n\t\t*********************************\n";
cout<<"\t\t※ 1.C++\n\t\t※ 2.数学\n\t\t※ 3.英语";
cout<<"\n\t\t*********************************\n请选择:";
cin>>z;
switch(z)
{
case 1:
cout<<"C++成绩为:"<<endl;
while(p!=End)
{
cout<<p->Cnum<<endl;
p=p->Next;
}
cout<<"输入任意字符!继续……";
getch();
break;
case 2:
cout<<"数学成绩为:"<<endl;
while(p!=End)
{
cout<<p->Mnum<<endl;
p=p->Next;
}
cout<<"输入任意字符!继续……";
getch();
break;
case 3:
cout<<"英语成绩为:"<<endl;
while(p!=End)
{
cout<<p->Enum<<endl;
p=p->Next;
}
cout<<"输入任意字符!继续……";
getch();
break;
}
}
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ModifyItem()
{
char name[20];
char Id[20];
int y;
Student *p=NULL;
cout<<"\n\t\t*********************************\n";
cout<<"\t\t※ 1.按学生的姓名修改\n\t\t※ 2.按学生学号修改";
cout<<"\n\t\t*********************************\n请选择:";
cin>>y;
switch(y)
{
case 1:
{
cout<<" 请输入您要修改的学生的姓名:";
cin>>name;
if(p=FindItem(name))
{
cout <<"\t<<已找到学生的信息,请输入新的信息!"<<endl;
p->Next->Input();
cout<<"修改成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}break;
}
case 2:
{
cout<<" 请输入您要修改的学生的学号:";
cin>>Id;
if(p=FindID(Id))
{
cout <<"\t<<已找到学生的信息,请输入新的信息!"<<endl;
p->Next->Input();
cout<<"修改成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::RemoveItem() // 删除信息
{
char name[20];
char Id[20];
int a;
Student * p=NULL,*temp=NULL;
cout<<"\n\t\t*********************************\n";
cout<<"\t\t※ 1.按学生的姓名删除\n\t\t※ 2.按学生学号删除";
cout<<"\n\t\t*********************************\n请选择:";
cin>>a;
switch(a)
{
case 1:
cout<<"\t\t请输入要删除的学生的姓名:"<<endl;cin>>name;
if(p=FindItem(name))
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
cout<<"\t\t删除成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}break;
case 2:
cout<<"\t\t请输入要删除的学生的学号:"<<endl;cin>>Id;
if(p=FindID(Id))
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
cout<<"\t\t删除成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"\t\t没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}break;
}
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Swap(Student *p1, Student *p2)//交换两个combox变量的数据域
{
Student *temp=new Student;
strcpy(temp->name,p1->name);
strcpy(temp->Id,p1->Id);
temp->Cnum=p1->Cnum;
temp->Mnum=p1->Mnum;
temp->Enum=p1->Enum;
temp->sum=p1->sum;
strcpy(p1->name,p2->name);
strcpy(p1->Id,p2->Id);
p1->Cnum=p2->Cnum;
p1->Mnum=p2->Mnum;
p1->Enum=p2->Enum;
p1->sum=p2->sum;
strcpy(p2->name,temp->name);
strcpy(p2->Id,temp->Id);
p2->Cnum=temp->Cnum;
p2->Mnum=temp->Mnum;
p2->Enum=temp->Enum;
p2->sum=temp->sum;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int Studentmassage::ListCount()//统计当前链表的记录总数,返回一个整数
{
if(! Head)
return 0;
int n=0;
for(Student * p=Head->Next;p!=End;p=p->Next)
{
n++;
}
return n;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌统计成绩﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Sort()//对当前链表进行排序
{int Ca=0;int Ma=0; int Ea=0;double m1=0; double j1;
double m2=0; double j2;double m3=0; double j3;
double e1=0; double h1;
double e2=0; double h2;double e3=0; double h3;
cout <<"Sorting..."<<endl;
Student *p=NULL,*p1=NULL,*k=NULL;
int n=Studentmassage::ListCount();
if(n<2)
return;
for(p=Head->Next;p!=End;p=p->Next)
for(k=p->Next;k!=End;k=k->Next)
{
if(p->sum>k->sum)
{
Studentmassage::Swap(p,k);
}
}
cout <<"排序完成!"<<endl;
p=Head->Next;
for(p=Head->Next;p!=End;p=p->Next)
{
Ca=Ca+p->Cnum;
Ma=Ma+p->Mnum;
Ea=Ea+p->Enum;
}
cout<<" C++平均分 "<<" 数学平均分 "<<" 英语平均分"<<endl<<endl;
cout<<" "<<Ca/n<<" "<<Ma/n<<" "<<Ea/n<<endl<<endl;
for(p=Head->Next;p!=End;p=p->Next)
{if(p->Cnum>=60)
m1++;
if(p->Mnum>=60)
m2++;
if(p->Enum>=60)
m3++;
}
j1=m1/n;
j2=m2/n;
j3=m3/n;
cout<<" C++及格率为: "<<setiosflags(ios::fixed)<<setprecision(2)<<j1*100<<" % "<<endl;
cout<<" 数学及格率为: "<<setiosflags(ios::fixed)<<setprecision(2)<<j2*100<<" % "<<endl;
cout<<" 英语及格率为: "<<setiosflags(ios::fixed)<<setprecision(2)<<j3*100<<" % "<<endl;
for(p=Head->Next;p!=End;p=p->Next)
{if(p->Cnum>=90)
e1++;
if(p->Mnum>=90)
e2++;
if(p->Enum>=90)
e3++;
}
h1=e1/n;
h2=e2/n;
h3=e3/n;
cout<<" C++优秀率为: "<<setiosflags(ios::fixed)<<setprecision(2)<<h1*100<<" % "<<endl;
cout<<" 数学优秀率为: "<<setiosflags(ios::fixed)<<setprecision(2)<<h2*100<<" % "<<endl;
cout<<" 英语优秀率为: "<<setiosflags(ios::fixed)<<setprecision(2)<<h3*100<<" % "<<endl;
getch();
return;
}
//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int main()
{
int x,i=0;
float quit=false;
Studentmassage Grade;
cout<<"按任意键开始……";
getch();
while(!quit)
{
system("cls");
Grade.ShowMenu();
cin>>x;
switch(x)
{
case 0:quit=true;break;
case 1:Grade.AddItem();break;
case 2:Grade.Display();break;
case 3:Grade.Sort();break;
case 4:Grade.Find();break;
case 5:Grade.RemoveItem();break;
case 6:Grade.ModifyItem();break;
}
}
return 0;
}