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

news2025/1/11 14:16:51

在这里插入图片描述

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[MAX];//存放人的信息
	int sz;//当前已经放的信息
}Contact;

这段代码定义了一个名为 “Contact” 的结构体(struct)类型,用于存储联系人的信息。该结构体包含以下字段:

“data” - 一个 PeoInfo 类型的数组,最多可以存储 MAX 个联系人的信息,其中 PeoInfo 是另一个结构体类型,用于存储单个联系人的信息。
“sz” - 一个整数,表示当前已经存储的联系人信息的数量。
可以将 “Contact” 结构体视为一个联系人列表,其中 “data” 数组存储了所有联系人的信息,而 “sz” 字段表示当前列表中已经存储的联系人数量。

这个结构体可以用于创建一个通讯录,其中每个联系人都有一个 PeoInfo 类型的信息。可以将 Contact 结构体作为参数或返回类型传递给需要处理联系人信息的函数。

3.初始化通讯录

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

这段代码定义了一个名为 “InitContact” 的函数,用于初始化一个 Contact 结构体类型的变量,即初始化一个通讯录。

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

在函数体中,首先将 Contact 结构体中的 “sz” 字段设置为 0,表示当前通讯录中没有联系人信息。然后使用 memset 函数将 “data” 数组中的所有元素都设置为 0,以确保通讯录中所有联系人的初始信息都为空。

这个函数可以用于在创建一个新的通讯录时初始化通讯录。

4.创建主函数框架

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:
			printf("退出程序");
			break;
		default:
			printf("输入错误,重新输入\n");
			break;
		}
	} while (input);

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

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

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 AddContact(Contact* pc)
{
	assert(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 宏检查指针是否为空,以确保程序不会崩溃。

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

这个函数可以用于向通讯录中添加新的联系人信息。

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

//删除指定联系人的信息
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 函数查找通讯录中是否存在该联系人。如果不存在,则打印一条消息并返回函数。如果存在,则将该联系人信息从通讯录中删除,即将该联系人信息的后面的所有联系人信息向前移动一个位置,并将通讯录中已经存储的联系人数量减 1。

这个函数可以用于根据人名删除通讯录中的联系人信息。

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

//查找指定联系人
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” 的函数,用于根据人名查找通讯录中的联系人信息。

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

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

这个函数可以用于根据人名查找通讯录中的联系人信息。

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

//修改指定联系人的信息
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 类型结构体中。

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

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

//显示通讯录的信息
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” 的函数,用于显示通讯录中所有联系人的信息。

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

在函数体中,首先打印表头,包括姓名、年龄、性别、地址和电话号码。然后使用循环遍历通讯录中所有的联系人信息,并打印出每个联系人的信息。

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

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

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;
}

这段代码定义了一个名为 “FindByName” 的函数,用于根据姓名在通讯录中查找对应联系人的位置。

该函数接受一个指向 Contact 类型的指针作为参数,表示要查找联系人信息的通讯录。同时,该函数还接受一个字符串参数 name,表示要查找的联系人姓名。函数使用循环遍历通讯录中所有的联系人信息,逐一比较姓名是否与要查找的姓名相同。如果找到对应的联系人,则返回该联系人在通讯录中的位置,否则返回 -1。

这个函数可以用于根据姓名在通讯录中查找对应联系人的位置。

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

//按名字排序联系人的信息
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 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,使用冒泡排序算法对通讯录中的联系人信息进行排序,具体实现是比较相邻的两个联系人姓名的字典序,如果前者大于后者,则交换两个联系人的信息。排序完成后,使用 ShowContact 函数打印排序后的通讯录信息。

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

13.完整源代码

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
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[MAX];//存放人的信息
	int sz;//当前已经放的信息
}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 InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

//添加联系人
void AddContact(Contact* pc)
{
	assert(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 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:
			printf("退出程序");
			break;
		default:
			printf("输入错误,重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

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

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

相关文章

MIAOYUN“一云多芯”全栈信创解决方案获认可!

信创&#xff0c;即信息技术产业创新&#xff0c;是数据安全、网络安全的基础&#xff0c;也是新基建的重要组成部分。信创产业发展已经成为经济数字化转型、提升产业链发展的关键&#xff0c;促进信创产业在本地落地生根&#xff0c;带动传统IT信息产业转型&#xff0c;构建区…

使用POI将excel文件导入到数据库

概要 随着时代变化&#xff0c;有的需求也会越来越多&#xff0c;例如&#xff1a;有的文件上千条数据需要导入数据库不可能手动一条条导入吧&#xff1f;太浪费时间了&#xff01;所以需要编写程序让程序来导入 整体架构流程 我这里使用的是springbootmybatisMVC的项目架构…

接口测试流程、测试点和测试工具

目录 前言&#xff1a; 一、什么情况下开展接口测试&#xff1f; 二、如何进行接口测试 三、接口测试用例设计 四、接口测试工具 前言&#xff1a; 接口测试是一种重要的测试类型&#xff0c;用于验证应用程序接口的功能、性能和可靠性。 一、什么情况下开展接口测试&am…

AtomicInteger源码

介绍 Atomic包是java.util.concurrent下的另一个专门为线程安全设计的Java包&#xff0c;包含多个原子操作类。这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下&#xff0c;当有多个线程同时执行这些类的实例包含的方法时&#xff0c;具有排他性&#xff0c;…

大坝渗流监测的目的和意义

​  大坝渗流监测是对坝体内渗流场进行的监测&#xff0c;是确保大坝安全运行的重要手段。通过监测&#xff0c;可以掌握渗流场的变化规律&#xff0c;并根据渗流场的变化趋势预测坝体、坝基可能出现的问题。通常根据渗漏量与渗流量两个指标来进行监测&#xff0c;即渗漏量小…

【ndarry的基本操作】——numpy03

目录索引 基本索引和切片&#xff1a;普通索引&#xff1a;省略索引&#xff1a;多省略索引&#xff1a;间隔索引&#xff1a; 形态变换操作&#xff1a;reshape()&#xff1a;resize()&#xff1a;transpose()&#xff1a;*通过参数进行转置&#xff1a;* flatten()&#xff1…

usb转8路串口模块

开源USB转8路串口PCB设计 文章目录 开源USB转8路串口PCB设计1. 简介2. 说明3. 一种跨电脑跨USB口的端口号自动识别方法4.开源地址 今天给大家介绍一款USB转8路串口的PCB设计&#xff0c;并提供一种跨电脑跨USB口的端口号自动识别方法。 1. 简介 芯片采用沁恒的CH348Q&#xff…

Kotlin Jetpack Compose - 实现Tab布局

Tab布局是一种常见的UI设计&#xff0c;它允许用户在不同的视图或数据集之间切换。我们将使用Jetpack Compose的 TabRow 和 ScrollableTabRow 组件来实现这个布局。 一、基本的Tab布局——TabRow 二、滚动的Tab布局——ScrollableTabRow 组件 三、自定义Tab组件 一、基本的T…

音视频数据处理-H265/HEVC视频码流分析

一、H265概述 H265/HEVC&#xff08;Hight Efficiency Video Coding&#xff09;是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准&#xff0c;主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行…

chatgpt赋能python:Python自动化定位元素的方法详解

Python自动化定位元素的方法详解 作为一名Python编程经验丰富的工程师&#xff0c;我经常需要用到自动化定位元素的方法。今天&#xff0c;我想与大家分享一下在Python中如何自动化定位元素&#xff0c;以帮助那些想要进行Web自动化测试的开发者们。 什么是自动化定位元素 在…

chatgpt赋能python:Python聊天界面:开发高效且易于使用的消息应用

Python聊天界面&#xff1a;开发高效且易于使用的消息应用 Python是一种十分流行的编程语言&#xff0c;最近几年来&#xff0c;这种语言在GUI应用程序开发方面也越来越受欢迎。在本篇文章中&#xff0c;我们将介绍如何使用Python开发一个高效且易于使用的消息应用程序——聊天…

chatgpt赋能python:Python自动化定位——解放SEO员工的双手

Python自动化定位——解放SEO员工的双手 SEO&#xff08;Search Engine Optimization&#xff09;是现代数字营销中必不可少的一环。面对庞大的网络世界&#xff0c;SEO员工们日复一日地进行着关键词排名、页面跳转、链接检测等重复且繁琐的工作。而Python作为一种功能强大、易…

chatgpt赋能python:Python自动执行:提高效率,增强灵活性

Python自动执行&#xff1a; 提高效率&#xff0c;增强灵活性 随着时代进步&#xff0c;人们日常生活中越来越依赖计算机和网络技术&#xff0c;而在编程领域&#xff0c;Python语言作为一种高效、可读性好、易学易用的语言&#xff0c;得到了广泛应用。其中&#xff0c;Pytho…

【算法之栈与队列I】leetcode239. 滑动窗口最大值

232.用栈实现队列 力扣题目链接 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并…

使用netwox 的实例进行ARP地址解析协议分析【网络工程】(保姆级图文)

目录 1. netwox 构造 ARP 报文使用 netwox 工具构造 ARP 包。1) 查看 netwox 所在主机默认的 ARP 包的相关信息&#xff0c;执行命令如下&#xff1a;2) 构造 ARP 请求包&#xff0c;请求目标主机 192.168.43.95&#xff0c;执行命令如下&#xff1a;3) 为了验证构造的 ARP 请求…

IDEA(2021.3.3) 登录Github copilot最新版本报错解决

"Request sign ln Initiate failed with message:read ECONNRESET, request id: 6, error code:-32603 " .在获得github认证后的登录设备验证阶段弹出。此处应该为login 弹出异常&#xff0c;方法一&#xff1a;先使用Github 520进行动态替换&#xff0c;打开自己hos…

霍夫变换椭圆检测(matlab仿真与图像处理系列第2期)

概述 椭圆检测是图像处理中的一个重要问题,其目的是从图像中检测出可能存在的椭圆。在实际的应用中,椭圆常常被用来描述物体的形状或者得到物体的尺寸信息。 传统的椭圆检测方法通常采用二维Hough变换,在求解过程中需要处理大量的数据,并且计算复杂度高,导致速度较慢,…

linux系统grep文本三剑客之一

文章目录 一、grep常用选项二、正则表达式三、sort命令四、tr命令五、cut命令六、split命令七、paste命令八、正则表达式总结 一、grep常用选项 grep&#xff1a;文本三剑客之一&#xff0c;对文本内容进行过滤&#xff0c;支持正则表达式&#xff0c;针对行来进行处理。 -m&a…

【C++】 Qt-信号与槽

文章目录 基本概念添加信号与槽方法一方法二 自定义信号与槽CheckBox自定义QMessageBox自定义信号 信号与槽多对多一个信号连接多个槽多个信号连接一个槽一个信号连接一个信号连接一个槽 断开连接方法一方法二判断是否连接成功 基本概念 信号&#xff08;signal&#xff09;和…

chatgpt赋能python:Python自动执行函数——提高生产力的利器

Python自动执行函数 —— 提高生产力的利器 Python作为一种高级编程语言&#xff0c;具有强大的自动化能力&#xff0c;可以轻松实现多种任务的自动执行&#xff0c;从而提高生产力和效率。这篇文章将介绍如何使用Python自动执行函数&#xff0c;以及它对于SEO的重要意义。 什…