C++结构体之读懂运算符重载

 1、运算符重载

“运算符重载”常用于解决结构体或自定义数据类型的加法、减法等特殊含义的运算。

运算符重载的一般格式为:

        类型名 operator 运算符 (const 类型名 变量)const{      … }

例如:

        worktime operator +(const worktime x)const{      … }

2、例题:作业统计

【问题描述】 为了了解学生的课后作业负担情况,需要统计学生连续若干天完成作业所需的总时间。现在,输入某位学生 n 天完成作业的时间,格式为时、分、秒,最后输出这位学生 n 天完成作业的总时间(秒)。

【输入格式】 第 1 行一个正整数 n,表示有 n 天; 第 2~ 第 n+1 行,每行 3 个整数,分别代表时、分、秒。

【输出格式】 一行信息,表示这个学生完成作业的总时间,具体格式见输出样例。

【输入样例】 3 1 20 30 1 20 45 1 19 30

【输出样例】 4hour 0minute 45second

程序: 
#include<bits/stdc++.h>  // 引入所有标准库头文件,方便处理各种输入输出、数据结构等
using namespace std;  // 使用标准命名空间,避免每次使用标准库的功能时都加上 "std::"

struct worktime {  // 声明一个结构体类型 worktime,用于记录时间
    int hr, minut, sec;  // hr、minut、sec 分别表示小时、分钟和秒数

    // 重载 + 运算符,使得两个 worktime 对象可以使用 + 运算符进行相加
    worktime operator +(const worktime x) const {
        worktime tmp;  // 创建一个新的 worktime 对象 tmp 用于保存相加结果
        
        // 计算秒数:两个秒数相加后,对60取余得到秒数(如果秒数达到60,就转换为分钟)
        tmp.sec = (sec + x.sec) % 60;
        
        // 计算分钟数:将分钟数和秒数进位的部分加起来,并对60取余
        tmp.minut = (minut + x.minut + (sec + x.sec) / 60) % 60;
        
        // 计算小时数:将小时数、分钟数进位的部分相加
        tmp.hr = hr + x.hr + (minut + x.minut + (sec + x.sec) / 60) / 60;
        
        // 返回计算得到的结果
        return tmp;
    }
};

int main() {  // 主函数,程序从这里开始执行
    worktime stu, sum;  // 声明两个 worktime 类型的变量,stu 用来保存每个学生的时间,sum 用来保存所有学生时间的总和
    int n;  // 声明一个整数 n,用于存储学生人数
    
    cin >> n;  // 输入学生人数 n
    
    sum.hr = sum.minut = sum.sec = 0;  // 初始化 sum 变量,将其时间置为 0(0小时、0分钟、0秒)
    
    for(int i = 1; i <= n; i++) {  // 遍历每个学生的时间
        cin >> stu.hr >> stu.minut >> stu.sec;  // 输入当前学生的小时、分钟和秒数
        
        sum = sum + stu;  // 将当前学生的时间 stu 加到总和 sum 中,利用重载的 + 运算符进行加法操作
    }
    
    // 输出结果,格式化输出总时间:小时、分钟和秒
    cout << sum.hr << " hour " << sum.minut << " minute " << sum.sec << " second ";
    
    return 0;  // 程序正常结束
}
 程序分析:
  1. worktime 结构体

    • 定义了一个结构体 worktime,它用于存储时间(小时、分钟、秒)。
    • operator +:重载了加法运算符,使得 worktime 对象能够直接相加。这使得你可以直接使用 sum = sum + stu; 来计算总时间。重载的加法运算符会处理秒、分钟和小时的进位问题。
  2. 主函数

    • 输入学生人数 n
    • 初始化一个 sum 结构体为 0(0小时、0分钟、0秒)。
    • 循环读取每个学生的时间(小时、分钟、秒),并通过重载的 + 运算符将它们累加到 sum 中。
    • 最后输出累加后的总时间,格式为 小时分钟 和 

具体的加法逻辑:

  • 通过重载的 + 运算符,对 secminut 和 hr 进行加法运算。
  • 每当秒数 sec 的和超过 60 时,它会向分钟 minut 进位,类似的,分钟数也可能进位到小时数。
  • 最终得到的 sum 包含了所有学生时间的总和,输出时按小时、分钟、秒的格式打印。

假设输入如下:

3 
1 20 30
2 40 50
3 15 40

那么 sum 将为:

  • 秒数:30 + 50 + 40 = 120,超过 60,所以分钟进位。
  • 分钟数:20 + 40 + 15 + (120 / 60) = 75,超过 60,所以小时进位。
  • 小时数:1 + 2 + 3 + (75 / 60) = 6。

最终输出将是:

6 hour 15 minute 0 second

这样,通过重载 + 运算符,程序能够很方便地处理时间加法,并正确地处理进位问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值