实验项目五:类和对象&&实验项目六:运算符重载

实验五,课后作业:
1、题目:时间流逝之增加一秒钟。模拟时间的流逝,例如:当前是2020年12月31日23:59:59,时间流逝(即增加一秒钟)后变成2021年1月1日00:00:00。
要求实现(1)Date类和Time类的构造函数;(2)Time类的成员函数void add_a_second(Date &);(3)<<运算符重载函数ostream& operator<<(ostream&, Time&)和ostream& operator<<(ostream&, Date&)(必须按照规定格式输出时间)。
注意:不得修改已有代码;不得再增加其他函数。
提示:在实现add_a_second函数时要注意:增加一秒,可能导致增加一分钟(而秒数需要减少60);而增加一分钟,可能导致增加一小时(而分钟数需要减少60);以此类推,天、月、年都要进行类似地判断和计算。由于不同月份的天数不同,且存在闰年的问题,所以计算月份的时候要考虑当前年份和月份(即以当前年份和月份为参数调用days函数计算该月的天数)。

#include <iostream>
#include <iostream>
#include <fstream>
#include <iomanip>
#define FORMAT setw(2)<<setfill('0')
using namespace std;
int days(int m, int y) { //days函数返回第y年第m月的天数
    int d[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //数组下标从0开始,而月份从1开始,所以给定d[0]=0
    if ((y % 100 == 0 && y % 4 != 0) || (y % 400 == 0)) d[2] = 29; //如果是闰年,则二月份是29天
    return d[m];
}
class Date; //对Date类的提前引用声明
class Time {
public:
    Time(int, int, int);
    void add_a_second(Date&);  //增加1秒,1秒后可能会到了下一天,乃到下一月、下一年
    friend ostream& operator<<(ostream&, Time&); //输出格式:hour:minute:second
    friend void writeToFile(Time&, Date&);
private:
    int hour;
    int minute;
    int sec;
};

class Date {
public:
    Date(int, int, int);
    friend void Time::add_a_second(Date&);
    friend ostream& operator<<(ostream&, Date&); //输出格式:year年month月day日
    friend void writeToFile(Time&, Date&);
private:
    int month;
    int day;
    int year;
};

/********************补充代码实现题目要求***************/

Time::Time(int h, int m, int s)
{
    hour = h;
    minute = m;
    sec = s;
}

void Time::add_a_second(Date& date)
{
    sec++;
    if ((sec - 60) >= 0)  //下面进行简单的判断
    {
        minute++;
        sec = 0;
    }
    if ((minute - 60) >= 0)
    {
        hour++;
        minute = 0;
    }
    if ((hour - 24) >= 0)
    {
        date.day++;
        hour = 0;
    }
    if ((date.day - days(date.month, date.year)) >= 0)
    {
        date.month++;
        date.day = 1;        //不应出现0天
    }
    if ((date.month - 12) >= 0)
    {
        date.year++;
        date.month = 1;   //不应出现0月
    }
}

ostream& operator<<(ostream& out, Time& time) {     //重载
        //输出格式:hour:minute:second
    out << time.hour << ":" << time.minute << ":" << time.sec << endl;
    return out;
}
void writeToFile(Time& time, Date& date)
{
    ofstream outFile("res.txt");
    outFile << date.year << "年" << date.month << "月" << date.day << "日";
    outFile << " " << FORMAT << time.hour << ":" << FORMAT << time.minute << ":" << FORMAT << time.sec << endl;
    outFile.close();
}
Date::Date( int m , int d,int y)
{
    this->month = m;
    this->day = d;
    this->year = y;
}
ostream& operator<<(ostream& out, Date& data) {
    //输出格式:year年month月day日
    out << data.year << "年" << data.month << "月" << data.day << "日\n";
    return out;
}

int main() {
    Time tm(23, 59, 59);
    Date dt(12, 31, 2020);

    tm.add_a_second(dt);
    cout << dt << tm;   //屏幕上的输出是:2021年1月1日(换行)0:0:0
    return 0;
}

2、程序填空:请将Smaple类的声明补全,使程序可以输出9(换行)22(换行)5。
(注意,已有代码不可删除或修改)
代码传送门:https://download.youkuaiyun.com/download/renzemingcsdn/85289836
3、实现一个学生信息处理程序,计算一个学生的四年平均成绩。要求实现一个代表学生的类,并且类中所有成员变量都是【私有的】。
实验六运算符重载
1、 定义复数类(Complex),包含必要的构造函数和析构函数,重载乘法赋值运算符“*=”实现复数与整数、复数与复数之间的乘法运算,自行举例并按照如下格式输出计算结果。(要求使用转换构造函数把整数转换为复数后进行计算)。
输出格式示例:
2、 输入两个2×3的整数矩阵a和b,输出矩阵和。要求:①重载运算符“+”实现两个矩阵相加,②重载流提取运算符“>>”和流插入运算符“<<”实现矩阵的输入和输出,③以2行3列的格式分别输出a、b和矩阵和(矩阵元素用“空格”分隔),例如“ ”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清欢_小铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值