#include<iomanip>
#include<fstream>
#include<string>
using namespace std;
#define max 100;
class student
{
public:
student *next;
public:
string name;//姓名
long num;//學號
int x,y,z;//數學,語文,英語
int AA;//總分
void play(){cout<<name<<"學生的學號是"<<num<<",數學:"<<x<<",語文:"<<y<<",英語:"<<z<<",總分:"<<AA<<endl;};
student(string sname,long snum,int sx,int sy,int sz)
{
name=sname;
num=snum;
x=sx;
y=sy;
z=sz;
}
};
class cla
{
public:
cla()//構造函數
{
stu=0;
sload();
}
~cla()//析構函數
{
student *p;
p=stu;
while(p)
{
p=p->next;
delete stu;
stu=p;
}
stu=0;
}
void sadd(); //添加
void sremove(); //刪除
void samend(); //修改
void ssearch(); //查詢
void staxis(); //排序
void ssave(); //保存
void sload(); //讀取
//排序函數
void pxh();
void psx();
void pyw();
void pyy();
void pAA();
private:
student *stu; //頭接點
};
void cla::sadd()//添加
{
student *q;
string name1;
long num1;
int x1,y1,z1;
system("cls");
cout<<"\n **增加的學生** \n"<<endl;
cout<<"請輸入學生的(中間用空格間隔) "<<endl;
cout<<"姓名 學號 數學成績 語文成績 英語成績:"<<endl;
cin>>name1>>num1>>x1>>y1>>z1;
q=new student(name1,num1,x1,y1,z1);
q->next=0;
q->AA=x1+y1+z1;
if(stu)
{
student *t;
t=stu;
if(t->num==num1)
{
cout<<"學號已存在,請重新輸入"<<endl;
return;
}
while(t->next)
{
if(t->num==num1)
{
cout<<"學號已存在,請重新輸入"<<endl;
return;
}
t=t->next;
}
t->next=q;
}
else
{
stu=q;
}
cout<<"輸入完畢"<<endl;
}
void cla::sremove()//刪除
{
system("cls");
int num1;
cout<<"\n** 刪除學生信息 **\n";
cout<<"請輸入想要刪除學生的學號:";
cin>>num1;
//查找要刪除的結點
student *p1,*p2;
p1=stu;
while(p1)
{
if(p1->num==num1)
break;
else
{
p2=p1;
p1=p1->next;
}
}
//刪除結點
if(p1!=NULL)//若找到結點,則刪除
{
p1->play();
cout<<"確定刪除嗎?[Y/N]"<<endl;
char c;cin>>c;
if(toupper(c)!='Y') return;
if(p1==stu) //若要刪除的結點是第壹個結點
{
stu=p1->next;
delete p1;
}
else //若要刪除的結點是後續結點
{
p2->next=p1->next;
delete p1;
}
cout<<"找到學號為"<<num1<<"的學生,並刪除\n";
}
else //未找到結點
cout<<"未找到想要刪除的學生!\n";
}
void cla::samend()//修改
{
system("cls");
long num1;
cout<<"\n** 修改學生信息 **\n";
cout<<"輸入要修改學生的學號";
cin>>num1;
//查找要修改的結點
student *p1,*p2;
p1=stu;
while(p1)
{
if(p1->num==num1)
break;
else
{
p2=p1;
p1=p1->next;
}
}
if(p1!=NULL)
{
cout<<"學號是"<<num1<<"的學生的信息"<<endl;
cout<<"姓名 "<<p1->name<<"數學"<<p1->x<<"語文"<<p1->y<<"英語"<<p1->z<<endl;
cout<<"請輸入修改後的信息:姓名 數學成績 語文成績 英語成績"<<endl;
cin>>p1->name>>p1->x>>p1->y>>p1->z;
p1->AA=p1->x+p1->y+p1->z;
cout<<"修改成功"<<endl;
}
else //未找到接點
cout<<"未找到!\n";
}
void cla::ssearch()//查詢
{
system("cls");
cout<<"\n** 查詢學生信息 **\n"<<endl;
cout<<"請輸入查詢方式:"<<endl;
cout<<"1.按學號查詢"<<endl;
cout<<"2.按姓名查詢"<<endl;
cout<<"3.返回"<<endl;
char c; cin>>c;
switch (c)
{
case '1':
{
long num1;
cout<<"要查詢的學號"<<endl;
cin>>num1;
//查找要查詢的結點
student *p1,*p2;
p1=stu;
while(p1)
{
if(p1->num==num1)
break;
else
{
p2=p1;
p1=p1->next;
}
}
if(p1!=NULL)
{
cout<<"學號是"<<num1<<"的學生的信息"<<endl;
cout<<"姓名:"<<p1->name<<" 數學:"<<p1->x<<" 語文:"<<p1->y<<" 英語:"<<p1->z<<endl;
cout<<"查詢完畢...";
}
else //未找到接點
cout<<"未找到!\n";
break;
}
case '2':
{
string name1;
cout<<"要查詢的學生姓名"<<endl;
cin>>name1;
//查找要查詢的結點
student *p1,*p2;
p1=stu;
while(p1)
{
if(p1->name==name1)
break;
else
{
p2=p1;
p1=p1->next;
}
}
if(p1!=NULL)
{
cout<<name1<<"的學生的信息"<<endl;
cout<<"學號:"<<p1->num<<" 數學:"<<p1->x<<" 語文:"<<p1->y<<" 英語:"<<p1->z<<endl;
cout<<"查詢完畢...";
}
else //未找到接點
cout<<"未找到!\n";
break;
}
case '3': return;
}
}
void cla::pxh() //按學號排序
{
student *p1,*p2;
int n;
p1=stu;
n=1;
while(p1->next)
{ n++; p1=p1->next; }
cout<<"***有"<<n<<"條信息..."<<endl;
int i;
p1=stu;
for(i=1;i<n;i++)
{
p1=stu;
if (p1->num>p1->next->num) // 如果頭結點大於第二個的
{
p2=p1->next;
p1->next=p1->next->next;
p2->next=p1; //頭結點交換
stu=p2;
}
p1=stu;
while(p1->next->next) //中間的交換
{
p2=p1;
p1=p1->next;
if(p1->num>p1->next->num)
{
p2->next=p1->next;
p1->next=p1->next->next;
p2->next->next=p1;
p1=p2->next; //交換
}
}
}
p1=stu;
do
{
p1->play();
p1=p1->next;
}while(p1);
}
void cla::psx()//按數學成績排序
{
student *p1,*p2;
int n;
p1=stu;
n=1;
while(p1->next)
{ n++; p1=p1->next; }
cout<<"***有"<<n<<"條信息..."<<endl;
int i;
p1=stu;
for(i=1;i<n;i++)
{ p1=stu;
if (p1->x>p1->next->x) // 如果頭結點大於第二個的
{ p2=p1->next;
p1->next=p1->next->next;
p2->next=p1; //頭結點交換
stu=p2;
}
p1=stu;
while(p1->next->next) //中間的交換
{ p2=p1;
p1=p1->next;
if(p1->x>p1->next->x)
{
p2->next=p1->next;
p1->next=p1->next->next;
p2->next->next=p1;
p1=p2->next; //交換
}
}
}
p1=stu;
do
{ p1->play();
p1=p1->next;
}while(p1);
}
void cla::pyw()//按語文成績排序
{
student *p1,*p2;
int n;
p1=stu;
n=1;
while(p1->next)
{ n++; p1=p1->next; }
cout<<"***有"<<n<<"條信息..."<<endl;
int i;
p1=stu;
for(i=1;i<n;i++)
{ p1=stu;
if (p1->y>p1->next->y) // 如果頭結點大於第二個的
{ p2=p1->next;
p1->next=p1->next->next;
p2->next=p1; //頭結點交換
stu=p2;
}
p1=stu;
while(p1->next->next) //中間的交換
{ p2=p1;
p1=p1->next;
if(p1->y>p1->next->y)
{
p2->next=p1->next;
p1->next=p1->next->next;
p2->next->next=p1;
p1=p2->next; //交換
}
}
}
p1=stu;
do
{ p1->play();
p1=p1->next;
}while(p1);
}
void cla::pyy()//按英語成績排序
{
student *p1,*p2;
int n;
p1=stu;
n=1;
while(p1->next)
{ n++; p1=p1->next; }
cout<<"***有"<<n<<"條信息..."<<endl;
int i;
p1=stu;
for(i=1;i<n;i++)
{ p1=stu;
if (p1->z>p1->next->z) // 如果頭結點大於第二個的
{ p2=p1->next;
p1->next=p1->next->next;
p2->next=p1; //頭結點交換
stu=p2;
}
p1=stu;
while(p1->next->next) //中間的交換
{ p2=p1;
p1=p1->next;
if(p1->z>p1->next->z)
{
p2->next=p1->next;
p1->next=p1->next->next;
p2->next->next=p1;
p1=p2->next; //交換
}
}
}
p1=stu;
do
{ p1->play();
p1=p1->next;
}while(p1);
}
void cla::pAA()//按總分排序
{
student *p1,*p2;
int n;
p1=stu;
n=1;
while(p1->next)
{ n++; p1=p1->next; }
cout<<"***有"<<n<<"條信息..."<<endl;
int i;
p1=stu;
for(i=1;i<n;i++)
{ p1=stu;
if (p1->AA>p1->next->AA) // 如果頭結點大於第二個的
{ p2=p1->next;
p1->next=p1->next->next;
p2->next=p1; //頭結點交換
stu=p2;
}
p1=stu;
while(p1->next->next) //中間的交換
{ p2=p1;
p1=p1->next;
if(p1->AA>p1->next->AA)
{
p2->next=p1->next;
p1->next=p1->next->next;
p2->next->next=p1;
p1=p2->next; //交換
}
}
}
p1=stu;
do
{ p1->play();
p1=p1->next;
}while(p1);
}
void cla::staxis()//排序
{
system("cls");
char c;
cout<<"請選擇以何種方式排序:"<<endl;
cout<<"1……以學號排序"<<endl;
cout<<"2……以數學成績排序"<<endl;
cout<<"3……以語文成績排序"<<endl;
cout<<"4……以英語成績排序"<<endl;
cout<<"5……以總分排序"<<endl;
cout<<"6……返回"<<endl;
cout<<"請選擇(1-6)"<<endl;
cin>>c;
switch (c)
{
case '1':pxh(); break;
case '2':psx(); break;
case '3':pyw(); break;
case '4':pyy(); break;
case '5':pAA(); break;
case '6':return;
}
}
void cla::ssave() //保存到文件
{
system("cls");
char c;
cout<<"\n保存學生信息(將覆蓋原文件),是否繼續?[Y/N]:"; cin>>c;
if(toupper(c)!='Y') return;
ofstream tfile("date.txt",ios_base::binary);
student *p=stu;
while(p)// 寫入文件
{
tfile<<p->name<<"\t"<<p->num<<"\t"<<p->x<<"\t"<<p->y<<"\t"<<p->z;
tfile<<endl;
p=p->next;
}
tfile.close();
cout<<"保存完畢..."<<endl;
}
void cla::sload() //讀取
{
student *p;
p=stu;
while(p)
{
stu=p->next;
delete p;
p=stu;
}
ifstream tfile("date.txt",ios_base::binary);
string name1;
long num1;
int x1,y1,z1;
tfile>>name1>>num1>>x1>>y1>>z1;
while(tfile.good())
{
//創建學生接點
student *s;
s=stu;
s=new student(name1,num1,x1,y1,z1);
s->next=0;
s->AA=x1+y1+z1;
if(stu) //若已經存在結點
{
student *p2;
p2=stu;
while(p2->next) //查找尾結點
{
p2=p2->next;
}
p2->next=s; //連接
}
else //若不存在結點(表空)
{
stu=s; //連接
}
tfile>>name1>>num1>>x1>>y1>>z1;
}
tfile.close();
cout<<"\n學生信息已經裝入...\n";
}
void main()
{
char c;
cla a;
do
{
cout<<"\n 學 生 成 績 管 理 系 統 \n";
cout<<"**************************************\n";
cout<<" 作者:軟件工程06110119:zgjxwl \n";
cout<<" 1……增加學生 \n";
cout<<" 2……刪除學生 \n";
cout<<" 3……修改學生 \n";
cout<<" 4……查詢學生信息 \n";
cout<<" 5……排序 \n";
cout<<" 6……保存信息 \n";
cout<<" 7……讀取信息 \n";
cout<<" 8……退出 \n";
cout<<"**************************************\n";
cout<<"請選擇(1-8):";
cin>>c;
switch(c)
{
case '1': a.sadd();break;
case '2': a.sremove();break;
case '3': a.samend();break;
case '4': a.ssearch();break;
case '5': a.staxis();break;
case '6': a.ssave();break;
case '7': a.sload();break;
}
}while(c!='8');
}