[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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.03.19 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | RoboSense 速腾聚创2024届春招启动&#xff08;内推&#xff09; 校招 | RoboSense 速腾聚创2024届春招启动&#xff08;内推&#xff09; 2、实习 | 百度智能驾驶事业群组 202…

kanzi 3d知识点

整理学习资料 名字链接Kanzi视频合集中科创达-智能座舱视频专辑-中科创达-智能座舱视频合集-哔哩哔哩视频 (bilibili.com)Kanzi在线文档Working with … - Kanzi framework 3.9.7 documentationThe Book of ShadersThe Book of Shaders着色器语言Shader_着色语言Shading Langua…

Vim - 文本编辑器 Vi vs Vim

你是否应该在学习 Vim 之前先学习 Vi&#xff0c;这完全取决于您自己、您的要求以及您的具体目标和需求。Vim 是 Vi 的扩展、增强和改进版本&#xff0c;它包括 Vi 的所有功能以及许多附加功能。 简约&#xff1a; Vi 设计简约。先学习 Vi 可以让你对基础知识有扎实的了解&…

malloc是如何分配内存|malloc(1)分配多大内存|free释放内存,会还给操作系统吗?

前言 大家好&#xff0c; 我jiantaoyab&#xff0c;这篇文章给大家介绍mallo和free面试中常问到的问题。 malloc是如何分配内存的&#xff1f; 如果用户分配的内存小于128KB&#xff0c;则通过brk()申请内存 如果用户分配的内存大于128KB&#xff0c;则通过mmap()申请内存 简…

数据分析之POWER Piovt的KPI设置

内容总结&#xff1a; 1.两个表格关联不上&#xff1a;需要添加辅助列&#xff0c;建立关联 2.添加辅助列后还关联不上&#xff1a;将虚线变为实线 3.根据需求要增加一些度量值 4.设置KPI后&#xff0c;绝对值选1后设定百分比 5.在透视表里面加入KPI状态 导入所关联的数据后建立…

游戏领域AI智能视频剪辑解决方案

游戏行业作为文化创意产业的重要组成部分&#xff0c;其发展和创新速度令人瞩目。然而&#xff0c;随着游戏内容的日益丰富和直播文化的兴起&#xff0c;传统的视频剪辑方式已难以满足玩家和观众日益增长的需求。美摄科技&#xff0c;凭借其在AI智能视频剪辑领域的深厚积累和创…

SQLBolt,一个练习SQL的宝藏网站

知乎上有人问学SQL有什么好的网站&#xff0c;这可太多了。 我之前学习SQL买了本SQL学习指南&#xff0c;把语法从头到尾看了个遍&#xff0c;但仅仅是心里有数的程度&#xff0c;后来进公司大量的写代码跑数&#xff0c;才算真真摸透了SQL&#xff0c;知道怎么调优才能最大化…

数据可视化之折线图plot

import matplotlib.pyplot as plt plt.rcParams[font.family] [SimHei]# 查看matplotlibde文件地址# import matplotlib # print(matplotlib.matplotlib_fname()) # plt.rcParams[font.sans-serif] [SimHei] # 准备数据time [20200401,20200402,20200403,20200404,20200405…

SpringBoot登录校验(三)

​​​​​​​SpringBoot 登录认证&#xff08;一&#xff09;-CSDN博客 SpringBoot 登录认证&#xff08;二&#xff09;-CSDN博客 SpringBoot登录校验&#xff08;三&#xff09;-CSDN博客 前面我们介绍了传统的会话跟踪技术cookie和sesstion&#xff0c;本节讲解令牌技术…

Ubuntu20.04LTS+uhd3.15+gnuradio3.8.1源码编译及安装

文章目录 前言一、卸载本地 gnuradio二、安装 UHD 驱动三、编译及安装 gnuradio四、验证 前言 本地 Ubuntu 环境的 gnuradio 是按照官方指导使用 ppa 的方式安装 uhd 和 gnuradio 的&#xff0c;也是最方便的方法&#xff0c;但是存在着一个问题&#xff0c;就是我无法修改底层…

Spel 表达式

模板占位替换&#xff0c;在项目开发中&#xff0c;还是很常用的。比如在代码中获取参数&#xff0c;消息推送可以使用变量占位&#xff0c;我比较推荐使用 SPEL 表达式。 在注解中&#xff0c;获取方法的参数 public class SpElParser {private static final ExpressionPars…

基于机器视觉的智能物流机器人的设计与开发

标题&#xff1a;基于机器视觉的智能物流机器人的设计与开发 摘要&#xff1a; 随着电子商务和物流行业的快速发展&#xff0c;智能物流机器人作为一种高效、准确的自动化解决方案&#xff0c;正逐渐受到广泛关注。本文围绕基于机器视觉技术的智能物流机器人的设计与研发展开&…

HarmonyOS实战开发-如何实现一个简单的电子相册应用开发

介绍 本篇Codelab介绍了如何实现一个简单的电子相册应用的开发&#xff0c;主要功能包括&#xff1a; 实现首页顶部的轮播效果。实现页面跳转时共享元素的转场动画效果。实现通过手势控制图片的放大、缩小、左右滑动查看细节等效果。 相关概念 Swiper&#xff1a;滑块视图容…

java多线程中的阻塞队列

一、普通不阻塞队列 还记得队列我们如何实现吗&#xff1f;我们用的是循环队列的方式&#xff0c;回一下&#xff1a; 描述&#xff1a;开始tail和head指针都指向最开始位置&#xff0c;往里面添加元素tail&#xff0c;出元素head 初始状态&#xff1a; put元素后状态 take…

账号微服务短信验证码发送工具单元测试

账号微服务短信验证码发送工具单元测试 注意sms的 app-code #----------sms短信配置-------------- sms:app-code: dd7829bedfaf4373875aa91abba82523template-id: JM1000372package net.xdclass.config;import org.springframework.context.annotation.Bean; import org.spri…

ROS 2边学边练(4)-- 何为主题(topics)

概念 主题是一种节点间的通信方式&#xff0c;某个节点充当发布特定&#xff08;主题&#xff09;消息&#xff08;数据&#xff09;的角色&#xff0c;另外一些节点则可以订阅接收该特定&#xff08;主题&#xff09;消息&#xff08;数据&#xff09;。两者&#xff0…

在ubuntu上搭建系统监控系统

大纲 数据生产方安装和运行验证 数据收集、存储和分发方下载和解压修改配置运行验证 数据消费方下载和运行验证新增数据源新增看板关联看板和数据源效果展现 参考资料 在一个监控系统中&#xff0c;一定会有“数据生产方”和“数据消费方”存在。“数据生产方”用于产出需要监控…

Android MediaRecorder

AndroidManifest.xml中添加权限标记 <uses-permission android:name"android.permission.RECORD_AUDIO"/> 动态添加权限MainActivity requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO},100); 创建MediaReco…

Go build 交叉编译-实现多平台兼容

【前言】 本章主要讲的是go程序如何兼容各种架构系统以及架构之间的区别 直接上干货&#xff0c;直接执行下面的指令&#xff0c;将GOOS&#xff08;平台&#xff09;和GOARCH&#xff08;架构&#xff09;就可以解决大部分架构兼容问题 GOOSlinux GOARCHamd64 go build test.g…

使用Asible自动化Linux管理任务

自动化与 Linux 系统管理 多年来&#xff0c;大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用检查清单、其他文档或记忆的例程来执行标准任务。 这样的做法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上出错。对步骤…