学生信息管理系统(通讯录)----------通俗易懂、附源码、C语言实现

news2024/11/14 18:48:05

绪论:

本篇文章使结构体章节后的习题,如果你对C语言有问题,或者结构体有什么问题不妨看看我之前所写的文章(章回体),对于文件管理和内存分配问题我将在后面补上,对于这个学生信息管理系统我用了多种方法和分源管理的形式来写可能内容偏多,但都有着重大意义,可以自行对我的源码进行copy和删减一些用了多种方法的地方,当然直接用也是没什么问题的。

附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要

思维导图

要XMind思维导图的话可以私信哈

逐步实现的目录

1.界面的创建、和功能的选择

1.1分源管理

1.1.1在主函数内

1.1.3在contact.h

1.1.2在contact.c

2.功能的实现

          2.1分源管理

2.1.1在主函数内

2.1.2在contact.h

2.1.3在contact.c

3.文件的保存、和文件的调用

3.1分源管理        

3.1.1在主函数内        

3.1.2在contact.c        

3.1.3在contact.h


补充:

对于分源管理:这样做的原因是可以将这个程序的实现,分开来实现,主函数放在了test.c中这里就像一个枢纽(主干)来选择功能,而contact.c 中放着的是这些主干后的分支(他代表着所要实现的功能的具体代码),而contact.h(头文件)这里存放着一些在test.c 和 contact.c 同时需要用到的东西,如头文件的应用、#define 定义的常量 、以及函数的声明 、这样只需在.c(源文件)中引用#include"contact" 即可包含该文件中的内容

下面先上源码:

test.c:

 #define _CRT_SECURE_NO_WARNINGS 1

#include"contact.h"

enum function
{
	Exit = 0,
	Add,
	Del,
	Search,
	Modeify,
	Show,
	Sort,
	Refresh
};


void menu()
{
	printf("********************************\n");
	printf("********************************\n");
	printf("*****    1. Add  2.Del     *****\n");
	printf("********************************\n");
	printf("*****  3.Search  4.Modeify *****\n");
	printf("********************************\n");
	printf("*****   5.Show   6.Sort    *****\n");
	printf("********************************\n");
	printf("*****  7.refresh    0.exit *****\n");
	printf("********************************\n");
	printf("********************************\n");
	//1)添加学生信息
	//2)删除学生信息
	//3)查询学生信息
	//4)修改学生信息
	//5)展示所有学生信息
	//6)重新排序学生信息
	//7)刷新学生信息
}

int main()
{
	int input = 0;

	Info_System con ;
//初始化
	InitCon(&con);
	//初始化方法二:Info_System con = {0};直接将全部置成0
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);

		switch(input)
		{
		case Add:
			Add_Stu_message(&con);
			break;
		case Del:
			Del_Stu_message(&con);
			break;
		case Search:
			Search_Stu_message(&con);
			break;
		case Modeify:
			Modeifyh_Stu_message(&con);
			break;
		case Show:
			Show_Stu_message(&con);
			break;
		case Sort:
			Sort_Stu_message(&con);
			break;
		case Refresh:
			Refresh_Stu_message(&con);
			break;
		case Exit:
			printf("退出\n");
			break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}


	} while (input);


	return 0;
}

contact.h:

#pragma once

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>


#define Name_Max 20
#define Sex_Max 5
#define Class_Max 20
#define Room_Max 20

#define PeoMax 100

typedef struct PeoInfo
{
	int ID;// 学号
	char Name[Name_Max];// 姓名
	char Sex[Sex_Max];// 性别
	char Class[Class_Max];// 班级
	char Room[Room_Max];// 宿舍号
	int Score;// 成绩

}PeoInfo;

typedef struct management_System
{

	PeoInfo Contact[PeoMax];//存放人的信息
	int sz;//已近存放了多少个人

}Info_System;


void InitCon(Info_System *con);

void Add_Stu_message(Info_System* con);

void Show_Stu_message(const Info_System* con);

void Del_Stu_message (Info_System* con);

void Search_Stu_message(const Info_System* con);

void Modeifyh_Stu_message(Info_System* con);

void Sort_Stu_message(Info_System* con);

void Refresh_Stu_message(Info_System* con);

contact.c:

 #define _CRT_SECURE_NO_WARNINGS 1

#include"contact.h"

//初始化
void InitCon(Info_System* con)
{
	assert(con);
	con->sz = 0;
	memset(con->Contact, 0, sizeof(Info_System));//利用memset将一块连续的空间初始化成0最后要初始化多少个字节
}

int FindById(int Id, const Info_System* con)
{
	int t = con->sz;//不要改变sz,用t来代替需要查找的人
	while (t--)
	{
		if (Id == con->Contact[t].ID)
		{
			return t;
		}
	}
	printf("找不到此人\n");
	return -1 ;//返回-1是因为区别于返回0(返回0表示查找的人的下标为0)
}
int FindByName(char * name,const Info_System* con)
{
	int t = con->sz;//不要改变sz,用t来代替需要查找的人
	while (t--)
	{
		if (strcmp(name, con->Contact[t].Name) == 0)//--ret 是因为ret表示的是总人数,而总人数-1才能找到最后一个人
		{
			return t;
		}

	}
	printf("找不到此人\n");

	return -1;//返回-1是因为区别于返回0(返回0表示查找的人的下标为0)
}

//增加
void Add_Stu_message(Info_System* con)
{
	assert(con);
	if (con->sz == PeoMax)
	{
		printf("信息已满,请删除或刷新后再试\n");
		return;
	}
	printf("依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n");
	scanf("%d %s %s %s %s %d", &con->Contact[con->sz].ID,
		con->Contact[con->sz].Name,
		con->Contact[con->sz].Class,
		con->Contact[con->sz].Sex,
		con->Contact[con->sz].Room,
		&con->Contact[con->sz].Score
	);
	con->sz += 1;
	//con->sz++;
	printf("添加完成\n");
}


void Show_Stu_message(const Info_System* con)
{
	assert(con);

	printf("%-10s %-20s %-20s %-5s %-20s %-10s\n", "学号", "名字", "班级", "性别", "宿舍", "计算机成绩");
	for (int i = 0; i < con->sz;i++)//解引用操作符的优先级都很(最)高
	{
		printf("%-10d %-20s %-20s %-5s %-20s %-10d\n", con->Contact[i].ID,
			con->Contact[i].Name,
			con->Contact[i].Class,
			con->Contact[i].Sex,
			con->Contact[i].Room,
			con->Contact[i].Score);
	}

}


void Del_Stu_message(Info_System* con)
{
	assert(con);
	if (con->sz == 0)
	{
		printf("没有学生信息\n");
		return;
	}
	int input = 0;
	printf("输入学号进行删除;>");
	scanf("%d", &input);
	int ret = FindById(input,con);
	if (ret != -1)
	{
		for (ret; ret < con-> sz - 1; ret++) //sz -1 也要转化成下标
		{
			con->Contact[ret] = con->Contact[ret+1]; //注意返回的就是所对应的下标
		}
		con->sz--;
		printf("删除成功\n");
	}
	//if (ret!=-1)
	//{
	//	memmove(con->Contact + ret, con->Contact + ret + 1, (con->sz)*sizeof(PeoInfo) - (ret) * sizeof(PeoInfo));
	//	con->sz--;
	//	printf("删除成功\n");
	//}

}


void Search_Stu_message(const Info_System* con)
{
	assert(con);
	int i = 0;
	printf("1.Id\n2.Name\n选择查找方法:>");
	scanf("%d", &i);
	if (i == 1)
	{
		int input = 0;

		printf("输入学号进行查找:>");
		scanf("%d", &input);
		int ret = FindById(input, con);
		if (ret != -1)
		{
			printf("%-10s %-20s %-20s %-5s %-20s %-10s\n", "学号", "名字", "班级", "性别", "宿舍", "计算机成绩");

			printf("%-10d %-20s %-20s %-5s %-20s %-10d\n", con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				con->Contact[ret].Score);
		}
	}
	else if (i == 2)
	{
		char name[20] = { 0 };
		printf("输入姓名进行查找:>");
		scanf("%s",name);
		int ret = FindByName(name, con);
		
		if (ret != -1)
		{
			printf("%-10s %-20s %-20s %-5s %-20s %-10s\n", "学号", "名字", "班级", "性别", "宿舍", "计算机成绩");

			printf("%-10d %-20s %-20s %-5s %-20s %-10d\n", con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				con->Contact[ret].Score);
		}
	}

	else
	{
		printf("选择错误\n");
	}
	

}


void Modeifyh_Stu_message(Info_System* con)
{
	assert(con);
	int i = 0;
	printf("1.Id\n2.Name\n选择查找方法:>");
	scanf("%d", &i);
	if (i == 1)
	{
		int input = 0;

		printf("输入要修改的学生信息的学号:>");
		scanf("%d", &input);
		int ret = FindById(input, con);
		if (ret != -1)
		{
			printf("修改:>\n");
			printf("依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n");
			scanf("%d %s %s %s %s %d", &con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				&con->Contact[ret].Score
			);

			printf("修改完成\n");
		}
	}
	else if (i == 2)
	{
		char name[20] = { 0 };
		printf("输入要修改的学生信息的姓名:>");
		scanf("%s", name);
		int ret = FindByName(name, con);

		if (ret != -1)
		{
			printf("修改:>\n");
			printf("依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n");
			scanf("%d %s %s %s %s %d", &con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				&con->Contact[ret].Score
			);
			printf("修改完成\n");

		}
	}

	else
	{
		printf("选择错误\n");
	}
}

int Sort_Name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->Name, ((PeoInfo*)e2)->Name);

}

int Sort_age(const void* e1, const void* e2)
{
	return ((PeoInfo*)e1)->ID  - ((PeoInfo*)e2)->ID;
}
void Sort_Stu_message(Info_System* con)
{
	assert(con);
	int input = 0;
	printf("1.以名字排序\n2.以学号排序\n");
	scanf("%d", &input);
	switch (input)
	{
	case 1:

		qsort(con->Contact, con->sz, sizeof(con->Contact[0]), Sort_Name);

		printf("排序成功\n");

		break;
	case 2:

		qsort(con->Contact, con->sz, sizeof(con->Contact[0]), Sort_age);
		printf("排序成功\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}
}

void Refresh_Stu_message(Info_System* con)
{
	InitCon(con);
	printf("刷新成功\n");
}



1.界面的创建、和功能的选择


1.1分源管理


1.1.1在主函数内

  1. 创建目录(界面)

在main函数内创建一个目录函数

int main()
{
	menu();
    retrn 0;
}

直接通过打印的方法,打印出自己所想要的目录(界面)

void menu()
{
	printf("********************************\n");
	printf("********************************\n");
	printf("*****    1. Add  2.Del     *****\n");
	printf("********************************\n");
	printf("*****  3.Search  4.Modeify *****\n");
	printf("********************************\n");
	printf("*****   5.Show   6.Sort    *****\n");
	printf("********************************\n");
	printf("*****  7.refresh    0.exit *****\n");
	printf("********************************\n");
	printf("********************************\n");
	//1)添加学生信息
	//2)删除学生信息
	//3)查询学生信息
	//4)修改学生信息
	//5)展示所有学生信息
	//6)重新排序学生信息
	//7)刷新学生信息
}

  1. 创建选择功能,

通过dowhile循环来不断的进行选择并且通过switch语句来控制所选择功能
 

int main()
{
	int input = 0;
	do
	{
		printf("请选择>:");
		scanf("%d", &input);
		switch(input)
		{
		case Add:
			Add_Stu_message(&con);
			break;
		case Del:
			Del_Stu_message(&con);
			break;
		case Search:
			Search_Stu_message(&con);
			break;
		case Modeify:
			Modeifyh_Stu_message(&con);
			break;
		case Show:
			Show_Stu_message(&con);
			break;
		case Sort:
			Sort_Stu_message(&con);
			break;
		case Refresh:
			Refresh_Stu_message(&con);
			break;
		case Exit:
			printf("退出\n");
			break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}
	} while (input);
	return 0;
}


1.1.3在contact.h

  1. 创建一个结构体存放学生的信息

一个学生的信息可能有   学号、姓名、性别、班级、宿舍、成绩

所以我们可以用一个结构体来存,并且用typedef来将复杂的名字简化

typedef struct PeoInfo
{
	int ID;// 学号
	char Name[Name_Max];// 姓名
	char Sex[Sex_Max];// 性别
	char Class[Class_Max];// 班级
	char Room[Room_Max];// 宿舍号
	int Score;// 成绩

}PeoInfo;
  1. 再创建一个结构体来存放每个学生(用数组)以及再通过计数器来计存了几个学生了

同样用到typedef来简化

typedef struct management_System
{

    PeoInfo Contact[PeoMax];//存放人的信息
    int sz;//已近存放了多少个人

}Info_System;

1.1.2在contact.c

  1.  初始化学生信息

对于已经创建好的结构体,他们此时还是一些随机值需要初始化

所以写一个初始化函数来进行初始化

void InitCon(Info_System* con)
{
	assert(con);
	con->sz = 0;
	memset(con->Contact, 0, sizeof(Info_System));//利用memset将一块连续的空间初始化成0最后要初始化多少个字节
}

其中有到了memset来直接对其初始化,

 第一个元素放目标地址,第二个元素表示要放东西的整形形式(如0 -> 0 ;而 'a' -> 97),第三个元素表示这个目标的大小(byte),具体用法可以看这篇博客:进阶C语言第三章-------《字符函数和内存函数》 完整思维导图+基本练习题+深入细节+通俗易懂+知识点+建议收藏_溟洵的博客-CSDN博客

附:首先,对于这些进行解释:他是通过枚举的办法实现的具体可以看看我写的一篇关于自定义类型的blog;其次,是对这个的解释

这是引用contact.h头文件,包含其里面的内容(函数的头文件,和函数声明)


2.功能的实现
 

2.1分源管理


2.1.1在主函数内


            通过目录的选择后进入功能内部


2.1.2在contact.h


2.1.3在contact.c


添加学生信息

对于下面的scanf操作我们需要引用并且存进结构体中 对于数组来说不需要加上& 
因为其数组名表示其地址 而对于整形就需要&了
先从con这是Info_System结构体的变量所以通过->访问其里面的成员Contact而其又是PeoInfo结构体的数组变量所以就可以通过访问数组空间再用.操作符来找到学生的信息,
这里不用-> 是因为前面con->Contact[con->sz] 已经表示成Contact[PeoMax]结构体变量了不需要在*解引用了 

void Add_Stu_message(Info_System* con)
{
assert(con);
if (con->sz == PeoMax)
{
	printf("信息已满,请删除或刷新后再试\n");
	return;
}
printf("依次输入%s %s %s %s %s %s\n", "学号", "名字", "班级", "性别", "宿舍", "计算机成绩");
scanf("%d %s %s %s %s %d",                  
&con->Contact[con->sz].ID,                                            
con->Contact[con->sz].Name,                             
con->Contact[con->sz].Class,                             
con->Contact[con->sz].Sex,                                
con->Contact[con->sz].Room,                          
&con->Contact[con->sz].Score
);
printf("添加完成\n");
}


展示学生信息

void Show_Stu_message(Info_System* con)
{
	assert(con);
	printf("%-10s %-20s %-20s %-5s %-20s %-10s\n", "学号", "名字", "班级", "性别", "宿舍", "计算机成绩");
	for (int i = 0; i < con->sz;i++)
		{
			printf("%-10d %-20s %-20s %-5s %-20s %-10d\n",
			 con->Contact[i].ID,
			con->Contact[i].Name,
			con->Contact[i].Class,
			con->Contact[i].Sex,
			con->Contact[i].Room,
			con->Contact[i].Score
			);
		}
}

对于printf打印只需要满足所给条件(%d)和所写条件(con->Contact[i].ID)对应的类型一致即可。


删除学生信息


void Del_Stu_message(Info_System* con)
{
	assert(con);
	if (con->sz == 0)
	{
		printf("没有学生信息\n");
		return;
	}
	int input = 0;
	printf("输入学号进行删除;>");
	scanf("%d", &input);
	int ret = FindById(input,con);
	if (ret != -1)
	{
		for (ret; ret < con-> sz - 1; ret++) //sz -1 也要转化成下标
		{
			con->Contact[ret] = con->Contact[ret+1]; //注意返回的就是所对应的下标
		}
		con->sz--;
		printf("删除成功\n");
	}
	//if (ret!=-1)
	//{
	//	memmove(con->Contact + ret, con->Contact + ret + 1, (con->sz)*sizeof(PeoInfo) - (ret) * sizeof(PeoInfo));
	//	con->sz--;
	//	printf("删除成功\n");
	//}

}

查找函数:

int FindByName(char * name,const Info_System* con)
{
	int t = con->sz;//不要改变sz,用t来代替需要查找的人
	while (t--)
	{
		if (strcmp(name, con->Contact[t].Name) == 0)//--ret 是因为ret表示的是总人数,而总人数-1才能找到最后一个人
		{
			return t;
		}

	}
	printf("找不到此人\n");

	return -1;//返回-1是因为区别于返回0(返回0表示查找的人的下标为0)
}
int FindById(int Id, const Info_System* con)
{
	int t = con->sz;//不要改变sz,用t来代替需要查找的人
	while (t--)
	{
		if (Id == con->Contact[t].ID)
		{
			return t;
		}
	}
	printf("找不到此人\n");
	return -1 ;//返回-1是因为区别于返回0(返回0表示查找的人的下标为0)
}

 查找学生信息

void Search_Stu_message(const Info_System* con)
{
	assert(con);
	int i = 0;
	printf("1.Id\n2.Name\n选择查找方法:>");
	scanf("%d", &i);
	if (i == 1)
	{
		int input = 0;

		printf("输入学号进行查找:>");
		scanf("%d", &input);
		int ret = FindById(input, con);
		if (ret != -1)
		{
			printf("%-10s %-20s %-20s %-5s %-20s %-10s\n", "学号", "名字", "班级", "性别", "宿舍", "计算机成绩");

			printf("%-10d %-20s %-20s %-5s %-20s %-10d\n", con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				con->Contact[ret].Score);
		}
	}
	else if (i == 2)
	{
		char name[20] = { 0 };
		printf("输入姓名进行查找:>");
		scanf("%s",name);
		int ret = FindByName(name, con);
		
		if (ret != -1)
		{
			printf("%-10s %-20s %-20s %-5s %-20s %-10s\n", "学号", "名字", "班级", "性别", "宿舍", "计算机成绩");

			printf("%-10d %-20s %-20s %-5s %-20s %-10d\n", con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				con->Contact[ret].Score);
		}
	}

	else
	{
		printf("选择错误\n");
	}
	

}

修改学生信息

void Modeifyh_Stu_message(Info_System* con)
{

	int i = 0;
	printf("1.Id\n2.Name\n选择查找方法:>");
	scanf("%d", &i);
	if (i == 1)
	{
		int input = 0;

		printf("输入要修改的学生信息的学号:>");
		scanf("%d", &input);
		int ret = FindById(input, con);
		if (ret != -1)
		{
			printf("原信息:\n%-10s %-20s %-20s %-5s %-20s %-10s\n", "学号", "名字", "班级", "性别", "宿舍", "计算机成绩");

			printf("%-10d %-20s %-20s %-5s %-20s %-10d\n", con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				con->Contact[ret].Score);
			

			printf("修改:>\n");
			printf("依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n");
			scanf("%d %s %s %s %s %d", &con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				&con->Contact[ret].Score
			);


		}
	}
	else if (i == 2)
	{
		char name[20] = { 0 };
		printf("输入要修改的学生信息的姓名:>");
		scanf("%s", name);
		int ret = FindByName(name, con);

		if (ret != -1)
		{
			printf("原信息:\n%-10s %-20s %-20s %-5s %-20s %-10s\n", "学号", "名字", "班级", "性别", "宿舍", "计算机成绩");

			printf("%-10d %-20s %-20s %-5s %-20s %-10d\n", con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				con->Contact[ret].Score);


			printf("修改:>\n");
			printf("依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n");
			scanf("%d %s %s %s %s %d", &con->Contact[ret].ID,
				con->Contact[ret].Name,
				con->Contact[ret].Class,
				con->Contact[ret].Sex,
				con->Contact[ret].Room,
				&con->Contact[ret].Score
			);
		}
	}

	else
	{
		printf("选择错误\n");
	}
}

 排序学生信息

int Sort_Name(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->Name, ((PeoInfo*)e2)->Name);
	//注意强转要写成 PeoInfo* 结构体类型
	//返回大于0的数才交换,即是升序形式
}

int Sort_age(const void* e1, const void* e2)
{
	return ((PeoInfo*)e1)->ID  - ((PeoInfo*)e2)->ID;
}
void Sort_Stu_message(Info_System* con)
{
	assert(con);
	int input = 0;
	printf("1.以名字排序\n2.以学号排序\n");
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		//ASCII升序
		qsort(con->Contact, con->sz, sizeof(con->Contact[0]), Sort_Name);//头文件stdlib,比较函数int compare(const void *elem1, const void *elem2)
		//此处con->Contact 直接找到了数组名传进去,所以qsort内所接受到的结构体时PeoInfo类型的

		printf("排序成功\n");

		break;
	case 2:
		//升序
		qsort(con->Contact, con->sz, sizeof(con->Contact[0]), Sort_age);
		printf("排序成功\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}
}



刷新学生信息
 

void Refresh_Stu_message(Info_System* con)
{
	InitCon(con);//直接再次调用初始化函数
	printf("刷新成功\n");
}


3.文件的保存、和文件的调用

3.1分源管理
        

3.1.1在主函数内
        

3.1.2在contact.c
       

3.1.3在contact.h

敬请期待!持续更新,关注喔老铁
 

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

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

相关文章

五【Spring】控制反转(IOC)

目录一 Ioc控制反转1.1 概述1.2 依赖注入二 传统依赖的问题2.1 在传统的项目中三 引入Spring解决3.1 Spring配置文件中Bean属性3.2 Bean的作用域3.3 项目案例四 基于xml的依赖注入&#xff08;注意有参 无参的构建&#xff09;4.1 设置注入4.2 构造注入&#xff08;依赖有参构造…

【Java面试总结】MySQL篇·优化篇

【Java面试总结】MySQL篇SQL优化篇1.该如何优化MySQL的查询&#xff1f;2.怎样插入数据才能更高效&#xff1f;3.表中包含几千万条数据该怎么办&#xff1f;4.MySQL的慢查询优化有了解吗&#xff1f;5.说一说你对explain的了解6.explain你一般关注什么&#xff1f;1.该如何优化…

【Linux】网络编程 - Socket套接字/基于UDP的网络通信

目录 一.套接字 1.什么是套接字/Socket套接字 2.套接字的分类 3.Socket套接字的常见API 二.网络字节序 1.什么是网络字节序 2.网络字节序和主机字节序的转换接口 三.IP地址形式上的转换 四.客户端的套接字不由程序员bind 1.为什么客户端套接字不能由程序员bind 2.OS…

【题外话】如何拯救小米11Pro这款工业垃圾

1 背景媳妇用小米11Pro手机&#xff0c;某日不慎摔落&#xff0c;幸好屏幕未碎&#xff0c;然而WiFi却怎样都无法打开&#xff0c;初以为是系统死机&#xff0c;几天依旧故障无法使用。现在的手机没有WiFi功能&#xff0c;就无法刷抖音、看视频&#xff0c;就是鸡肋了。后抽空去…

全栈之路-前端篇 | 第三讲.基础前置知识【前端标准与研发工具】学习笔记

欢迎关注「全栈工程师修炼指南」公众号点击 &#x1f447; 下方卡片 即可关注我哟!设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01;涉及 企业运维、网络安全、应用开发、物联网、人工智能、大数据 学习知识“ 花开堪折直须折&#xff0c;莫待无花空折…

【2.19】算法题2:贪心算法、动态规划、分治

题目&#xff1a;给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组 是数组中的一个连续部分。方法一&#xff1a;贪心算法原理&#xff1a;若当前指针所指元素之前的和小…

学生和老师-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-4】学生和老师 【案例介绍】 1.案例描述 在班级中上课时&#xff0c;老师在讲台上讲课&#xff0c;偶有提问&#xff0c;会点名学生回答问题。虽然老师和学生都在讲话&#xff0c;但讲话的具体内容却不相同。本案例要求使用抽象类的知识编写一个程序实现老师上课的情…

Allegro如何快速清除多余的规则设置操作指导

Allegro如何快速清除多余的规则设置操作指导 在用Allegro做PCB设计的时候,会给PCB设置一些规则,在PCB设计完成之后,可能会有一些没有使用到的规则,如下图 Physical规则中的45OHM的规则是多余的 单独某个规则可以直接在规则管理器中删除,如果比较多可以用下面方法批量删除…

真实景观渲染技巧【Three.js】

受到一些很棒的 three.js 演示、与 covid 相关的旅行禁令以及可能在 pinterest 上花太多时间看美丽的旅行照片的启发——我开始看看我是否可以使用 three.js 和r3f在浏览器中渲染一个令人信服的风景场景。 推荐&#xff1a;将 NSDT场景编辑器 加入你的3D开发工具链。 在过去一个…

AnLogicFPGA设计的时序约束及时序收敛

本篇博文讲了三个内容&#xff1a;时序约束基本概念、时序约束命令、时序收敛技巧 时序约束基本概念 时序设计的实质就是满足每一个触发器的建立&#xff08;setup&#xff09;时间和保持&#xff08;hold&#xff09;时间。 建立时间(Tsu) 触发器的时钟信号沿到来以前&…

零信任-新华三H3C零信任介绍(12)

​目录 ​新华三零信任是什么&#xff1f; 新华三零信任架构特点 新华三零信任架构 新华三零信任架构适用场景 新华三零信任的未来发展展望 新华三零信任是什么&#xff1f; 建立新边界 全面身份化。新华三贯彻“永不信任&#xff0c;始终验证”的原则&#xff0c;通过对…

JavaWeb7-线程状态(生命周期)及转换过程

目录 1.所有线程状态&#xff08;共6种&#xff09; ①NEW-新建状态 ②RUNNABLE-运行状态 RUNNABLE&#xff08;得到时间片运行中状态&#xff09; READY&#xff08;已经保存了上下文&#xff0c;但还未得到时间片的就绪状态&#xff09;。 ③BLOCKED-阻塞状态 ④WAITI…

使用NutUI创建小程序和H5界面

做开发的时间长了&#xff0c;技术都是通用的&#xff0c;创建小程序和H5界面有很多的UI&#xff0c;本章节演示使用NutUI来创建&#xff0c;官网&#xff0c;NutUI - 移动端 Vue3 小程序组件库 1.使用HBuilder X创建一个uni-app的程序&#xff0c;如图所示 2. 安装UniNutUI …

nvm的使用与坑

1、nvm 介绍 Node Version Manager - 符合 POSIX 标准的 bash 脚本&#xff0c;用于管理多个活动的 node.js 版本 官网为 nvm-windows&#xff0c;点击这里进行下载 2、使用场景 比如有几个项目&#xff0c;这些项目的需求都不太一样&#xff0c;导致了这些个项目需要依赖的…

论文投稿指南——中文核心期刊推荐(管理学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

多彩的声音-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-3】多彩的声音 记得 关注&#xff0c;收藏&#xff0c;评论哦&#xff0c;作者将持续更新。。。。 【案例介绍】 案例描述 设计和实现一个Soundable发声接口&#xff0c;该接口具有发声功能&#xff0c;同时还能调节声音大小。 Soundable接口的这些功能将由有3种声音…

【C++的OpenCV】第一课-opencv的介绍和安装(Linux环境下)

第一课-目录一、基本介绍1.1 官网1.2 git源码1.3 介绍二、OpenCV的相关部署工作2.1 Linux平台下部署OpenCV一、基本介绍 1.1 官网 opencv官网 注意&#xff1a;官网为英文版本&#xff0c;可以使用浏览器自带的翻译插件进行翻译&#xff0c;真心不推荐大家去看别人翻译的&am…

vue实现xml在线编辑功能

先看效果 避免误会 这是一个在线编辑器 我们可以在这上面随意的编写xml代码格式 我们修改上面的内容之后 就可以在控制台输出内容 如果这正是您想要的东西 那就可以先创建一个vue项目 我们先引入依赖 npm install brace -S npm install element-ui -S npm install vue-cli…

原型链污染

目录 前置知识 原型对象 prototype和__proto__的区别 原型链概念 原型链的继承 原型 链污染 原型链污染原理 javascript中可能会存在原型链污染的危险函数 原型链污染的实际应用 JavaScript中可以触发弹窗的函数 前置知识 原型对象 在JavaScript中&#xff0c;每个函…

9-静态链表及其有关操作

链表可以用malloc/new和结构体加指针的方式来实现&#xff0c;那种实现方式实现的链表又被称为动态链表。但是我们还可以利用数组的方式来实现一个链表&#xff0c;这种实现方式称为静态链表。 静态单链表 我们知道&#xff0c;一个链表节点主要由两大部分组成&#xff1a;数…