本文主要是介绍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位宽度,不足两位补0cout<<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;
}
这篇关于HNU程序设计 类和对象练习(小班)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!