HNU程序设计 类和对象练习(小班)

学生类Student类的设计与实现

要求:

创建一个 Student 类,包含公有数据成员:姓名(字符串)、学号、性别、 3 门课程成绩 ( 结构
体形式,属性包含课程名和分数 ) ,以及私有属性身份证信息。
1 )给出针对私有属性的 setID() getID() 函数,可以设置和读取身份证信息。
2 )给出构造函数,支持从键盘接收学生对象的初始信息,其中身份证信息的设置需调用 se
tID()
3 )给出输出信息的方法,格式化输出学生信息,每个属性之间占 18 位宽度,居中对齐;其
中身份证信息的输出需调用 getID()
4 )创建动态对象数组,存储若干名学生数据,并按总分,从高到低排序。若总分相同,则
按学号从小到大进行排序。
5 )输出排序后的列表,第一行为标题行,字段包括 姓名 学号 性别 身份证 课程成绩 总
,每个字段占 18 位宽度( 3 门课程成绩总共占 18 位宽度),居中对齐。
6 )根据输入的院系代码(学号的第 5-8 位),筛选输出某院系的学生数据。
7 )统计女生和男生的人数。
8 )根据输入的课程名信息,按标题行、 及格学生 不及格学生 的先后顺序,以一行 "----
" 为分隔符,输出学生信息,标题行字段只需包含姓名、学号、该课程成绩。
9 )可根据姓名、学号、课程名、身份证号等,查询输出符合的学生。
10 )可添加、删除学生信息。
【特别说明】
无标准答案,所有实现的细则可以自定,满足简单的信息输入 / 出,及增、删、改、查、排
序、统计等基本功能。
建议学生数据多样化,包含不同性别,不同院系专业,不同课程,不同成绩等。
将根据功能的丰富度、代码的规范性和可读性进行评分。
本人未按照题目要求写,而是自定义,参考于csdn某大佬的代码,在此说明!,并且是在codeblock中分文件编写完成!,没有完全完成所有代码,因为没那么时间去优化和修改完善,基本功能可以实现!
#pragma once
#include<algorithm>
#include<string>
#include<vector>
#include"Subject.h"
using namespace std;
//学生类的定义
class Student{
	private:
		string id;
	public:
		string stuName;
		string stuNum;//学号
		string gender;//性别
		int graNum;//年级
		int classNum;//班级
		string major;//专业
		vector<Subject> subs; //存放各个科目
		int subSum;//科目门数
		double sumScore;//总分
		double aveScore;//平均分
		void setID(string id);
		string getID();
		Student();//无参的构造函数
		Student(string stuName,string stuNum,string gender,int graNum,int classNum,string major,vector<Subject> subs,int subSum,double sumScore,double aveScore);//有参构造函数
        void showStuHeader(); //头标题
		void showStuInfo(); //学生信息
};
#include"Student.h"
#include<iostream>
#include<iomanip>
Student::Student(){}
Student::Student(string stuName,string stuNum,string gender,int graNum,int classNum,string major,vector<Subject> subs,int subSum,double sumScore,double aveScore)
{
    this->stuName=stuName;
    this->stuNum=stuNum;
    this->gender=gender;
    this->graNum=graNum;
    this->classNum=classNum;
    this->major=major;
    this->subs=subs;
    this->subSum=subSum;
    this->sumScore=sumScore;
    this->aveScore=aveScore;
}
void Student::setID(string id)
{

    this->id=id; //私有属性赋值
}
string Student::getID()
{
    return this->id; //拿到身份证信息
}
void Student::showStuHeader()//头标题
{
    cout<<setw(12)<<left<<"姓名";
	cout<<setw(10)<<left<<"学号";
	cout<<setw(6)<<left<<"性别";
	cout<<setw(6)<<left<<"年级";
	cout<<setw(8)<<left<<"班级";
	cout<<setw(23)<<left<<"专业";
	cout<<setw(12)<<left<<"总分";
	cout<<setw(6)<<left<<"平均分"<<endl;
}
void Student::showStuInfo()//具体信息展示
{
    cout<<setw(12)<<left<<stuName;
	cout<<setw(10)<<left<<stuNum;
	cout<<setw(6)<<left<<gender;
	cout<<setw(6)<<left<<graNum;
	cout<<setw(8)<<left<<classNum;
	cout<<setw(23)<<left<<major;
	cout<<setw(12)<<left<<sumScore;
	cout<<setw(6)<<left<<aveScore<<endl;
}

//学科类
#pragma once
#include<algorithm>
#include<string>
using namespace std;
class Subject
{
    public:
        string subName;//学科名
        double score;//分数
        void showSubInfo();//学科分数展示
        void showSubHeader();//头标题展示
};
#include"Subject.h"
#include<algorithm>
#include<string>
#include<iostream>
#include<iomanip>
using namespace std;
void Subject::showSubHeader()
{
    cout<<left<<setw(45)<<"科目";  //left左对齐
    cout<<left<<setw(6)<<"分数"<<endl;

}
void Subject::showSubInfo()//成绩信息展示
{
    cout<<left<<setw(45)<<subName;
    cout<<left<<setw(6)<<score<<endl;
}
//学生列表类,对学生可以进行各种操作
#pragma once
#include<vector>
#include"Student.h"
#include"Subject.h"
#include<fstream> //文件操作头文件
class StudentList
{
    private:
        vector<Student> stuList;//学生列表,学生信息放在这里

    public:
        StudentList();
        StudentList(vector<Student> stuList);
        void init();//初始化,拿到初始学生信息
        void menu();//菜单,对学生进行操作
        void readFile();//进行读取文件
        void writeFile();//写入文件
        void addList();//添加学生信息
        void delList();//删除学生信息
        void modList();//修改学生信息
        void selList();//查询学生信息
        void showList();//展示学生信息,包括基本信息和成绩信息
        void calList();//统计学生成绩,总分,平均分,信息情况
        void clearList();//清空学生信息
        void disStuInfo(); //显示学生基本信息
        void disSubInfo();//显示学生成绩信息
        int checkExist(Student stu);//检查是否存在该学生

};
#include"StudentList.h"
#include<iostream>
#include<iomanip>
StudentList::StudentList(){}
StudentList::StudentList(vector<Student> stuList)
{
    this->stuList=stuList;
}

void StudentList::menu()
{
    int cho=0;
    system("cls");//清屏
    cout<<"--------欢迎来到学生成绩管理系统--------"<<endl;
    cout<<"|--------------------------------------|"<<endl;
    cout<<"|           0.退出学生系统             |"<<endl;
    cout<<"|--------------------------------------|"<<endl;
    cout<<"|           1.添加学生信息             |"<<endl; //制表符对齐
    cout<<"|--------------------------------------|"<<endl;
    cout<<"|           2.删除学生信息             |"<<endl;
    cout<<"|--------------------------------------|"<<endl;
    cout<<"|           3.修改学生信息             |"<<endl;
    cout<<"|--------------------------------------|"<<endl;
    cout<<"|           4.查询学生信息             |"<<endl;
    cout<<"|--------------------------------------|"<<endl;
    cout<<"|           5.统计学生信息             |"<<endl;
    cout<<"|--------------------------------------|"<<endl;
    cout<<"|           6.清空学生信息             |"<<endl;
    cout<<"|--------------------------------------|"<<endl;
    cout<<"|           7.显示学生信息             |"<<endl;
    cout<<"|--------------------------------------|"<<endl;
    cout<<"请选择功能序号:[0-7]:";
    cin>>cho;
    while(cho<0||cho>7){
        cout<<"没有该功能序号,请重新输入!"<<endl;
        cin>>cho;
    }
    if(cho==0){
        cout<<"感谢使用系统!"<<endl;
        exit(0);
    }else if(cho==1)
    {
        this->addList();
        this->menu();//返回主菜单
    }else if(cho==2)
    {
        this->delList();
        this->menu();
    }else if(cho==3)
    {
        this->modList();
        this->menu();
    }else if(cho==4)
    {
        this->selList();
        this->menu();
    }else if(cho==5)
    {
        this->calList();
        this->menu();
    }else if(cho==6)
    {
        this->clearList();
        this->menu();
    }else if(cho==7)
    {
        this->showList();
        this->menu();
    }
    system("pause"); //按任意键继续
}
void StudentList::addList()
{
    while(true)
    {
        system("cls");
        cout<<"--------欢迎来到添加学生信息功能界面--------"<<endl;
        cout<<"学生基本信息表如下:"<<endl;
        this->disStuInfo();
        cout<<endl;//换行
        cout<<"-------------------"<<endl;
        cout<<" 1.添加学生信息 "<<endl;
        cout<<" 2.返回主菜单界面 "<<endl;
        cout<<"-------------------"<<endl;
        cout<<"请输入功能序号[1/2]:";
        int n;
        cin>>n;
        while(n!=1&&n!=2){
            cout<<"没有该功能序号,请重新输入!"<<endl;
            cin>>n;
        }
        if(n==1)
        {
            Student stu;
            cout<<"输入学生基本信息"<<endl;
            cout<<"请输入学号:";
            int check=-1;//判断学生是不是已经存在了
            while(true)
            {
                cin>>stu.stuNum;
                check=this->checkExist(stu);
                if(check!=-1)
                {
                    cout<<"该学生已经存在,请重新输入!"<<endl;
                    cin>>stu.stuNum;
                }else
                {
                    cout<<"学号输入成功!"<<endl;
                    break;
                }
            }
            cout<<"姓名:";
            cin>>stu.stuName;
            cout<<"性别:";
            cin>>stu.gender;
            cout<<"年级:";
            cin>>stu.graNum;
            cout<<"班级:";
            cin>>stu.classNum;
            cout<<"专业:";
            cin>>stu.major;
            cout<<endl;
            cout<<"基本信息输入完成!请问是否还要输入成绩信息? 1是0否";
            int opt;
            cin>>opt;
            while(opt!=0&&opt!=1)
            {
                cout<<"没有该功能,请重新输入!";
                cin>>opt;
            }
            if(opt==1)
            {
                int cou=0;//科目门数
                while(true)
                {
                    cou++;
                    Subject sub;
                    cout<<"第"<<cou<<"门科目名称: ";
                    cin>>sub.subName;
                    cout<<"第"<<cou<<"门科目分数: ";
                    cin>>sub.score;
                    stu.subs.push_back(sub); //在vector容器尾部添加元素
                    cout<<"该学生该科目成绩信息添加成功!请问是否还要继续添加科目信息?1是0否";
                    cin>>opt;
                    while(opt!=0&&opt!=1)
                    {
                        cout<<"没有该输入选项,请重新输入!";
                        cin>>opt;
                    }
                    if(opt==0)
                    {
                        cout<<"该学生成绩信息添加完毕!"<<endl;
                        break;
                    }
                }
                stu.subSum=cou;

            }
            for(int i=0;i<stu.subs.size();i++)
            {
                stu.sumScore+=stu.subs[i].score;//求总分
            }
            if(stu.sumScore>0)
            {
                stu.aveScore=stu.sumScore/stu.subs.size();//求平均分
            }
            stuList.push_back(stu);//学生列表添加该学生信息
            cout<<"该学生信息添加成功!请问是否还要继续添加?1是0否";
            cin>>n;
            while(n!=0&&n!=1)
            {
                cout<<"没有该输入选项,请重新输入!";
                cin>>n;
            }
            if(n==0)
            {
                cout<<"添加学生信息完成!"<<endl;
                writeFile();
                break;
            }
        }else
        {
            break;//返回主菜单
        }
        system("pause"); //按任意键继续
   }
}
int StudentList::checkExist(Student stu)
{
    for(int i=0;i<stuList.size();i++)
    {
        if(stu.stuNum==stuList[i].stuNum)
        {
            return i;//该学生已经存在
        }
    }
    return -1; //没有找到
}
void StudentList::delList()
{
    while(true)
    {
        system("cls");
        cout<<"--------欢迎来到删除学生信息功能界面--------"<<endl;
        cout<<"-------------------------"<<endl;
        cout<<" 1.输入学号删除学生信息 "<<endl;
        cout<<" 2.返回主菜单界面 "<<endl;
        cout<<"-------------------------"<<endl;
        cout<<"请输入功能序号[1/2]:";
        int n;
        Student stu;
        cin>>n;
        while(n!=1&&n!=2){
            cout<<"没有该功能序号,请重新输入!";
            cin>>n;
        }
        if(n==1)
        {
            string stuNum;
            cout<<"请输入要删除学生学号:";
            cin>>stu.stuNum;
            int check=checkExist(stu);//删除学生是否存在
            if(check!=-1)
            {
                cout<<"要删除学生信息如下:"<<endl;
                cout<<"-----------------------------"<<endl;
                stuList[check].showStuHeader();
                stuList[check].showStuInfo();
                cout<<"请问确认删除吗?1是0否";
                int opt;
                cin>>opt;
                while(opt!=0&&opt!=1)
                {
                    cout<<"没有该功能,请重新输入!";
                    cin>>opt;
                }
                if(opt==0)
                {
                    break;
                }else
                {
                    stuList.erase(stuList.begin()+check);//删除指定位置信息
                    cout<<"删除该学生信息成功!"<<endl;
                    break;
                }
            }else
            {
                cout<<"该学生不存在!无法删除!"<<endl;
            }
        }else if(n==2)
        {
            cout<<"删除学生信息完成!"<<endl;
            writeFile();
            break;

        }
        system("pause"); //按任意键继续
    }

}
void StudentList::modList()
{
    while(true)
    {
        system("cls");
        cout<<"--------欢迎来到修改学生信息功能界面--------"<<endl;
        cout<<"-------------------------"<<endl;
        cout<<" 1.修改学生基本信息 "<<endl;
        cout<<" 2.修改学生成绩信息 "<<endl;
        cout<<" 3.返回主菜单界面 "<<endl;
        cout<<"-------------------------"<<endl;
        cout<<"请输入功能序号[1/2/3]:";
        int n;
        Student stu;
        cin>>n;
        while(n!=1&&n!=2&&n!=3){
            cout<<"没有该功能序号,请重新输入!";
            cin>>n;
        }
        if(n==1)
        {
            string stuNum;
            cout<<"请输入要修改学生的学号:";
            cin>>stu.stuNum;
            int check=checkExist(stu);//要修改的学生是否存在
            if(check!=-1)
            {
                cout<<"要修改学生的原来基本信息如下:"<<endl;
                cout<<"-----------------------------"<<endl;
                stuList[check].showStuHeader();
                stuList[check].showStuInfo();
                cout<<"-----------------------------"<<endl;
                cout<<"请问确认修改吗?1是0否";
                int opt;
                cin>>opt;
                while(opt!=0&&opt!=1)
                {
                    cout<<"没有该功能,请重新输入!";
                    cin>>opt;
                }
                if(opt==0)
                {
                    break;
                }else
                {
                    cout<<"修改后姓名:";
                    cin>>stuList[check].stuName;
                    cout<<"修改后性别:";
                    cin>>stuList[check].gender;
                    cout<<"修改后年级:";
                    cin>>stuList[check].graNum;
                    cout<<"修改后班级:";
                    cin>>stuList[check].classNum;
                    cout<<"修改后专业:";
                    cin>>stuList[check].major;
                    cout<<endl;
                    cout<<"该学生基本信息修改完成!请问是否还要继续修改信息? 1是0否";
                    cin>>opt;
                    while(opt!=0&&opt!=1)
                    {
                        cout<<"没有该功能,请重新输入!";
                        cin>>opt;
                    }
                    if(opt==0)
                    {
                        cout<<"修改学生信息完成!"<<endl;
                        writeFile();
                        break;
                    }
                }
            }else
            {
                cout<<"该学生不存在!无法修改基本信息!"<<endl;
            }
        }else if(n==2)
        {
            string stuNum;
            cout<<"请输入要修改学生的学号:";
            cin>>stu.stuNum;
            int check=checkExist(stu);//要修改的学生是否存在
            if(check!=-1)
            {
                cout<<"要修改学生的原来成绩信息如下:"<<endl;
                cout<<"-------------------------------------"<<endl;
                stuList[check].subs[check].showSubHeader();
                for(int i=0;i<stuList[check].subs.size();i++)
                {
                    cout<<(i+1)<<internal<<setw(8);
                    stuList[check].subs[i].showSubInfo();
                }
                stuList[check].showStuInfo();
                cout<<"-------------------------------------"<<endl;
                cout<<"请问确认修改吗?1是0否";
                int opt;
                cin>>opt;
                while(opt!=0&&opt!=1)
                {
                    cout<<"没有该功能,请重新输入!";
                    cin>>opt;
                }
                if(opt==0)
                {
                    break;
                }else
                {
                    for(int i=0;i<stuList[check].subs.size();i++)//遍历列表进行修改成绩信息
                    {
                        cout<<"第"<<(i+1)<<"门科目名称: "<<stuList[check].subs[i].subName;
                        cout<<"请输入修改后的分数:";
                        cout<<"第"<<(i+1)<<"门科目分数: "<<stuList[check].subs[i].score;
                    }
                    cout<<"该学生成绩信息修改完成!请问是否还要继续修改信息? 1是0否";
                    cin>>opt;
                    while(opt!=0&&opt!=1)
                    {
                        cout<<"没有该功能,请重新输入!";
                        cin>>opt;
                    }
                    if(opt==0)
                    {
                        cout<<"修改学生信息完成!"<<endl;
                        break;
                    }

                }

                }
            }else
            {
                cout<<"该学生不存在!无法修改基本信息!"<<endl;
                break;
            }
            system("pause"); //按任意键继续

        }
}

void StudentList::selList()
{
    while(true)
    {
        system("cls");
        cout<<"--------欢迎来到查询学生信息功能界面--------"<<endl;
        cout<<"-------------------------"<<endl;
        cout<<" 1.输入学号查询学生信息 "<<endl;
        cout<<" 2.输入姓名查询学生信息 "<<endl;
        cout<<" 3.输入身份证号查询学生信息 "<<endl;
        cout<<" 4.输入课程名查询学生信息 "<<endl;
        cout<<" 5.输入班级查询学生信息 "<<endl;
        cout<<" 6.返回主菜单界面 "<<endl;
        cout<<"-------------------------"<<endl;
        cout<<"请输入功能序号[1/2]:";
        int n;
        Student stu;
        cin>>n;
        while(n!=1&&n!=2){
            cout<<"没有该功能序号,请重新输入!";
            cin>>n;
        }
        if(n==1)
        {
            string stuNum;
            cout<<"请输入要查询学生学号[5-8位院系代码]:";
            cin>>stuNum;
            if(stuNum.size()>8)
            {
                stuNum=stuNum.substr(5,9);
                stuList[0].showStuHeader();
                for(int i=0;i<stuList.size();i++)
                {
                    if(stuList[i].stuNum.substr(5,9)==stuNum)
                    {

                        stuList[i].showStuInfo();
                    }
                }
                cout<<"请问还要查询吗?1是0否";
                int opt;
                cin>>opt;
                while(opt!=0&&opt!=1)
                {
                    cout<<"没有该功能,请重新输入!";
                    cin>>opt;
                }
                if(opt==0)
                {
                    cout<<"查询学生信息完成!"<<endl;
                    break;
                }
            }else
            {
                cout<<"学生学号输入不正确,无对应院系编号!无法查询!"<<endl;
            }
        }
}
}
bool cmpAve(Student&s1,Student&s2) //自定义排序函数
{
    return s1.aveScore>s2.aveScore;
}
bool cmpSum(Student&s1,Student&s2)
{
    return s1.sumScore>s2.sumScore;
}
void StudentList::calList()
{
    while(true)
    {
        system("cls");
        cout<<"--------欢迎来到统计学生信息功能界面--------"<<endl;
        cout<<"-------------------------"<<endl;
        cout<<" 1.统计男生女生数量 "<<endl;
        cout<<" 2.按照平均分排序学生 "<<endl;
        cout<<" 3.按照总分排序学生 "<<endl;
        cout<<" 4.返回主菜单界面 "<<endl;
        cout<<"-------------------------"<<endl;
        cout<<"请输入功能序号[1/2/3/4]:";
        int n;
        Student stu;
        cin>>n;
        while(n!=1&&n!=2&&n!=3&&n!=4){
            cout<<"没有该功能序号,请重新输入!";
            cin>>n;
        }
        if(n==1)
        {
            int b=0,g=0;
            stuList[0].showStuHeader();
            for(int i=0;i<stuList.size();i++)
            {
                if(stuList[i].gender=="女")
                {
                    g++;
                    stuList[i].showStuInfo();
                }
            }
            cout<<endl;
            cout<<"女生共有:"<<g<<"名"<<endl;
            stuList[0].showStuHeader();
            for(int i=0;i<stuList.size();i++) //遍历学生列表
            {
                if(stuList[i].gender=="男")
                {
                    b++;
                    stuList[i].showStuInfo(); //输出男生信息
                }
            }
            cout<<"男生共有:"<<b<<"名"<<endl;;


        }else if(n==2)
        {
            sort(stuList.begin(),stuList.end(),cmpAve);//按照平均分降序排序
            cout<<"按照平均分降序排序如下:"<<endl;
            this->showList();

        }else if(n==3)
        {
            sort(stuList.begin(),stuList.end(),cmpSum);//按照总分降序排序
            cout<<"按照总分升序排序如下:"<<endl;
            this->showList();

        }else
        {
            cout<<"学生信息统计完成!"<<endl;
            break;
        }
        system("pause"); //按任意键继续
    }
}
void StudentList::clearList()
{
    while(true)
    {
        system("cls");
        cout<<"--------欢迎来到清空学生信息功能界面--------"<<endl;
        cout<<"-------------------------"<<endl;
        cout<<" 1.确认清空所有学生信息 "<<endl;
        cout<<" 2.返回主菜单界面 "<<endl;
        cout<<"-------------------------"<<endl;
        cout<<"请输入功能序号[1/2]:";
        int n;
        Student stu;
        cin>>n;
        while(n!=1&&n!=2){
            cout<<"没有该功能序号,请重新输入!";
            cin>>n;
        }
        if(n==1)
        {
            stuList.clear();//清空容器
            cout<<"清空学生信息成功!"<<endl;
            system("pause"); //按任意键继续
            writeFile();
        }else
        {
            cout<<"清空学生信息完成!"<<endl;
            break;
        }
    }
}
void StudentList::disStuInfo()
{
    Student stu;
    cout<<"-----------------------"<<endl;
    stu.showStuHeader();
    cout<<"-----------------------"<<endl;
    for(int i=0;i<stuList.size();i++)
    {
        cout<<"";
        stuList[i].showStuInfo();
    }
    cout<<"-----------------------"<<endl;
}
void StudentList::disSubInfo()//成绩信息展示
{
    Subject sub;
    cout<<"-----------------------"<<endl;
    cout<<"";
    cout<<left<<setw(10)<<"姓名";
    cout<<left<<setw(12)<<"学号";
    sub.showSubHeader();
    cout<<"-----------------------"<<endl;
    for(int i=0;i<stuList.size();i++)
    {
        for(int j=0;j<stuList[i].subs.size();j++) //遍历每个学生的课程
        {

            cout<<left<<setw(10)<<stuList[i].stuName;
            cout<<left<<setw(12)<<stuList[i].stuNum;
            stuList[i].subs[j].showSubInfo();
        }
        cout<<"-----------------------"<<endl;
    }
}

void StudentList::showList()
{

        system("cls");
        cout<<"--------欢迎来到显示学生信息功能界面--------"<<endl;
        cout<<" 1.学生基本信息表 "<<endl;
        this->disStuInfo();
        cout<<"--------------------------------------------------------------------------------------------------"<<endl;
        cout<<" 2.学生成绩信息表 "<<endl;
        this->disSubInfo();
        system("pause"); //按任意键继续
}
void StudentList::init()
{
    //初始化
    readFile();
}
void StudentList::readFile()
{
    //读取文件
    ifstream ifs;
    ifs.open("stuList.txt",ios::in);
    int n=0;//学生数量
    ifs>>n;
    for(int i=0;i<n;i++)
    {
        Student s;
        ifs>>s.stuNum>>s.stuName>>s.gender>>s.graNum>>s.classNum>>s.major;
        for(int j=0;i<s.subSum;j++)
        {
            Subject sub;
            ifs>>sub.subName>>sub.score;
            s.subs.push_back(sub);
        }
        stuList.push_back(s);
    }
    ifs.close();
}
void StudentList::writeFile()
{
    //写入文件
    ofstream ofs;
    ofs.open("stuList.txt",ios::out);
    ofs<<stuList.size()<<endl;//学生数量
    for(int i=0;i<stuList.size();i++)
    {

        ofs<<stuList[i].stuNum<<" "<<stuList[i].stuName<<" "<< stuList[i].gender<<" "
        <<stuList[i].graNum<<" "<<stuList[i].classNum<<" "<<stuList[i].major<<endl;
        for(int j=0;j<stuList[i].subs.size();j++)
        {

            ofs<<stuList[i].subs[j].subName<<" "<<stuList[i].subs[j].score<<endl;
        }

    }
    ofs.close();
}
#include <iostream>
#include"Student.h"
#include"Subject.h"
#include"StudentList.h"
using namespace std;

int main()
{
    StudentList stuList;
    stuList.init();
    stuList.menu();
    return 0;
}

数字时钟Date类的设计与实现

要求:

创建一个 24 小时制的 Date 类,包含数据成员:时、分、秒。
1 )给出构造函数,根据形参初始化 Date 对象,如 Date(9,35,20)
2 )给出自增 1 秒的方法,注意 59 秒、 59 59 秒、 23:59:59 等特殊时间。
3 )给出输出方法,按 : : 的格式输出,每个属性占 2 位宽度,不足两位补 0 。如零
点,应表示为 00:00:00
4 )主程序中模拟不少于 12 小时的数字时钟,按秒变化,可参考如下主函数定义
#include <cstdlib>
#include <ctime> //Sleep()函数使用
using namespace std;
int main(){
Date my_clock(11,13,56);
for (int i=1;i<=50000;i++){ //模拟5万秒
my_clock.update(); // 自增1秒
my_clock.display(); // 时钟显示变化
Sleep(1000); // 下一秒
}
return 0;
}
//数字时钟类
#pragma once
#include<iomanip>
#include<iostream>
using namespace std;
class Date
{
    public :
        int hour;
        int minute;
        int second;
    public :
        Date();
        Date(int hour,int minute,int second);
        void update(); //自增一秒
        void display();//时钟显示变化

};
#include"Date.h"

Date::Date(){};//无参构造函数
Date::Date(int hour,int minute,int second)
{
    this->hour=hour;
    this->minute=minute;
    this->second=second;//有参构造函数
}
void Date::update()
{
    int sum=hour*3600+minute*60+second+1;//时间转化成秒
    if(sum>=3600*24)
    {
        //超过一天
        sum-=3600*24;
    }
    hour=sum/3600;
    minute=(sum%3600)/60;//拿到新的分钟
    second=(sum%3600)%60;
}
void Date::display()
{
    cout<<setfill('0')<<setw(2)<<hour<<":";//2位宽度,不足两位补0
    cout<<setfill('0')<<setw(2)<<minute<<":";
    cout<<setfill('0')<<setw(2)<<second<<endl;
}

日历Calendar类设计与实现

要求:

创建一个日历 Calendar 类,包含数据成员:年、月、日、星期。
1 )给出构造函数,根据形参初始化 Calendar 对象,如 Calendar(2023,11,20,"Mon")
2 )给出自增 1 天的方法,注意每个月的最后一天、每年的最后一天等特殊时间。
3 )给出输出函数,按 / / 年 星期几 的格式输出,每个属性占 4 位宽度,不足补空格。
4 )主程序中模拟支持跨年变化的数字日历,按天变化。
#include<string>
#include<iostream>
using namespace std;
class Calendar
{
  //日历类
  public :
      int year;
      int month;
      int day;
      string week;  //年月日星期
  public :
    Calendar();
    Calendar(int year,int month,int day,string week);
    void update();//自增一天
    void display();//展示日历
    bool checkLeap(int y);//看是否是闰年
    bool checkWeek();//看输入的星期是否正确
    string changeInt(int n);//把数字转成星期
    int monDay(int month);//返回月份对应的天
};
#include<iomanip>
#include"Calendar.h"
Calendar::Calendar(){};
Calendar::Calendar(int year,int month,int day,string week)
{
    this->year=year;
    this->month=month;
    this->day=day;
    checkWeek(); //根据形参初始化对象
}
bool Calendar::checkLeap(int y)
{
    if(y%400==0||(y%4==0&&y%100!=0))
    {
        return true;//是闰年
    }
    return false;//不是闰年
}
string Calendar::changeInt(int n)
{
    switch(n)
    {
    case 0:
        return "Sun";
    case 1:
        return "Mon";
    case 2:
        return "Tus";
    case 3:
        return "Wed";
    case 4:
        return "Thr";
    case 5:
        return "Fri";
    case 6:
        return "Sat";
    default:
        return "Error";
    }
}
int Calendar::monDay(int month)
{
    switch(month)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        return 31;
    case 4:
    case 6:
    case 9:
    case 11:
        return 30;
    }
}
bool Calendar::checkWeek()
{
    int ty=year;
    int tm=month;
    int td=day;
    int sum=0;//计算总天数
    while(ty>2000)
    {
        if(checkLeap(ty))
        {
            sum+=366;
        }else
        {
            sum+=365;
        }
        ty--;
    }
    while(tm>1)
    {
        if(tm==2)
        {
            sum+=29;
        }else
        {
            sum+=monDay(tm);
        }
        tm--;//加月份对应的天数
    }
    sum+=day-1;//计算出与2000.1.1相距多少天
    sum+=6;//一开始周六
    string tw=changeInt(sum%7);//真实星期
    if(week!=tw)
    {
        cout<<"星期输入不正确,已经自动更改为正确的星期:"<<tw<<endl;;
    }
    week=tw;//修改为真实星期
    return tw==week;//判断星期是否正确
}
void Calendar::update()
{
    int md;
    int st;//一开始星期对应的数字
    for(int i=0;i<7;i++)
    {
        if(this->changeInt(i)==week)
        {
            st=i;
        }
    }
    week=this->changeInt((st+1)%7);//星期几更新
    if(month!=2)
    {
        md=monDay(month);//这个月有多少天
    }else
    {
        md=28+checkLeap(this->year);
    }
    if(md==day)
    {
        //月份最后一天
        if(month==12)
        {
            //12月最后一天
            year++;
            month=1;
            day=1;
        }else
        {
            month++;
            day=1;
        }
    }else
    {
        day++;
    }
}
void Calendar::display()
{
    cout<<setw(4)<<setfill(' ')<<day<<"/";
    cout<<setw(4)<<setfill(' ')<<month<<"/";
    cout<<setw(4)<<setfill(' ')<<year<<"/";
    cout<<setw(4)<<setfill(' ')<<week<<endl;
}

#include <cstdlib>
#include <ctime>
#include<windows.h>//Sleep函数使用
#include"Calendar.h"
using namespace std;
int main(){
    Calendar my_calendar(2023,12,1,"Mon");
    for (int i=1;i<=2000;i++){ //模拟2000天
        my_calendar.update(); // 自增1天
        my_calendar.display(); // 日历显示变化
        Sleep(1000); // 下一秒
    }
    return 0;
}

分数类Rational类的设计与实现

要求:

创建一个 Rational 类,表示分数形式的有理数,包含数据成员:分数名(字符串)、分子和分
( 整数 )
1 )给出构造函数,支持以形参方式对分数对象进行初始化。
2 )给出私有函数 Simplify() ,实现分数化简。
3 )给出输出信息的方法,要求调用 Simplify() 函数,按 分数 name: 分子 fz/ 分母 fm” 的形式输
出最简分数。
4 )给出输入属性的方法,从键盘输入分数的名称、分子和分母信息。
5 )给出成员方法 Multi Div Add Sub 函数,计算两个分数相乘、相除、相加和相减。
6 )给出成员函数 Small() 比较两个分数的大小。
7 )创建一个动态分数数组,对若干个分数实现从大到小排序,分数的个数和输入方式不限
定。
//分数类设计
#include<string>
#include<iostream>
using namespace std;
class Rational
{
    public :
        string name;//分数名
        int fz;//分子
        int fm;//分母
    public :
        Rational();
        Rational(string name,int fz,int fm);//有参构造函数
        void printInfo();//输出信息
        void inputInfo();//输入信息
        Rational Multi(Rational&r);//两个分数相乘
        Rational Div(Rational&r);//两个分数相除
        Rational Add(Rational&r);//两个分数相加
        Rational Sub(Rational&r);//两个分数相减
        bool Small(Rational&r);//比较两个分数大小
    private:
        void Simplify();//分数化简

};

#include"Rational.h"
Rational::Rational(){};
Rational::Rational(string name,int fz,int fm)
{
    this->name=name;
    this->fz=fz;
    this->fm=fm;
}
int gcd(int a,int b)
{
    return a%b==0? b:gcd(b,a%b);//求最大公约数
}
void Rational::Simplify()
{
    int m=gcd(fz,fm);
    fz/=m;
    fm/=m;//化简
}
void Rational::printInfo()
{
    Simplify();
    cout<<"分数"<<name<<":"<<fz<<"/"<<fm<<endl;//指定形式输出
}
void Rational::inputInfo()
{
    cout<<"请输入分数名:";
    cin>>name;
    cout<<"请输入分子:";
    cin>>fz;
    cout<<"请输入分母:";
    cin>>fm;
}
Rational Rational::Multi(Rational&r)
{
    Rational r1;
    r1.fz=fz*r.fz;
    r1.fm=fm*r.fm;
    cout<<"分数相乘:"<<endl;
    r1.printInfo();//输出化简后的相乘结果
    return r1;
}
Rational Rational::Div(Rational&r)
{
    Rational r1;
    r1.fz=fz*r.fm;
    r1.fm=fm*r.fz;
    cout<<"分数相除:"<<endl;
    r1.printInfo();
    return r1;
}
Rational Rational::Add(Rational&r)
{
    Rational r1;
    r1.fz=fz*r.fm+fm*r.fz;
    r1.fm=fm*r.fm;//通分相加
    cout<<"分数相加:"<<endl;
    r1.printInfo();
    return r1;
}
Rational Rational::Sub(Rational&r)
{
    Rational r1;
    r1.fz=fz*r.fm-fm*r.fz;
    r1.fm=fm*r.fm;//通分相减
    cout<<"分数相减:"<<endl;
    r1.printInfo();
    return r1;
}
bool Rational::Small(Rational &r)
{
    Rational r1;
    r1=Sub(r);//两个分数相减
    if(r1.fz*r1.fm>=0)
    {
        return false;//前者更大或者相等
    }else
    {
        return true;
    }
}
#include <iostream>
#include"Rational.h"
#include<vector>
#include<algorithm>
using namespace std;
bool comp(Rational&r1,Rational&r2)
{
    return ~r1.Small(r2);//从大到小排序
}
void printList(vector<Rational>r_List)
{
    for(int i=0;i<r_List.size();i++)
    {
        r_List[i].printInfo();
    }
}
int main()
{
    vector<Rational> r_List;//动态分数数组
    Rational r1;
    Rational r2;
    Rational r;

    r1.inputInfo();
    r2.inputInfo();
    r1.printInfo();
    r2.printInfo();
    r=r1.Add(r2);

    r=r1.Sub(r2);

    r=r1.Multi(r2);

    r=r1.Div(r2);

    r_List.push_back(r1);
    r_List.push_back(r2);
    r_List.push_back(r);
    sort(r_List.begin(),r_List.end(),comp);
    printList(r_List);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值