#include<iostream>
#include<iomanip> //格式控制
#include<fstream> //文件流
#include<string> //字符串系统函数
using namespace std;
//学生结构体
struct student
{
public:
student *next;
string name;
int num;
int Soft,Cisco,VC; //Soft,Cisco,VC的成绩
int SUM; //总分
student(string sname,int snum,int sSoft,int sCisco,int sVC) //构造函数
{
name=sname;
num=snum;
Soft=sSoft;
Cisco=sCisco;
VC=sVC;
}
};
//实现方法类
class SStu
{
private:
student *first; //头接点
public:
SStu() //构造函数
{
first=0;
}
~SStu() //析构函数
{
student *p;
p=first;
while(p)
{
p=p->next;
delete first;
first=p;
}
first=0;
}
void input(); //添加
void dele(); //删除
void update(); //修改
void display(); //输出
void search1(); //按NUM查询
void search2(); //按NAME查询
void order(); //排序
void save(); //保存
void order1(); //按NUM排序
void order2(); //按SOFT成绩排序
void order3(); //按CISCO成绩排序
void order4(); //按VC成绩排序
void order5(); //按SUM排序
};
//----添加----
void SStu::input()
{
student *q;
string name1;
int num1;
int Soft1,Cisco1,VC1;
cout<<"输入学生信息,以空格间隔 "<<endl;
cout<<"Num Name Soft Cisco VC "<<endl;
cin>>num1>>name1>>Soft1>>Cisco1>>VC1;
q=new student(name1,num1,Soft1,Cisco1,VC1); //创建1个新学生结点,然后查找学生链表表尾结点,链接学生结点,输入学生信息
q->next=NULL;
q->SUM=Soft1+Cisco1+VC1;
if(first) // 链表非空
{
student *t;
t=first;
while(t->next!=NULL) //查找到结尾
{
t=t->next;
}
t->next=q;
}
else //链表为空
{
first=q;
}
}
//----修改----
void SStu::update()
{
int num1;
cout<<"输入要修改学生的Num: ";
cin>>num1;
student *p1,*p2;
p1=first;
while(p1) //查找需要修改的学生学号
{
if(p1->num==num1) //修改第一个
break;
else
{
p2=p1;
p1=p1->next;
}
}
//修改学生信息
if(p1)
{
cout<<"请输入修改后的信息: "<<endl;
cout<<"Name Soft Cisco VC"<<endl;
cin>>p1->name>>p1->Soft>>p1->Cisco>>p1->VC;
p1->SUM=p1->Soft+p1->Cisco+p1->VC;
cout<<"修改成功!"<<endl;
}
else
cout<<"未找到!"<<endl;
}
//----输出----
void SStu::display()
{
student *p1;
p1=first;
cout<<"全部学生成绩信息如下: "<<endl;
cout<<"Num Name Cisco Soft Vc Sum /n";
cout<<"____________________________________/n";
while(p1)
{
cout<<setiosflags(ios_base::left)<<setw(7)<<p1->num
<<setiosflags(ios_base::left)<<setw(7)<<p1->name
<<setiosflags(ios_base::left)<<setw(7)<<p1->Soft
<<setiosflags(ios_base::left)<<setw(7)<<p1->Cisco
<<setiosflags(ios_base::left)<<setw(7)<<p1->VC
<<setiosflags(ios_base::left)<<setw(7)<<p1->SUM
<<endl;
p1=p1->next;
}
cout<<"/n";
}
//----删除----
void SStu::dele()
{
int num1;
cout<<"请输入想要删除学生的Num: ";
cin>>num1;
student *p1,*p2;
p1=first;
while(p1) //查找要删除的结点
{
if(p1->num==num1)
break;
else
{
p2=p1;
p1=p1->next;
}
}
//删除过程
if(p1)
{
if(p1==first) //若要删除的是第一个(头)结点
{
first=p1->next;
delete p1;
}
else //若要删除的是后续结点
{ p1=p2->next ;
p2->next=p1->next;
delete p1;
}
cout<<"成功删除!"<<endl;
}
else
cout<<"未找到想要删除的学生!/n";
}
//按Num查找
void SStu::search1()
{
int num1;
cout<<"输入要查询的Num: "<<endl;
cin>>num1;
student *p1,*p2;
p1=first;
while(p1)
{
if(p1->num==num1) //判断
break;
else
{
p2=p1;
p1=p1->next;
}
}
if(p1!=NULL)
{
cout<<"查到的学生信息如下"<<endl;
cout<<"Num Name Cisco Soft Vc Sum /n";
cout<<"____________________________________/n";
cout<<setiosflags(ios_base::left)<<setw(7)<<p1->num
<<setiosflags(ios_base::left)<<setw(7)<<p1->name
<<setiosflags(ios_base::left)<<setw(7)<<p1->Soft
<<setiosflags(ios_base::left)<<setw(7)<<p1->Cisco
<<setiosflags(ios_base::left)<<setw(7)<<p1->VC
<<setiosflags(ios_base::left)<<setw(7)<<p1->SUM
<<endl;
}
else
cout<<"未找到!/n";
}
//按Name查找
void SStu::search2()
{
string name1;
cout<<"要查询的学生Name"<<endl;
cin>>name1;
student *p1,*p2;
p1=first;
while(p1!=NULL) //查找过程
{
if(p1->name==name1)
break;
else
{
p2=p1;
p1=p1->next;
}
}
if(p1!=NULL)
{
cout<<"查到的学生信息如下"<<endl;
cout<<"Num Name Cisco Soft Vc Sum /n";
cout<<"____________________________________/n";
cout<<setiosflags(ios_base::left)<<setw(7)<<p1->num
<<setiosflags(ios_base::left)<<setw(7)<<p1->name
<<setiosflags(ios_base::left)<<setw(7)<<p1->Soft
<<setiosflags(ios_base::left)<<setw(7)<<p1->Cisco
<<setiosflags(ios_base::left)<<setw(7)<<p1->VC
<<setiosflags(ios_base::left)<<setw(7)<<p1->SUM
<<endl;
}
else
cout<<"未找到!/n";
}
//按Num排序
void SStu::order1()
{
student *p1,*p2;
int n=1;
p1=first;
while(p1->next!=NULL)
{
n++; //求出结点总个数
p1=p1->next;
}
for(int i=1;i<n;i++)
{
p1=first;
if (p1->num>p1->next->num) // 如果头结点大于第二个的num
{
p2=p1->next; //把p2作p1的后续
//交换过程
p1->next=p1->next->next; //p1指向下下一个结个点,取代p2指向的结点
p2->next=p1; //p2的next指向p1
first=p2; //p2代替p1成为头结点,交换完成
}
}
p1=first;
cout<<"按Num排序(升序)如下:"<<endl;
cout<<"Num Name Soft Cisco VC Sum /n";
cout<<"____________________________________/n";
do
{
cout<<setiosflags(ios_base::left)<<setw(7)<<p1->num
<<setiosflags(ios_base::left)<<setw(7)<<p1->name
<<setiosflags(ios_base::left)<<setw(7)<<p1->Soft
<<setiosflags(ios_base::left)<<setw(7)<<p1->Cisco
<<setiosflags(ios_base::left)<<setw(7)<<p1->VC
<<setiosflags(ios_base::left)<<setw(7)<<p1->SUM
<<endl;
p1=p1->next;
}while(p1!=NULL);
}
//按Soft成绩排序
void SStu::order2()
{
student *p1,*p2;
int n=1;
p1=first;
while(p1->next)
{
n++;
p1=p1->next;
}
int i;
p1=first;
for(i=1;i<n;i++)
{
p1=first;
if (p1->Soft<p1->next->Soft) // 如果头结点小于第二个的值,(降序排序)
{
p2=p1->next; //把p2作p1的后续
//交换过程
p1->next=p1->next->next; //p1指向下下一个结个点,取代p2指向的结点
p2->next=p1; //p2的next指向p1
first=p2; //p2代替p1成为头结点,交换完成
}
}
p1=first;
cout<<"按Soft排序(降序)如下:"<<endl;
cout<<"Num Name Soft Cisco VC Sum /n";
cout<<"____________________________________/n";
do
{
cout<<setiosflags(ios_base::left)<<setw(7)<<p1->num
<<setiosflags(ios_base::left)<<setw(7)<<p1->name
<<setiosflags(ios_base::left)<<setw(7)<<p1->Soft
<<setiosflags(ios_base::left)<<setw(7)<<p1->Cisco
<<setiosflags(ios_base::left)<<setw(7)<<p1->VC
<<setiosflags(ios_base::left)<<setw(7)<<p1->SUM
<<endl;
p1=p1->next;
}while(p1!=NULL);
}
//按Cisco成绩降序排序
void SStu::order3()
{
student *p1,*p2;
int n;
p1=first;
n=1;
while(p1->next)
{
n++;
p1=p1->next;
}
int i;
p1=first;
for(i=1;i<n;i++)
{
p1=first;
if (p1->Cisco<p1->next->Cisco) // 如果头结点小于第二个Cisco
{
p2=p1->next; //把p2作p1的后续
//交换过程
p1->next=p1->next->next; //p1指向下下一个结个点,取代p2指向的结点
p2->next=p1; //p2的next指向p1
first=p2; //p2代替p1成为头结点,交换完成
}
}
p1=first;
cout<<"按Cisco排序(降序)如下:"<<endl;
cout<<"Num Name Soft Cisco VC Sum /n";
cout<<"____________________________________/n";
do
{
cout<<setiosflags(ios_base::left)<<setw(7)<<p1->num
<<setiosflags(ios_base::left)<<setw(7)<<p1->name
<<setiosflags(ios_base::left)<<setw(7)<<p1->Soft
<<setiosflags(ios_base::left)<<setw(7)<<p1->Cisco
<<setiosflags(ios_base::left)<<setw(7)<<p1->VC
<<setiosflags(ios_base::left)<<setw(7)<<p1->SUM
<<endl;
p1=p1->next;
}while(p1!=NULL);
}
//按VC成绩降序排序
void SStu::order4()
{
student *p1,*p2;
int n=1;
p1=first;
while(p1->next)
{
n++;
p1=p1->next;
}
int i;
p1=first;
for(i=1;i<n;i++)
{
p1=first;
if (p1->VC<p1->next->VC)
{
p2=p1->next; //把p2作p1的后续
//交换过程
p1->next=p1->next->next; //p1指向下下一个结个点,取代p2指向的结点
p2->next=p1; //p2的next指向p1
first=p2; //p2代替p1成为头结点,交换完成
}
}
p1=first;
cout<<"按VC成绩排序(降序)如下:"<<endl;
cout<<"Num Name Soft Cisco VC Sum /n";
cout<<"_____________________________________/n";
do
{
cout<<setiosflags(ios_base::left)<<setw(7)<<p1->num
<<setiosflags(ios_base::left)<<setw(7)<<p1->name
<<setiosflags(ios_base::left)<<setw(7)<<p1->Soft
<<setiosflags(ios_base::left)<<setw(7)<<p1->Cisco
<<setiosflags(ios_base::left)<<setw(7)<<p1->VC
<<setiosflags(ios_base::left)<<setw(7)<<p1->SUM
<<endl;
p1=p1->next;
}while(p1!=NULL);
}
//按SUM降序排序
void SStu::order5()
{
student *p1,*p2;
int n;
p1=first;
n=1;
while(p1->next)
{
n++;
p1=p1->next;
}
p1=first;
for( int i=1;i<n;i++)
{
p1=first;
if (p1->SUM<p1->next->SUM)
{
p2=p1->next; //把p2作p1的后续
//交换过程
p1->next=p1->next->next; //p1指向下下一个结个点,取代p2指向的结点
p2->next=p1; //p2的next指向p1
first=p2; //p2代替p1成为头结点,交换完成
}
}
p1=first;
cout<<"按总成绩Sum排序(降序)如下:"<<endl;
cout<<"Num Name Soft Cisco VC Sum /n";
cout<<"____________________________________/n";
do
{
cout<<setiosflags(ios_base::left)<<setw(7)<<p1->num
<<setiosflags(ios_base::left)<<setw(7)<<p1->name
<<setiosflags(ios_base::left)<<setw(7)<<p1->Soft
<<setiosflags(ios_base::left)<<setw(7)<<p1->Cisco
<<setiosflags(ios_base::left)<<setw(7)<<p1->VC
<<setiosflags(ios_base::left)<<setw(7)<<p1->SUM
<<endl;
p1=p1->next;
}while(p1!=NULL);
}
//保存到文件
void SStu::save()
{
ofstream file("学生成绩管理.txt",ios_base::app);
student *p=first;
while(p)// 写入文件
{
file<<setiosflags(ios_base::left)<<setw(7)<<p->num
<<setiosflags(ios_base::left)<<setw(7)<<p->name
<<setiosflags(ios_base::left)<<setw(7)<<p->Soft
<<setiosflags(ios_base::left)<<setw(7)<<p->Cisco
<<setiosflags(ios_base::left)<<setw(7)<<p->VC
<<setiosflags(ios_base::left)<<setw(7)<<p->SUM
<<";"
<<endl;
p=p->next;
}
file.close();
cout<<"保存完毕!"<<endl;
}
//测试函数**--**--**--//
void main()
{
char c;
SStu S;
do
{
cout<<" ╭—-—--—————《主菜单》———--—————---╮"<<endl;
cout<<" ├—--——————————————————————┤"<<endl;
cout<<" ∣ 0.增加/输入学生成绩信息 ∣"<<endl;
cout<<" ∣ 1.修改学生成绩信息 ∣"<<endl;
cout<<" ∣ 2.删除学生成绩信息 ∣"<<endl;
cout<<" ∣ 3.输出学生成绩信息 ∣"<<endl;
cout<<" ∣ x.按学号查询 ∣"<<endl;
cout<<" ∣ y.按姓名查询 ∣"<<endl;
cout<<" ∣ a.按学号升序排序 ∣"<<endl;
cout<<" ∣ b.按Soft 成绩降序排序 ∣"<<endl;
cout<<" ∣ c.按Cisco成绩降序排序 ∣"<<endl;
cout<<" ∣ d.按VC 成绩降序排序 ∣"<<endl;
cout<<" ∣ e.按总成绩 降序排序 ∣"<<endl;
cout<<" ∣ 7.保存学生成绩信息 ∣"<<endl;
cout<<" ∣ 8.退出这个管理系统 ∣"<<endl;
cout<<" ╰————-——————————————————-—╯"<<endl;
cout<<" ——————————————————————————"<<endl;
cout<<"请输入操作命令: " ;
cin>>c;
switch(c)
{
case '0': S.input();
break;
case '1': S.update();
break;
case '2': S.dele();
break;
case '3': S.display();
break;
case 'x': S.search1();
break;
case 'y': S.search2();
break;
case 'a': S.order1();
break;
case 'b': S.order2();
break;
case 'c': S.order3();
break;
case 'd': S.order4();
break;
case 'e': S.order5();
break;
case '7': S.save();
break;
}
}while(c!='8');
}