c语言通讯录——动态版本(带详细文字解释)

news2024/9/24 9:20:24

在这里插入图片描述

1.定义一个用于存储一个人的信息的结构体

typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;

定义了一个名为 “PeoInfo” 的结构体(struct)类型,用于存储有关一个人的信息。
该结构体包含以下字段:

“name” - 一个字符数组,最多可以存储 NAME_MAX 个字符,表示这个人的姓名。
“age” - 一个整数,表示这个人的年龄。
“sex” - 一个字符数组,最多可以存储 SEX_MAX 个字符,表示这个人的性别。
“addr” - 一个字符数组,最多可以存储 ADDR_MAX 个字符,表示这个人的地址。
“tele” - 一个字符数组,最多可以存储 TELE_MAX 个字符,表示这个人的电话号码。

这个结构体可以用于存储一个人的信息,并且可以作为需要处理人员数据的函数的参数或返回类型。通常使用 typedef 创建结构体的别名,以允许更简洁的代码。

2.定义一个表示通讯录的结构体

typedef struct Contact
{
	PeoInfo* data;//指向存放人的信息的空间
	int sz;//当前已经放的信息的个数
	int capacity;//当前通讯录的最大容量
}Contact;

这段代码定义了一个名为 Contact 的结构体类型,用于表示通讯录。

该结构体包含三个成员变量:

PeoInfo* data:指向存放联系人信息的空间的指针,该空间由动态内存分配获得。
int sz:当前已经存储的联系人信息的个数。
int capacity:当前通讯录的最大容量,即可以存储的联系人信息的最大个数。
该结构体类型定义了通讯录的基本信息和存储方式,可以用于管理通讯录中的联系人信息。

3.创建主函数框架

int input;
	//创建通讯录
	Contact con;
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1://添加联系人
			AddContact(&con);
			break;
		case 2://删除联系人
			DelContact(&con);
			break;
		case 3://查找联系人
			SearchContact(&con);
			break;
		case 4://更改联系人
			ModifyContact(&con);
			break;
		case 5://显示联系人
			ShowContact(&con);
			break;
		case 6://排序联系人
			SortContactName(&con);
			break;
		case 0:
			DestroyContact(&con);
			printf("退出程序");
			break;
		default:
			printf("输入错误,重新输入\n");
			break;

这段代码包含了一个主函数的框架,用于管理一个通讯录的信息。主函数的具体实现可能包括以下步骤:

创建一个 Contact 类型的变量 con 作为通讯录。
调用 InitContact 函数初始化通讯录。
使用 do-while 循环显示菜单,要求用户输入数字进行操作。
根据用户输入的数字,调用相应的函数进行操作
如果用户输入1,执行函数AddContact,添加联系人
如果用户输入2,执行函数DelContact,删除联系人
如果用户输入3,执行函数SearchContact,查找联系人
如果用户输入4,执行函数ModifyContact,更改联系人
如果用户输入5,执行函数ShowContact,显示联系人
如果用户输入6,执行函数SortContactName,排序联系人
如果用户输入了 0,则退出程序。
输入用户输入“其他”,显示“输入错误,重新输入”。

4.初始化通讯录

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
	if (ptr == NULL)
	{
		perror("InitContact::calloc");
		return;
	}
	pc->data = ptr;
	pc->capacity = DEFAULT_SZ;
}

这段代码定义了一个名为 “InitContact” 的函数,用于初始化通讯录。

该函数接受一个指向 Contact 类型的指针作为参数,表示要初始化的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,首先将通讯录中已经存储的联系人信息个数 sz 初始化为 0。然后使用动态内存分配函数 calloc 分配 DEFAULT_SZ 个 PeoInfo 类型结构体的空间,并将返回的指针赋值给通讯录的 data 成员变量。同时,将通讯录的最大容量 capacity 设置为 DEFAULT_SZ。

这个函数可以用于初始化通讯录,将通讯录中已经存储的联系人信息个数 sz 初始化为 0,并分配 DEFAULT_SZ 个 PeoInfo 类型结构体的空间。

5.创建显示通讯录菜单的函数

void menu()
{
	printf("********************************************\n");
	printf("**            1.add     2.del             **\n");
	printf("**            3.search  4.modify          **\n");
	printf("**            5.show    6.sort            **\n");
	printf("**            0.exit                      **\n");
	printf("********************************************\n");
}

这段代码定义了一个名为 “menu” 的函数,用于显示通讯录操作的菜单,其中包括以下选项:
1.add——添加联系人
2.del——删除联系人
3.search——查找联系人
4.modify ——更改联系人
5.show——显示联系人
6.sort——排序联系人
0.exit ——销毁通讯录,退出程序

6.创建检查通讯录扩容的函数

//检查通讯录是否需要扩容
void check_capacity(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		//增加容量
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr == NULL)
		{
			perror("check_capacity::realloc");
			return;
		}
		pc->data = ptr;
		pc->capacity += INC_SZ;
		printf("增容成功\n");
	}
}

这段代码定义了一个名为 “check_capacity” 的函数,用于检查通讯录是否需要扩容。

该函数接受一个指向 Contact 类型的指针作为参数,表示要检查通讯录是否需要扩容的通讯录。在函数体中,函数检查通讯录中已经存储的联系人信息个数 sz 是否等于通讯录的最大容量 capacity。如果相等,则使用动态内存分配函数 realloc 重新分配内存,将新分配的内存大小设置为 (capacity + INC_SZ) * sizeof(PeoInfo),其中 INC_SZ 表示增加的容量大小。如果内存分配失败,则打印一条错误消息并返回函数。否则,将新分配的内存的指针赋值给通讯录的 data 成员变量,将通讯录的最大容量 capacity 更新为 (capacity + INC_SZ)。

这个函数可以用于检查通讯录是否需要扩容,并在需要扩容时增加容量。

7.创建添加联系人的函数

//添加联系人(动态版本)
void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//添加一个人的信息
	printf("请输入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;
}

这段代码定义了一个名为 “AddContact” 的函数,用于向通讯录中添加一个联系人信息。

该函数接受一个指向 Contact 类型的指针作为参数,表示要添加联系人信息的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。另外,check_capacity 函数用于检查通讯录是否需要扩容。

在函数体中,首先使用 check_capacity 函数检查通讯录是否需要扩容。如果通讯录已满,则打印一条消息并返回函数。否则,提示用户输入新添加联系人的信息,包括姓名、年龄、性别、地址和电话号码,并将这些信息存储在通讯录中下一个位置的 PeoInfo 类型结构体中。最后,将通讯录中已经存储的联系人信息个数 sz 加 1。

这个函数可以用于向通讯录中添加一个联系人信息,如果通讯录已满则返回函数。

8.创建删除联系人的函数

//删除指定联系人的信息
void DelContact(Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通信录为空,无法删除\n");
		return;
	}
	//删除
	printf("请输入要删除人的名字:\n");
	scanf("%s", name);
	int ret=FindByName(pc,name);
	if (-1==ret)
	{
		printf("要删除的人不存在\n");
		return;
	}
	int i = 0;
	for (i = ret;i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

这段代码定义了一个名为 “DelContact” 的函数,用于从通讯录中删除指定联系人的信息。

该函数接受一个指向 Contact 类型的指针作为参数,表示要删除联系人信息的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。另外,如果通讯录中没有联系人信息则打印一条消息并返回函数。

在函数体中,首先提示用户输入要删除的联系人姓名,并使用 FindByName 函数查找该联系人在通讯录中的位置。如果该联系人不存在,则打印一条消息并返回函数。否则,从该位置开始遍历通讯录中的所有联系人,并将每个联系人的信息向前移动一个位置,以覆盖要删除的联系人信息。最后,将通讯录中已经存储的联系人信息个数 sz 减 1,并打印一条删除成功的消息。

这个函数可以用于从通讯录中删除指定联系人的信息。

9.创建查找指定联系人的函数

//查找指定联系人
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].addr,
		pc->data[pos].tele);
}

这段代码定义了一个名为 “SearchContact” 的函数,用于在通讯录中查找指定联系人的信息。

该函数接受一个指向 const Contact 类型的指针作为参数,表示要查找联系人信息的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,首先提示用户输入要查找的联系人姓名,并使用 FindByName 函数查找该联系人在通讯录中的位置。如果该联系人不存在,则打印一条消息并返回函数。否则,打印联系人的姓名、年龄、性别、地址和电话信息。

这个函数可以用于在通讯录中查找指定联系人的信息。

10.创建修改指定联系人信息的函数

//修改指定联系人的信息
void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别:");
	scanf("%s", pc->data[pos].sex);
	printf("请输入地址:");
	scanf("%s", pc->data[pos].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[pos].tele);
	printf("修改完成\n");
}

这段代码定义了一个名为 “ModifyContact” 的函数,用于修改通讯录中指定联系人的信息。

该函数接受一个指向 Contact 类型的指针作为参数,表示要修改联系人信息的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,首先提示用户输入要修改的联系人姓名,并使用 FindByName 函数查找该联系人在通讯录中的位置。如果该联系人不存在,则打印一条消息并返回函数。否则,提示用户输入新的联系人信息,包括姓名、年龄、性别、地址和电话号码,并将这些信息存储在通讯录中指定位置的 PeoInfo 类型结构体中。最后,打印一条修改完成的消息。

这个函数可以用于修改通讯录中指定联系人的信息。

11.创建显示通讯录信息的函数

//显示通讯录的信息
void ShowContact(const Contact* pc)
{
	assert(pc);
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].tele);
	}
}

这段代码定义了一个名为 “ShowContact” 的函数,用于显示通讯录中所有联系人的信息。

该函数接受一个指向 const Contact 类型的指针作为参数,表示要显示联系人信息的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。在函数体中,首先打印联系人信息的表头,包括姓名、年龄、性别、地址和电话。然后遍历通讯录中的所有联系人,逐个打印其姓名、年龄、性别、地址和电话信息。

这个函数可以用于显示通讯录中所有联系人的信息。

12.创建查找对应联系人位置的函数

int FindByName(Contact*pc,char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

13.创建按名字排序联系人信息的函数

//按名字排序联系人的信息
void SortContactName(Contact* pc)
{
	assert(pc);
	PeoInfo temp;
	for (int i = 0; i < pc->sz - 1; i++)
	{
		for (int j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				temp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = temp;
			}
		}
	}
	printf("排序后为:\n");
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].tele);
	}
}

这段代码定义了一个名为 “SortContactName” 的函数,用于按照联系人姓名对通讯录中的联系人信息进行排序。

该函数接受一个指向 Contact 类型的指针作为参数,表示要排序联系人信息的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。在函数体中,使用冒泡排序算法对通讯录中的联系人信息进行排序,排序的关键字为联系人的姓名,使用 strcmp 函数进行比较。排序完成后,打印排序后的联系人信息表头和每个联系人的姓名、年龄、性别、地址和电话。

这个函数可以用于按照联系人姓名对通讯录中的联系人信息进行排序。

14.创建销毁通讯录的函数

//销毁通讯录
void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
	pc = NULL;
}

这段代码定义了一个名为 “DestroyContact” 的函数,用于销毁通讯录并释放内存。

该函数接受一个指向 Contact 类型的指针作为参数,表示要销毁的通讯录。在函数体中,首先使用 free 函数释放通讯录中的联系人信息所占用的内存。然后将通讯录的容量和大小都设置为 0,并将通讯录指针设置为 NULL。

这个函数可以用于销毁通讯录并释放内存,避免内存泄漏。

15.完整源代码

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
#define DEFAULT_SZ 3
#define INC_SZ 2
typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;
typedef struct Contact
{
	PeoInfo* data;//指向存放人的信息的空间
	int sz;//当前已经放的信息的个数
	int capacity;//当前通讯录的最大容量
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//增加联系人
void AddContact(Contact* pc);
//删除指定联系人
void DelContact(Contact* pc);
//显示通讯录的信息
void ShowContact(const Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人的信息
void ModifyContact(Contact* pc);
//按名字排序联系人的信息
void SortContactName(Contact* pc);
//销毁通讯录
void DestroyContact(Contact* pc);

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
	if (ptr == NULL)
	{
		perror("InitContact::calloc");
		return;
	}
	pc->data = ptr;
	pc->capacity = DEFAULT_SZ;
}

//检查通讯录是否需要扩容
void check_capacity(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		//增加容量
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr == NULL)
		{
			perror("check_capacity::realloc");
			return;
		}
		pc->data = ptr;
		pc->capacity += INC_SZ;
		printf("增容成功\n");
	}
}
//添加联系人(动态版本)
void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//添加一个人的信息
	printf("请输入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;
}

//显示通讯录的信息
void ShowContact(const Contact* pc)
{
	assert(pc);
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].tele);
	}
}

int FindByName(Contact*pc,char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//删除指定联系人的信息
void DelContact(Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通信录为空,无法删除\n");
		return;
	}
	//删除
	printf("请输入要删除人的名字:\n");
	scanf("%s", name);
	int ret=FindByName(pc,name);
	if (-1==ret)
	{
		printf("要删除的人不存在\n");
		return;
	}
	int i = 0;
	for (i = ret;i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

//查找指定联系人
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].addr,
		pc->data[pos].tele);
}

//修改指定联系人的信息
void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
		return;
	}
	printf("请输入名字:");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别:");
	scanf("%s", pc->data[pos].sex);
	printf("请输入地址:");
	scanf("%s", pc->data[pos].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[pos].tele);
	printf("修改完成\n");
}

//按名字排序联系人的信息
void SortContactName(Contact* pc)
{
	assert(pc);
	PeoInfo temp;
	for (int i = 0; i < pc->sz - 1; i++)
	{
		for (int j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				temp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = temp;
			}
		}
	}
	printf("排序后为:\n");
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].tele);
	}
}

//销毁通讯录
void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
	pc = NULL;
}
void menu()
{
	printf("********************************************\n");
	printf("**            1.add     2.del             **\n");
	printf("**            3.search  4.modify          **\n");
	printf("**            5.show    6.sort            **\n");
	printf("**            0.exit                      **\n");
	printf("********************************************\n");
}
int main()
{

	int input;
	//创建通讯录
	Contact con;
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1://添加联系人
			AddContact(&con);
			break;
		case 2://删除联系人
			DelContact(&con);
			break;
		case 3://查找联系人
			SearchContact(&con);
			break;
		case 4://更改联系人
			ModifyContact(&con);
			break;
		case 5://显示联系人
			ShowContact(&con);
			break;
		case 6://排序联系人
			SortContactName(&con);
			break;
		case 0:
			DestroyContact(&con);
			printf("退出程序");
			break;
		default:
			printf("输入错误,重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

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

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

相关文章

软件测试实验室申请cnas需要做好哪些资源准备?

软件测试实验室在准备申请cnas资质前&#xff0c;除了建立完善的软件测试体系、科学的质量管理体系&#xff0c;还需要做好相关资源的准备。本文我们就一起来看一下&#xff0c;cnas官方文件中的资源要求部分&#xff0c;以及对于软件检测实验室&#xff0c;应该做好哪些准备才…

项目bug--汇集

1、 2、 原因&#xff1a;页面选择后 没有调init方法 刷新页面 解决&#xff1a;在保存方法最后 &#xff0c;加上init方法 3、 原因&#xff1a;select中 v-model绑定的id、select选项中 :value 绑定的id &#xff0c;和编辑时触发的方法里 的id 没有一致&#xff0c;可能的…

抖音账号矩阵系统源码开发怎么用

以下是一些关键的技术交付形式&#xff1a; 1. 形成完整的运营需求框架 在开展任何项目前&#xff0c;首先应建立一个完整的运营需求框架。这个框架要对于整个系统的功能、结构、性能、安全、稳定性等方面进行详细的需求分析。并且需要与各方沟通&#xff0c;形成清晰的需求文…

【高频电子线路课程设计】调幅发射机

目录 高频电子线路课程设计 摘要&#xff1a; 1绪论 1.1设计的作用和目的 2调幅发射机的主要性能指标 2.1调幅发射机的工作原理 3小功率调幅发射机的设计 3.1方案的选择 3.1.1简易调幅发射机的工作原理框图 3.1.2功率分配及电源电压确定 3.1.3各级晶体管的选择 3.2…

Golang每日一练(leetDay0109) 拼接最大数、区间和的个数

目录 321. 拼接最大数 Create Maximum Number &#x1f31f;&#x1f31f;&#x1f31f; 327. 区间和的个数 Count of Range Sum &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Pytho…

【Android】怎么把一个自定义Dialog弄成一个圆形的

需求 自定义一个Dialog&#xff0c;做成圆形 实现 实现步骤&#xff1a; 创建XML布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://s…

多元分类预测 | Matlab麻雀算法(SSA)优化极限学习机(ELM)的分类预测,多特征输入模型。SSA-ELM分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 麻雀算法(SSA)优化极限学习机(ELM)的分类预测,多特征输入模型。SSA-ELM分类预测模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代…

C#中如何调整easyui中控件方法$.messager.alert弹窗窗口和字体的大小

首先看下调整前的效果&#xff1a; 这是easyui 默认的一个效果&#xff0c;然后 我在网上搜调整大小&#xff0c;搜到的代码是这样的 $.messager.alert({title: 提示,msg: ,icon: warning,ok: 确定,style: {fontSize: 20px // 修改字体大小},fn: function(){$(.messager-windo…

Git 常用指令

查看修改的文件 将修改的文件添加到版本库 Git如何创建、切换、删除分支? 合并分支 新建分支 切换分支 合并分支&#xff0c;解决冲突 删除分支

如何校验 MySQLOracle 时间字段合规性?

作者&#xff1a;余振兴 爱可生 DBA 团队成员&#xff0c;热衷技术分享、编写技术文档。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 背景信息 在数据迁移或者数据库低版本升级到高版本…

基于OneAPI工具分析包TensorFlow的聊天机器人设计分析和总结

文章目录 基础介绍&#xff1a;实现思路&#xff1a;详细介绍1. 聊天机器人发展历程&#xff1a;2. embedding_attention_seq2seq接口&#xff1a;3. 训练模型&#xff1a;4. Python编程实现完整的聊天机器人&#xff1a;补充内容&#xff1a; 环境搭建与关键技术环境搭建关键技…

【跟晓月学数据库】基于book库的mysql进阶实战

前言 上篇文章中&#xff0c;我们已经导入了book库&#xff0c;如果你还没有导入book库&#xff0c;参考&#xff1a;【跟晓月学数据库】使用MySQLdump 对数据导入导出 这篇文章&#xff0c;主要是基于book库的操作&#xff0c;希望对你有用。 &#x1f3e0;个人主页&#xf…

如何在vue项目开发中使用tailwindcss样式

在vue项目中下载tailwindcss依赖 yarn add tailwindcss1.4.6ornpm i tailwindcss1.4.6新建一个tailwind.css文件 在src文件夹下的asset静态资源文件夹中创建一个css样式文件夹&#xff0c;然后在该css文件夹下创建一个tailwind.css文件&#xff0c;并在文件中写入如下代码 使用…

xss-labs靶场level1~5

参考资料&#xff1a; XSS常见的触发标签_可以触发xss的标签_H3rmesk1t的博客-CSDN博客 基础知识&#xff1a; XSS漏洞的定义: 跨站脚本攻击XSS(Cross Site Scripting)&#xff0c;为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩…

android 添加图片 error 使用

安卓开发在drawable文件夹下如何插入后缀为xhdpi xxxhdpi 的图片 1&#xff1a;copy图片进drawable文件夹时&#xff0c;在路径后面加上“-xhdpi” 2.直接在drawable文件夹下新建一个drawable-xhdpi文件夹&#xff0c;你再添加图片的时候就会让你选择将图片具体放到哪个文件夹下…

高速电路设计系列分享-熟悉JESD204B(上)

目录 概要 整体架构流程 技术名词解释 技术细节 1.应用层 2.传输层 小结 基本概要 随着高速ADC跨入GSPS范围&#xff0c;与FPGA(定制ASIC)进行数据传输的首选接口协JESD204B。为了捕捉频率范围更高的RF频谱&#xff0c;需要宽带RFADC。在其推动下&#xff0c;对于能够捕捉更宽带…

Tomcat【管理页面】

管理页面的功能 server status &#xff1a;图形化管理、查看页面状态Manager app&#xff1a;图像化添加、创建、部署、删除项目目录host manager&#xff1a;图形化创建、管理、删除虚拟主机 默认安装tomcat需要配置以后才能使用 配置conf/tomcat-users.xml [rootnginx ROO…

网络通信性能测试方法-iperf、ping

1 iperf工具下载安装 根据板卡类型,选择合适的iperf软件版本下载 (ARM64) wget https://iperf.fr/download/ubuntu/iperf3_3.1.3-1_arm64.deb 根据提示下载依赖 wget https://iperf.fr/download/ubuntu/libiperf0_3.1.3-1_arm64.deb 下载后使用命令sudo dpkg -i xxx.deb …

黑河学院ASP.NET程序设计大作业(3)--登录及账号密码的CURD

目录 一、效果&#xff1a; 二、代码分布&#xff1a; 三、介绍 1.添加用户 2.删除用户&#xff1a; 3.修改密码&#xff1a; 四、遇到的问题&#xff1a; 一、效果&#xff1a; 二、代码分布&#xff1a; 三、介绍 1.添加用户 判断是否是管理员&#xff0c;只有管理员才可以…

chatgpt赋能python:用Python计算圆周率的两种方法

用Python计算圆周率的两种方法 圆周率&#xff08;π&#xff09;是一个非常重要的数学常数&#xff0c;被广泛应用于数学、计算机科学和工程学中。本文将介绍两种使用Python计算圆周率的方法&#xff1a;蒙特卡罗方法和Bailey–Borwein–Plouffe算法。 蒙特卡罗方法 蒙特卡…