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

C++模拟实现-----日期计算器(超详细解析,小白一看就会!)

目录

一、前言

 二、日期类计算器

 三、日期计算器的实现

🍎日期计算器各个接口的实现

🍐日期计算器的需求 

 🍉打印当前日期(并检查日期是否合理)

 💦检查日期是否合理

 💦日期类构造函数(用于日期的初始化)

 ⭐效果展示

 🍓日期之间的大小比较

 💦<  运算符重载

 💦== 运算符重载

 💦<= 运算符重载

 💦>  运算符重载

 💦>= 运算符重载

 💦!= 运算符重载

 ⭐效果展示

🍌日期的加减天数计算 

 💦日期 + 天数

 💦日期 + = 天数

💦 日期 -= 天数

💦日期 - 天数 

 💦日期 前置++

  💦日期 后置++

 💦日期 前置--

 💦日期 后置--

 ⭐效果展示

 🍊日期与日期之间的减法运算

 💦日期 - 日期

 ⭐效果展示

 四、日期计算器的完整代码

🍇Date.h 

🍋Date.cpp 

🥝Test.cpp

 🍍代码运行的界面

 五、共勉


一、前言

        在之前的博客学习中,我们已经详细的讲解了C++中的引用、缺省函数、this指针、构造函数、析构函数、拷贝构造函数、运算符重载等非常重要的知识,但是对于这些知识如何如何的使用还没有进行讲解,所以本次博客将以日期计算器为例,将以上知识融合起来讲解,帮助大家更好的理解。

 二、日期类计算器

        在我们的日常生活中,我们可能需要计算几天后的日期,或计算日期差等,现如今计算日期的方式有很多,简单粗暴的直接查看日历,快捷点的直接使用日期计算器来求得,先给一个网络上的日期计算器截图:

        现在,就让我们用代码来实现其工作原理吧。

 三、日期计算器的实现

🍎日期计算器各个接口的实现

 这里先建立三个文件:
1️⃣ :Date.h文件,用于类中---函数声明
2️⃣ :Date.cpp文件,用于类中---函数的定义
3️⃣ :Test.cpp文件,用于测试函数
建立三个文件的目的: 将日期计算器作为一个项目来进行书写,方便我们的学习与观察。

🍐日期计算器的需求 

这里我们需要考虑,我们实现的这个日期计算器,需要实现怎样的需求呢

  1. 需要打印当前的日期(请检查日期是否合理)
  2. 实现日期之间的大小比较
  3. 实现日期的加减天数计算
  4. 实现日期与日期之间的减法运算

 🍉打印当前日期(并检查日期是否合理)

        实现日期类首先就得检查日期的合法性,这其中就包括大小月,闰年的2月有29天,一年只有12个月等等细节都要考虑到。

 💦检查日期是否合理

//判断是否为闰年
bool Date::isLeaveYear(int year)
{// (四年一润,百年不润) 或者 四百年一润return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}// 获取每个月的天数
int Date::GetMonthDay(int year, int month)
{int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month == 2 && isLeaveYear(year)){return 29;}else{return monthday[month];}
}

 💦日期类构造函数(用于日期的初始化)

//判断是否为闰年
bool Date::isLeaveYear(int year)
{// (四年一润,百年不润) 或者 四百年一润return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}// 获取每个月的天数
int Date::GetMonthDay(int year, int month)
{int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month == 2 && isLeaveYear(year)){return 29;}else{return monthday[month];}
}

 效果展示

1️⃣:错误的日期演示   ------  -1 / -1 / -1 (年/月/日)

// 测试初始化
void Test()
{Date d1(-1,-1,-1);d1.Printf();
}
int main()
{Test();return 0;
}


1️⃣:正确的日期演示  --------  2023 / 10 / 28 (年/月/日)

// 测试初始化
void Test()
{cout << "请输入今日的日期" << endl;Date d1(2023,10,28);d1.Printf();
}
int main()
{Test();return 0;
}

 🍓日期之间的大小比较

 💦<  运算符重载

  • 思路:

< 运算符重载在我上一篇博文已经详细讲解过,主要是先把大于的情况全部统计出来,就比如我要比较实例化对象d1是否小于实例化对象d2,只需考虑如下三种满足的情况:

  • d1的年小于d2的年
  • d1与d2年相等,d1的月小于d2的月
  • d1与d2年相等月相等,d1的天小于d2的天

这三种全是小于的情况,返回true,其余返回false

  • 代码如下:
// "<" 运算符重载
bool Date::operator<(const Date& d)
{if (_year < d._year ||_year == d._year && _month < d._month ||_year == d._year && _month == d._month && _day < d._day){return true;}else{return false;}
}

 💦== 运算符重载

  •  思路:

 == 运算符重载其实非常简单,只需要判断d1和d2的年、月、天是否对应相等即可:

  • 代码如下:
// "==" 运算符重载
bool Date::operator==(const Date& d)
{return _year == d._year && _month == d._month && _day == d._day;
}

 💦<= 运算符重载

  • 思路: --  复用 (这里复用的意思是:用之前写好的运算符重载,可以减少我们的代码量)

<= 的运算符重载,这里要仔细想一想 <= 成立的条件是啥。不就是 要么 < 要么 = 吗?我们只需要复用先前写的 < 运算符重载和 <=运算符重载,无需自己费老大劲推导其内部原理。

  • 代码如下:
// "<=" 运算符重载
bool Date::operator<=(const Date& d)
{// 运算符重载的复用return *this < d || *this == d;
}

 💦>  运算符重载

  • 思路: --  复用

> 的反义就是 <=,所以我们只需要复用 <= 运算符重载,再对其取反即可解决此问题。

  • 代码如下:
// ">" 运算符重载
bool Date::operator>(const Date& d)
{return !(*this <= d);
}

 💦>= 运算符重载

  • 思路: --  复用

>= 的反义就是 <,所以我们只需要复用 < 运算符重载,再对其取反即可。

  • 代码如下:
// ">="运算符重载、
bool Date::operator>=(const Date& d)
{return !(*this < d);
}

 💦!= 运算符重载

  • 思路: --  复用

有了前面的基础,写个 != 也很简单,对 == 取反即可

  • 代码如下:
//"!="运算符重载
bool Date::operator!=(const Date& d)
{return !(*this == d);
}

 效果展示

此时我们拿   "<"运算符   举例子

// 测试"<"运算符
void Test1()
{Date d1(2023,10,28);cout << "d1的日期为:";d1.Printf();cout << "d2的日期为:";Date d2(2023, 10, 27);d2.Printf();cout << endl;if (d2 < d1){cout << "d1的日期 < d2的日期" << endl;}else{cout << "d2的日期 > d1的日期" << endl;}
}int main()
{Test1();return 0;
}

🍌日期的加减天数计算 

 💦日期 + 天数

  • 思路:

对于日期 + 天数,我们得到的还是一个日期。特别需要注意进位的问题(天满了往月进,月满了往年进),主要考虑如下几个特殊点:

  • 加过的天数超过该月的最大天数,需要进位
  • 当月进位到13时,年进位+1,月置为1

  • 法一:
Date Date::operator+(int day) 
{Date ret(*this); //拷贝构造,拿d1去初始化retret._day += day;while (ret._day > GetMonthDay(ret._year, ret._month)){ret._day -= GetMonthDay(ret._year, ret._month);ret._month++;if (ret._month == 13){ret._year++;ret._month = 1;}}return ret;
}

        出了作用域,对象ret不在,它是一个局部对象,我们这里不能用引用,用了的话,返回的就是ret的别名,但是ret又已经销毁了,访问野指针了,所以出了作用域,如果对象不在了,就不能用引用返回,要用传值返回

  • 法二:复用日期+=天数

此法是建立在日期+=天数的基础上完成的,这里各位可以先看下文日期+=天数,然后我们进行复用:

Date Date::operator+(int day) 
{//法二:复用日期 += 天数Date ret(*this);ret += day;return ret;
}
  • 法一和法二熟优?

答案:法二更好,也就是用+去复用+=,具体原因在下文会解释。
 

 💦日期 + = 天数

 这里实现 += 其实有两种方案

  • 法一:

前面我实现的日期+天数,仔细观察我的代码,函数的第一行,我就调用了一个拷贝构造:

Date ret(*this); //拷贝构造,拿d1去初始化ret

        这里调用拷贝构造,是为了不在*this本身上做变动,只在ret上进行操作,其理由是日期+天数得到的是另一个日期,而不用拷贝构造直接在*this上做改动只会导致原有的日期也变化,而这个变化正是我日期 += 天数的需求

        仔细想想:+=天数就是在原有的日期上再加一定的天数,直接对*this做手脚即可,因此只需对日期+天数的代码进行小改动即可:

Date& Date::operator+=(int day) //传引用返回
{//如果day小于0,要单独处理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;
}

注意这里是传引用返回,原因就在于我返回的*this是全局的,出了作用域还在
 

  • 法二:复用日期 +天数
Date& Date::operator+=(int day)
{//法二:复用* this = *this + day; //让d1+过天数后再返回给自己从而实现+=return *this;
}
  • 法一和法二熟优?

答案:法一。其实讨论这个问题就是在讨论用+去复用+=好还是用+=复用+好,答案是用+=去复用+好,因为+两次拷贝,而+=没有拷贝,所以实现+,并且用+=去复用+效率更高
 

💦 日期 -= 天数

  • 思路:

日期-=天数得到的还是一个日期,且是在原日期的基础上做改动。合法的日期减去天数后的day只要>0就没问题,若小于0就要借位了。要注意当减去的天数<0时单独讨论。具体步骤如下:

  1. 当减的天数为负数,则为+=,直接调用
  2. 若减后的day<0,月-1
  3. 若月 = 0,则年-1,月置为12

 
  • 代码如下:
// 日期-= 天数 :d1 d1 - 100
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;
}

💦日期 - 天数 

有了先前日期+和+=的基础,这里实现日期 - 天数直接复用日期 -= 天数即可:

// 日期-天数 : d1 - 100
Date Date::operator-(int day)
{// 调用拷贝构造Date temp(*this);// 复用 "-="temp -= day;return temp;
}

 💦日期 前置++

  • 思路:

        C++里有前置++和后置++,这就导致一个巨大的问题,该如何区分它们,具体实现过程不难(直接复用+=即可),难的是如何区分前置和后置。因此C++规定,无参的为前置,有参的为后置。

  • 代码如下:
// 前置++ (无参的为前置,有参的为后置)
Date& Date::operator++()
{// 直接复用 +=*this += 1;return *this;
}

  💦日期 后置++

  • 思路:

        有参的即为后置,后置++拿到的返回值应该是自己本身未加过的,因此要先把自己保存起来,再++*this,随后返回自己。

  • 代码如下:
// 后置++(无参的为前置,有参的为后置)
// int i 这里的形参可以写,可以不写
Date Date::operator++(int i)
{Date temp(*this);*this += 1;return temp;
}

 💦日期 前置--

  • 思路:

前置--和前置++没啥区别,只不过内部复用的是-=

  • 代码如下:
// 前置--
Date& Date::operator--()
{*this -= 1;return *this;
}

 💦日期 后置--

  • 思路:

后置--和后置++类似,只不过内部复用的是-=,不再赘述

  • 代码如下:
//后置--
Date Date::operator--(int i)
{Date temp(*this);*this -= 1;return temp;
}

 ⭐效果展示

 举例:将日期 + 100 天  :2023 / 10 / 28  + 100

// d1+=100 测试
void Test3()
{Date d1(2023, 10, 28);cout << "d1的日期为:";d1.Printf();cout << endl;d1 += 100;cout << "d1的日期+100为:";d1.Printf();
}int main()
{Test3();return 0;
}

 🍊日期与日期之间的减法运算

 💦日期 - 日期

  • 思路:

       日期 - 日期得到的是天数,首先我们得判断两个日期的大小,用min和max代替小的和大的,随后,算出min和max之间的差距,若min!=max,则min就++,随即定义变量n也自增++,最后返回n(注意符号)

  • 代码如下:
// 日期 - 日期
int Date::operator-(const Date& d)
{// 方便后续计算正负int flag = 1;Date max = *this;Date min = d;// 确保max是大的  min是小的if (*this < d){min = *this;max = d;flag = -1;  //计算正负}int n = 0;// 计算min和max之间的绝对值差距while (min != max){min++;n++;}return n * flag;
}

 ⭐效果展示

 举例:计算 2023 / 10 /28  -------------   2023  / 11 / 11  的天数差距 

// 日期 - 日期
void Test4()
{Date d1(2023, 11, 11);cout << "d1的日期为:";d1.Printf();cout << "d2的日期为:";Date d2(2023, 10, 28);d2.Printf();cout << endl;cout << "d1与d2之间的天数差距为:";int ret = d1 - d2;cout << ret << endl;}int main()
{Test4();return 0;
}

 四、日期计算器的完整代码

🍇Date.h 

#pragma once
#include <iostream>
#include <stdio.h>
#include <assert.h>
#include <stdbool.h>
using std::cout;
using std::cin;
using std::endl;class Date
{
public:// 构造函数用于初始化 -- 声明 // 在声明中缺省函数需要 写清楚  在定义中缺省函数就不要写了 防止编译器分不清Date(int year = 1, int month = 1, int day = 1);//判断是否为闰年bool isLeaveYear(int year);// 获取每个月的天数int GetMonthDay(int year, int month);// 打印void Printf();// "<" 运算符重载bool operator<(const Date& d);// "==" 运算符重载bool operator==(const Date& d);// "<=" 运算符重载bool operator<=(const Date& d);// ">" 运算符重载bool operator>(const Date& d);// ">="运算符重载、bool operator>=(const Date& d);//"!="运算符重载bool operator!=(const Date& d);// 日期+= 天数: d1 = d1 + 100Date& operator+= (int day);// 日期 + 天数 d1+100  d1不变Date operator+(int day);// 日期-= 天数 :d1 = d1 - 100Date& operator-=(int day);// 日期-天数 : d1 - 100Date operator-(int day);// 前置++ (无参的为前置,有参的为后置)Date& operator++();// 后置++(无参的为前置,有参的为后置)Date operator++(int i);// 前置--Date& operator--();//后置--Date operator--(int i);// 日期 - 日期int operator-(const Date& d);
private:int _year;int _month;int _day;
};

🍋Date.cpp 

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Date.h"// 构造函数用于初始化
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;if (_year < 1 || _month < 1 || _month>12 || _day<1 || _day>GetMonthDay(_year, _month)){assert(false);}
}//判断是否为闰年
bool Date::isLeaveYear(int year)
{// (四年一润,百年不润) 或者 四百年一润return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}// 获取每个月的天数
int Date::GetMonthDay(int year, int month)
{int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month == 2 && isLeaveYear(year)){return 29;}else{return monthday[month];}
}void Date::Printf()
{cout << _year << " / " << _month << " / " << _day << endl;
}// "<" 运算符重载
bool Date::operator<(const Date& d)
{if (_year < d._year ||_year == d._year && _month < d._month ||_year == d._year && _month == d._month && _day < d._day){return true;}else{return false;}
}// "==" 运算符重载
bool Date::operator==(const Date& d)
{return _year == d._year && _month == d._month && _day == d._day;
}// "<=" 运算符重载
bool Date::operator<=(const Date& d)
{// 运算符重载的复用return *this < d || *this == d;
}// ">" 运算符重载
bool Date::operator>(const Date& d)
{return !(*this <= d);
}// ">="运算符重载、
bool Date::operator>=(const Date& d)
{return !(*this < d);
}//"!="运算符重载
bool Date::operator!=(const Date& d)
{return !(*this == d);
}// 日期+= 天数: d1 = d1 + 100
Date& Date::operator+=(int day)
{// 防止传入的天数为 负数(-100)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  d1不变
Date Date::operator+(int day)
{// 调用拷贝构造Date temp(*this);temp += day;return temp;
}// 日期-= 天数 :d1 d1 - 100
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;
}// 日期-天数 : d1 - 100
Date Date::operator-(int day)
{// 调用拷贝构造Date temp(*this);// 复用 "-="temp -= day;return temp;
}// 前置++ (无参的为前置,有参的为后置)
Date& Date::operator++()
{// 直接复用 +=*this += 1;return *this;
}// 后置++(无参的为前置,有参的为后置)
// int i 这里的形参可以写,可以不写
Date Date::operator++(int i)
{Date temp(*this);*this += 1;return temp;
}// 前置--
Date& Date::operator--()
{*this -= 1;return *this;
}//后置--
Date Date::operator--(int i)
{Date temp(*this);*this -= 1;return temp;
}// 日期 - 日期
int Date::operator-(const Date& d)
{// 方便后续计算正负int flag = 1;Date max = *this;Date min = d;// 确保max是大的  min是小的if (*this < d){min = *this;max = d;flag = -1;  //计算正负}int n = 0;// 计算min和max之间的绝对值差距while (min != max){min++;n++;}return n * flag;
}

🥝Test.cpp

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Date.h"// 测试初始化
void Test()
{cout << "请输入今日的日期" << endl;Date d1(2023,10,28);d1.Printf();
}// 测试"<"运算符
void Test1()
{Date d1(2023,10,28);cout << "d1的日期为:";d1.Printf();cout << "d2的日期为:";Date d2(2023, 10, 27);d2.Printf();cout << endl;if (d2 < d1){cout << "d1的日期 < d2的日期" << endl;}else{cout << "d2的日期 > d1的日期" << endl;}
}// d1 + 100 测试
void Test2()
{Date d1(2023,10,27);cout << "d1的日期为:";d1.Printf();Date d2;d2 = d1 + 100;cout << "d1的日期+100为:";d2.Printf();
}// d1+=100 测试
void Test3()
{Date d1(2023, 10, 28);cout << "d1的日期为:";d1.Printf();cout << endl;d1 += 100;cout << "d1的日期+100为:";d1.Printf();
}// 日期 - 日期
void Test4()
{Date d1(2023, 11, 11);cout << "d1的日期为:";d1.Printf();cout << "d2的日期为:";Date d2(2023, 10, 28);d2.Printf();cout << endl;cout << "d1与d2之间的天数差距为:";int ret = d1 - d2;cout << ret << endl;}void Test5()
{cout << " ***********   欢迎来到  日期计算器   ***********" << endl<<endl;cout << "输入今日的日期: >" ;int y, m, d;cin >> y >> m >> d;cout << endl;Date d1(y, m, d);//d1.Printf();cout << "输入需要对比的日期: >";int y1, m1, dd;cin >> y1 >> m1 >> dd;cout << endl;Date d2(y1, m1, dd);//d2.Printf();cout << "两个日期之间的天数差距为:";int ret = d - dd;cout << ret << endl;
}int main()
{Test5();return 0;
}

 🍍代码运行的界面

 五、共勉

  以下就是我对C++日期计算器的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++ 类和对象的理解,请持续关注我哦!!!  

 

相关文章:

C++模拟实现-----日期计算器(超详细解析,小白一看就会!)

目录 一、前言 二、日期类计算器 三、日期计算器的实现 &#x1f34e;日期计算器各个接口的实现 &#x1f350;日期计算器的需求 &#x1f349;打印当前日期&#xff08;并检查日期是否合理&#xff09; &#x1f4a6;检查日期是否合理 &#x1f4a6;日期类构造函数&#x…...

Oracle实现把B表某一字段更新到A表

1.使用SQL命令UPDATE语句。 2.使用MERGE语句。 3.使用TRIGGER触发器。 4.使用游标CURSOR和循环 使用游标和循环来将B表中的数据更新到A表中&#xff0c;从而实现了两个表数据的同步。例如下面的代码实现&#xff1a;...

CUMCM历年赛题汇总

题目来源&#xff1a; 全国大学生数学建模竞赛官网 注&#xff1a;题目和数据均可在官网下载 2021–2023年 年份题号题目2023A定日镜场的优化设计2023B多波束测线问题2023C蔬菜类商品的自动定价与补货决策2023D圈养湖羊的空间利用率2023E黄河水沙监测数据分析2022A波浪能最大…...

人间道-您到底做错了什么:正心径之您要逐渐去除外邪行为

过去的您或许在您自个身上付出&#xff0c;投入了巨大&#xff0c;重大的人力&#xff0c;物力&#xff0c;财力等各方面的重重的成本&#xff0c;但是呢&#xff0c;收获却微小的稀罕&#xff0c;微少的可怜啊。甚至于一个错误&#xff0c;就把您完全陷入到万丈深渊里面去了&a…...

Spring Boot拓展XML格式的请求和响应

在我们开发过程中&#xff0c;我们经常使用的参数绝大多少事HTML和JSON格式的请求和响应处理&#xff0c;但是我们在实际开发过程中&#xff0c;我们可能经历一些&#xff0c;比如对于XML格式的请求&#xff0c;我们在后端应该如何接收&#xff0c;并且如何将XML格式的参数变成…...

0045【Edabit ★☆☆☆☆☆】【字符数转整型】Return a String as an Integer

0045【Edabit ★☆☆☆☆☆】【字符数转整型】Return a String as an Integer language_fundamentals numbers strings Instructions Create a function that takes a string and returns it as an integer. Examples stringInt("6") // 6 stringInt("1000&q…...

数据库MySQL(六):事务

事务 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 MySQL中默认事务是自动提交的&#xff0c;当执行完一条DML语句时…...

比较浮点数时,我被绊倒了

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;我们面对的不是…...

JVM进阶(1)

一)JVM是如何运行的&#xff1f; 1)在程序运行前先将JAVA代码转化成字节码文件也就是class文件&#xff0c;JVM需要通过类加载器将字节码以一定的方式加载到JVM的内存运行时数据区&#xff0c;将类的信息打包分块填充在运行时数据区&#xff1b; 2)但是字节码文件是JVM的一套指…...

【AICFD案例操作】汽车外气动分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…...

Hadoop 请求数据长度 Requested Data length 超过配置的最大值

一、问题 现象 Spark 任务速度变慢&#xff0c;也不失败。 DataNode 内存足够 CPU 负载不高 GC 时间也不长。 查看 DataNode 日志&#xff0c;发现有些日志出现很多 Netty RPC 超时。超时的 destination 是一个 NameNode 节点&#xff0c;然后查看 NameNode 节点的日志&…...

搜索与图论:染色法判定二分图

将所有点分成两个集合&#xff0c;使得所有边只出现在集合之间&#xff0c;就是二分图 二分图&#xff1a;一定不含有奇数个点数的环&#xff1b;可能包含长度为偶数的环&#xff0c; 不一定是连通图 染色可以使用1和2区分不同颜色&#xff0c;用0表示未染色 遍历所有点&…...

磁场设备主要有哪些

磁学是物理学最古老的研究领域之一&#xff0c;目前仍然充满了生机活力。对于磁性物理的科学研究、磁性材料相关的探索来说&#xff0c;磁场设备必不可少&#xff0c;因为在外加磁场的作用下&#xff0c;样品会表现出特殊的物理性质&#xff0c;并带来了巨大的应用前景&#xf…...

【wespeaker】模型ECAPA_TDNN介绍

本次主要介绍开源项目wespeaker模型介绍 1. 模型超参数 model_args: feat_dim: 80 embed_dim: 192 pooling_func: “ASTP” projection_args: project_type: “softmax” # add_margin, arc_margin, sphere, softmax scale: 32.0 easy_margin: False 2. 模型结构 2.1 Layer…...

GPT技术的广泛使用

GPT技术的广泛使用确实引发了一些关于其潜在影响的讨论&#xff0c;包括可能导致某些职业失业以及对一些互联网公司构成竞争压力的问题。然而&#xff0c;这个问题涉及到多个方面&#xff0c;而且不容易一概而论。 潜在影响&#xff1a; 自动化任务&#xff1a; GPT等自然语言…...

银河麒麟V10安装MySQL8.0.28并实现远程访问

参考资料&#xff1a; 银河麒麟V10安装MySQL8.0.28并实现远程访问-数据库运维技术服务 银河麒麟高级服务器操作系统V10安装mysql数据库_麒麟v10安装mysql-CSDN博客...

[AUTOSAR][诊断管理][ECU][$27] 安全访问

文章目录 一、简介$27服务有何作用,为什么要有27服务呢?功能描述应用场景安全解锁基本原理服务请求服务响应Verify Key负响应NRC支持二、常见Bug大揭秘三、示例代码uds27_security_access.c一、简介 $27服务有何作用,为什么要有27服务呢? 功能描述 根据ISO14119-1标准中…...

Android Studio编译旧的app代码错误及解决方法

‘android.injected.build.density’ is deprecated. The option ‘android.injected.build.density’ is deprecated. It was removed in version 8.0 of the Android Gradle plugin. Density property injection from Android Studio has been removed. 解决 app/build.gr…...

Docker的架构与自制镜像的发布

一. Docker 是什么 Docker与自动化测试及其测试实践 大家都知道虚拟机吧&#xff0c;windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机&#xff0c;虚拟机将物理硬件资源虚拟化&#xff0c;按需分配和使用&#xff0c;虚拟机使用起来和真实操…...

嵌入式系统中C++ 类的设计和实现分析

C代码提供了足够的灵活性&#xff0c;因此对于大部分工程师来说都很难把握。 本文介绍了写好C代码需要遵循的10个最佳实践&#xff0c;并在最后提供了一个工具可以帮助我们分析C代码的健壮度。 原文&#xff1a;10 Best practices to design and implement a C class。 1. 尽…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...