【C++奇妙冒险】日期类Date的实现

文章目录

  • 前言
  • 日期类Date的接口设计
    • 构造函数和打印函数
    • 获取日期并判断日期是否合法
    • 日期类的大小比较关系
      • <运算符重载 判断小于
      • ==运算符重载 判断相等
      • <=运算符重载 判断小于等于
      • >运算符重载 判断大于
      • >= 运算符重载 判断大于等于
      • != 运算符重载 不等于
    • 日期类计算
      • 日期+=天数
      • 日期+天数
      • 日期-=天数
      • 日期-天数
      • 前置++
      • 后置++
      • 前置--
      • 后置--
      • 日期-日期
  • 完整代码
    • Date.h
    • Date.cpp
    • Test.cpp


前言

日期类Date的接口设计

我们把函数的声明放到类中,定义在类的外边,实现声明与定义分离

以下是日期类中所包含的成员函数和成员变量

🗨️Date.h

class Date
{
public:// 判断日期是否合法bool CheckInvalid() const;// 构造函数Date(int year = 1, int month = 1, int day = 1);// 日期类的大小关系比较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;// d1 + 100Date& operator+=(int day);Date operator+(int day) const;// d1 - 100Date operator-(int day) const;Date& operator-=(int day);// ++d1Date& operator++();// 特殊处理:解决语法逻辑不自洽,自相矛盾的问题// d1++// 为了跟前置++区分,强行增加一个int形参,够成重载区分Date operator++(int);Date operator--(int);Date& operator--();// d1 - d2int operator-(const Date& d) const;// 本质就是inlineint GetMonthDay(int year, int month) const{assert(month > 0 && month < 13);static int monthDays[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;}return monthDays[month];}void Print() const{cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};

构造函数和打印函数

函数声明写到Date.h文件中
函数定义写到Date.cpp 中
🗨️Date.h

#include<iostream>
#include<assert.h>
using namespace std;class Date
{
public:// 全缺省构造函数Date(int year = 1, int month = 1, int day = 1);// 打印函数void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};

🗨️Date.cpp

#include"Date.h"// 缺省值在声明和定义中不能同时出现
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}

运行结果

在这里插入图片描述

在上面的代码中,构造函数我们使用全缺省,在调用的时候给了指定日期,通过打印函数把日期打印出来,这里的打印函数可以用const来修饰,const修饰成员函数,不能修改里面状态,而构造函数需要修改成员变量,所以不能加const。

获取日期并判断日期是否合法

比如说,我输入日期:
在这里插入图片描述
我们大家都知道,这日期哪来的13月啊,哪来的32天?是不是很离谱,是不是相当的不合理😅😅😅
所以我们设计一个自动获取日期天数并帮助我们判断该日期是否合法的函数功能。
获取天数int GetMonthDay 我们将该函数封装在类内,方便访问私有成员,提高效率。

注意:内联函数不要声明和定义分离!否则会出现链接错误,所以我们定义在类内

	int GetMonthDay(int year, int month) const{assert(month > 0 && month < 13);static int monthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 判断是否为闰年// 非整百年:能被4整除而不能被100整除的为闰年// 整百年:能被400整除的是闰年。if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return monthDay[month];}

我们将数组设置成13,因为数组下标是从0开始访问的,这样设方便我们返回时直接返回月份。

判断日期是否有效
月数:小于等于0或者大于12就无效
天数:可以依靠我们刚刚写的GetMonthDay函数,获取不同月份的天数,再去判断是否有效。

bool Date::CheckInvalid() const
{if (_year <= 0 || _month < 1 || _month>12 || _day<1 || _day>GetMonthDay(_year, _month)){return false;}else{return true;}
}

利用该函数每次构造日期判断日期是否合法。

Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;if (!CheckInvalid()){cout << "构造非法日期" << endl;}
}

测试:

在这里插入图片描述

日期类的拷贝构造和析构我们可以不写,让编译器自己生成就行了。

日期类的大小比较关系

日期类的大小关系看着挺多,实际上有些是可以复用的,实现了两个剩下的都可以复用
比较日期类的大小是不会修改传入对象的值的,所以我们把比较大小关系的成员函数都加上const修饰

<运算符重载 判断小于

先比较年是否小于,再判断月是否小于,最后判断日是否小于,其中一条满足则返回真true,反之返回假false。
Date.h

	bool operator<(const Date& d) const;

Date.cpp

// d1 < d2
bool Date::operator<(const Date& d) const
{if (_year < d._year){return true;}else if (_year == d._year){if (_month < d._month){return true;}else if (_month == d._month){if (_day < d._day){return true;}}}return false;
}

运行结果

在这里插入图片描述

==运算符重载 判断相等

判断年月日是否都相等
Date.h

	bool operator==(const Date& d) const;

Date.cpp

// d1 == d2
bool Date::operator==(const Date& d) const
{return _year == d._year&& _month == d._month&& _day == d._day;
}

运行结果

在这里插入图片描述

<=运算符重载 判断小于等于

小于等于,即小于或等于,两者满足一个即可
这里就可以展现出复用的魅力了,已知我们已经实现了小于和等于,那小于或等于就不用自己实现了,直接复用
Date.h

bool operator<=(const Date& d) const;

Date.cpp

// d1 <= d2
bool Date::operator<=(const Date& d) const
{return *this < d || *this == d;
}

运行结果

在这里插入图片描述

>运算符重载 判断大于

你也可以用判断语句 if else if 来判断 但是这样太矬了,我们已经实现了小于等于了,那大于不就是非大于等于吗,继续复用!能坐着咱绝不站着🏄‍♀️
Date.h

	bool operator>(const Date& d) const;

Date.cpp

// d1 > d2
bool Date::operator>(const Date& d) const
{return !(*this <= d);
}

运行结果

在这里插入图片描述

>= 运算符重载 判断大于等于

大于等于,即大于或者等于,两者满足一个即可,或者直接非小于(!<)
Date.h

	bool operator>=(const Date& d) const;

Date.cpp
以下两种方法都可

bool Date::operator>=(const Date& d) const
{return *this > d || *this == d;
}

or

// d1 >= d2
bool Date::operator>=(const Date& d) const
{return !(*this < d);
}

运行结果

在这里插入图片描述

!= 运算符重载 不等于

字面意思很好理解,我们实现了等于,直接判断不等于即可
Date.h

	bool operator!=(const Date& d) const;

Date.cpp

// d1 != d2
bool Date::operator!=(const Date& d) const
{return !(*this == d);
}

运行结果

在这里插入图片描述

日期类计算

我们认为,日期+日期是没有意义的,但是+天数就很有意义了,假设我们想计算当前日期+100天之后的日期,+1000天呢何年何月何日?我们下面就来实现这个功能。

日期+=天数

+=运算符重载
在这里插入图片描述
由上图可见,无脑把天数叠上去肯定是不合理的,这里需要用到我们上面实现过的函数 GetMonthDay 了
思路:先将天数加到日(day)上面去,再判断是否合法,是否超出该月的天数,若不合法,则不断调整,直到合法为止。
调整日期步骤:
1.日+天数,若日超出当前月的天数,则日-当前月的天数,然后月+1;
2.若月加满,即超出12,则年+1,然后月重新置为1;
3.不断执行以上步骤进行调整,直到日期合法;
Date.h

	Date& operator+=(int day);

Date.cpp

// d1 += 100
Date& Date::operator+=(int day)
{// 直接加上去,后面再判断_day += day;// 若_day 大于 当前月份的天数,则进循环进行调整while (_day > GetMonthDay(_year, _month)){// _day减去当前月的天数_day -= GetMonthDay(_year, _month);++_month;// 月数+1;// 若月数溢出if (_month == 13){++_year;// 年数+1_month = 1;// 月数置为1}}return *this;
}

运行结果

注意:因为我们传引用返回,传的是d1的别名,实际上我们+=的是d1本身,d1原始值会发生改变,如下测试样例实际上是先加上了10,再把+10后的结果+100,这和我们接下来要讲的+是不一样的。

在这里插入图片描述

验证:此时d1原始数据发生改变

在这里插入图片描述

日期+天数

+运算符重载
对于+运算符来说,我们可以复用刚刚实现的operator+=运算符。
方法一:
先看结果:
Date.h

	Date operator+(int day) const;

Date.cpp

Date Date::operator+(int day) const
{Date tmp = *this;// 拷贝构造,返回tmptmp += day;// 复用operator+=return tmp;
}

运行结果

这里得注意,虽然我们对天数进行了加,并且返回的是加之后的值,但是d1本身并不会发生改变,这便是与+=运算符不同的地方,由代码可见,我们创建了个Date类的临时变量tmp,所以我们改变的是临时变量,并返回临时变量,这里我们还可以用const来修饰一下函数,防止内部改变this指针的指向。
在这里插入图片描述
对于+=和+,这里我们是先实现+=后实现+的,当然也可以先实现+后实现+=,它们有什么区别吗?
实现方法是类似的
我们简单看一下:
方法二:
Date.cpp

// d1 + 100
Date Date::operator+(int day) const
{// Date tmp(*this)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.cpp

Date& Date::operator+=(int day)
{*this = *this + day;return *this;
}

区别:
在这里插入图片描述

日期-=天数

和+=思路一样的,先用日减去需要减的天数day,再判断结果是否合法,若不合法,则进行调整,直到合法为止
步骤:
1若减完结果得负,则像月借,即月-1;
2.如果月减到0,则像年借,年-1;
3.日加上借的天数
4.重复以上步骤,直到日期合法为止;
Date.h

	Date& operator-=(int day);

Date.cpp

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

运行结果

-=和+=一样的会改变d1本身,即改变原始值

在这里插入图片描述

日期-天数

Date.h

	Date operator-(int day) const;

Date.cpp

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

运行结果

在这里插入图片描述
注意:-=运算符的重载采用了引用返回,但是-运算符重载的返回却只能是传值返回,因为-运算符重载函数中的tmp对象出了作用域被销毁了,所以不能用引用返回。

前置++

我们可以服用+=运算符的重载
因为前置++返回的是++之后的值,所以我们使用引用返回
加不加引用就取决于它出了作用域还在不在
Date.h

	Date& operator++();

Date.cpp

// 前置++  ——》d.operator++()
Date& Date::operator++()
{*this += 1;return *this;
}

因为是复用+=,所以++的值就是this,直接返回this即可

运行结果

在这里插入图片描述

后置++

前置++和后置++都operator++,那要怎么让编译器方便识别它们呢,它怎么知道到底是前置++还是后置++。
这里我们要做特殊处理:解决语法逻辑自洽,自相矛盾问题
为了跟前置++区分,强行增加了一个int形参,构成重载区分
Date.h

	Date operator++(int);

Date.cpp

// 后置++
Date Date::operator++(int)
{// Date tmp(*this) 为了能返回++之前的值,所以拷贝构造d1;Date tmp = *this;*this += 1; // 复用+= ,return tmp;
}

运行结果

在这里插入图片描述注意:后置++也是需要返回加之前的值,所以我们用tmp保存之前的值,然后再+1,最后返回tmp,因为tmp是临时对象,出了作用域销毁了,所以后置++只能使用传值返回,前置++可以使用引用返回

前置–

前置–和前置++是一模一样的,参照前置++
Date.h

	// 前置--Date& operator--();

Date.cpp

// --d1
Date& Date::operator--()
{*this -= 1;return *this;
}

后置–

后置–和后置++一样的
Date.h

	// 后置--Date operator--(int);

Date.cpp

// d1--
Date Date::operator--(int)
{Date tmp = *this;tmp -= 1;return tmp;
}

日期-日期

计算两个传入日期相差的天数,一直让较小的日期++,一直加到和另一个日期相等即可,在加的过程中,小日期所加的天数,就是两个日期的差值
Date.h

	// d1 - d2int operator-(const Date& d) const;

Date.cpp

// d1 - d2
int Date::operator-(const Date& d) const
{// 立个flag,若左边的日期大于右边的日期,则返回真int flag = 1;Date max = *this;// 假设左边的日期大Date min = d;// 假设右边的日期小// 假设错误,进行更正if (*this < d){int flag = -1;max = d;// 令大的为右边的日期min = *this;// 小的为左边的日期}int n = 0;//记录加的天数while (min != max){++min;// 小日期++++n;//   总天数++}return n * flag;
}

运行结果

在这里插入图片描述

完整代码

Date.h

#include<iostream>
#include<assert.h>
using namespace std;class Date
{
public:// 全缺省构造函数Date(int year = 1, int month = 1, int day = 1);Date(const Date& d);bool CheckInvalid() 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;bool operator!=(const Date& d) const;// d1 += 100Date& operator+=(int day);Date operator+(int day) const;// d1 - 100Date& operator-=(int day);Date operator-(int day) const;// 前置++Date& operator++();// 后置++Date operator++(int);// 前置--Date& operator--();// 后置--Date operator--(int);// d1 - d2int operator-(const Date& d) const;// 本质就是内联inlineint GetMonthDay(int year, int month) const{assert(month > 0 && month < 13);static int monthDay[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;}return monthDay[month];}// 打印函数void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};

Date.cpp

#include"Date.h"// 缺省值在声明和定义中不能同时出现
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;if (!CheckInvalid()){cout << "构造非法日期" << endl;}
}
Date::Date(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;//cout << "Date(const Date& d)" << endl;
}
// d1 < d2
bool Date::operator<(const Date& d) const
{if (_year < d._year){return true;}else if (_year == d._year){if (_month < d._month){return true;}else if (_month == d._month){if (_day < d._day){return true;}}}return false;
}
// d1 == d2
bool Date::operator==(const Date& d) const
{return _year == d._year&& _month == d._month&& _day == d._day;
}
// d1 <= d2
bool Date::operator<=(const Date& d) const
{return *this < d || *this == d;
}
// d1 > d2
bool Date::operator>(const Date& d) const
{return !(*this <= d);
}
// d1 >= d2
bool Date::operator>=(const Date& d) const
{//return !(*this < d);return *this > d || *this == d;
}
// d1 != d2
bool Date::operator!=(const Date& d) const
{return !(*this == d);
}// d1 += 100
Date& Date::operator+=(int day)
{// 直接加上去,后面再判断_day += day;// 若_day 大于 当前月份的天数,则进循环进行调整while (_day > GetMonthDay(_year, _month)){// _day减去当前月的天数_day -= GetMonthDay(_year, _month);++_month;// 月数+1;// 若月数溢出if (_month == 13){++_year;// 年数+1_month = 1;// 月数置为1}}return *this;
}
Date Date::operator+(int day) const
{Date tmp = *this;// 拷贝构造,返回tmptmp += day;// 复用operator+=return tmp;
}//Date Date::operator+(int day) const
//{
//	// Date tmp(*this)
//	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)
//{
//	*this = *this + day;
//	return *this;
//}// d1 -= 100
Date& Date::operator-=(int day)
{_day -= day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += GetMonthDay(_year, _month);}return *this;
}
// d1 -100
Date Date::operator-(int day) const
{Date tmp = *this;tmp -= day;return tmp;
}// 前置++  ——》d.operator++()
Date& Date::operator++()
{*this += 1;return *this;
}
// d++ ->d.operator++(0)
Date Date::operator++(int)
{Date tmp = *this;*this += 1;return tmp;
}
// --d1
Date& Date::operator--()
{*this -= 1;return *this;
}
// d1--
Date Date::operator--(int)
{Date tmp = *this;tmp -= 1;return tmp;
}
// d1 - d2
int Date::operator-(const Date& d) const
{// 立个flag,若左边的日期大于右边的日期,则返回真int flag = 1;Date max = *this;// 假设左边的日期大Date min = d;// 假设右边的日期小// 假设错误,进行更正if (*this < d){int flag = -1;max = d;// 令大的为右边的日期min = *this;// 小的为左边的日期}int n = 0;//记录加的天数while (min != max){++min;// 小日期++++n;//   总天数++}return n * flag;
}
bool Date::CheckInvalid() const
{if (_year <= 0 || _month < 1 || _month>12 || _day<1 || _day>GetMonthDay(_year, _month)){return false;}else{return true;}
}

Test.cpp

#include"Date.h"void Test1()
{Date d1(2024, 12, 13);Date d2(2024, 1, 15);cout << (d1 < d2) << endl;
}
void Test2()
{Date d1(2024, 1, 1);Date d2(2024, 1, 1);cout << (d1 == d2) << endl;Date d3(2024, 1, 2);cout << (d1 == d3) << endl;
}
void Test3()
{Date d1(2024, 6, 2);Date d2(2024, 6, 3);cout << (d1 <= d2) << endl;Date d3(2024, 6, 2);cout << (d1 <= d3) << endl;Date d4(2024, 6, 1);cout << (d1 <= d4) << endl;
}
// d1 > d2
void Test4()
{Date d1(2024, 6, 3);Date d2(2024, 6, 2);cout << (d1 > d2) << endl;Date d3(2024, 7, 1);cout << (d1 > d3) << endl;
}
// d1 >= d2
void Test5()
{Date d1(2024, 6, 1);Date d2(2024, 6, 1);cout << (d1 >= d2) << endl;Date d3(2024, 5, 20);cout << (d1 >= d3) << endl;Date d4(2024, 6, 3);cout << (d1 >= d4) << endl;
}
void Test6()
{Date d1(2024, 6, 1);Date d2(2024, 6, 2);cout << (d1 != d2) << endl;Date d3(2024, 6, 1);cout << (d1 != d3) << endl;
}void Test7()
{Date d1(2024, 6, 2);d1.Print();Date d2 = d1 += 10;d2.Print();Date d3 = d1 += 100;d3.Print();// 验证// 再次打印d1d1.Print();
}
void Test8()
{Date d1(2024, 6, 2);Date d2 = d1 += 10;d1.Print();d2.Print();
}
void Test9()
{Date d1(2024, 6, 1);Date d2 = d1 - 10;d2.Print();d1.Print();
}
// ++d1
void Test10()
{Date d1(2024, 6, 2);++d1;d1.Print();//d1++;//d1.operator++(10);//d1.Print();
}
void Test11()
{Date d1(2024, 6, 2);d1++;//d1.operator++(10);d1.Print();
}void Test12()
{Date d1(2024, 6, 2);Date d2(2024, 1, 2);cout << (d1 - d2) << endl;
}
int main()
{Test12	();return 0;
}

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

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

相关文章

C++ 的 Tag Dispatching(标签派发) 惯用法

目录 1.概述 2.标准库中的例子 3.使用自己的 Tag Dispatching 3.1.使用 type traits 技术 3.2.使用 Type_2_Type 技术 4.Tag Dispatching的使用场景 5.总结 1.概述 一般重载函数的设计是根据不同的参数决定具体做什么事情&#xff0c;编译器会根据参数匹配的原则确定正确…

数据库之函数、存储过程

函数、存储过程 1.函数 函数&#xff0c;常用于对一个或多个输入参数进行操作&#xff0c;主要目的是返回一个结果值&#xff0c;就是一种方法&#xff0c;在postgre里存放的位置叫function&#xff0c;比如创建一个计算长方面积的函数。 举例&#xff1a;建立一个计算长方形…

基于GTX 8B10B编码的自定义PHY接收模块(高速收发器十三)

点击进入高速收发器系列文章导航界面 前文完成了发送模块的设计&#xff0c;本文接着完成接收模块的设计&#xff0c;接收模块相对发送模块会更加麻烦。 1、设计思路 前文在讲解官方示例工程时&#xff0c;提到GTX IP的接收部分没有做字对齐&#xff0c;需要用户自己编写字对齐…

---初始Linux---

一、认识计算机 计算机 硬件 软件 硬件&#xff1a;就是计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称&#xff08;CPU\GPU\...&#xff09; 软件&#xff1a;是用户和计算机硬件之间及进行交流的工具 然而一个简单的计算机或者说基本的计算机就是有两大…

Android开机动画,framework修改Bootanimation绘制文字。

文章目录 Android开机动画&#xff0c;framework修改Bootanimation动画绘制文字。 Android开机动画&#xff0c;framework修改Bootanimation动画绘制文字。 frameworks/base/cmds/bootanimation/bootanimation.cpp 绘制时间的一个方法 // We render 12 or 24 hour time. void…

Linux 僵尸进程和孤儿进程

一.Z(zombie)-僵尸进程 1.僵死状态&#xff08;Zombies&#xff09;是一个比较特殊的状态。当进程退出并且父进程&#xff08;使用wait()系统调用后&#xff09;没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 2.僵死进程会以终止状态保持在进程表中&#xff0c;并且会…

Spring 中如何控制 Bean 的加载顺序?

如果你脱口而出说添加 Order 注解或者是实现 Ordered 接口&#xff0c;那么恭喜&#xff0c;你掉坑了。 一 Order 注解和 Ordered 接口 在 Spring 框架中&#xff0c;Order 是一个非常实用的元注解&#xff0c;它位于 spring-core 包下&#xff0c;主要用于控制某些特定上下文…

SQL实验 带函数查询和综合查询

一、实验目的 1&#xff0e;掌握Management Studio的使用。 2&#xff0e;掌握带函数查询和综合查询的使用。 二、实验内容及要求 1&#xff0e;统计年龄大于30岁的学生的人数。 --统计年龄大于30岁的学生的人数。SELECT COUNT(*) AS 人数FROM StudentWHERE (datepart(yea…

小公司的软件开发IT工具箱

目录 工具链困境 难题的解决 达到的效果 资源要求低 工具箱一览 1、代码管理工具 2、自动化发版&#xff08;测试&#xff09;工具 3、依赖库&#xff08;制品包&#xff09;管理 4、镜像管理 5、授权管理&#xff08;可选&#xff09; 待讨论&#xff1a;为什么不是…

基于全志T507-H的Linux-RT实时性测试案例分享

本文将为各位工程师演示全志T507-H工业评估板&#xff08;TLT507-EVM&#xff09;基于IgH EtherCAT控制伺服电机方法&#xff0c;生动说明Linux-RT Igh EtherCAT的强大之处&#xff01; Linux-RT系统的优势 内核开源、免费、功能完善。 RT PREEMPT补丁&#xff0c;使Linux内…

【Qt】对话框

文章目录 1 :peach:对话框介绍:peach:2 :peach:对话框的分类:peach:2.1 :apple:模态对话框:apple:2.2 :apple:非模态对话框:apple:2.3 :apple:混合属性对话框:apple: 3 :peach:Qt 内置对话框:peach:3.1 :apple:消息对话框 QMessageBox:apple: 1 &#x1f351;对话框介绍&#x…

AK F.*ing leetcode 流浪计划之费马小定理与组合数取模

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 费马小定理与证明 参考 https://zhuanlan.zhihu.com/p/594859227 费马小定理&#xff1a;如果p是一个质数&#xff0c;而正整数a不是p的倍数&#xff0c;那么a(p-1)≡…

LabVIEW齿轮调制故障检测系统

LabVIEW齿轮调制故障检测系统 概述 开发了一种基于LabVIEW平台的齿轮调制故障检测系统&#xff0c;实现齿轮在恶劣工作条件下的故障振动信号的实时在线检测。系统利用LabVIEW的强大图形编程能力&#xff0c;结合Hilbert包络解调技术&#xff0c;对齿轮的振动信号进行精确分析…

opensips 3.5的DB部署

opensips 3.X的DB部署方式较之前版本有很大的不同。本文以opensips 3.5 为例&#xff0c;说明部署的过程。 当OpenSIPS安装完成后&#xff0c;需要进一步做什么&#xff1f;最大的可能就是部署配套的DB。因为很多功能离不开它&#xff0c;比如用户鉴权、注册信息持久化、dialog…

MySQL学习——影响选项文件处理的命令行选项和程序选项修改器

大多数支持选项文件的MySQL程序都处理以下选项。因为这些选项会影响选项文件的处理&#xff0c;所以必须在命令行上给出&#xff0c;而不是在选项文件中给出。为了正常工作&#xff0c;这些选项中的每一个都必须先于其他选项给出&#xff0c;但以下情况除外&#xff1a; -prin…

OpenCASCADE开发指南<十四>:OCCT建模类之BRepPrimAPI_MakePipe创建管道

1、OpenCasCade拓扑几何 在Open CASCADE Technology (OCCT) 中,除了基本三维几何体建模类BRepBuilderAPI外,还提供了复杂模型的建模类,常用的有如下几种,他们可以单独使用或相互组合,通过OCCT提供的融合函数进行组装。例如:BRepOffsetAPI_ThruSections、BRepOffsetAPI_Ma…

sqlite基本操作

简介 文章目录 简介1.数据库的安装2.数据库命令&#xff1a;API&#xff0c;创建表单代码 csprintf&#xff08;&#xff09;getchar和scanf&#xff08;&#xff09; 1.数据库的安装 sudo dpkg -i *.deb这个报错表明出现依赖问题 用这个命令后再试试sudo apt --fix-broken in…

Docker是什么?使用场景作用及Docker的安装和启动详解

目录 Docker是什么&#xff1f; Docker的发展 Docker的安装 Docker使用 Docker的运行机制 第一个Docker容器 进入Docker容器 客户机访问容器 Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker …

ChatGPT的基本原理是什么?又该如何提高其准确性?

在深入探索如何提升ChatGPT的准确性之前&#xff0c;让我们先来了解一下它的工作原理吧。ChatGPT是一种基于深度学习的自然语言生成模型&#xff0c;它通过预训练和微调两个关键步骤来学习和理解自然语言。 在预训练阶段&#xff0c;ChatGPT会接触到大规模的文本数据集&#x…

绘画参数配置及使用

绘画参数配置及使用 路径&#xff1a;站点后台-功能-AI绘画 进入参数配置 接口选择&#xff1a;多种接口自主选择&#xff08;需自己准备key&#xff09;&#xff0c;对应接口的key对话和绘画通用 存储空间&#xff1a; 位置在超管后台-存储空间 自主选择存储&#xff08;需…