学生类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;
}