银行账户管理系统

news2024/11/19 23:15:30

1. 目的与要求

1、目的:
(1)熟练掌握 C++语言的基本知识和技能:
(2)掌握面向对象程序设计的基本思想和方法;(3)能够利用所学的面向对象基本知识和技能,解决简单应用的程序设计
2、基本要求:(1)利用面向对象的方法以及 C++的编程思想来完成系统的设计;(2)在设计的过程中,建立清晰的类层次:定义各个类,每个类中要有各自的数据和成员函数:运用面向对象(继承、派生及多态性)来实现系统功能。
(3)在系统的设计中,要有清晰的界面设计,同时采用文件进行读写操作。
3、创新要求: 在基本要求达到后,可进行创新设计。

2. 问题描述及功能要求

设计一个银行账户管理程序,账户的信息有账号(唯一)、姓名、余额、身份证号码单位、电话号码、地址等,允许用户进行如下操作:开户、销户、存款、取款、转账、查询,一个用户可以有多个户头,账户的数值没有上限。程序运行时,可以由用户选择进行何种操作,开户操作要求输入用户信息后自动获取账号,用户销户后账号被回收,并且该账号可以继续分配给其它账户,不允许用户透支,根据姓名或账号可以进行用户的信息查询,所有的账户信息应存放到一个文件中,可以随时的访问和更新。
程序应输入不少于 10 人的账户信息,应考虑到人员同名的情况。

3. 实现思路以及代码

1. Person

只能格式化的从文件中写入或读出数据,一个用户可以办多张银行卡,所以不能确定用户有几张卡,并且每张卡又有不同的余额,用一个Person类存人和卡的信息,每张卡都对应一个人(多对多),但是打印时可以将人的信息和卡的信息分开打印。这样处理容易删除,如果将人的信息和卡的信息用一对多的方法表示,那就必须再创建一个文件,对这个文件进行维护,非常麻烦,所以不建议一对多 代码如下:

//人和卡的信息
class Person
{
public:
	string _name; //姓名
	string _id; //身份证号码
	string _pnumber; //电话号码
	string _address; //地址
	string _account; //账号
	double _balance = 0.0; //余额
};
Person p_tmp; //用来接受数据
vector<Person> v_person; //保存数据

2. 创建账号

要求:用户销户后账号被回收,并且该账号可以继续分配给其它账户。
思路:用key-value来实现,key存账号,value存1或0(1表示未使用,0表示已使用)。必须先创建一个card.txt,向card.txt文件中写入账号,然后拿来使用,代码如下:

#define CARD "1000000000" //默认账号10位数
#define LENGTH 10
#define SIZE 1000 //默认写入1000个账号

void DataCreate()
{
	FILE* pf = fopen("card.txt", "w"); //打开文件
	if (pf == nullptr) //打开失败则返回
	{
		perror("fopen");
		return;
	}
	map<string, int> m;
	string s = CARD;
	int n = SIZE;
	while (n--)
	{
		m.insert(pair<string, int>(s, 1)); //插入map中
		fprintf(pf, "%s %d\n", s.c_str(), 1); //顺便打印到文件中
		int tmp = stoi(s);
		++tmp;
		s = to_string(tmp);
	}
}

编译后就可以在main.cpp文件路径下看到card.txt文件,并且卡号写入成功。
在这里插入图片描述

这个函数是向文件中写入账号的,所以先运行一次,得到card.txt之后就不需要运行。

3. 初始化两个数组

从文件中读取数据。
map<string, int> card;存的是所有银行卡的卡号
Person p_tmp;存的是人的信息

//卡号是否使用
map<string, int> card;

//初始化
void cardInit()
{
	FILE* pf = fopen("card.txt", "r");
	if (pf == nullptr)
	{
		perror("DataInit fopen");
		return;
	}
	pair<string, int> tmp;
	char s[LENGTH + 1];
	int n = 0;
	while (fscanf(pf, "%s %d", s, &n) != EOF)
	{
		s[LENGTH] = '\0';
		tmp.first = s;
		tmp.second = n;
		::card.insert(tmp);
	}
	fclose(pf);
}
void v_personInit()
{
	FILE* pf = fopen("person.txt", "r");
	if (pf == nullptr)
	{
		perror("v_personInit fopen");
		return;
	}
	Person tmp;
	char name[MAX]; char id[MAX]; char pnumber[MAX]; char address[MAX]; char account[MAX]; double balance = 0.0;
	while (fscanf(pf, "%s %s %s %s %s %lf", name, id, pnumber, address, account, &balance) != EOF)
	{
		name[MAX - 1] = '\0';     ::p_tmp._name = name;
		id[MAX - 1] = '\0';       ::p_tmp._id = id;
		pnumber[MAX - 1] = '\0';  ::p_tmp._pnumber = pnumber;
		address[MAX - 1] = '\0';  ::p_tmp._address = address;
		account[MAX - 1] = '\0';     ::p_tmp._account = account;
		::p_tmp._balance = balance;
		v_person.push_back(::p_tmp);
	}
	fclose(pf);
}

4. 保存数据并且排序

因为是用身份证号来读取银行卡号,所以当用户再次办理银行卡,就需要对v_bankcard进行排序;在查看之前需要排序,退出之前也需要排序。

//按照身份证号来排序
bool Compare1(Person p1, Person p2)
{
	return p1._id < p2._id;
}
void Sort()
{
	sort(v_person.begin(), v_person.end(), Compare1);
}
//保存数据
void cardSave()
{
	FILE* pf = fopen("card.txt", "w");
	if (pf == nullptr)
	{
		perror("DataCreate fopen");
		return;
	}
	map<string, int>::iterator it = ::card.begin();
	while (it != ::card.end())
	{
		fprintf(pf, "%s %d\n", (*it).first.c_str(), (*it).second);
		++it;
	}
	fclose(pf);
}
void v_personSave()
{
	FILE* pf = fopen("person.txt", "w");
	if (pf == nullptr)
	{
		perror("DataCreate fopen");
		return;
	}
	for (int i = 0; i < ::v_person.size(); ++i)
	{
		fprintf(pf, "%s %s %s %s %s %.2lf\n", v_person[i]._name.c_str(), v_person[i]._id.c_str(), v_person[i]._pnumber.c_str(), v_person[i]._address.c_str(), v_person[i]._account.c_str(), v_person[i]._balance);
	}
	fclose(pf);
}
void Save()
{
	cardSave();
	v_personSave();
}

上述函数搭配起来,再在主函数插入,就可以实现如下效果:
在这里插入图片描述

5. 查看所有人的银行卡信息

这个函数主要用来检验程序是否正确,数据是否输入正确,打印时,如果身份证号相同,则只打印一遍人的信息,代码如下:

	void Show()
	{
		int i = 0;
		while (i < v_person.size())
		{
			if ((i > 0) && (v_person[i]._id == v_person[i - 1]._id))
			{
				cout << v_person[i]._account << "  " << v_person[i]._balance << endl;
			}
			else
			{
				cout << v_person[i]._name << "  " << v_person[i]._id << "  " << v_person[i]._pnumber << "  " << v_person[i]._address << endl;
				cout << v_person[i]._account << "  " << v_person[i]._balance << endl;
			}
			++i;
		}
	}

效果如下:
在这里插入图片描述

6. 销户(注销银行卡)

销户有两种方法,一种是搜账号进行销毁,另一种是搜姓名进行销毁 (单姓名单卡号直接删,多姓名转换为按账号搜进行销毁) , 销户后将card中数据唤醒(即赋1),以便给其他用户使用。

  1. 按银行卡号删除
    按银行卡号删除就进行遍历v_person,然后进行删除,删除之前需释放卡号(即将card.second = 1)
  2. 按姓名删除
    按姓名删除void DestoryN(int n)需要传姓名的个数,int FindN()返回姓名的个数 (注意这里是多对多),只有当n==1时,才能直接删,否则按银行卡删。
	//通过银行卡号查找
	vector<Person>::iterator FindA(const string& account)
	{
		vector<Person>::iterator it = v_person.begin();
		while (it != v_person.end())
		{
			if ((*it)._account == account)
			{
				return it;
			}
			++it;
		}
		return it;
	}
	void Erase(vector<Person>::iterator& it)
	{
		map<string, int>::iterator itmap = card.begin();
		//将card.second赋值为1
		while (itmap != card.end())
		{
			if ((*itmap).first == (*it)._account)
			{
				(*itmap).second = 1;
				break;
			}
			++itmap;
		}
		//删除
		v_person.erase(it);
		cout << "删除成功" << endl;
	}
	//通过姓名删除
	void DestoryN(int n) 
	{
		if (n == 1) //没有重名
		{
			cout << "请再次输入要删除账户的姓名>:";
			string name;
			cin >> name;
			vector<Person>::iterator it = v_person.begin();
			while (it != v_person.end())
			{
				if ((*it)._name == name)
				{
					Erase(it);
					break;
				}
				++it;
			}
		}
		else //有重名或一个人有多张卡
		{
			cout << "有相同的姓名或多张银行卡" << endl;
			DestoryA();
		}
	}
	//通过银行卡号删除
	void DestoryA()
	{
		string account;
		cout << "请输入要删除的账号>:";
		cin >> account;
		vector<Person>::iterator it = FindA(account);
		Erase(it);
	}
	//查找姓名
	int FindName() 
	{
		int n = 0;
		while (true)
		{
			cout << "请输入要查找的姓名>:";
			string name;
			int i = 0;
			cin >> name;
			while (i < v_person.size())
			{
				if (v_person[i]._name == name)
				{
					cout << v_person[i]._name << "  " << v_person[i]._id << "  " << v_person[i]._pnumber << "  " << v_person[i]._address << "  " << v_person[i]._account << "  " << v_person[i]._balance << endl;
					++n;
				}
				++i;
			}
			if (n == 0)
				cout << "找不到,请重新输入!" << endl;
			else
				break;
		}

		return n;
	}
	//销户
	void CloseAccount()
	{
		int n = 0;
		int input = 0;
		do
		{
			cout << "请选择搜索销户的方式>:0.退出销毁  1.姓名  2.银行卡号" << endl;
			cout << "请选择>:";
			cin >> input;
			switch (input)
			{
			case 0:
				break;
			case 1:
				n = FindName();
				DestoryN(n);
				break;
			case 2:
				DestoryA();
				break;
			default:
				cout << "选择错误,请重新选择!" << endl;
				break;
			}
		} while (input);
	}

7. 存款、取款、转账

这些功能实现较简单,在v_person中遍历修改即可,代码如下:

	//存款
	void Deposit()
	{
		string account;
		cout << "请输入要存款的银行卡号>:";
		cin >> account;
		vector<Person>::iterator it = FindA(account);

		double balance = 0.0;
		cout << "请输入要存款的金额>:";
		cin >> balance;

		(*it)._balance += balance;
		cout << "存款成功" << endl;
	}
	//取款
	void Withdrawal()
	{
		string account;
		cout << "请输入要取的银行卡号>:";
		cin >> account;
		vector<Person>::iterator it = FindA(account);

		double balance = 0.0;
		cout << "请输入要取款的金额>:";
		cin >> balance;
		if ((*it)._balance < balance)
		{
			cout << "余额不足,取款失败! 余额为:" << (*it)._balance << endl;
		}
		else
		{
			(*it)._balance -= balance;
			cout << "取款成功! 剩余余额为:" << (*it)._balance << endl;
		}
	}
	//转账
	void Transfer()
	{
		double d;
		string a1;
		string a2;
		cout << "请输入被转的银行卡号:";
		cin >> a1;
		cout << "请输入转入的银行卡号:";
		cin >> a2;
		vector<Person>::iterator it1 = FindA(a1); 
		vector<Person>::iterator it2 = FindA(a2);
		cout << "请输入要转的金额>:";
		cin >> d;
		if ((*it1)._balance < d)
		{
			cout << "余额不足,转账失败! 余额为:" << (*it1)._balance << endl;
		}
		else
		{
			(*it1)._balance -= d;
			(*it2)._balance += d;
			cout << "转账成功!两张卡的余额分别为:" << (*it1)._balance << "  " << (*it2)._balance << endl;
		}
	}

4. 完整代码如下

银行管理系统大致思路如上,一些小细节就省略了。当然有些地方还需要一定的改善,比如可以加个办卡时间,还有好多地方需要二级菜单。
将上述一些代码放在Account类中,就可以跑起来

BAMSystem.h文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm> //sort
using namespace std;

#define CARD "1000000000" //默认银行卡号10位数
#define LENGTH 10
#define SIZE 1000 //默认写入1000个银行卡号
#define MAX 30

//人和卡的信息
class Person
{
public:
	string _name; //姓名
	string _id; //身份证号码
	string _pnumber; //电话号码
	string _address; //地址
	string _account; //账号
	double _balance = 0.0; //余额
};
Person p_tmp;
vector<Person> v_person;
//卡号是否使用
map<string, int> card;

//初始化
void cardInit()
{
	FILE* pf = fopen("card.txt", "r");
	if (pf == nullptr)
	{
		perror("DataInit fopen");
		return;
	}
	pair<string, int> tmp;
	char s[LENGTH + 1];
	int n = 0;
	while (fscanf(pf, "%s %d", s, &n) != EOF)
	{
		s[LENGTH] = '\0';
		tmp.first = s;
		tmp.second = n;
		::card.insert(tmp);
	}
	fclose(pf);
}
void v_personInit()
{
	FILE* pf = fopen("person.txt", "r");
	if (pf == nullptr)
	{
		perror("v_personInit fopen");
		return;
	}
	Person tmp;
	char name[MAX]; char id[MAX]; char pnumber[MAX]; char address[MAX]; char account[MAX]; double balance = 0.0;
	while (fscanf(pf, "%s %s %s %s %s %lf", name, id, pnumber, address, account, &balance) != EOF)
	{
		name[MAX - 1] = '\0';     ::p_tmp._name = name;
		id[MAX - 1] = '\0';       ::p_tmp._id = id;
		pnumber[MAX - 1] = '\0';  ::p_tmp._pnumber = pnumber;
		address[MAX - 1] = '\0';  ::p_tmp._address = address;
		account[MAX - 1] = '\0';     ::p_tmp._account = account;
		::p_tmp._balance = balance;
		v_person.push_back(::p_tmp);
	}
	fclose(pf);
}
//按照身份证号来排序
bool Compare1(Person p1, Person p2)
{
	return p1._id < p2._id;
}
void Sort()
{
	sort(v_person.begin(), v_person.end(), Compare1);
}
//保存数据
void cardSave()
{
	FILE* pf = fopen("card.txt", "w");
	if (pf == nullptr)
	{
		perror("DataCreate fopen");
		return;
	}
	map<string, int>::iterator it = ::card.begin();
	while (it != ::card.end())
	{
		fprintf(pf, "%s %d\n", (*it).first.c_str(), (*it).second);
		++it;
	}
	fclose(pf);
}
void v_personSave()
{
	FILE* pf = fopen("person.txt", "w");
	if (pf == nullptr)
	{
		perror("DataCreate fopen");
		return;
	}
	for (int i = 0; i < ::v_person.size(); ++i)
	{
		fprintf(pf, "%s %s %s %s %s %.2lf\n", v_person[i]._name.c_str(), v_person[i]._id.c_str(), v_person[i]._pnumber.c_str(), v_person[i]._address.c_str(), v_person[i]._account.c_str(), v_person[i]._balance);
	}
	fclose(pf);
}
void Save()
{
	cardSave();
	v_personSave();
}
//账户类
class Account :protected Person
{
public:
	void OpenAccount()
	{
		//输入数据
		cout << "请输入姓名>:";
		cin >> _name;
		cout << "请输入身份证号码>:";
		cin >> _id;
		cout << "请输入电话号码>:";
		cin >> _pnumber;
		cout << "请输入地址>:";
		cin >> _address;
		//初始化数据
		::p_tmp._name = _name;
		::p_tmp._id = _id;
		::p_tmp._pnumber = _pnumber;
		::p_tmp._address = _address;
		::p_tmp._balance = 0;
		//生成账号
		int n = 1;
		map<string, int>::iterator it = ::card.begin();
		while (it != ::card.end())
		{
			if ((*it).second == 1)
			{
				n = 0;
				::p_tmp._account = (*it).first;
				(*it).second = 0; //使用后的卡号赋值为0
				break;
			}
			++it;
		}
		if (n)
			cout << "办理失败,请及时扩充银行卡号!" << endl;
		else
		{
			v_person.push_back(::p_tmp);
			cout << "办理成功,银行卡号为:" << ::p_tmp._account << endl;
		}
	}
	//销户
	void CloseAccount()
	{
		int n = 0;
		int input = 0;
		do
		{
			cout << "请选择搜索销户的方式>:0.退出销毁  1.姓名  2.银行卡号" << endl;
			cout << "请选择>:";
			cin >> input;
			switch (input)
			{
			case 0:
				break;
			case 1:
				n = FindName();
				DestoryN(n);
				break;
			case 2:
				DestoryA();
				break;
			default:
				cout << "选择错误,请重新选择!" << endl;
				break;
			}
		} while (input);
	}
	//存款
	void Deposit()
	{
		string account;
		cout << "请输入要存款的银行卡号>:";
		cin >> account;
		vector<Person>::iterator it = FindA(account);

		double balance = 0.0;
		cout << "请输入要存款的金额>:";
		cin >> balance;

		(*it)._balance += balance;
		cout << "存款成功" << endl;
	}
	//取款
	void Withdrawal()
	{
		string account;
		cout << "请输入要取的银行卡号>:";
		cin >> account;
		vector<Person>::iterator it = FindA(account);

		double balance = 0.0;
		cout << "请输入要取款的金额>:";
		cin >> balance;
		if ((*it)._balance < balance)
		{
			cout << "余额不足,取款失败! 余额为:" << (*it)._balance << endl;
		}
		else
		{
			(*it)._balance -= balance;
			cout << "取款成功! 剩余余额为:" << (*it)._balance << endl;
		}
	}
	//转账
	void Transfer()
	{
		double d;
		string a1;
		string a2;
		cout << "请输入被转的银行卡号:";
		cin >> a1;
		cout << "请输入转入的银行卡号:";
		cin >> a2;
		vector<Person>::iterator it1 = FindA(a1); 
		vector<Person>::iterator it2 = FindA(a2);
		cout << "请输入要转的金额>:";
		cin >> d;
		if ((*it1)._balance < d)
		{
			cout << "余额不足,转账失败! 余额为:" << (*it1)._balance << endl;
		}
		else
		{
			(*it1)._balance -= d;
			(*it2)._balance += d;
			cout << "转账成功!两张卡的余额分别为:" << (*it1)._balance << "  " << (*it2)._balance << endl;
		}
	}

	//查找姓名
	int FindName() 
	{
		int n = 0;
		while (true)
		{
			cout << "请输入要查找的姓名>:";
			string name;
			int i = 0;
			cin >> name;
			while (i < v_person.size())
			{
				if (v_person[i]._name == name)
				{
					cout << v_person[i]._name << "  " << v_person[i]._id << "  " << v_person[i]._pnumber << "  " << v_person[i]._address << "  " << v_person[i]._account << "  " << v_person[i]._balance << endl;
					++n;
				}
				++i;
			}
			if (n == 0)
				cout << "找不到,请重新输入!" << endl;
			else
				break;
		}

		return n;
	}
	//7.查看
	void Show()
	{
		int i = 0;
		while (i < v_person.size())
		{
			if ((i > 0) && (v_person[i]._id == v_person[i - 1]._id))
			{
				cout << v_person[i]._account << "  " << v_person[i]._balance << endl;
			}
			else
			{
				cout << v_person[i]._name << "  " << v_person[i]._id << "  " << v_person[i]._pnumber << "  " << v_person[i]._address << endl;
				cout << v_person[i]._account << "  " << v_person[i]._balance << endl;
			}
			++i;
		}
	}
private:
	void Erase(vector<Person>::iterator& it)
	{
		map<string, int>::iterator itmap = card.begin();
		//将card.second赋值为1
		while (itmap != card.end())
		{
			if ((*itmap).first == (*it)._account)
			{
				(*itmap).second = 1;
				break;
			}
			++itmap;
		}
		//删除
		v_person.erase(it);
		cout << "删除成功" << endl;
	}
	//通过姓名删除
	void DestoryN(int n) 
	{
		if (n == 1) //没有重名
		{
			cout << "请再次输入要删除账户的姓名>:";
			string name;
			cin >> name;
			vector<Person>::iterator it = v_person.begin();
			while (it != v_person.end())
			{
				if ((*it)._name == name)
				{
					Erase(it);
					break;
				}
				++it;
			}
		}
		else //有重名或一个人有多张卡
		{
			cout << "有相同的姓名或多张银行卡" << endl;
			DestoryA();
		}
	}
	//通过银行卡号删除
	void DestoryA()
	{
		string account;
		cout << "请输入要删除的账号>:";
		cin >> account;
		vector<Person>::iterator it = FindA(account);
		Erase(it);
	}
	//通过银行卡号查找
	vector<Person>::iterator FindA(const string& account)
	{
		vector<Person>::iterator it = v_person.begin();
		while (it != v_person.end())
		{
			if ((*it)._account == account)
			{
				return it;
			}
			++it;
		}
		return it;
	}
};

main.cpp文件

#include "BAMSystem.h"

void menu()
{
	cout << "*******************************************" << endl;
	cout << "*******  1.开户  2.销户  3.存款  **********" << endl;
	cout << "*******  4.取款  5.转账  6.查询  **********" << endl;
	cout << "*******  7.查看  8.刷新  0.退出  **********" << endl;
	cout << "*******************************************" << endl;
}
int main()
{

	cardInit();
	v_personInit();

	int input = 0;
	Account a;
	do
	{
		menu();
		cout << "请选择>:";
		cin >> input;
		switch (input)
		{
		case 0:
			Sort(); //先排序,在保存
			Save();
			cout << "退出程序" << endl;
			break;
		case 1:
			a.OpenAccount();
			break;
		case 2:
			a.CloseAccount();
			break;
		case 3:
			a.Deposit();
			break;
		case 4:
			a.Withdrawal();
			break;
		case 5:
			a.Transfer();
			break;
		case 6:
			a.FindName();
			break;
		case 7:
			a.Show();
			break;
		case 8:
			Sort(); //先排序,在保存
			Save();
			cout << "刷新成功" << endl;
			break;
		default:
			cout << "选择错误,请重新选择。" << endl;
			break;
		}

	} while (input);
	return 0;
}

//只用来生成card.txt文件,生成card.txt文件后就不在使用,除非修改银行卡号的位数
//void DataCreate()
//{
//	FILE* pf = fopen("card.txt", "w");
//	if (pf == nullptr)
//	{
//		perror("DataCreate fopen");
//		return;
//	}
//	map<string, int> m;
//	string s = CARD;
//	int n = SIZE;
//	while (n--)
//	{
//		m.insert(pair<string, int>(s, 1));
//		fprintf(pf, "%s %d\n", s.c_str(), 1);
//		int tmp = stoi(s);
//		++tmp;
//		s = to_string(tmp);
//	}
//	fclose(pf);
//}

下图为删除银行卡号效果:
在这里插入图片描述

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

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

相关文章

抽象工厂模式(Abstract Factory)

定义 抽象工厂是一种创建型设计模式&#xff0c;它能创建一系列相关的对象&#xff0c;而无需指定其具体类。 前言 1. 问题 假设你正在开发一款家具商店模拟器。你的代码中包括一些类&#xff0c;用于表示&#xff1a; 一系列相关产品&#xff0c;例如椅子&#xff08;Chai…

091基于深度学习的手写汉字数字识别含10多种模型

emo仓库和视频演示找091期&#xff1a; 银色子弹zg的个人空间-银色子弹zg个人主页-哔哩哔哩视频 效果展示图如下&#xff1a; 代码文件展示如下&#xff1a; 运行01数据集文本生成制作.py可以读取图片路径保存再txt文本中&#xff0c; 运行02train.py可以对txt文本中的图片路…

同程数科基于 Apache Doris 构建统一实时数仓,查询提速数十倍!

本文导读&#xff1a; 同程数科是同程集团旗下的旅游产业金融科技服务平台&#xff0c;为上下游企业和个人消费者提供数字金融科技服务。近年来&#xff0c;随着同程数科业务的不断拓展和用户量的增加&#xff0c;高效可靠的一站式数据中心建设已成为必不可少的需求。为帮助业…

团体程序设计天梯赛-练习集L2篇④

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

WPF 零基础入门笔记(1):WPF静态页面,布局+样式+触发器

文章目录 官方文档往期回顾零基础笔记项目实战&#xff08;已完结&#xff09; WPF项目创建为什么选net core版本 WPF 静态页面WPF 页面布局WPF样式Style样式行内样式行外样式如果是简单样式&#xff0c;可以这么写如果是复杂样式 WPF样式继承WPF触发器单条件触发器多条件触发 …

LLDP(链路层发现协议)详解及C/C++代码实现

LLDP&#xff08;链路层发现协议&#xff09;是一种IEEE标准协议&#xff08;IEEE 802.1AB&#xff09;&#xff0c;它定义了封装在以太网帧中的消息&#xff0c;目的是通过默认情况下每30秒从每个端口定期重传一次&#xff0c;为设备提供一种向LAN&#xff08;局域网&#xff…

20个Java编程技巧

1. 把字符串常量放在前面 通过把字符串常量放在比较函数equals()比较项的左侧来防止偶然的 NullPointerException 从来都不是一个坏主意&#xff0c;就像这样&#xff1a; 这是毫无疑问的&#xff0c;把一种表达式转换成另一种更好的表达式&#xff0c;并不会失去什么。只要我…

mysql锁机制及MVCC底层原理

一、锁介绍 按性能可分为乐观锁&#xff08;适用于读多写少的情况下&#xff0c;如果是写多&#xff0c;导致过多cpu空转&#xff0c;影响性能&#xff09;和悲观锁&#xff08;适用于写多的情况&#xff09;按数据库操作粒度可分为表锁、页锁、行锁按数据库操作类型可分为读锁…

UE4/5动画系列(1.模板制作)

目录 动画模板制作 同步模板组制作 有模板做什么都方便&#xff0c;所以这里我们做一个动画蓝图的模板&#xff08;动物专用&#xff09; 动画模板制作 第一步创建一个动画蓝图的模板 然后找到第三人称的模板&#xff0c;将其模板的蓝图改名&#xff1a; 在动画蓝图的模板里…

团体程序设计天梯赛-练习集L2篇②

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

首个跨云元数据KV存储Xline正式进入CNCF沙箱

2023年6月13日&#xff0c;云原生计算基金会&#xff08;CNCF&#xff09;宣布Xline正式被纳入CNCF沙箱(Sandbox&#xff09;项目。Xline是由达坦科技&#xff08;DatenLord&#xff09;于2022年年底推出的开源项目&#xff0c;是一个用Rust语言写就的&#xff0c;用于元数据管…

hello算法笔记之图

一、图的基础知识 图是一种非线性数据结构&#xff0c;由「顶点 Vertex」和「边 Edge」组成。 1.图的类型&#xff1a; 根据边是否具有方向可以分为有向图&#xff0c;无向图 根据所有顶点是否连通可以分为连通图&#xff08;对于连通图&#xff0c;从某个顶点出发&#xf…

gdb系列-入门篇-day01

gdb基础命令 一个程序要被调试&#xff0c;编译的时候要加上-g选项&#xff0c;例如gcc -g … 先准备一个调试的小代码 #include <stdio.h>int hello() {printf("hello\n");return 0; }int main() {int a[5] {1,2,3,4,5};hello();for(int i0; i<5; i){pri…

springboot使用@Valid 和 @Validated 注解校验详解以及编写一个自定义全局异常类

package com.test.springvalid.config;import lombok.Data; import java.util.HashMap; import java.util.Map;/*** 通用返回结果&#xff0c;服务端响应的数据最终都会封装成此对象* param <T>*/ Data public class R<T> {private Integer code; //编码&#xff1…

Mybatis源码分析_Mapper接口是如何实例化的 (2)

我们在使用Springmybatis的时候&#xff0c;经常都是直接写一个接口和一个对应的 ***Mapper.xml文件&#xff0c;然后业务代码就可以直接注入这个接口了。它是如何做到的呢&#xff1f; 接口&#xff1a; xml 想搞清楚这个问题&#xff0c;那还是要从Mybatis底层源码进行分析的…

智能小车使用IIC屏幕做动作显示界面

一、简介 使用0.96寸IIC屏幕作为遥控动作的显示界面。 外设引脚 stm32f103c8t6单片机IIC引脚有两组 使用I2C1&#xff0c;对应的时钟与数据线分别为PB6、PB7。 IIC屏幕指令 // OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel // OLED_WR_Byte(0x00,OLED_CMD);//---se…

07- c语言指针 (C语言)

一 指针的引入 1、一般把内存中的一个字节称为一个内存单元。 2、为了正确地访问这些内存单元&#xff0c;必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址&#xff0c;通常也把这个地址称为指针。 3、如果在程序中定义…

车载网络测试 - CANCANFD - 基础篇_03

十、发送方式与过滤方式 1、广播发送及规则 我们以小组讨论现场为例来说明CAN总线广播发送规则&#xff1a; 1&#xff09;一个房间代表同一路CAN总线&#xff0c;每一个小组代表一个CAN Node&#xff0c;每一个小组成员发言代表发送一帧CAN报文&#xff0c;对所有的小组成员进…

生成对抗网络

1 GAN基本概念 1.1 GAN介绍 GAN的英文全称是Generative Adversarial Network&#xff0c;中文名是生成对抗网络。它由两个部分组成&#xff0c;生成器和鉴别器&#xff08;又称判别器&#xff09;&#xff0c;生成网络&#xff08;Generator&#xff09;负责生成模拟数据&…

【Python】异常处理 ④ ( 异常处理 else 语句 | 异常处理 finally 语句 )

文章目录 一、Python 异常捕获 else 语句1、异常捕获 else 语句2、代码示例 - 没有触发 else 语句的情况3、代码示例 - 触发 else 语句的情况 二、Python 异常捕获 finally 语句1、异常捕获 finally 语句2、代码示例 - 出现异常后执行 finally 语句 一、Python 异常捕获 else 语…