[c++]类和对象常见题目详解
本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。
💓博主csdn个人主页:小小unicorn
⏩专栏分类:C++
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识
类和对象
- 1.求1+2+3+…+n
- 2.计算一年的第几天
- 3.日期差值
- 4.打印日期
- 5. 日期累加
1.求1+2+3+…+n
题目来源:求1+2+3+…+n
题目描述:
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例:
输入:5
返回值:15
分析:
若是只看题目不管要求,这是一道非常简单的题目,我们有好几种方式可以得出最终结果,但加上题目限制条件,可能大多数博友都懵了。
我们来捋一捋:
1、不能使用乘除法,等差数列求和公式不能用了。
2、不能使用for、while,循环求解不能用了。
3、不能使用switch、case和A?B:C,递归求解也不能用了。
思路:
这道题用常规的方式确实解决不了,因为题目把我们要用到的东西都限制死了。解决这道题之前我们需要知道:当一个对象被创建的时候,该对象会自动调用其默认构造函数。
我们需要计算的是1-n这n个数的和,那么我们可以创建n个类对象,这样就可以调用n次构造函数,这就相当于代替了递归。每次需要被加的数都比上一次被加的数大一,我们可以借助于类的静态成员变量,在构造函数中设置该静态成员变量自增即可实现。特别注意,这里必须是静态成员变量,不能是普通的成员变量,因为每个对象被创建时都有属于自己的普通成员变量,而静态成员变量是属于整个类的,这样才能使得这n次调用构造函数时自增的是同一个变量,每个对象访问到的静态成员变量是同一个。同理,存储累加结果的变量也必须是静态成员变量。
class Add
{
public:Add() //构造函数{_num++;_ret += _num;}static int _num; //静态成员变量,存储正在累加的数字static int _ret; //静态成员变量,存储1+2+3+...+n的结果
};
//静态成员变量的定义
int Add::_num = 0;
int Add::_ret = 0;
class Solution
{
public:int Sum_Solution(int n) {//多个测试用例,可能会多次调用,做好初始化工作//防止第二个测试用例的结果是在第一个测试用例的基础上继续累加得到的Add::_num = 0;Add::_ret = 0;Add* p = new Add[n]; //为n个Add类对象申请空间(可调用n次构造函数)return Add::_ret; //返回1+2+3+...+n的结果}
};
代码中为了可以通过类名和类的访问限定符直接突破类域,进而访问到静态成员变量,于是把类的成员变量直接设置为了公有(public)。我们知道,将类的成员变量设置为公有是不安全的,对此,我们可以使用友元类来解决该问题。
class Add
{friend class Solution; //声明Solution是Add的有元类
public:Add() //构造函数{_num++;_ret += _num;}
private:static int _num; //静态成员变量,存储正在累加的数字static int _ret; //静态成员变量,存储1+2+3+...+n的结果
};
//静态成员变量的定义
int Add::_num = 0;
int Add::_ret = 0;
class Solution {
public:int Sum_Solution(int n) {//多个测试用例,可能会多次调用,做好初始化工作//防止第二个测试用例的结果是在第一个测试用例的基础上继续累加得到的Add::_num = 0;Add::_ret = 0;Add* p = new Add[n]; //为n个Add类对象申请空间(可调用n次构造函数)return Add::_ret; //返回1+2+3+...+n的结果}
};
代码中我们将Solution声明为Add的友元类,这样Solution类的成员函数就可以访问Add中的非公有成员了。但在某种意义上来说,使用友元是破坏了封装的,使得Solution类的独立性降低了。
实际上,访问类中的静态成员变量最标准的方法是通过静态成员函数,我们可以通过定义静态成员函数来获取静态成员变量,或是对静态成员变量进行修改。
class Add
{
public:Add() //构造函数{_num++;_ret += _num;}static void Init() //对静态成员变量进行初始化{_num = 0;_ret = 0;}static int Getret() //获取静态成员变量_ret{return _ret;}
private:static int _num; //静态成员变量,存储正在累加的数字static int _ret; //静态成员变量,存储1+2+3+...+n的结果
};
//静态成员变量的定义
int Add::_num = 0;
int Add::_ret = 0;
class Solution
{
public:int Sum_Solution(int n) {//多个测试用例,可能会多次调用,做好初始化工作//防止第二个测试用例的结果是在第一个测试用例的基础上继续累加得到的Add::Init();//Add arr[n];Add* p = new Add[n]; //为n个Add类对象申请空间(可调用n次构造函数)return Add::Getret(); //返回1+2+3+...+n的结果}
};
2.计算一年的第几天
题目来源:计算日期到天数转换
题目描述:
根据输入的日期计算是这一年的第几天。
示例:
输入:2021 7 18
输出:199
思路:
计算某日期是该年的第几天,也就是计算从该年的1月1日到该日期一共有多少天。计算总天数时,我们可以先按照平年的天数进行计算,这样一来每个月的天数都是固定的,然后再判断所给日期是否为3月及以上,因为此时才需要考虑是否为闰年,若日期为3月及以上并且为闰年,则将之前得到的总天数+1作为最终的总天数。
#include <iostream>
using namespace std;
int main()
{int year, month, day;cin >> year >> month >> day; //输入日期int daysArray[13] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; //daysArray[i]表示1月-i月的总天数(默认2月为28天)int totalDay = daysArray[month - 1] + day; //总天数if ((month > 2) && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) //如果所给日期为3月及以上,并且该年为闰年{totalDay += 1; //总天数+1(2月29日)}cout << totalDay << endl; //输出总天数,即该日期为该年的第几天return 0;
}
实现二:
#include <iostream>using namespace std;
int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int main()
{int y, m, d;cin >> y >> m >> d;//输入年月日int sum = 0;for (int i = 1; i < m; i++) { //加每月的天数sum += month[i - 1];}sum += d; //加日数if (((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) &&m > 2) //闰年并且月份大于2,则加一sum++;cout << sum << endl;return 0;
}
3.日期差值
题目来源:日期差值
题目描述:
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定它们之间的天数为两天。
示例:
输入:19700101
20210718
输出:18827
思路:
根据所给的两个日期,分别得到两个日期的年、月、日,然后先计算出这两个日期年相差的天数,得到的值减去第一个日期当年的天数,再加上第二个日期当年的天数即可,但是题目规定:如果两个日期是连续的,那么题目之间的天数为两天。这意味着我们需要计算的日期差值为闭区间 [date1, date2],所以输出结果时需要再加上1。
//日期差值
#include <iostream>
using namespace std;
//判断是否为闰年
bool IsLeapYear(int year)
{return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
int main()
{int date1, date2; //存储两个日期int year1, year2, month1, month2, day1, day2; //存储两个日期的年、月、日int ret = 0; //存储两个日期的差值int dayArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //dayArray[i]代表i月的天数(平年)while (cin >> date1 >> date2) //多组测试数据{//确保第一个日期比第二个日期小if (date1 > date2){int tmp = date1;date1 = date2;date2 = tmp;}//根据两个日期得到其年、月、日year1 = date1 / 10000, year2 = date2 / 10000;day1 = date1 % 100, day2 = date2 % 100;month1 = date1 % 10000 / 100, month2 = date2 % 10000 / 100;//计算年相差的天数for (int year = year1; year < year2; year++){if (IsLeapYear(year))ret += 366;elseret += 365;}auto getCurYearDays = [&dayArray](int year, int month, int day)->int{int total = 0;for (int i = 1; i < month; i++) {total += dayArray[i];if (i == 2 && IsLeapYear(year))total++;}return total + day;};//减去date1当年的天数int days1 = getCurYearDays(year1, month1, day1);ret -= days1;//加上date2当年的天数int days2 = getCurYearDays(year2, month2, day2);ret += days2;ret++; //结果为闭区间[date1, date2],所以需要再加1cout << ret << endl;}return 0;
}
4.打印日期
题目来源:打印日期
题目描述:
给出年份m和一年中的第n天,计算出第n天是几月几号。
示例:
输入:2021 100
输出:2021-04-10
思路:
根据得到的年份判断该年是否为闰年,从而得到该年每月的准确天数。设置月份从1月开始,判断所给总天数是否大于该年该月的总天数,若大于,则将总天数减去该月的总天数后作为新的总天数,然后将月份加一,继续进行判断;若小于,则结束判断,输出日期即可。
#include <iostream>
using namespace std;
int main()
{int year, day;int dayArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //dayArray[i]代表i月的天数(平年)while (cin >> year >> day) //多组测试数据{int month = 1; //month从1月开始if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) //判断该年是否为闰年dayArray[2] += 1; //闰年2月为29天//使日期合法while (day > dayArray[month]){day -= dayArray[month];month++;}printf("%d-%02d-%02d\n", year, month, day); //按格式输出}return 0;
}
5. 日期累加
题目来源:日期累加
题目描述:
设计一共程序能计算一个日期加上若干天后是什么日期。
输入描述:
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述:
输出m行每行按yyyy-mm-dd的格式输出。
示例:
输入:2
2021 7 18 100
2021 1 1 100
输出:2021-10-26
2021-04-11
思路:
先将需要累加的天数加到“日”上,然后通过不断的迭代使得日期合法,迭代过程如下:判断“日”是否大于该年该月的总天数,若大于,则将“日”减去该月的总天数后作为新的“日”,然后将月份加一,继续进行判断;若小于,则结束判断,输出日期即可。需要注意:每次月份加一后需要判断“年”是否需要进位,若需要进位还需判断进位后的年是否为闰年。
#include <iostream>
using namespace std;
//判断是否为闰年
bool IsLeapYear(int year)
{return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
int main()
{int m, year, month, day, n;int dayArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //dayArray[i]代表i月的天数(平年)cin >> m; //读取样例个数for (int i = 0; i < m; i++){cin >> year >> month >> day >> n; //读取年、月、日和需要累加的天数if (IsLeapYear(year))dayArray[2] = 29; //闰年2月设置为29天day += n; //先将需要累加的天数加到“日”上//使日期合法while (day > dayArray[month]){day -= dayArray[month];month++;if (month == 13) //“年”需要进位{year++;month = 1;//判断新的一年是否为闰年if (IsLeapYear(year))dayArray[2] = 29; //闰年2月设置为29天elsedayArray[2] = 28; //平年2月设置为28天}}printf("%d-%02d-%02d\n", year, month, day); //按格式输出}return 0;
}
相关文章:
[c++]类和对象常见题目详解
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...
【c++】类和对象(五)赋值运算符重载
🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章带大家认识赋值运算符重载,const成员,取地址及const取地址操作符重载等内容 目录 1.赋值运算符重载1.1运算符重载1.1.1特性&#…...
密码学基础-对称密码/公钥密码/混合密码系统 详解
密码学基础-对称密码/公钥密码 加解密说明1.加密解密必要因素加密安全性说明 什么是对称密码图示说明对称密码详解什么是DES?举例说明 什么是3DES什么是AES? 公钥密码什么是RSA? 对称密钥和公钥密码优缺点对比对称密码对称密码算法总结对称密码存在的问题? 公钥密码公钥密码…...
《装饰器模式(极简c++)》
本文章属于专栏- 概述 - 《设计模式(极简c版)》-CSDN博客 模式说明: 方案: 装饰类和派生类同根,然后装饰类中放一个派生类,以在接口不动的情况下增加功能优点: 可以灵活地扩展对象功能…...
Spring Boot 整合分布式搜索引擎 Elastic Search 实现 自动补全功能
文章目录 ⛄引言一、分词器⛅拼音分词器⚡自定义分词器 二、自动补全查询三、自动补全⌚业务需求⏰实现酒店搜索自动补全 四、效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,…...
实现一个Google身份验证代替短信验证
最近才知道公司还在做国外的业务,要实现一个登陆辅助验证系统。咱们国内是用手机短信做验证,当然 这个google身份验证只是一个辅助验证登陆方式。看一下演示 看到了嘛。 手机下载一个谷歌身份验证器就可以 。 谷歌身份验证器,我本身是一个基…...
Spring框架与Spring Boot的区别和联系
引言 Spring框架和Spring Boot都是Java生态中最受欢迎的开源框架,它们各自扮演着不同的角色,帮助开发者构建高效的企业级应用。本教程将从零基础的角度出发,让你轻松理解这两者的区别和联系。 Spring框架简介 Spring框架,简称Spri…...
[OpenCV学习笔记]Qt+OpenCV实现图像灰度反转、对数变换和伽马变换
目录 1、介绍1.1 灰度反转1.2 图像对数变换1.3 图像伽马变换 2、效果图3、代码实现4、源码展示 1、介绍 1.1 灰度反转 灰度反转是一种线性变换,是将某个范围的灰度值映射到另一个范围内,一般是通过灰度的对调,突出想要查看的灰度区间。 S …...
【大数据】Flink学习笔记
文章目录 认识FlinkDocker安装Flink基本概念Flink的特点Flink 和 Spark Streaming 对比 基本使用WordCount实现依赖 批模式代码流模式代码网络流模式代码在web UI上提交代码创建项目[^1]编写代码配置打包在Web UI上提交 Flink 架构系统架构核心概念并行度算子链(Opeartor Chain…...
社交网络的未来:Facebook如何塑造数字社交的下一章
引言 社交网络已成为我们生活中不可或缺的一部分,而Facebook作为其领军者,一直在塑造着数字社交的未来。本文将深入探讨Facebook在未来如何塑造数字社交的下一章,并对社交网络的发展趋势进行展望和分析。 1. 引领虚拟社交的潮流 Facebook将…...
RabbitMQ 延时消息实现
1. 实现方式 1. 设置队列过期时间:延迟队列消息过期 死信队列,所有消息过期时间一致 2. 设置消息的过期时间:此种方式下有缺陷,MQ只会判断队列第一条消息是否过期,会导致消息的阻塞需要额外安装 rabbitmq_delayed_me…...
【Django】枚举类型数据
模型 在模型里主要增加两项内容: 枚举表字段增加choices class Snort(CoreModel):PAGE_TYPE_CHOICES [(1, 失陷主机检测), # 1是保存到数据库里的数据,失陷主机检测是显示在前端的(2, 远程漏洞攻击检测),(3, 可疑流量行为),(4, WEB检测),]page_type…...
java实现https连接总是要报no cipher suites in common
遇到“no cipher suites in common”这样的错误通常意味着客户端和服务器之间没有共同支持的加密套件(Cipher Suite)。这个问题可能由多个原因引起,包括但不限于SSL/TLS配置错误、Java安全策略限制、客户端或服务器不支持的加密算法等。解决这…...
[C++初阶] 爱上C++ : 与C++的第一次约会
🔥个人主页:guoguoqiang 🔥专栏:我与C的爱恋 本篇内容带大家浅浅的了解一下C中的命名空间。 在c中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称…...
STM32技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案
文章目录 一、简易刷卡式打卡考勤系统(一)功能简介原理图设计程序设计 哔哩哔哩: https://www.bilibili.com/video/BV1NZ421Y79W/?spm_id_from333.999.0.0&vd_sourcee5082ef80535e952b2a4301746491be0 一、简易刷卡式打卡考勤系统 &…...
module ‘numpy‘ has no attribute ‘int‘
在 NumPy 中,如果遇到了错误提示 "module numpy has no attribute int",这通常意味着正在尝试以错误的方式使用 NumPy 的整数类型。从 NumPy 1.20 版本开始,numpy.int 已经不再是一个有效的属性,因为 NumPy 不再推荐使用…...
MFC(一)搭建空项目
安装MFC支持库 创建空白桌面程序 项目相关设置 复制以下代码 // mfc.h #pragma once #include <afxwin.h>class MyApp : public CWinApp { public:virtual BOOL InitInstance(); };class MyFrame : public CFrameWnd { public:MyFrame();// 消息映射机制DECLARE_…...
OKCC的API资源管理平台怎么用?
API资源管理平台,重点是“资源”管理平台,不是API接口管理平台。 天天讯通推出的API资源管理平台,类似昆石的VOS系统,区别是VOS是SIP资源管理系统,我们的API资源管理平台是API资源管理系统(AXB、AX、回拨AP…...
CentOS 7 安装python 3.7 需要必要的依赖。
在 CentOS 7 上部署 Python 3.7 可以通过源代码编译安装来实现。以下是大致的步骤: 安装必要的依赖: bashCopy Code sudo yum install gcc openssl-devel bzip2-devel libffi-devel 下载 Python 3.7 源代码并进行编译安装: bashCopy Code wg…...
美术馆设计方案优化布局与设施提升观众体验!
如今,美术馆不仅仅是作为展示艺术作品的平台,也是吸引公众参与和创造独特体验的数字艺术体验空间,因此许多传统美术馆在进行翻修改造时,都会更加注重用户体验,并在其中使用大量的多媒体互动,让参观者能够在…...
数据库基础原理
宏观 数据库的实现原理分为四个部分: 网络通信 网络协议 硬盘存储 内存分配 微观 硬盘存储 数据库是持久化的,而持久化如何实现的,我们不难想到磁盘可以持久化存储,所以数据库所有持久化的数据都是以文件形式存在磁盘中的…...
Pandas操作MultiIndex合并行列的Excel,写入读取以及写入多余行及Index列处理,插入行,修改某个单元格的值,多字段排序
Pandas操作MultiIndex合并行列的excel,写入读取以及写入多余行及Index列处理,多字段排序尽量保持原来的顺序 1. 效果图及问题2. 源码参考 今天是谁写Pandas的 复合索引MultiIndex,写的糊糊涂涂,晕晕乎乎。 是我呀… 记录下&#…...
工作总结5
1.taro框架使用map标签出现的错误 这个问题困扰很长时间,在频繁切换页面渲染的时候出现左边不显示,我理解的是变量没有到达map标签的属性上,那我就想是不是setState太慢了,然后又用了变量,本地缓存等,都没有…...
速通汇编(二)汇编mov、addsub指令
一,mov指令 mov指令的全称是move,从字面上去理解,作用是移动(比较确切的说是复制)数据,mov指令可以有以下几种形式 无论哪种形式,都是把右边的值移动到左边 mov 寄存器,数据&#…...
软考 - 系统架构设计师 - 构件组装技术
概念 构件组装是将库中的构件经修改后相互连接,或者将它们和当前开发项目中的软件元素进行连接,最终构成新的目标构件。 构件组装技术是基于构件的软件开发的核心技术,也是构件技术研究的重点和难点。构件组装的目的是利用现有的构件组装成新…...
2010年之前电脑ubuntu安装nvidia驱动黑屏处理
装好驱动 仿真fps直接到60Hz 陈旧设备 都是非常老旧的电脑,没钱换新电脑,就这么穷…… 电脑详细配置: 冲动 想装显卡驱动提升一下性能,结果……黑了 黑习惯了也无所谓,几分钟就能解决,关键还是太穷&…...
类与对象中C++
加油!!! 文章目录 前言 一、类的6个默认成员函数 编辑 二、构造函数 1.概念 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 拷贝构造函数典型调用场景 五、赋值运算符重载 1.运算符重载 2.赋值运算符重载 赋值运算符重载格式…...
k8s 集群重启报错:The connection to the server 192.168.92.26:6443 was refused
[rootk8s-master ~]# kubectl get node The connection to the server 192.168.92.26:6443 was refused - did you specify the right host or port?查到是kubelet进程没有启动 [rootk8s-master ~]# systemctl status kubelet ● kubelet.service - kubelet: The Kubernetes …...
国内好用的chatGPT和AI绘图工具
分享一个比较好用的AI 分享一个比较好用的AI,只是需要开通会员,目前官网的价格是:298,开通之后可以使用chatgpt4、AI绘画、图片融合等等!不开通的话是可以免费使用15次的,下面是一些介绍图片!链…...
蚂蚁庄园3.31今日答案春季美食“雷竹笋”之所以得名是因为出笋与打雷有关吗?
蚂蚁庄园是一款爱心公益游戏,用户可以通过喂养小鸡,产生鸡蛋,并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料,使用鸡饲料喂鸡之后,会可以获得鸡蛋,可以通过鸡蛋来进行爱心捐赠。其中&#…...
外链工具下载/谷歌关键词排名优化
1. 随机森林使用背景 1.1 随机森林定义 随机森林是一种比较新的机器学习模型。经典的机器学习模型是神经网络,有半个多世纪的历史了。神经网络预测精确,但是计算量很大。上世纪八十年代Breiman等人发明分类树的算法(Breiman et al. 1984&…...
网站的按钮怎么做 视频/网络营销的策划流程
在几个月之前,我在Firefox浏览器中发现了一个安全漏洞,这个漏洞就是CVE-2019-17016。在分析这个安全漏洞的过程中,我发现了一种新技术,即利用单一注入点从Firefox浏览器中提取CSS数据。在这篇文章中,我将跟大家详细介绍…...
论网站建设情况/百度怎么投放广告
一、基本原理 1.数据源无关的数据统一操作,LINQ语句做了一个程序语句到各种数据源之间的抽象统一中间件。where开始,select或group结束. order 和group,select new等各种语句 。 2.用了拓展方法,在generic枚举类型来做࿰…...
怀化网页/优化设计五年级下册语文答案
光标移动移动到单词的最前面:option ←移动到单词最末尾:option →将当前行代码移动到上一行:option ↑将当前行代码移动到下一行:option ↓移动到当前行最前面:cmd ←移动到当前行最末尾:cmd →花括…...
发布网站建设需求的经验/色盲测试图第六版及答案大全
离我上次写的随笔到现在一年了, 日子真的好快. 又一年了. 一看内我收获了什么呢? 好像没有...... 有的只是现在以一年来到底做了什么的遗憾...... 转载于:https://www.cnblogs.com/Jeffrey/archive/2007/05/12/744125.html...
wordpress数据库主机填什么/营销技巧和营销方法培训
修复表中的名字 # Write your MySQL query statement below select user_id, CONCAT(Upper(left(name, 1)), Lower(substring(name, 2))) name from Users order by user_id;使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NU…...