| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 439 人关注过本帖
标题:课设遇到个问题。。想了两天了,实在不会,求助
只看楼主 加入收藏
li583
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-6-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
课设遇到个问题。。想了两天了,实在不会,求助
#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)排序功能:可按总分和单科成绩排名次。
这是要求,
现在有问题的是 显示功能  编辑功能  输入的时候可以分大中小学生类输入,输出时实在不知道怎么分类了,,求指教
搜索更多相关主题的帖子: private english include public 
2013-06-24 23:03
lzj12530
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:264
专家分:841
注 册:2013-3-28
收藏
得分:20 
用学生类指针,其他3类均继承学生类. 显示display函数用作虚函数.这样就可以了

C++菜鸟
2013-06-25 07:55
快速回复:课设遇到个问题。。想了两天了,实在不会,求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028645 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved