【上海大学《面向对象程序设计A》课程小项目报告】抽象向量类模板及其派生类

news2024/11/29 10:35:30

1 项目内容及要求

本项目通过设计一个抽象向量类模板,以及一个通用的向量类模板和一个字符串类作为其派生类,以满足各种应用场景中的数据存储和处理需求。

项目内容:

  1. 抽象向量类模板。
  2. 派生向量类。
  3. 派生字符串类。
  4. 测试及异常处理。
  5. 联合测试

2.1 抽象向量类模板

2.1.1 数据成员设计

int  num;//向量的维度
T* p;//存储元素的数组 

2.1.2 成员函数设计

VECTOR(int size = 0, const T* x = NULL)//构造函数
VECTOR(const VECTOR& v)//拷贝构造函数
virtual ~VECTOR()//虚析构函数
VECTOR& operator=(const VECTOR& v)//赋值运算符重载
T& operator[](int index)//用于访问特定位置的元素
void resize(int size)//重设容器大小
virtual void Output(ostream& out) const = 0;//纯虚函数
virtual void Input(istream& in) = 0;//纯虚函数

2.2 派生向量类模板

2.2.1 定义纯虚函数

void Output(ostream& out) const
{
	if (__super::num == 0) out << "( )";
	else
	{
		out << "(" << __super::p[0];
		for (int i = 1; i < __super::num; i++)
		{
			out << "," << __super::p[i];
		}
		out << ")" << endl;
	}
}

void Input(istream& in)
{
	char c;
	T x;
	__super::resize(0);
	in >> c;
	if (c != '(') return;
	while (in >> x)
	{
		__super::resize(__super::num + 1);
		__super::p[__super::num - 1] = x;
		in >> c;
		if (c == ')') break;
	}
}

2.2.2 成员函数设计

Vector(int size = 0, const T* x = NULL)//构造函数 
Vector operator+(const Vector& v)//+运算符重载 

2.2.3 测试及异常处理

int TestVector()
{
	int a[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
	double x[8];
	for (int i = 0; i < 8; i++)
		x[i] = sqrt(double(i));

	Vector<int> vi1(10, a), vi2(5, a + 5);
	Vector<double> vd1(8, x), vd2(3, x);

	cout << "原始数据:" << endl;
	cout << "vi1 = " << vi1 << "\nvi2 = " << vi2
		<< "\nvd1 = " << vd1 << "\nvd2 = " << vd2 << endl;

	cout << "调整维数到5:" << endl;
	vi1.resize(5);
	vi2.resize(5);
	vd1.resize(5);
	vd2.resize(5);
	cout << "vi1 = " << vi1 << "\nvi2 = " << vi2
		<< "\nvd1 = " << vd1 << "\nvd2 = " << vd2 << endl;

	cout << "\n将数据写入文件 vector.txt 中..." << endl;
	ofstream outfile("vector.txt");
	outfile << vi1 << '\n'
		<< vi2						
		<< vd1 << '\n' << vd2 << endl;
	outfile.close();

	cout << "\n清除对象的数据(即调整维数到0)..." << endl;
	vi1.resize(0);
	vi2.resize(0);
	vd1.resize(0);
	vd2.resize(0);
	cout << "vi1 = " << vi1 << "\nvi2 = " << vi2
		<< "\nvd1 = " << vd1 << "\nvd2 = " << vd2 << endl;

	cout << "\n从文件 vector.txt 中读取的数据:" << endl;
	ifstream infile("vector.txt");
	infile >> vi1 >> vi2 >> vd1 >> vd2;
	infile.close();
	cout << "vi1 = " << vi1 << "\nvi2 = " << vi2
		<< "\nvd1 = " << vd1 << "\nvd2 = " << vd2 << endl;

	cout << "\nvi1 + vi2 = " << vi1 + vi2
		<< "\nvd1 + vd2 = " << vd1 + vd2 << endl;

	cout << "\n异常处理测试" << endl;
	Vector<int> v;
	cout << "请输入一个整数向量。如 (1, 3, 5, 7)" << endl;
	try
	{
		cin >> v;//如果格式错误,则抛出异常
	}
	catch (const char* str)
	{
		cout << str << endl;
		return 0;
	}
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.3 派生字符串类

2.3.1 定义纯虚函数

void Output(ostream& out) const
{
	for (int i = 0; i < __super::num; i++)
	{
		out << p[i];
	}
}

void Input(istream& in)
{
	string temp;
	in >> temp;
	*this = temp.c_str();
}

2.3.2 成员函数设计

String(const char* x = "")//构造函数  
String operator+(const String& s)//+运算符重载 

2.3.3 测试及异常处理

int TestString()
{
	String str1 = "Hello", str2 = str1, str3;
	// 转换构造		拷贝构造 	默认构造
	cout << "原始数据(双引号是另外添加的):" << endl;
	cout << "str1 = \"" << str1
		<< "\"\nstr2 = \"" << str2
		<< "\"\nstr3 = \"" << str3 << "\"" << endl;

	str3 = str2;				// 赋值运算
	str1 = "C++ program.";
	str2 = str3 + ", world!";	// 拼接运算
	cout << "str1 = \"" << str1
		<< "\"\nstr2 = \"" << str2
		<< "\"\nstr3 = \"" << str3 << "\"" << endl;

	cout << "\n将数据写入文件 string.txt 中..." << endl;
	ofstream outfile("string.txt");
	outfile << str1 << '\n'
		<< str2 << '\n'
		<< str3 << endl;
	outfile.close();

	cout << "\n清除对象的数据(即调整长度到0)..." << endl;
	str1.resize(0);
	str2.resize(0);
	str3.resize(0);
	cout << "str1 = \"" << str1
		<< "\"\nstr2 = \"" << str2
		<< "\"\nstr3 = \"" << str3 << "\"" << endl;

	cout << "\n从文件 string.txt 中读取的数据:" << endl;
	ifstream infile("string.txt");
	infile >> str1
		>> str2
		>> str3;
	infile.close();
	cout << "str1 = \"" << str1
		<< "\"\nstr2 = \"" << str2
		<< "\"\nstr3 = \"" << str3 << "\"" << endl;

	cout << "\n异常处理测试" << endl;
	String str4 = "Hello";
	try
	{
		cout << str4 << endl;
		cout << str4[10] << endl;//越界访问,抛出异常
	}
	catch (const char* str)
	{
		cout << str << endl;
		return 0;
	}
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3 联合测试

#include "Vec.h"

int TestVector(), TestString(), Test();

void menu()
{
	cout << "\n1 --- testing Vector          [v]"
		<< "\n2 --- testing String          [s]"
		<< "\n3 --- testing Vector & String [m]"
		<< "\n0 --- exit                    [q]"
		<< endl;
}

int main()
{
	char choice = '0';
	do
	{
		menu();
		cin >> choice;
		switch (choice)
		{
		case '1':
		case 'v':
		case 'V':	TestVector();	break;
		case '2':
		case 's':
		case 'S':	TestString();	break;
		case '3':
		case 'm':
		case 'M':	Test();			break;
		case '0':
		case 'q':
		case 'Q':
		case 27:	choice = 0;		break;
		default:	cout << "选择错误,重新选择" << endl;	break;
		}
	} while (choice);
	return 0;
}

int Test()
{
	Vector<int> v;
	String str;

	cout << "请输入一个整数向量。如 (1, 3, 5, 7)" << endl;
	try
	{
		cin >> v;
	}
	catch (const char* str) 
	{ 
		cout << str << endl;
		return 0;
	}
	cout << v << endl;
	cin.sync();			// 刷新输入流缓冲区(目的是读取并丢弃向量后的换行符)
	cout << "请输入一个字符串。如 abc 12345   xyz" << endl;
	cin >> str;
	cout << str << endl;

	cout << "\n将数据写入文件 output.txt 中..." << endl;
	ofstream outfile("output.txt");
	outfile << v << endl
		    << str << endl;
	outfile.close();

	cout << "\n清除对象的数据..." << endl;
	v.resize(0);
	str.resize(0);
	cout << "向量:" << v << endl
		 << "字符串:\"" << str << "\"" << endl;

	cout << "\n从文件 output.txt 中读取的数据:" << endl;
	ifstream infile("output.txt");
	infile >> v;
	infile >> str;
	infile.close();
	cout << "向量:" << v << endl
		<< "字符串:\"" << str << "\"" << endl;
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4 完整代码

4.1 Vec.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS	1
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

template <typename T> class VECTOR
{
public:
	VECTOR(int size = 0, const T* x = NULL)
	{
	
		num = (size > 0) ? size : 0;
		p = NULL;
		if (num > 0)
		{
			p = new T[num];
			for (int i = 0; i < num; i++)
				p[i] = (x == NULL) ? 0 : x[i];
		}
	}
	VECTOR(const VECTOR& v)
	{
		num = v.num;
		p = NULL;
		if (num > 0)
		{
			p = new T[num];
			for (int i = 0; i < num; i++)
				p[i] = v.p[i];
		}
	}
	virtual ~VECTOR()
	{
		if (p != NULL) delete[] p;
	}
	VECTOR& operator=(const VECTOR& v)
	{
		if (num != v.num)
		{
			if (p != NULL) delete[] p;
			p = new T[num = v.num];
		}
		for (int i = 0; i < num; i++)
			p[i] = v.p[i];
		return *this;
	}
	T& operator[](int index)
	{
		if (index >= num) throw "越界访问";
		else return p[index];
	}
	void resize(int size)
	{
		if (size < 0 || size == num) return;
		else if (size == 0)
		{
			if (p != NULL) delete[] p;
			num = 0;
			p = NULL;
		}
		else
		{
			T* temp = p;
			p = new T[size];
			for (int i = 0; i < size; i++)
				p[i] = (i < num) ? temp[i] : 0;
			num = size;
			delete[] temp;
		}
	}
	virtual void Output(ostream& out) const = 0;
	virtual void Input(istream& in) = 0;

	int num;//向量的维度
	T* p;//存储元素的数组
};

template <typename T> ostream& operator<<(ostream& out, const VECTOR<T>& v)
{
	v.Output(out);
	return out;
}

template <typename T> istream& operator>>(istream& in, VECTOR<T>& v)
{
	v.Input(in);
	return in;
}

template <typename T> class Vector :public VECTOR<T>
{
public:
	Vector(int size = 0, const T* x = NULL) :VECTOR<T>(size, x) {}
	void Output(ostream& out) const
	{
		if (__super::num == 0) out << "( )";
		else
		{
			out << "(" << __super::p[0];
			for (int i = 1; i < __super::num; i++)
			{
				out << "," << __super::p[i];
			}
			out << ")" << endl;
		}
	}


	void Input(istream& in)
	{
		char c;
		T x;
		__super::resize(0);
		in >> c;
		if (c != '(')	throw "格式错误";
		while (in >> x)
		{
			__super::resize(__super::num + 1);
			__super::p[__super::num - 1] = x;
			in >> c;
			if (c == ')') break;
		}
	}

	Vector operator+(const Vector& v)
	{
		Vector Add;
		if (__super::num == v.__super::num)
		{
			Add.resize(__super::num);
			for (int i = 0; i < __super::num; i++)
			{
				Add[i] = __super::p[i] + v.__super::p[i];
			}
		}
		return Add;
	}

};

class String : public VECTOR<char>
{
public:
	String(const char* x = "") 
		: VECTOR<char>(strlen(x), x) { }

	void Output(ostream& out) const
	{
		for (int i = 0; i < __super::num; i++)
		{
			out << p[i];
		}
	}

	void Input(istream& in)
	{
		string temp;
		in >> temp;
		*this = temp.c_str();
	}

	String operator+(const String& s)
	{
		int i, j;
		String add;
		add.__super::num = __super::num + s.__super::num;
		add.p = new char[add.__super::num];
		for (i = 0; i < __super::num; i++)
		{
			add.p[i] = p[i];
		}
		for (j = 0; j < s.__super::num; j++)
		{
			add.p[i + j] = s.p[j];
		}
		return add;
	}

};

4.2 Test.cpp

#include "Vec.h"

int TestVector(), TestString(), Test();

void menu()
{
	cout << "\n1 --- testing Vector          [v]"
		<< "\n2 --- testing String          [s]"
		<< "\n3 --- testing Vector & String [m]"
		<< "\n0 --- exit                    [q]"
		<< endl;
}

int main()
{
	char choice = '0';
	do
	{
		menu();
		cin >> choice;
		switch (choice)
		{
		case '1':
		case 'v':
		case 'V':	TestVector();	break;
		case '2':
		case 's':
		case 'S':	TestString();	break;
		case '3':
		case 'm':
		case 'M':	Test();			break;
		case '0':
		case 'q':
		case 'Q':
		case 27:	choice = 0;		break;
		default:	cout << "选择错误,重新选择" << endl;	break;
		}
	} while (choice);
	return 0;
}

int Test()
{
	Vector<int> v;
	String str;

	cout << "请输入一个整数向量。如 (1, 3, 5, 7)" << endl;
	try
	{
		cin >> v;
	}
	catch (const char* str) 
	{ 
		cout << str << endl;
		return 0;
	}
	cout << v << endl;
	cin.sync();			// 刷新输入流缓冲区(目的是读取并丢弃向量后的换行符)
	cout << "请输入一个字符串。如 abc 12345   xyz" << endl;
	cin >> str;
	cout << str << endl;

	cout << "\n将数据写入文件 output.txt 中..." << endl;
	ofstream outfile("output.txt");
	outfile << v << endl
		    << str << endl;
	outfile.close();

	cout << "\n清除对象的数据..." << endl;
	v.resize(0);
	str.resize(0);
	cout << "向量:" << v << endl
		 << "字符串:\"" << str << "\"" << endl;

	cout << "\n从文件 output.txt 中读取的数据:" << endl;
	ifstream infile("output.txt");
	infile >> v;
	infile >> str;
	infile.close();
	cout << "向量:" << v << endl
		<< "字符串:\"" << str << "\"" << endl;
	return 0;
}

4.3 TestString.cpp

#include "Vec.h"

int TestString()
{
	String str1 = "Hello", str2 = str1, str3;
	// 转换构造		拷贝构造 	默认构造
	cout << "原始数据(双引号是另外添加的):" << endl;
	cout << "str1 = \"" << str1
		<< "\"\nstr2 = \"" << str2
		<< "\"\nstr3 = \"" << str3 << "\"" << endl;

	str3 = str2;				// 赋值运算
	str1 = "C++ program.";
	str2 = str3 + ", world!";	// 拼接运算
	cout << "str1 = \"" << str1
		<< "\"\nstr2 = \"" << str2
		<< "\"\nstr3 = \"" << str3 << "\"" << endl;

	cout << "\n将数据写入文件 string.txt 中..." << endl;
	ofstream outfile("string.txt");
	outfile << str1 << '\n'
		<< str2 << '\n'
		<< str3 << endl;
	outfile.close();

	cout << "\n清除对象的数据(即调整长度到0)..." << endl;
	str1.resize(0);
	str2.resize(0);
	str3.resize(0);
	cout << "str1 = \"" << str1
		<< "\"\nstr2 = \"" << str2
		<< "\"\nstr3 = \"" << str3 << "\"" << endl;

	cout << "\n从文件 string.txt 中读取的数据:" << endl;
	ifstream infile("string.txt");
	infile >> str1
		>> str2
		>> str3;
	infile.close();
	cout << "str1 = \"" << str1
		<< "\"\nstr2 = \"" << str2
		<< "\"\nstr3 = \"" << str3 << "\"" << endl;

	cout << "\n异常处理测试" << endl;
	String str4 = "Hello";
	try
	{
		cout << str4 << endl;
		cout << str4[10] << endl;//越界访问,抛出异常
	}
	catch (const char* str)
	{
		cout << str << endl;
		return 0;
	}
	return 0;
}

4.4 TestVector.cpp

#include "Vec.h"

int TestVector()
{
	int a[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
	double x[8];
	for (int i = 0; i < 8; i++)
		x[i] = sqrt(double(i));

	Vector<int> vi1(10, a), vi2(5, a + 5);
	Vector<double> vd1(8, x), vd2(3, x);

	cout << "原始数据:" << endl;
	cout << "vi1 = " << vi1 << "\nvi2 = " << vi2
		<< "\nvd1 = " << vd1 << "\nvd2 = " << vd2 << endl;

	cout << "调整维数到5:" << endl;
	vi1.resize(5);
	vi2.resize(5);
	vd1.resize(5);
	vd2.resize(5);
	cout << "vi1 = " << vi1 << "\nvi2 = " << vi2
		<< "\nvd1 = " << vd1 << "\nvd2 = " << vd2 << endl;

	cout << "\n将数据写入文件 vector.txt 中..." << endl;
	ofstream outfile("vector.txt");
	outfile << vi1 << '\n'
		<< vi2						
		<< vd1 << '\n' << vd2 << endl;
	outfile.close();

	cout << "\n清除对象的数据(即调整维数到0)..." << endl;
	vi1.resize(0);
	vi2.resize(0);
	vd1.resize(0);
	vd2.resize(0);
	cout << "vi1 = " << vi1 << "\nvi2 = " << vi2
		<< "\nvd1 = " << vd1 << "\nvd2 = " << vd2 << endl;

	cout << "\n从文件 vector.txt 中读取的数据:" << endl;
	ifstream infile("vector.txt");
	infile >> vi1 >> vi2 >> vd1 >> vd2;
	infile.close();
	cout << "vi1 = " << vi1 << "\nvi2 = " << vi2
		<< "\nvd1 = " << vd1 << "\nvd2 = " << vd2 << endl;

	cout << "\nvi1 + vi2 = " << vi1 + vi2
		<< "\nvd1 + vd2 = " << vd1 + vd2 << endl;

	cout << "\n异常处理测试" << endl;
	Vector<int> v;
	cout << "请输入一个整数向量。如 (1, 3, 5, 7)" << endl;
	try
	{
		cin >> v;//如果格式错误,则抛出异常
	}
	catch (const char* str)
	{
		cout << str << endl;
		return 0;
	}
	return 0;
}

注意

包含项目的文件夹中以下三个文本文档需要自行创建:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

相关文章

Redis SDS 源码

底层数据结构的好处&#xff1a; 杜绝缓冲区溢出。减少修改字符串长度时所需的内存重分配次数。二进制安全。兼容部分C字符串函数。 常用命令&#xff1a; set key value、get key 等 应用场景&#xff1a;共享 session、分布式锁&#xff0c;计数器、限流。 1、给char*定义…

【Java Web学习笔记】4 - DOM文档对象模型

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/javascript 零、在线文档 JavaScript HTML DOM 一、HTML DOM基本介绍 1. DOM全称是Document Object Model文档对象模型 文档<---映射--->对象 2.就是把文档中的标签&#xff0c;属性&#xf…

Java集合常见问题

目录 Java集合 1.前言2.集合3.Collection接口类3.1 List接口3.1.1 ArrayList&#xff08;常用&#xff09;3.1.2 LinkedList&#xff08;常用&#xff09;3.1.3 Vector&#xff08;不常用&#xff09; 3.2 Set接口3.2.1 HashSet&#xff08;常用&#xff09;3.2.2 LinkedHash…

最高性能、最低错误率!一年沉寂,IBM王者归来

周一&#xff0c;国际商业机器公司&#xff08;IBM&#xff09;发布了首台量子计算机&#xff0c;它拥有1000多个量子比特&#xff08;相当于普通计算机中的数字比特&#xff09;。但该公司表示&#xff0c;现在它将转变思路&#xff0c;专注于提高机器的抗错能力&#xff0c;而…

Ruff智能物联网网关助力工厂数智化运营,实现产量提升5%

数字化转型是大势所趋&#xff0c;以工业互联网为代表的数实融合是发展数字经济的重要引擎&#xff0c;也是新质生产力的一大助力。工业互联网是新工业革命的重要基石&#xff0c;加快工业互联网规模化应用&#xff0c;是数字技术和实体经济深度融合的关键支撑&#xff0c;是新…

【面试HOT200】二叉树的构建二叉搜索树篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot200】进行的&#xff0c;每个知识点的修正和深入主要参…

免费SSL证书靠谱吗?

首先&#xff0c;我们需要明确一点&#xff0c;那就是免费SSL证书并非完全没有价值。它们同样能够提供基本的数据加密功能&#xff0c;确保用户的信息在传输过程中不会被第三方截获。因此&#xff0c;如果你的网站不需要处理敏感信息&#xff0c;例如个人身份信息、银行卡号等&…

地方招商策略:招商招哪些,如何选择理想的企业?

招商引资是推动地方经济发展的不二选择&#xff0c;通过吸引优质企业入驻&#xff0c;不仅可以带来直接的投资和税收&#xff0c;还可以为地方创造更多的就业机会&#xff0c;引入高端人才、先进的技术及管理经验&#xff0c;同时&#xff0c;招商引资还能够促进地方的产业升级…

深度优先搜索(DFS)LeetCode 2477. 到达首都的最少油耗

2477. 到达首都的最少油耗 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n - 1 &#xff0c;且恰好有 n - 1 条路。0 是首都。给你一个二维整数数组 roads &#xff0c;其中 roads[i] [ai,…

回溯总结(一)基础概念及模板

1.回溯是什么&#xff1f; 回溯&#xff0c;也叫回溯搜索法&#xff0c;搜索的一种方式。回溯搜索实际上也是一种暴力搜索&#xff08;本质是穷举&#xff09;&#xff08;对于有些问题是唯一可以解决的办法了&#xff0c;for循环是不适用的&#xff09;和别的搜索不同之处在于…

基于混沌算法的图像加密解密系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着信息技术的迅猛发展&#xff0c;图像的传输和存储已经成为现代社会中不可或缺的一部分。然而&#xff0c;随着互联网的普及和信息的快速传播&am…

Node-red的节点离线安装

Node-red节点离线安装 前言 目前越来越高的数据安全的要求&#xff0c;因此我们很多的生产类服务器是无法进行在线化部署的&#xff0c;为了解决这一问题&#xff0c;我们需要在无法连接外部网络环境的情况下&#xff0c;实现Node-red的节点的安装&#xff0c;以满足项目的需…

el-dialog 垂直居中

写文章总是在想引言&#xff0c;怎么开头才会显的更加优雅&#xff0c;更加让读者朋友给我点赞。看到有人点赞&#xff0c;我就觉的进行技术经验分享是一件非常愉快的事情&#xff0c;可是打小作文写的不好不会组织语句&#xff0c;就喜欢直来直去。老师说让写春天的作文&#…

vue2 element-ui select下拉框 选择传递多个参数

<el-select v-model"select" slot"prepend" placeholder"请选择" change"searchPostFn($event,123)"> <el-option :label"item.ziDianShuJu" :value"{value:item.id, label:item.ziDianShuJu}" v-for&qu…

文件夹批量改名:轻松管理文件夹,随机重命名不求人

在日常生活和工作中&#xff0c;文件夹批量改名是一个常见的需求。当有大量的文件夹时&#xff0c;它们可能会变得混乱和难以管理。有时候要对大量的文件夹进行重命名&#xff0c;以便更好地组织和管理这些文件。手动重命名每个文件夹可能会非常耗时且容易出错。现在可以来看下…

印度股市荣登全球第四,释放了什么讯号?

KlipC报道&#xff1a;随着散户迅速增加&#xff0c;外国资金重新流入&#xff0c;自2020年3月大流行低点以来&#xff0c;截至当地时间12月4日&#xff0c;其印度股市总市值已经上涨到3.93万亿美元&#xff0c;仅次于美国、中国和日本。 值得一提的是&#xff0c;Sensex指数飙…

java springboot简单了解数据源实现 与 springboot内置数据源

之前 我们讲到的项目 数据库管理 用了三种技术 数据源管理方式 我们选择了: DruidDataSource 持久化技术: MyBatis-Plus / MyBatis 数据库: MySql 那么 我们在刚接触数据库连接时 是没用配置Druid的 那它有没有用数据源呢&#xff1f; 我们接触过的配置Druid的方式有两种 用…

CSS特效026:扇骨打开关闭的动画

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

xcode ——Instrumets(网络连接调试)使用

环境&#xff1a; instruments 使用只能在真机调试时使用&#xff0c;且真机系统必须ios15 点击debug 按钮——Network——Profile in Instruments 然后就可以看到如下面板 展开运行的项目&#xff0c;点击session下的域名&#xff0c;下方回出现该域名下的网络请求。点击Deve…

持续集成交付CICD:Jenkins使用GitLab共享库实现前后端项目Sonarqube

目录 一、实验 1.Jenkins使用GitLab共享库实现后端项目Sonarqube 2.优化GitLab共享库 3.Jenkins使用GitLab共享库实现前端项目Sonarqube 二、问题 1.sonar-scanner 未找到命令 2.npm 未找到命令 一、实验 1.Jenkins使用GitLab共享库实现后端项目Sonarqube &#xff08…