课设遇到个问题。。想了两天了,实在不会,求助
#include<iostream>#include<string>
#include<fstream>
using namespace std;
int ID=0; //学生编号(保证唯一)
class Student
{
public:
Student(int n,string na,int a,int cl,string s,int pan){ num=n; name=na; age=a; class1=cl; sex=s;}
void show() { cout<<num<<"\t"<<name<<"\t"<<age<<"\t"<<class1<<"\t"<<sex<<endl;}
private:
int num;
string name;
int age;
int class1;
string sex;
int panduan;
int english;
int match;
int chinese;
int history;
int grography;
int english1;
int match1;
int chinese1;
int cpp;
int english2;
int gaoshu;
int sum;
Student *next;
friend class Manage; //Manage是操作类
};
class Xxs:public Student //小学生类
{
private:
int english;
int match;
int chinese;
int sum;
Xxs *next;
public:
Xxs(int n,string na,int a,int cl,string s,int pan,int ch,int m,int en):Student(n,na,a,cl,s,pan){chinese=ch;match=m;english=en;}
void show_Xxs()
{cout<<"该学生的语文,数学,英语成绩为:"<<chinese<<match<<english;}
};
class Zxs:public Student //中学生类
{
private:
int history;
int grography;
int english1;
int match1;
int chinese1;
int sum;
Zxs *next;
public:
Zxs(int n,string na,int a,int cl,string s,int pan,int ch1,int m1,int en1,int h,int gr):Student(n,na,a,cl,s,pan){chinese1=ch1;match1=m1;english1=en1;history=h;grography=gr;}
void get_Zxs()
{cout<<"请输入该学生的语文,数学,英语,历史,地理成绩:"<<endl;
cin>>chinese1>>match1>>english1>>history>>grography;}
void show_Zxs()
{cout<<"该学生的语文,数学,英语,历史,地理成绩为:"<<endl;
cout<<chinese1<<match1<<english1<<history<<grography<<endl;}
friend class Manage;
};
class Dxs:public Student //大学生类
{
private:
int cpp;
int english2;
int gaoshu;
int sum;
Dxs *next;
public:
Dxs(int n,string na,int a,int cl,string s,int pan,int cp,int en2,int gs):Student(n,na,a,cl,s,pan)
{cpp=cp;english2=en2;gaoshu=gs;}
void get_Dxs()
{cout<<"请输入该学生的的c++,英语,高数成绩"<<endl;
cin>>cpp>>english2>>gaoshu;}
friend class Manage;
};
class Manage
{
public:
Manage();
~Manage();
void add(); //增加学生
void del(); //删除学生
void modify(); //修改学生
void display(); //显示全部学生
void query(); //查询学生
void save(); //保存学生信息
void load(); //读取学生信息
void tongji();//排序功能
private:
Student *header; //学生链表,header为头指针
void clear(); //类内部使用函数,清空内存的链表数据
};
void Manage::clear()
{
Student *p=header;
while(p)
{
p=p->next;
delete header;
header=p;
}
}
Manage::Manage() //构造函数在定义操作类的对象时加载文件中的信息
{
header=0;
//load(); //定义对象时,自动加载文件中的数据
}
//析构函数在对象结束时逐个删除链表里各个结点
Manage::~Manage()
{
clear();
}
//添加学生信息
void Manage::add()
{
Student *p;
string name;
int age;
int class1;
string sex;
int panduan;
int chinese;
int match;
int english;
int history;
int grography;
int english1;
int match1;
int chinese1;
int cpp;
int english2;
int gaoshu;
ID++;
cout<<"新增学生"<<endl;
//判断输入学生种类
cout<<"1.小学生"<<endl;
cout<<"2.中学生"<<endl;
cout<<"3.大学生"<<endl;
cout<<"请选择要该学生的种类:"<<endl;
cin>>panduan;
if(panduan==1)
{ panduan=1;
cout<<"小学生"<<endl;
cout<<"姓名="; cin>>name;
cout<<"年龄="; cin>>age;
cout<<"班级:"; cin>>class1;
cout<<"性别:"; cin>>sex;
cout<<"语文成绩="; cin>>chinese;
cout<<"数学成绩="; cin>>match;
cout<<"英语成绩="; cin>>english;
p=new Xxs(ID,name,age,class1,sex,panduan,chinese,match,english);
}
else if(panduan==2)
{
panduan=2;
cout<<"中学生"<<endl;
cout<<"姓名="; cin>>name;
cout<<"年龄="; cin>>age;
cout<<"班级:"; cin>>class1;
cout<<"性别:"; cin>>sex;
cout<<"语文成绩="; cin>>chinese1;
cout<<"数学成绩="; cin>>match1;
cout<<"英语成绩="; cin>>english1;
cout<<"历史成绩="; cin>>history;
cout<<"地理成绩="; cin>>grography;
p=new Zxs(ID,name,age,class1,sex,panduan,chinese1,match1,english1,history,grography);
}
else if(panduan==3)
{
panduan=3;
cout<<"大学生"<<endl;
cout<<"姓名="; cin>>name;
cout<<"年龄="; cin>>age;
cout<<"班级:"; cin>>class1;
cout<<"性别:"; cin>>sex;
cout<<"c++成绩"; cin>>cpp;
cout<<"英语成绩="; cin>>english2;
cout<<"高数成绩="; cin>>gaoshu;
p=new Dxs(ID,name,age,class1,sex,panduan,cpp,english2,gaoshu);
}
else
{cout<<"该类学生不存在!!"<<endl;}
p->next=0; //Manage是Student的友元类,可以访问Student的私有成员变量next
if(header!=0) //如果链表已经存在结点
{
Student *p2;
p2=header;
while(p2->next) //查找尾结点
{
p2=p2->next;
}
p2->next=p; //将新结点连接在链表的后面
}
else //若不存在结点(空链表)
{
header=p; //链表头结点即为新建结点
}
}
//删除学生信息
void Manage::del()
{
int No;
cout<<"请输入要删除的学生学号=";
cin>>No;
Student *p1,*p2;
p1=header;
while(p1) //查找要删除的结点
{
if(p1->num==No)
break;
else
{
p2=p1; //p2是删除结点的前一个结点
p1=p1->next;
}
}
//删除结点
if(p1!=0) //若找到结点,则删除
{
if(p1==header) //若要删除的结点是头结点
{
header=p1->next;
delete p1;
}
else //若要删除的结点不是头结点
{
p2->next=p1->next; //p2是要删除结点的前一个结点,
//要将删除结点的前一个结点和后一个结点连接起来
delete p1;
}
cout<<"找到并已删除结点!"<<endl;
}
else //没有找到要删除结点
cout<<"未找到要删除的学生信息!"<<endl;
}
//显示学生信息
void Manage::display()
{
if(header)
{
cout<<"学号\t姓名\t年龄\t班级\t性别"<<endl;
Student *p=header;
while(p)
{
cout<<p->num<<"\t"<<p->name<<"\t"<<p->age<<"\t"<<p->class1<<"\t"<<p->sex<<endl;
if(p->panduan==1)
{cout<<"小学生成绩"<<p->chinese<<p->match<<p->english;}
if(p->panduan==2)
{cout<<"中学生成绩"<<p->chinese1<<p->match1<<p->english1<<p->history<<p->grography;}
if(p->panduan==3)
{cout<<"大学生成绩"<<p->cpp<<p->gaoshu->english2;}
p=p->next;
}
}
else
cout<<"没有学生信息!"<<endl;
}
//修改学生信息(实际上是删除原来结点,然后把增加的新结点替换原来结点的位置)
void Manage::modify()
{
int No;
string Name;
int Age;
int Class1;
string Sex;
int Panduan;
cout<<"修改学生的学号=";
cin>>No;
//查找要修改的结点
Student *p1,*p2;
p1=header;
//查找要修改的结点
while(p1)
{
if(p1->num==No)
break;
else
{
p2=p1; //p2记录查找的结点的前一个结点
p1=p1->next;
}
}
//修改学生信息
if(p1!=0) //找到要修改的结点
{
p1->show();
cout<<"修改姓名=";
cin>>Name;
cout<<"修改年龄="; cin>>Age;
cout<<"修改班级:"; cin>>Class1;
cout<<"修改性别:"; cin>>Sex;
//修改的学生信息,学号不能变,只能改变姓名
Student *p3;
p3=new Student(p1->num,Name,Age,Class1,Sex,Panduan);
//修改结点替换到链表中
p3->next=p1->next;
if(p1==header) //若要替换结点是头结点
header=p3;
else
p2->next=p3; //要替换的结点p1的前一个结点连接上p3
//删除原来的学生结点
delete p1;
cout<<"修改完成!"<<endl;
}
else
cout<<"未找到要删除的学生信息!"<<endl;
}
//查询学生信息
void Manage::query()
{
int x;
cout<<"请输入要查询的方式:"<<"1.按学号查询"<<"2.按姓名查询"<<endl;
cin>>x;
int No;
string xingming;
if(x==1)
{
cout<<"请输入要查询的学生学号=";
cin>>No;
Student *p=header;
while(p)
{
if(p->num==No)
{
p->show();
break;
}
p=p->next;
}
}
if(x==2)
{
cout<<"请输入要查询学生的姓名"<<endl;
cin>>xingming;
Student *p=header;
while(p)
{
if(p->name==xingming)
{
p->show();
break;
}
p=p->next;
}
}
}
void Manage::save()
{
fstream fout;
fout.open("d:\\student.txt",ios::out);
Student *p=header;
fout<<ID<<endl; //存放学生的当前编号的值,以便下次打开程序时能知道上次程序结束是的ID值
while(p)
{
fout<<p->num<<"\t"<<p->name;
p=p->next;
if(p!=0)
fout<<endl; //保存在文件中最后一行数据不加回车
}
fout.close();
cout<<"保存成功!"<<endl;
}
//从文件中读取学生信息
void Manage::load()
{
fstream fin("d:\\student.txt",ios::in);
fin>>ID; //读取当前学号值
clear(); //清空内存数据
header=0;
Student *p,*p1=header;
int No;
string Name;
int Age;
int Class1;
string Sex;
int Panduan;
while(!fin.eof())
{
fin>>No>>Name>>Age>>Class1>>Sex;
p=new Student(No,Name,Age,Class1,Sex,Panduan);
p->next=0;
if(header==0) //若是空链表,头结点就是p
{
p1=header=p;
}
else
{
p1->next=p;
p1=p; //p1总指向最后一个结点
}
}
fin.close();
cout<<"数据加载完成!"<<endl;
}
int main()
{
char c;
Manage a;
do
{
cout<<"\n*** 学生信息管理系统 ***\n";
cout<<"1-增加学生信息\n";
cout<<"2-删除学生信息\n";
cout<<"3-显示学生信息\n";
cout<<"4-修改学生信息\n";
cout<<"5-查询学生信息\n";
cout<<"6-数据存盘\n";
cout<<"7-数据装入\n";
cout<<"8-退出\t请选择(1-8):";
cin>>c;
switch(c)
{
case '1': a.add(); break;
case '2': a.del(); break;
case '3': a.display(); break;
case '4': a.modify(); break;
case '5': a.query(); break;
case '6': a.save(); break;
case '7': a.load(); break;
}
}while(c!='8');
return 0;
}
(1)添加功能:程序能够添加不同学生的记录,提供选择界面供用户选择所要添加的类别,要求学号要唯一,如果添加了重复学号的记录时,则提示数据添加重复并取消添加。
(2)查询功能:可根据学号、姓名等信息对已添加的学生记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
(3):可显示当前系统中所有学生的记录,每条记录占据一行。
(4):可根据查询结果对相应的记录进行修改,修改时注意学号的唯一性。
(5)删除功能:主要实现对已添加的学生记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。
(6)统计功能:能根据多种参数进行统计。能统计学生人数、总分、单科的平均分等。
(7)保存功能:可将当前系统中各类记录存入文件中,存入方式任意。
(8)读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。
(9)排序功能:可按总分和单科成绩排名次。
这是要求,
现在有问题的是 显示功能 编辑功能 输入的时候可以分大中小学生类输入,输出时实在不知道怎么分类了,,求指教