C++学习之旅【实战全面解析C++类和对象】


🔥承渊政道: 个人主页
❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法初阶》

《C++初阶知识内容》

✨逆境不吐心中苦,顺境不忘来时路! 🎬 博主简介:

引言:前篇文章,小编已经将我所学的C++类和对象的相关知识介绍完了,俗话说的好,温故知新,可以为师矣.那么本篇文章让我们通过做题全面解析C++类和对象,加深自己对知识的理解!废话不多说,带着这些疑问,下面跟着小编的节奏🎵一起学习吧!

目录

1.选择题(全面解析)































2.编程题(全面解析)

2.1计算日期到天数转换

cpp 复制代码
#include <iostream>
using namespace std;
// 判断是否为闰年
bool isLeap(int year) {
    // 闰年规则:能被4整除且不能被100整除,或能被400整除
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
    int year, month, day;
    // 输入年、月、日(需确保输入为合法日期)
    cin >> year >> month >> day;
    int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    // 闰年则修改2月天数为29
    if (isLeap(year)) {
        months[1] = 29;
    }
    // 累加前month-1个月的总天数
    int totalDays = 0;
    for (int i = 0; i < month - 1; ++i) {
        totalDays += months[i];
    }
    totalDays += day;
    // 输出结果
    cout << totalDays << endl;
    return 0;
}

2.2日期差值

cpp 复制代码
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
// 判断闰年
bool isLeap(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 计算date(YYYYMMDD)对应的"当年第几天"
int dateToDayOfYear(int date) {
    int year = date / 10000;
    int month = (date / 100) % 100;
    int day = date % 100;
    int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (isLeap(year)) {
        months[1] = 29;
    }
    int total = 0;
    for (int i = 0; i < month - 1; ++i) {
        total += months[i];
    }
    return total + day;
}
// 计算两个日期(YYYYMMDD)之间的天数差
int dateDiff(int date1, int date2) {
    // 确保date1 <= date2,方便计算
    if (date1 > date2) {
        swap(date1, date2);
    }
    int year1 = date1 / 10000;
    int year2 = date2 / 10000;
    int day1 = dateToDayOfYear(date1);
    int day2 = dateToDayOfYear(date2);
    int total = 0;
    // 处理中间完整的年份
    for (int y = year1 + 1; y < year2; ++y) {
        total += isLeap(y) ? 366 : 365;
    }
    // 处理year1剩余的天数 + year2已过的天数
    if (year1 == year2) {
        total = day2 - day1 + 1; // 同一年,直接相减+1(如12到22是11天)
    } else {
        int daysInYear1 = isLeap(year1) ? 366 : 365;
        total += (daysInYear1 - day1 + 1) + day2;
    }
    return total;
}
int main() {
    int date1, date2;
    // 多组输入(直到输入结束)
    while (cin >> date1 >> date2) {
        cout << dateDiff(date1, date2) << endl;
    }
    return 0;
}

2.3打印日期

cpp 复制代码
#include <iostream>
using namespace std;
// 判断是否为闰年
bool isLeap(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
    int y, n;
    // 处理多组输入
    while (cin >> y >> n) {
        // 平年各月天数(索引0对应1月)
        int months[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        // 闰年修改2月天数
        if (isLeap(y)) {
            months[1] = 29;
        }
        int month = 1;
        // 推算月份和日期
        for (; month <= 12; ++month) {
            if (n <= months[month - 1]) {
                break;
            }
            n -= months[month - 1];
        }
        // 按yyyy-mm-dd格式输出(补前导零)
        printf("%04d-%02d-%02d\n", y, month, n);
    }
    return 0;
}

2.4日期累加

cpp 复制代码
#include <iostream>
using namespace std;
// 判断闰年
bool isLeap(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 获取指定年、月的天数
int getDays(int year, 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;
        case 2:
            return isLeap(year) ? 29 : 28;
        default:
            return 0; // 无效月份(实际不会触发)
    }
}
int main() {
    int m;
    cin >> m; // 样例个数
    while (m--) {
        int y, mon, d, add;
        cin >> y >> mon >> d >> add;
        d += add; // 累加天数到"日"
        // 调整日期至合法范围
        while (true) {
            int days = getDays(y, mon);
            if (d <= days) break; // 日合法,退出循环
            d -= days; // 减去当月天数
            mon++;
            if (mon > 12) { // 月份超12,年份进位
                y++;
                mon = 1;
            }
        }
        // 按格式输出
        printf("%04d-%02d-%02d\n", y, mon, d);
    }
    return 0;
}

敬请期待下一篇文章内容-->C++内存管理!


相关推荐
2401_8920709820 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
世人万千丶20 小时前
Flutter 框架跨平台鸿蒙开发 - 恐惧清单应用
学习·flutter·华为·开源·harmonyos·鸿蒙
yuzhuanhei20 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
一轮弯弯的明月20 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
不爱吃炸鸡柳21 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发21 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎21 小时前
STL 栈 队列
开发语言·c++
此刻觐神21 小时前
IMX6ULL开发板学习-01(Linux文件目录和目录相关命令)
linux·服务器·学习
憧憬从前21 小时前
算法学习记录DAY2
学习
2401_8920709821 小时前
【Linux C++ 日志系统实战】高性能文件写入 AppendFile 核心方法解析
linux·c++·日志系统·文件写对象