模拟选课系统编写(C++)

这是一个使用C++编写的模拟选课系统,包括学生、课程、教师等类的定义,实现了数据的输入、输出、选课、退课、成绩录入等功能。系统通过多态和数据结构管理学生信息、课程信息,并支持查看课程表和选课情况。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<fstream>
#include<string>
#include<map>
#include<string.h>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
class xuesheng
{
    int no;
    string name;
    string classes;
    double pscj;
    double kscj;
public:
    xuesheng(){pscj=0;kscj=0;}
    xuesheng(int a,string b,string c,double d,double e):no(a),name(b),classes(c),pscj(d),kscj(e){};
    int getno(){return no;}
    void setno(int x){no=x;}
    string getname(){return name;}
    void setname(string x){name=x;}
    string getclasses(){return classes;}
    void setclasses(string x){classes=x;}
    double getpscj(){return pscj;}
    void setpscj(double x){pscj=x;}
    double getkscj(){return kscj;}
    void setkscj(double x){kscj=x;}
    friend istream &operator>>(istream&is,xuesheng&r);
    friend ostream &operator<<(ostream&os,const xuesheng&r);
};
istream &operator>>(istream&is,xuesheng&r)
{
    cout<<"请以此按照学生学号、姓名、班级、平时成绩、考试成绩输入学生信息,输入-1结束:"<<endl;
    is>>r.no;
    if(r.no==-1)
        return is;
    is>>r.name>>r.classes>>r.pscj>>r.kscj;
    return is;
}
ostream &operator<<(ostream&os,const xuesheng&r)
{
    os<<r.no<<"\t"<<r.name<<"\t"<<r.classes<<"\t"<<r.pscj<<"\t"<<r.kscj<<endl;
    return os;
}
class lesson//课程小类
{
    string no1;
    int no2;
    string name;
    double point;
    string teach;
    string place;
    int time1;
    int time2;
    double score;
public:
    lesson(){teach="无";score=0;}
    string getno1(){return no1;}
    void setno1(string x){no1=x;}
    int getno2(){return no2;}
    void setno2(int x){no2=x;}
    string getname(){return name;}
    void setname(string x){name=x;}
    double getpoint(){return point;}
    void setpoint(double x){point=x;}
    string getteach(){return teach;}
    void setteach(string x){teach=x;}
    string getplace(){return place;}
    void setplace(string x){place=x;}
    int gettime1(){return time1;}
    void settime1(int x){time1=x;}
    int gettime2(){return time2;}
    void settime2(int x){time2=x;}
    double getscore(){return score;}
    void setscore(double x){score=x;}
    void makescore(xuesheng x){score=x.getpscj()*0.3+x.getkscj()*0.7;}
    friend istream &operator>>(istream&is,lesson&r);
    friend ostream &operator<<(ostream&os,const lesson&r);
};
istream &operator>>(istream&is,lesson&r)
{
    cout<<"请依次按课号、班号、名称、学分、教师、地点、时 间输入课程信息,输入-1结束:"<<endl;
    is>>r.no1;
    if(r.no1=="-1")
        return is;
    is>>r.no2>>r.name>>r.point>>r.teach>>r.place>>r.time1>>r.time2;
    return is;
}
ostream &operator<<(ostream&os,const lesson&r)
{
    os<<r.no1<<"\t"<<r.no2<<"\t"<<r.name<<"\t"<<r.point<<"\t"<<r.teach<<"\t"<<r.place<<"\t"<<r.time1<<" "<<r.time2<<endl;
    return os;
}
class course
{
    string no1;
    int no2;
    string name;
    double point;
    string teach;
    string place;
    int time1;
    int time2;
    int course_cap;
    int course_pop;//xs.size()
    vector<xuesheng> xs;
    vector<xuesheng>::iterator xsit;
    multimap<int,int> xs1;//按照学号查找
    multimap<int,int>::iterator xsit1;//查找完后判断是否与姓名相同
public:
    course(){teach="无";course_pop=0;}
    string getno1(){return no1;}
    void setno1(string x){no1=x;}
    int getno2(){return no2;}
    void setno2(int x){no2=x;}
    string getname(){return name;}
    void setname(string x){name=x;}
    double getpoint(){return point;}
    void setpoint(double x){point=x;}
    string getteach(){return teach;}
    void setteach(string x){teach=x;}
    string getplace(){return place;}
    void setplace(string x){place=x;}
    int gettime1(){return time1;}
    void settime1(int x){time1=x;}
    int gettime2(){return time2;}
    void settime2(int x){time2=x;}
    int getcourse_cap(){return course_cap;}
    void setcourse_cap(int x){course_cap=x;}
    int getcourse_pop(){return course_pop;}
    void setcourse_pop(int x){course_pop=x;}
    void addxuesheng(xuesheng x){xs.push_back(x);course_pop++;}
    void delexuesheng(xuesheng x);
    int xssize(){return xs.size();}
    int xsno(int x){return xs[x].getno();}
    double xspscj(int x){return xs[x].getpscj();}
    double xskscj(int x){return xs[x].getkscj();}
    void cinxscj();
    friend istream &operator>>(istream&is,course&r);
    friend ostream &operator<<(ostream&os,const course&r);
};
void course::delexuesheng(xuesheng x)
{
    int i,j;
    for(i=0;i<xs.size();i++)
        if(xs[i].getno()==x.getno())
            break;
    j=xs.size();
    for(;i<j-1;i++)
        xs[i]=xs[i+1];
    xs.erase(xs.end());
    course_pop--;
}
void course::cinxscj()
{
    int i;
    double a,b;
    for(i=0;i<xs.size();i++)
    {
        cout<<"请依次输入您的平时成绩、考试成绩:"<<endl;
        cin>>a>>b;
        xs[i].setpscj(a);
        xs[i].setkscj(b);
    }
}
istream &operator>>(istream&is,course&r)
{
    xuesheng x;
    cout<<"请依次按课号、班号、名称、学分、老师、地点、时 间、课容量、选课人数输入课程信息,输入-1结束:"<<endl;
    is>>r.no1;
    if(r.no1=="-1")
        return is;
    is>>r.no2>>r.name>>r.point>>r.teach>>r.place>>r.time1>>r.time2>>r.course_cap>>r.course_pop;
    for(int i=0;i<r.course_pop;i++)
    {
        is>>x;
        r.xs.push_back(x);
    }
    return is;
}
ostream &operator<<(ostream&os,const course&r)
{
    os<<r.no1<<"\t"<<r.no2<<"\t"<<r.name<<"\t"<<r.point<<"\t"<<r.teach<<"\t"<<r.place<<"\t"<<r.time1<<" "<<r.time2<<"\t"<<r.course_cap<<"\t"<<r.course_pop<<endl;
    for(int i=0;i<r.course_pop;i++)
        os<<r.xs[i]<<endl;
    return os;
}
class student
{
    int no;
    string name;
    string classes;
    double GPA;
    int course_no;//课程门数=cou.size();
    double course_score;//已选学分
    int KCB[5][7];
    string kcb[5][7];
    vector<lesson> les;
    vector<lesson>::iterator lesit;//只能用课号与班号查找
    vector<course> cs;
public:
    student()
    {
        GPA=0;course_no=0;course_score=0;
        memset(KCB,0,sizeof(KCB));
        int i,j;
        for(i=0;i<5;i++)
            for(j=0;j<7;j++)
                kcb[i][j]="休息";
    }
    void rekcb();
    string lesno1(int x){return les[x].getno1();}
    int lesno2(int x){return les[x].getno2();}
    string lesname(int x){return les[x].getname();}
    double lespoint(int x){return les[x].getpoint();}
    string lesteach(int x){return les[x].getteach();}
    string lesplace(int x){return les[x].getplace();}
    int lestime1(int x){return les[x].gettime1();}
    int lestime2(int x){return les[x].gettime2();}
    void lesscore(int x,double y){les[x].setscore(y);}
    int lessize(){return les.size();}
    int getno(){return no;}
    void setno(int x){no=x;}
    string getname(){return name;}
    void setname(string x){name=x;}
    string getclasses(){return classes;}
    void setclasses(string x){classes=x;}
    double getGPA(){return GPA;}
    void setGPA(double x){GPA=x;}
    int getcourse_no(){return course_no;}
    void setcourse_no(){course_no=les.size();}
    double getcourse_score(){return course_score;}
    void setcourse_score(double x){course_score=x;}
    int getKCB(int i,int j){return KCB[i][j];}
    void setKCB(int i,int j,int s){KCB[i][j]=s;}
    string getkcb(int i,int j){return kcb[i][j];}
    void setkcb(int i,int j,string s){kcb[i][j]=s;}
    void displaykcb();
    void addlesson(lesson x){les.push_back(x);}
    void delelesson(lesson x);
    void loadc()
    {
        ifstream infile("D:\\course.dat",ios::in);
        if(!infile)
        {
            return;
        }
        cs.clear();
        while(1)
        {
            course w;
            infile>>w;
            if(w.getno1()=="-1")
                break;
            cs.push_back(w);
        }
        system("cls");
        infile.close();
    }
    void makeGPA()
    {
        loadc();
        system("cls");
        int i;
        int y,x;
        for(y=0;y<les.size();y++)
        {
            for(i=0;i<cs.size();i++)
            {
                if(cs[i].getno1()==les[y].getno1()&&cs[i].getno2()==les[y].getno2())
                    break;
            }
            int j;
            for(j=0;j<cs[i].xssize();j++)
                if(cs[i].xsno(j)==no)
                    break;
            int k;
            k=cs[i].xspscj(j)*0.3+cs[i].xskscj(j)*0.7;
            les[y].setscore(k);
            if(les[y].getscore()>=60)
                x=x+les[y].getscore()/10-5;
            GPA=x/course_score;
        }
    }
    friend istream &operator>>(istream&is,student&r);
    friend ostream &operator<<(ostream&os,const student&r);
};
void student::rekcb()
{
    int i;
    for(i=0;i<les.size();i++)
    {
        setkcb(les[i].gettime2()-1,les[i].gettime1()-1,les[i].getname());
        setKCB(les[i].gettime2()-1,les[i].gettime1()-1,1);
    }
}
void student::delelesson(lesson x)
{
    int i,j;
    for(i=0;i<les.size();i++)
        if(les[i].getno1()==x.getno1()&&les[i].getno2()==x.getno2())
            break;
    j=les.size();
    for(;i<j-1;i++)
        les[i]=les[i+1];
    les.erase(les.end());
}
void student::displaykcb()
{
    rekcb();
    int i,j;
    cout<<" "<<"\t"<<"周一"<<"\t"<<"周二"<<"\t"<<"周三"<<"\t"<<"周四"<<"\t"<<"周五"<<"\t"<<"周六"<<"\t"<<"周日"<<endl;
    for(i=0;i<5;i++)
    {
        cout<<i+1<<"\t";
        for(j=0;j<7;j++)
            cout<<kcb[i][j]<<"\t";
        cout<<endl;
    }
}
istream &operator>>(istream&is,student&r)
{
    lesson x;
    cout<<"请依次按学号、姓名、班级、绩点、所选课程门数、所选学分、所选课程输入学生信息,输入-1结束:"<<endl;
    is>>r.no;
    if(r.no==-1)
        return is;
    is>>r.name>>r.classes>>r.GPA>>r.course_no>>r.course_score;
    for(int i=0;i<r.course_no;i++)
    {
        is>>x;
        r.les.push_back(x);
    }
    return is;
}
ostream &operator<<(ostream&os,const student&r)
{
    os<<r.no<<"\t"<<r.name<<"\t"<<r.classes<<"\t"<<r.GPA<<"\t"<<r.course_no<<"\t\t"<<r.course_score<<endl;
    for(int i=0;i<r.course_no;i++)
        os<<r.les[i];
    return os;
}
class teacher
{
    int no;
    string name;
    string collage;
    string system;
    int course_num;
    vector<course> cou;
    vector<course> couit;//用课号和班号来查找。
    int KCB[5][7];
    string kcb[5][7];
public:
    teacher()
    {
        course_num=0;
        memset(KCB,0,sizeof(KCB));
        int i,j;
        for(i=0;i<5;i++)
            for(j=0;j<7;j++)
                kcb[i][j]="休息";
    }
    void tcou(int y,course x){cou[y]=x;}
    void replacecou(int x,course y){cou[x]=y;}
    int cousize(){return cou.size();}
    string couno1(int x){return cou[x].getno1();}
    int couno2(int x){return cou[x].getno2();}
    void cdispaly(int x){cout<<cou[x];}
    string getname(){return name;}
    void setname(string x){name=x;}
  
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值