当前位置: 首页 > news >正文

【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑

作者:chlorine

专栏:c++专栏

赋值运算符重载(+)(+=)(++):实现完整的日期类(上)

我走的很慢,但我从不后退。

【学习目标】

  • 日期(- -= --)天数重载运算符
  • 日期-日期 返回天数
  • 对日期类函数进行优化(不符合常理的日期,负数,const成员)
  • c++中重载输入cin和输出cout运算符
  • const成员

首先我要对上面一篇类和对象(上)进行补充,上一篇主要内容

  • '=' 赋值运算符重载
  • '<'  '='  '>'  '<='  '>='  '!=' 重载运算符
  • '前置++' '后置++’ 重载运算符

相信大家对于operator的运用以及重载运算符有了一定的了解。本次博客我会继续深化赋值运算符重载的内容,并对各函数进行优化处理。


目录

🔑'—' '-='重载运算符

🔑前置--,后置-- 

 🔑日期-日期=天数

🔑+=(-=)负数 (优化)

🔑C++中重载输入cin和输出cout运算符

🌈重载输入cin运算符>> 

🌈重载输入cout运算符<<

🔑不符合常理的日期(优化)

🔑const成员(优化)

🌈const对于+=和+ 

🌈const对于d1<d2?和d1>d2

🕶️完整代码

🚩Date.h

🚩Date.cpp

🚩test.cpp


🔑'—' '-='重载运算符

我们不只局限于对未来的计算,虽然以前的日子已经一去不复返。如果我们想知道100天是哪一天?该如何操作呢?上面的图片今天是2023年11月18日,一百天前是2023年8月10日,这是该如何计算呢?

11月已经被-100了,这里要+上的是10月份的天数。

计算过程如图所示。我们可以根据上面思路进行写代码。

主要思路:先将日-100,然后如果是负数就进入循环 ,月份-1,就可以得到在此基础上的上一个月的天数,然后我们还要考虑一个情况,就是如果月份=0,我们就要追溯到上一年的12月开始。代码如下:

Date &Date::operator-=(int day)
{_day-=day;while(_day<=0){--_month;if(_month==0){_month=12;--_year;}    _day+=GetMonthDay(_year,_month);}return *this;
}

 那么-重载运算符和+重载运算符一个道理,不能改变原来的值,就创建一个临时变量tmp,保留d1原来的值,然后返回tmp.

依旧使用-复用-=的方法.

Date Date::operator-(int day)
{Date tmp(*this);tmp -=day;return tmp;
}

🔑前置--,后置-- 

前置--后置--和前置++后置++的用法是一样的

  • 前置--:返回的减之后的值。
  • 后置--:返回的减之前的值,需要用拷贝构造创建 一个临时变量tmp来保存原来的值。并且后置--重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递  。
//前置--返回的是减之后的值
Date& Date::operator--()
{*this -= 1;return *this;
}//后置--返回的是减之前的值
Date Date::operator--(int)
{Date tmp = *this;*this -= 1;return tmp;
}

 🔑日期-日期=天数

我想计算一下自己的生日和今天相差多少天?我该如何用代码实现呢?

 第一种思路:

  • 我们可以与小的日期和大的日期的年份设置成一样的,然后就可以利用 《月和日对齐,利用年判断润平年,闰年一年多少天,平年一年的多少天,相加)
  • 然后算出了2003-10-29~~~2023-10-29相差多少天,然后 《年对齐,利用获得每个月的天数进行相加》

思路的俩个步骤,比较于直接减方便多了。

第二种思路:

  • d1-d2   我们先假设d1是小min日期,d2是大max日期,如果我的猜测不对,就将min赋值给d2,max赋值给d1。我们要用flag=1或-1来记录,如果(小-大就得乘以-1)(大-小就得乘以1)
  • 小的数如果一直++是可以与大的数持平的,我们就进行一个循环直到min=max的时候结束,过程中min一直++,用n来记下min一直+的次数,n的值就是天数。

代码如下:

int Date::operator-(const Date& d)
{Date max = *this;Date min = d;int flag = 1;if (*this<d){min = *this;max = d;flag = -1;}int n = 0;while (min != max){++min;++n;}return n*flag;
}

计算机的效率是可以完成循环多次的。 


🔑+=(-=)负数 (优化)

图中不管是+还是-都是成立的对于day是正是负都是可以计算的。 

day+= -100;

 大家有没有想过如果day是负数呢?上面的代码运行的结果是什么呢?

这时候我们该如何优化呢?

 d1+= -day 是不是相当于 d1-=day?   那么就可以复用-=重载运算符。

这样对嘛,d1+= -100,本来是看以前的日子的,怎么算到2024了?这里我们就要考虑到数学的知识了。 *this是d1 ,d1-=day ,day是-100,那么负负得正, 就成了d1+=day,所以我们需要在day前面加个负号,即d1-= -day。 -day=100,所以 d1-=100 与 d1+=-100 等式成立。

Date& Date::operator+=(int day)
{if (day < 0){return *this -= day;}_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month >= 13){++_year;_month = 1;}}return *this;
}

​ 

同理:d1-= -100,看100天后的日期,那么就相当于负负得正,d1+=100,那么用到-=函数里就是  d1+=-day.

Date& Date::operator-=(int day)
{if (day < 0){return *this += -day;}_day -= day;while (_day <= 0){--_month;if (_month== 0){_month = 12;--_year;}_day+= GetMonthDay(_year, _month);}return *this;
}

 


🔑C++中重载输入cin和输出cout运算符

c++系统实现了一个庞大的类的库,如下图所示。其中ios为基类,其他类都直接或间接派生自ios类.

  • cin和cout可以直接输入和输出内置类型(如int、double等)和部分标准自定义类型(如string等),原因是标准库已经将所有这些类型的输入和输出重载了,直接使用即可。

  •  对于我们自定义的类型,如果想直接使用cin、cout来输入输出,需要自己重载>>和<<,否则不能直接使用。

在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。如果自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以Date类为例来演示输入输出运算符的重载。

cout << _year << "-" << _month << "-" << _day << endl;//输出形式
cin>>_year>>_month>>_day; //输入形式

cout是ostream类的对象,cin是istream类的对象,要想达到这个目标,就必须以全局函数(友元函数)的形式重载<<和>>,否则就要修改标准库中的类,这显然不是我们所期望的。

🌈重载输入cin运算符>> 

全局函数的形式重载>>,

//cin重载
istream& operator>>(istream& _in, Date& d)
{_in >> d._year >> d._month >> d._day;return _in;
}

注意:运算符重载函数中用到了Date类的private 成员变量,必须在Date类中将该函数声明为友元函数,如下例所示:

friend istream & operator>> (istream &_in,Date &d);


🌈重载输入cout运算符<<

同样地,也可以模仿上面的形式对输入运算符>>进行重载,让它能够输出,请看下面的代码:

//cout重载
ostream& operator<<(ostream& _out, const Date& d)
{_out << d._year << "-" << d._month << "-" << d._day << endl;return _out;
}

ostream表示输出流,cout是ostream类的对象。由于采用了引用的方式进行参数传递,并且也返回了对象的引用,所以重载后的运算符可以实现连续输出。

为了能够直接访问Date类的private成员变量,同样需要将该函数声明为complex类的友元函数
friend ostream & operator<< (ostream &out, complex &A);


友元函数的声明:


我们有没有观察到

​ 

​ 

为什么输入重载里面的参数不加,而输出相反。

——输入年月日,如果输入流不能修改,那么就没办法进行输入了,输出在输入之后了,它保留着日期,是不能被修改的。

在这之前加coonst也是编译不过的,因为流入和流出的过程取它们其中的值也是需要改变它的状态值,所以输出输入都是不能加const的。 提取完了之后要改变其中内部的状态值的。

输入输出重载运算符代码如下:

//cin重载
istream& operator>>(istream& _in, Date& d)
{_in >> d._year >> d._month >> d._day;return _in;
}//cout重载
ostream& operator<<(ostream& _out, const Date& d)
{_out << d._year << "-" << d._month << "-" << d._day << endl;return _out;
}


 我们继续优化吧~


🔑不符合常理的日期(优化)

这个日期符合常理嘛?显然是不符合的。所有的对象是构造出来的,所以我们再构造的时候加一些检查~

  • 第一种:直接打印出“非法日期”
  • 第二种:直接断言报错(暴力法)

既然输出流对于不合理的日期进行了检查,那么输入呢?

输入非法日期之后,是可以直接通过的,那我们就得给流输入进行检查。

//cin重载
istream& operator>>(istream& _in, Date& d)
{//第一种写法_in >> d._year >> d._month >> d._day;if (d._month > 0 && d._month < 13&& d._day>0 && d._day <= d.GetMonthDay(d._year, d._month)){}else{//cout << "非法日期" << endl;assert(false);}return _in;//第二种写法:int year, month, day;_in >> year >> month >> day;if (month > 0 && month < 13&& day>0 && day <= d.GetMonthDay(year, month)){d._year = year;d._month = month;d._day = day;}else{//cout << "非法日期" << endl;assert(false);}
}

一共俩种写法,第二种更灵活。


🔑const成员(优化)

const 修饰的 成员函数 称之为 const 成员函数 const 修饰类成员函数,实际修饰该成员函数 隐含的 this 指针 ,表明在该成员函数中 不能对类的任何成员进行修改。

如何让权限平移或者缩小呢?我们只需要给Date*this改成const Date*this就可以了。

我们不能动this的类型,因为它是隐含的是无法动的,那么如何将类型改成const使权限不放大呢?所以祖师爷就直接再函数后面加个const就可以了。

这里加个const 修饰的是*this。const Date* this我们之前就复习了const,这里const修饰的类型是Date,修饰的内容是*this。

重点:成员函数后面加const以后,普通和const对象都可以调用(权限的平移和权限的缩小)。


🌈const对于+=和+ 

那我们所写的所有成员函数都能加个const嘛?

——当然不是,要修改的对象成员变量函数不能加

比如+=成员函数后面加个const。

_day===》this->day,const修饰的是this指向的内容,指向的内容都不能修改如何+=呢?——肯定不行。那么+呢?

+不会改变我自己,我们上面说了成员函数后面加const以后,普通和const对象都可以调用(权限的平移和权限的缩小)。(只要不改变成员变量都可以加)

所以我们看看还有什么可以加const?


🌈const对于d1<d2和d1>d2?

 

为什么d1<d2可以,d2<d1不可以呢?

这里就考虑到了权限的放大缩小平移问题了,d2是const显然传过去就是权限的放大,当然是不可以的。所以最好的方式就是给这些成员函数都加const。

结论:只要成员函数内部不修改成员变量,就应该加const,这样const对象和普通对象都可以调用。

这些成员函数都可以后面加const,因为按上面的结论,就是不修改内部成员变量。


🕶️完整代码

🚩Date.h

#pragma once
#include<iostream>
#include<assert.h>
using namespace std;
class Date
{//友元函数的声明friend ostream& operator<<(ostream& _out, const Date& d);friend istream& operator>>(istream& _in, Date& d);
public:int GetMonthDay(int year, int month){int array[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}else{return array[month];}}void print() const{cout << _year << "-" << _month << "-" << _day << endl;}Date(int year = 2003, int month = 10, int day = 5);Date& operator=(const Date& d);bool operator==(const Date& d)const;bool operator>(const Date& d)const;bool operator>=(const Date& d)const;bool operator<(const Date& d)const;bool operator<=(const Date& d)const;bool operator!=(const Date& d)const;//日期+天数Date operator+(int day) const;Date& operator+=(int day);// 日期-天数Date operator-(int day)const;//自己不能改变。但是返回之后的结果Date& operator-=(int day);//前置++Date&operator++();//后置++Date operator++(int);//前置--Date& operator--();//后置--Date operator--(int);//日期-日期int operator-(const Date& d)const;private:int _year;int _month;int _day;
};

🚩Date.cpp

#include<iostream>
using namespace std;#include"Date.h"Date::Date(int year, int month, int day)
{if (month>0&&month<13&&day>0&&day<=GetMonthDay(year,month)){_year = year;_month = month;_day = day;}else{//cout << "非法日期" << endl;assert(false);}
}//赋值运算符重载
Date& Date::operator=(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;return (*this);
}bool Date::operator==(const Date& d)const
{return _year == d._year&& _month == d._month&& _day == d._day;
}bool Date::operator>(const Date& d)const
{if (_year > d._year){return true;}else if (_year == d._year && _month > d._month){return true;}else if (_year == d._year && _month == d._month && _day >d._day){return true;}else{return false;}
}bool Date::operator>=(const Date& d)const
{return *this > d || *this == d;
}bool Date::operator<(const Date& d)const
{return !(*this>=d);
}bool Date::operator<=(const Date& d)const
{return !(*this > d);
}bool Date::operator!=(const Date& d)const
{return !(*this == d);
}+=复用+
//Date& Date::operator+=(int day)
//{
//	*this = *this + day;
//	return *this;
//}
//
//Date Date::operator+(int day)
//{
//	Date tmp(*this);
//	tmp._day += day;
//	while (tmp._day > GetMonthDay(tmp._year, tmp._month))
//	{
//		tmp._day -= GetMonthDay(tmp._year, tmp._month);
//		++tmp._month;
//		if (tmp._month >= 13)
//		{
//			++tmp._year;
//			tmp._month = 1;
//		}
//	}
//	return tmp;
//}//+复用+=
Date Date::operator+(int day)const
{Date tmp(*this);tmp += day;return tmp;
}//d1+=100
Date& Date::operator+=(int day)
{if (day < 0){return *this -= -day;}_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month >= 13){++_year;_month = 1;}}return *this;
}//前置++返回的是加之后的值
Date &Date::operator++()
{*this += 1;return *this;
}//后置++返回的是加之前的值
Date Date::operator++(int)
{Date tmp = *this;*this += 1;return tmp;
}//前置--返回的是减之后的值
Date& Date::operator--()
{*this -= 1;return *this;
}//后置--返回的是减之前的值
Date Date::operator--(int)
{Date tmp = *this;*this -= 1;return tmp;
}Date Date::operator-(int day)const
{Date tmp(*this);tmp -=day;return tmp;
}Date& Date::operator-=(int day)
{if (day < 0){return *this += -day;}_day -= day;while (_day <= 0){--_month;if (_month== 0){_month = 12;--_year;}_day+= GetMonthDay(_year, _month);}return *this;
}int Date::operator-(const Date& d)const
{Date max = *this;Date min = d;int flag = 1;if (*this<d){min = *this;max = d;flag = -1;}int n = 0;while (min != max){++min;++n;}return n*flag;
}//cin重载
istream& operator>>(istream& _in, Date& d)
{//第一种写法_in >> d._year >> d._month >> d._day;if (d._month > 0 && d._month < 13&& d._day>0 && d._day <= d.GetMonthDay(d._year, d._month)){}else{//cout << "非法日期" << endl;assert(false);}return _in;//第二种写法:int year, month, day;_in >> year >> month >> day;if (month > 0 && month < 13&& day>0 && day <= d.GetMonthDay(year, month)){d._year = year;d._month = month;d._day = day;}else{//cout << "非法日期" << endl;assert(false);}
}//cout重载
ostream& operator<<(ostream& _out, const Date& d)
{_out << d._year << "-" << d._month << "-" << d._day << endl;return _out;
}

🚩test.cpp

#include"Date.h"void TestDate1()
{Date d1(2003, 10, 5);Date d2(2003, 11, 5);int ret=d1 > d2;int ret2 = d1 == d2;int ret3 = d1 < d2;int ret4 = d1 >= d2;cout << ret3 << endl;
}void TestDate2()
{Date d1(2003, 11, 14);Date d2=d1 +100;//运用拷贝构造创建一个临时变量tmp,将*this的值给tmp,*this的值不改变,tmp值改变,//从而导致了d1+day,d1不变,tmp改变。返回d1原来的值。//d1 +=100;//d1 += 100;d2.print();/*d1++;d1.print();++d1;d1.print();*/
}void TestDate3()
{Date d1(2023, 11, 17);Date d2=d1 -100;d2.print();
}void TestDate4()
{Date d1(2023, 11, 17);//d1--;//后置--返回的是之前的值、--d1;//前置--返回的是之后的值d1.print();
}void TestDate5()
{Date d1(2023, 11, 17);Date d2(2003, 10, 29);cout << d1-d2<< endl;cout << d2 - d1<< endl;
}void TestDate6()
{Date d1(2023, 11, 17);d1.print();/*d1 += -100;d1.print();*/d1 -= -100;d1.print();
}void TestDate7()
{//Date d1(2023, 11, 17);//d1 += 100;流插入//cout << d1;//operator<<(cout, d1);Date d1(2023, 11, 17);Date d2(2003, 10, 29);cin >> d1 >> d2;cout << d1 << d2;/*Date d4(2023, 13, 1);cout << d4;*/}void TestDate8()
{Date d4(2023,13,1);cin>>d4;cout << d4;
}void TestDate9()
{Date d1(2023, 11, 17);const Date d2(2023, 11, 17);d1 < d2;d2 < d1;//d1 + 100;//d1普通对象//d2 + 100;//const对象
}int main()
{//TestDate1();//TestDate2();//TestDate3();//TestDate4();//TestDate5();//TestDate6();//TestDate7();//TestDate8();TestDate9();return 0;
}

我走的很慢,但我从不后退。

相关文章:

【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑

作者:chlorine 专栏:c专栏 赋值运算符重载()()():实现完整的日期类(上) 我走的很慢&#xff0c;但我从不后退。 【学习目标】 日期(- - --)天数重载运算符 日期-日期 返回天数 对日期类函数进行优化(不符合常理的日期&#xff0c;负数&#xff0c;const成员)c中重载输入cin和输…...

开源与闭源:大模型时代的技术交融与商业平衡

一、开源和闭源的优劣势比较 1.1 开源 优势&#xff1a; 1.技术共享与吸引人才&#xff1a; 开源促进了技术共享&#xff0c;吸引了全球范围内的人才参与大模型的发展&#xff0c;形成了庞大的开发者社区。 2.推动创新&#xff1a; 开源模式鼓励开发者共同参与&#xff0c;推动…...

C#开发的OpenRA游戏之属性BodyOrientation(6)

C#开发的OpenRA游戏之属性BodyOrientation(6) 在顶层定义里会发现这个属性: ^SpriteActor: BodyOrientation: QuantizeFacingsFromSequence: RenderSprites: SpriteActor是用来定义角色的基本属性,它的第一个属性就是BodyOrientation,这个属性主要用来描述角色的身体的…...

Linux shell编程学习笔记27:tputs

除了stty命令&#xff0c;我们还可以使用tput命令来更改终端的参数和功能。 1 tput 命令的功能 tput 命令的主要功能有&#xff1a;移动更改光标、更改文本显示属性&#xff08;如颜色、下划线、粗体&#xff09;&#xff0c;清除屏幕特定区域等。 2 tput 命令格式 tput [选…...

【计算机网络笔记】IPv6简介

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

c语言-数据结构-堆

目录 一、二叉树 1、二叉树的概念 2、完全二叉树和满二叉树 3、完全二叉树的顺序存储 二、堆 2、堆的概念与结构 3、堆的创建及初始化 4、堆的插入&#xff08;小堆&#xff09; 5、堆的删除 6、显示堆顶元素 7、显示堆里的元素个数 8、测试堆的各个功能 9、 实现堆…...

ROS基础—关于参数服务器的操作

1、rosparam list 获取参数服务器的所有参数。 2、rosparam get /run_id 获取参数的值...

Sql Server 2017主从配置之:事务日志传送

使用事务日志传送模式搭建Sql Server 2017主从同步&#xff0c;该模式有一定的延迟&#xff0c;是通过3个不同的定时任务&#xff0c;将主库的日志同步到从库进行恢复来实现数据库同步操作。 环境准备 两台服务器&#xff0c;配置都是8g2核&#xff0c;50g硬盘&#xff0c;操…...

每日OJ题_算法_双指针_力扣283. 移动零+力扣1089. 复写零

力扣283. 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例…...

WebGl-Blender:建模 / 想象成形 / Blender概念词汇表 / 快捷键

一、理解Blender 欢迎来到Blender&#xff01;Blender是一款免费开源的3D创作套件。 使用Blender&#xff0c;您可以创建3D可视化效果&#xff0c;例如建模、静态图像&#xff0c;3D动画&#xff0c;VFX&#xff08;视觉特效&#xff09;快照和视频编辑。它非常适合那些受益于…...

【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

仿射变换是一种二维变换&#xff0c;它可以将一个二维图形映射到另一个二维图形上&#xff0c;保持了图形的“形状”和“大小”不变&#xff0c;但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示&#xff0c;该矩阵包含了六个参数&#xff0c;可以进行平移…...

WPF实现右键菜单

在WPF中&#xff0c;创建上下文菜单&#xff08;通常称为“右键菜单”&#xff09;是通过使用ContextMenu控件来实现的。你可以在XAML中声明上下文菜单&#xff0c;并将其关联到任何FrameworkElement。以下是如何在WPF中实现上下文菜单的基本步骤&#xff1a; 1. 在XAML中定义…...

Java智慧工地SaaS管理平台源码:AI/云计算/物联网

智慧工地是指运用信息化手段&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析&#xff0c;提供过程趋势预测及专家预案&#xff0c;实现工程…...

【漏洞复现】通达oa 前台sql注入

漏洞描述 通达OA(Office Automation)是一款企业级协同办公软件,旨在为企业提供高效、便捷、安全、可控的办公环境。它涵盖了企业日常办公所需的各项功能,包括人事管理、财务管理、采购管理、销售管理、库存管理、生产管理、办公自动化等。通达OA支持PC端和移动端使用,可以…...

机器学习笔记 - Ocr识别中的文本检测EAST网络概述

一、文本检测 文本检测简单来说就是找到图像中可以出现文本的区域。例如,请参见下图,其中在检测到的文本周围绘制了绿色边框。 在进行文本检测时,你可能会遇到两种情况 具有结构化文本的图像:这是指具有干净/均匀背景和常规字体的图像。文本大多密集,行结构正确,…...

【SQL server】数据库、数据表的创建

创建数据库 --如果存在就删除 --所有的数据库都存在sys.databases当中 if exists(select * from sys.databases where name DBTEST)drop database DBTEST--创建数据库 else create database DBTEST on --数据文件 (nameDBTEST,--逻辑名称 字符串用单引号filenameD:\DATA\DBT…...

vue的生命周期分别是什么?

Vue的生命周期分为8个阶段&#xff0c;分别是&#xff1a; beforeCreate&#xff1a;实例初始化之后&#xff0c;数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 created&#xff1a;实例已经创建完成后被调用&#xff0c;这时候实例已完成以下的配置&#…...

Java拼图游戏

运行出的游戏界面如下&#xff1a; 按住A不松开&#xff0c;显示完整图片&#xff1b;松开A显示随机打乱的图片。 User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password…...

Vue框架的element组件table文字居中

1.直接上代码 <el-table max-height"500px" :data"datas.roles" style"width: 100%" border :header-cell-style"{textAlign: center}" :cell-style"{ textAlign: center }"><el-table-column prop"id" …...

科技创新 共铸典范 | 江西卫健办邓敏、飞图影像董事长洪诗诗一行到访拓世科技集团,提振公共卫生事业发展

2023年11月15日&#xff0c;拓世科技集团总部迎来了江西省卫健项目办项目负责人邓敏、江西飞图影像科技有限公司董事长洪诗诗一行的考察参观&#xff0c;集团董事长李火亮、集团高级副总裁方高强进行热情接待。此次多方交流&#xff0c;旨在共同探讨携手合作&#xff0c;激发科…...

Linux安装OpenCV并配置VSCode环境

Linux安装OpenCV并配置VSCode环境 安装OpenCV环境安装必需工具下载并解压OpenCV库&#xff08;Opencv Core Modules和opencv_contrib&#xff09;创建构建目录&#xff0c;进行构建验证构建结果安装验证安装结果 配置VSCode环境创建项目文件修改配置信息执行程序 安装环境 Ubun…...

Django(ORM事务操作|ORM常见字段类型|ORM常见字段参数|关系字段|Meta元信息)

文章目录 ORM事务操作什么是事务&#xff1f;事务的产生事务的四大特征ORM中如何使用事务 ORM字段类型常用字段与不常用字段类型ORM还支持用户自定义字段类型 ORM字段参数关系字段ForeignKey外键on_delete参数设置的值 OneToOneField与ForeignKey的区别多对多关系建立的方式ORM…...

【mujoco】Ubuntu20.04配置mujoco210

【mujoco】Ubuntu20.04配置mujoco210 文章目录 【mujoco】Ubuntu20.04配置mujoco2101. 安装mujoco2102. 安装mujoco-py3.使用render时报错Reference 本文简要介绍一下如何在ubuntu20.04系统中配置mujoco210&#xff0c;用于强化学习。 1. 安装mujoco210 在官方资源里找到http…...

【洛谷 P3853】[TJOI2007] 路标设置 题解(二分答案+循环)

[TJOI2007] 路标设置 题目背景 B 市和 T 市之间有一条长长的高速公路&#xff0c;这条公路的某些地方设有路标&#xff0c;但是大家都感觉路标设得太少了&#xff0c;相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题&#xff0c;我们把公路上相邻路标的最大…...

蓝桥杯 vector

vector的定义和特性 注意&#xff1a;vector需要开C11标准 vector的常用函数 push_back():将元素添加到vector末尾 pop_back():删除vector末尾的元素 begin()和end():返回指向vector第一个元素和最后一个元素之后一个位置的迭代器。 示例 vector<int> vec{10,20,30};f…...

ai绘画部署教程

在部署AI绘画Web环境的过程中&#xff0c;你提供了一些关键步骤。以下是一些详细说明&#xff1a; 1. 克隆webui 首先&#xff0c;通过以下命令从GitHub上克隆webui的代码&#xff1a; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 这将下载webui的源…...

策略模式的应用——应对频繁的需求变更

秋招结束后&#xff0c;间接性堕落了一段时间&#xff0c;学习几乎停止下来了。内心甚是焦灼&#xff0c;感觉生活很无趣&#xff01;为了在参加工作后能够快速上手和成为一名优秀的中级开发者&#xff0c;从这篇文章开始将不断学习优秀的编码经验&#xff0c;学习是永无止境的…...

qt-C++笔记之treeWidget初次使用

qt-C笔记之treeWidget初次使用 code review! 文章目录 qt-C笔记之treeWidget初次使用1.运行2.文件结构3.main.cpp4.widget.h5.widget.cpp6.widget.ui7.main.qrc8.qt_widget_test.pro9.options.png 1.运行 2.文件结构 3.main.cpp 代码 #include "widget.h"#include…...

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(八)

FULL OUTER JOIN 除了前面讲到的 INNER JOIN&#xff08;内连接&#xff09;、LEFT JOIN&#xff08;左连接&#xff09;、RIGHT JOIN&#xff08;右连接&#xff09;&#xff0c;还有另外一种关联方式&#xff0c;即 FULL OUTER JOIN&#xff08;全外连接&#xff09; FULL O…...

C语言编程陷阱(八)

陷阱36:不要使用指针作为函数的返回值 有时候,我们可能想要用一个函数来返回一个指针,比如返回一个动态分配的内存,或者返回一个数组的某个元素的地址。但是,如果我们不小心,我们可能会犯一个很常见的错误,就是返回一个局部变量的地址。例如,看看下面的代码: #inclu…...

客户端性能优化实践

背景 双十一大促时&#xff0c;客户客服那边反馈商品信息加载卡顿&#xff0c;在不断有订单咨询时&#xff0c;甚至出现了商品信息一直处于加载状态的情况&#xff0c;显然&#xff0c;在这种高峰期接待客户时&#xff0c;是没法进行正常的接待工作的。 起初&#xff0c;页面一…...

mysql使用--表达式和函数

1.表达式 如&#xff1a;11&#xff0c;一般包含操作数&#xff0c;运算符。 _1.操作数 MYSQL中最常用的操作数有以下几种 (1).常数 (2).列名&#xff0c;针对某个具体的表&#xff0c;它的列名可被当作表达式的一部分 (3).函数调用 一个函数用于完成某个特定的功能。比如NOW()…...

<蓝桥杯软件赛>零基础备赛20周--第6周--数组和队列

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…...

软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?

软件开发、网络空间安全、人工智能这三个方向都是当前及未来的热门领域&#xff0c;每个领域都有各自的就业前景和价值&#xff0c;以下是对这三个方向的分析&#xff1a; 1、软件开发&#xff1a; 就业前景&#xff1a;随着信息化的加速&#xff0c;软件开发的需求日益增长。…...

新增文章分类

pojo.Category package com.lin.springboot01.pojo;import jakarta.validation.constraints.NotEmpty; import lombok.Data;import java.time.LocalDateTime;Data public class Category {private Integer id;//主键NotEmptyprivate String categoryName;//分类名称NotEmptypr…...

选硬币该用动态规划

选硬币&#xff1a; 现有面值分别为1角1分&#xff0c;5分&#xff0c;1分的硬币&#xff0c;请给出找1角5分钱的最佳方案。 #include <iostream> #include <vector>std::vector<int> findChange(int amount) {std::vector<int> coins {11, 5, 1}; /…...

LeetCode 2342. 数位和相等数对的最大和:哈希表

【LetMeFly】2342.数位和相等数对的最大和&#xff1a;哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/max-sum-of-a-pair-with-equal-sum-of-digits/ 给你一个下标从 0 开始的数组 nums &#xff0c;数组中的元素都是 正 整数。请你选出两个下标 i 和 j&…...

Vulkan渲染引擎开发教程 一、开发环境搭建

一 安装 Vulkan SDK Vulkan SDK 就是我们要搞的图形接口 首先到官网下载SDK并安装 https://vulkan.lunarg.com/sdk/home 二 安装 GLFW 窗口库 GLFW是个跨平台的小型窗口库&#xff0c;也就是显示窗口&#xff0c;图形的载体 去主页下载并安装&#xff0c;https://www.glfw.…...

(带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程

源码简介&#xff1a; 1、会员管理&#xff1a; 该系统分为三个级别的会员流程&#xff1a;总站管理员、代理与会员&#xff08;会员有普通会员、中级会员和高级会员三个等级&#xff09;。总站管理员可以添加代理用户并为其充值余额&#xff0c;代理用户可以为普通用户充值余…...

IDEA 快捷键汇总

目录 1、altinsert 2、ctrl/ 3、altenter 4、alt回车 5、ctrlD 6、ctrlaltL 7、ctrl点击 8、alt左键向下拉 9、ctrlaltv 10、ctrlaltwint 1、altinsert 快速创建代码&#xff0c;可以快速创建类中get set tostring等方法 2、ctrl/ 单行注释 3、altenter…...

目标检测YOLO实战应用案例100讲-基于机器视觉的水稻病虫害监测预警

目录 前言 国内外研究现状 国外研究现状 国内研究现状 2 相关理论与技术...

OrthoNets:正交信道注意网络

文章目录 摘要1、简介2、相关工作3、方法4、实验设置及结果5、论述6、结论摘要 链接:https://arxiv.org/pdf/2311.03071v2.pdf 设计有效的通道注意力机制要求人们找到一种有损压缩方法,以实现最佳特征表示。尽管该领域近年来取得了进展,但仍然存在一个未解决的问题。FcaNet…...

C_12练习题

一、单项选择题(本大题共20小题,每小题2分&#xff0c;共40分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案&#xff0c;并将所选项前的字母填写在答题纸的相应位置上。) C 风格的注释&#xff0c;也称块注释或多行注释&#xff0c;以&#xff08;&#xff09;…...

导航守卫有哪三种?

导航守卫主要分为三种&#xff1a; 全局前置守卫&#xff1a;使用 router.beforeEach 注册&#xff0c;作用是在路由切换开始前进行拦截和处理&#xff0c;可以用来进行一些全局的权限校验、登录状态检查等操作。 全局解析守卫&#xff1a;使用 beforeResolve 注册&#xff0c…...

强烈 推荐 13 个 Web前端在线代码IDE

codesandbox.io&#xff08;国外&#xff0c;提供免费空间&#xff09; 网址&#xff1a;https://codesandbox.io/ CodeSandbox 专注于构建完整的 Web 应用程序&#xff0c;支持多种流行的前端框架和库&#xff0c;例如 React、Vue 和 Angular。它提供了一系列增强的功能&…...

网络协议 WebSocket

一、介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输 1、HTTP协议和WebSocket协议对比 HTTP 是短连接WebSocket 是长连接H…...

路径操作 合法路径名

python中路径的三种合法表示&#xff1a;在路径前面加上r、分隔符使用/。 在路径前面加上r python中在前面加上r&#xff0c;是防止字符转义。 例如&#xff1a;这样一个路径&#xff1a; \Undergraduate\School\Programme\Python_Learnpython会将这个字符串的**\和\后面的…...

JavaEE初阶 01 计算机是如何工作的

前言 今天开始进行对JavaEE的一些基本总结,希望大家能在阅读中有所收获,如有错误还望多多指正. 1.冯诺依曼体系结构 这个体系结构相信学计算机的同学都不陌生,但是你真的知道这个体系结构说的是什么嘛?请听我娓娓道来.首先我先给出一张冯诺依曼体系结构的简图 你可以理解为当前…...

【shell 常用脚本30例】

先了解下编写Shell过程中注意事项 开头加解释器&#xff1a;#!/bin/bash语法缩进&#xff0c;使用四个空格&#xff1b;多加注释说明。命名建议规则&#xff1a;全局变量名大写、局部变量小写&#xff0c;函数名小写&#xff0c;名字体现出实际作用。默认变量是全局的&#xf…...

【我和Python算法的初相遇】——体验递归的可视化篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON数据结构与算法学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 递归的起源 什么是递归? 利用递归解决列表求和问题 递归三定律 递归应用-整数转换为任意进制数 递归可视化 画…...