当前位置: 首页 > news >正文

【通讯录】--C语言

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

通讯录--C语言

  • 🎈 一、初始版本
  • 🌺二、动态扩容版本
  • 🌵三、文件版(可长期保存数据)
    • Contact.h
    • Contact.c
    • test.c

用c语言实现一个通讯录的系统,并且存储若干人的信息,每个人的信息包括:
姓名,性别,年龄,电话号码,住址。
此通讯录系统的功能包括:
1.增加联系人
2.删除对应的联系人
3.查找联系人
4.修改联系人的信息
5.排序此通讯录
6.打印出通讯录每个人的信息

设计
test.c--------------------测试通讯录的功能

contact.h---------------通讯录的实现(接口的声明)

contact.c---------------通讯录的实现(接口的实现)

🎈 一、初始版本

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define Max_ADDR 30enum OPTION
{EXIT,ADD,DLE,SEARCH,MODIFY,SHOW,SORT
};typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[Max_ADDR];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];int sz;
}Contact;//初始化联系人
void InitContact(Contact* pc);//添加联系人+
void AddContact(Contact* pc);//显示联系人
void ShowContact(Contact* pc);//删除指定联系人(name)
void DelContact(Contact* pc);//查找一个人
void SearchContact(Contact* pc);//修改指定联系人信息
void ModifyContact(Contact* pc);//排序
void SortContact(Contact* pc);

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{printf("**********************************\n");printf("****1.增加              2.删除****\n");printf("****3.查找              4.修改****\n");printf("****5.展示              6.排序****\n");printf("****0.退出                    ****\n");printf("**********************************\n");
}
void test()
{Contact con;//通讯录InitContact(&con);//初始化int input;do {menu();printf("请输入你的选则:");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DLE:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT:printf("退出通讯录!!\n");break;default:printf("选择错误,请重新输入\n"); break;}} while (input);
}int main()
{test();return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//初始化联系人
void InitContact(Contact* pc)
{assert(pc);memset(pc->data, 0, sizeof(pc->data));pc->sz = 0;
}//添加联系人+
void AddContact(Contact* pc)
{assert(pc);//判断if (pc->sz == MAX){printf("通讯录已满,无法添加!");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].tele);printf("请输入住址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("添加成功");
}//显示联系人
void ShowContact(const Contact* pc)//const修饰,不让其通过pc指针改变其指向内容。
{assert(pc);int i = 0;//打印表头printf("%-20s\t %2s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");//打印内容for (i = 0; i < pc->sz; i++){printf("%-20s\t %2d\t %-5s\t %-12s\t %-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}//查找
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;
}//删除指定联系人(name)
void DelContact(Contact* pc)
{char name[MAX_NAME];assert(pc);printf("请输入要删除的名字\n");scanf("%s", name);int i = 0;//如果为空,不删if (pc->sz == 0) {printf("通讯录为空\n");return;}int del = FindByName(pc, name);if (del == -1) {printf("没找到\n");return;}for (i = del; 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[MAX_NAME];printf("请输入要删除的名字\n");scanf("%s", name);int find = FindByName(pc, name);if (find == -1){printf("没有这个人\n");return;}//打印找到人的信息printf("%-20s\t %2d\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");//打印内容printf("%-20s\t %2d\t %-5s\t %-12s\t %-20s\n",pc->data[find].name,pc->data[find].age,pc->data[find].sex,pc->data[find].tele,pc->data[find].addr);}//修改指定联系人信息
void ModifyContact(Contact* pc)
{assert(pc);printf("请输入要修改联系人的姓名:\n");char name[MAX_NAME];scanf("%s", name);int find = FindByName(pc, name);if (find == -1){printf("没有这个人\n");return;}printf("请输入要修改的内容:\n");printf("请输入姓名:");scanf("%s", pc->data[find].name);printf("请输入年龄:");scanf("%d", &pc->data[find].age);printf("请输入性别:");scanf("%s", pc->data[find].sex);printf("请输入电话:");scanf("%s", pc->data[find].tele);printf("请输入住址:");scanf("%s", pc->data[find].addr);printf("修改成功!!!!\n");
}//排序
//名字排序
int comper_name(const void* e1, const void* e2)
{return strcmp(((Contact*)e1)->data->name, ((Contact*)e2)->data->name);
}
//年龄排序
int comper_age(const void* e1, const void* e2)
{return ((Contact*)e1)->data->age - ((Contact*)e2)->data->age;
}
//性别排序
int comper_sex(const void* e1, const void* e2)
{return strcmp(((Contact*)e1)->data->sex, ((Contact*)e2)->data->sex);
}
//排序
void SortContact(Contact* pc)
{printf("***************************\n");printf("1. 名字排序   2. 年龄排序\n");printf("3. 性别排序   \n");printf("***************************\n");printf("请选择排序方法:");int input = 0;scanf("%d", &input);switch (input){case 1:qsort(pc->data, pc->sz, sizeof(PeoInfo), comper_name);ShowContact(pc);printf("排序成功\n");break;case 2:qsort(pc->data, pc->sz, sizeof(PeoInfo), comper_age);ShowContact(pc);printf("排序完成\n");break;case 3:qsort(pc->data, pc->sz, sizeof(PeoInfo), comper_sex);ShowContact(pc);printf("排序完成\n");break;default:printf("选择错误\n");break;}
}

🌺二、动态扩容版本

Contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define Max_ADDR 30
#define INT_SZ 2enum OPTION
{EXIT,ADD,DLE,SEARCH,MODIFY,SHOW,SORT
};typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[Max_ADDR];
}PeoInfo;typedef struct Contact
{PeoInfo* data;//指向存储数据的空间int sz;//记录当前存放有效数据int capacity;//记录当前的最大容量
}Contact;//初始化联系人
void InitContact(Contact* pc);//添加联系人+
void AddContact(Contact* pc);//显示联系人
void ShowContact(Contact* pc);//删除指定联系人(name)
void DelContact(Contact* pc);//查找一个人
void SearchContact(Contact* pc);//修改指定联系人信息
void ModifyContact(Contact* pc);//排序
void SortContact(Contact* pc);//释放空间
void DestroyContact(Contact* pc);	

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//初始化联系人
void InitContact(Contact* pc)
{assert(pc);pc->data = (PeoInfo*)malloc(sizeof(PeoInfo));pc->sz = 0;
}//扩容
int CheckCapacity(Contact* pc)
{if (pc->sz == pc->capacity){PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INT_SZ) * sizeof(PeoInfo));if (ptr == NULL){printf("扩容失败!");perror("CheckCapacity");return 0;}else{pc->data = ptr;pc->capacity += INT_SZ;printf("扩容成功!");return 1;}}return 1;
}
//添加联系人+
void AddContact(Contact* pc)
{assert(pc);//判断if (CheckCapacity(pc) == 0){printf("添加失败,空间不足!");return;}if (CheckCapacity(pc) == 1){printf("扩容成功\n");//添加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].tele);printf("请输入住址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("添加成功\n");}
}//显示联系人
void ShowContact(const Contact* pc)//const修饰,不让其通过pc指针改变其指向内容。
{assert(pc);int i = 0;//打印表头printf("%-20s\t %2s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");//打印内容for (i = 0; i < pc->sz; i++){printf("%-20s\t %2d\t %-5s\t %-12s\t %-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}//查找
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;
}//删除指定联系人(name)
void DelContact(Contact* pc)
{char name[MAX_NAME];assert(pc);printf("请输入要删除的名字\n");scanf("%s", name);int i = 0;//如果为空,不删if (pc->sz == 0) {printf("通讯录为空\n");return;}int del = FindByName(pc, name);if (del == -1) {printf("没找到\n");return;}for (i = del; 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[MAX_NAME];printf("请输入要删除的名字\n");scanf("%s", name);int find = FindByName(pc, name);if (find == -1){printf("没有这个人\n");return;}//打印找到人的信息printf("%-20s\t %-2s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");//打印内容printf("%-20s\t %-2d\t %-5s\t %-12s\t %-20s\n",pc->data[find].name,pc->data[find].age,pc->data[find].sex,pc->data[find].tele,pc->data[find].addr);}//修改指定联系人信息
void ModifyContact(Contact* pc)
{assert(pc);printf("请输入要修改联系人的姓名:\n");char name[MAX_NAME];scanf("%s", name);int find = FindByName(pc, name);if (find == -1){printf("没有这个人\n");return;}printf("请输入要修改的内容:\n");printf("请输入姓名:");scanf("%s", pc->data[find].name);printf("请输入年龄:");scanf("%d", &pc->data[find].age);printf("请输入性别:");scanf("%s", pc->data[find].sex);printf("请输入电话:");scanf("%s", pc->data[find].tele);printf("请输入住址:");scanf("%s", pc->data[find].addr);printf("修改成功!!!!\n");
}//排序联系人信息
void SortContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n");
}//释放
void DestroyContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->capacity = 0;pc->sz = 0;
}

Teat.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{printf("**********************************\n");printf("****1.增加              2.删除****\n");printf("****3.查找              4.修改****\n");printf("****5.展示              6.排序****\n");printf("****0.退出                    ****\n");printf("**********************************\n");
}
void test()
{Contact con;//通讯录InitContact(&con);//初始化int input;do {menu();printf("请输入你的选则:");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DLE:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT:DestroyContact(&con);break;default:printf("选择错误,请重新输入\n"); break;}} while (input);
}int main()
{test();return 0;
}

🌵三、文件版(可长期保存数据)

Contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define Max_ADDR 30
#define INT_SZ 2enum OPTION
{EXIT,ADD,DLE,SEARCH,MODIFY,SHOW,SORT
};typedef struct PeoInfo
{char name[MAX_NAME];int age;char sex[MAX_SEX];char tele[MAX_TELE];char addr[Max_ADDR];
}PeoInfo;typedef struct Contact
{PeoInfo* data;//指向存储数据的空间int sz;//记录当前存放有效数据int capacity;//记录当前的最大容量
}Contact;//初始化联系人
void InitContact(Contact* pc);//添加联系人+
void AddContact(Contact* pc);//显示联系人
void ShowContact(Contact* pc);//删除指定联系人(name)
void DelContact(Contact* pc);//查找一个人
void SearchContact(Contact* pc);//修改指定联系人信息
void ModifyContact(Contact* pc);//排序
void SortContact(Contact* pc);//释放空间
void DestroyContact(Contact* pc);	//保存联系人
void SaveContact(Contact* pc);//扩容
int CheckCapacity(Contact* pc);

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"//从文件中加载数据void LoadContact(Contact* pc)
{FILE* pf = fopen("ContactData.text", "rb");if (pf == NULL){perror("LoadContact");return;}PeoInfo temp = { 0 };while (fread(&temp, sizeof(PeoInfo), 1, pf)){if (CheckCapacity(pc) == 0)return;pc->data[pc->sz] = temp;pc->sz++;}//关闭fclose(pf);pf = NULL;}//初始化联系人
void InitContact(Contact* pc)
{assert(pc);pc->data = (PeoInfo*)malloc(INT_SZ*sizeof(PeoInfo));if (pc->data == NULL){perror("InitContact");return;}pc->sz = 0;pc->capacity = INT_SZ;//加载联系人LoadContact(pc);
}//扩容
int CheckCapacity(Contact* pc)
{if (pc->sz == pc->capacity){PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INT_SZ) * sizeof(PeoInfo));if (ptr == NULL){printf("扩容失败!");perror("CheckCapacity");return 0;}else{pc->data = ptr;pc->capacity += INT_SZ;printf("扩容成功!");return 1;}}return 1;
}
//添加联系人+
void AddContact(Contact* pc)
{assert(pc);//判断if (CheckCapacity(pc) == 0){printf("添加失败,空间不足!");return;}if (CheckCapacity(pc) == 1){printf("扩容成功\n");//添加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].tele);printf("请输入住址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("添加成功\n");}
}//显示联系人
void ShowContact(const Contact* pc)//const修饰,不让其通过pc指针改变其指向内容。
{assert(pc);int i = 0;//打印表头printf("%-20s\t %2s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");//打印内容for (i = 0; i < pc->sz; i++){printf("%-20s\t %2d\t %-5s\t %-12s\t %-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}//查找
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;
}//删除指定联系人(name)
void DelContact(Contact* pc)
{char name[MAX_NAME];assert(pc);printf("请输入要删除的名字\n");scanf("%s", name);int i = 0;//如果为空,不删if (pc->sz == 0) {printf("通讯录为空\n");return;}int del = FindByName(pc, name);if (del == -1) {printf("没找到\n");return;}for (i = del; 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[MAX_NAME];printf("请输入要删除的名字\n");scanf("%s", name);int find = FindByName(pc, name);if (find == -1){printf("没有这个人\n");return;}//打印找到人的信息printf("%-20s\t %-2s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "住址");//打印内容printf("%-20s\t %-2d\t %-5s\t %-12s\t %-20s\n",pc->data[find].name,pc->data[find].age,pc->data[find].sex,pc->data[find].tele,pc->data[find].addr);}//修改指定联系人信息
void ModifyContact(Contact* pc)
{assert(pc);printf("请输入要修改联系人的姓名:\n");char name[MAX_NAME];scanf("%s", name);int find = FindByName(pc, name);if (find == -1){printf("没有这个人\n");return;}printf("请输入要修改的内容:\n");printf("请输入姓名:");scanf("%s", pc->data[find].name);printf("请输入年龄:");scanf("%d", &pc->data[find].age);printf("请输入性别:");scanf("%s", pc->data[find].sex);printf("请输入电话:");scanf("%s", pc->data[find].tele);printf("请输入住址:");scanf("%s", pc->data[find].addr);printf("修改成功!!!!\n");
}//排序联系人信息
void SortContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n");
}//释放
void DestroyContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->capacity = 0;pc->sz = 0;
}//保存联系人
void SaveContact(Contact* pc)
{FILE* pf = fopen("ContactData.text", "wb");if (pf == NULL){perror("SaveContact");return;}//写文件int i = 0;for (i = 0; i < pc->sz; i++){fwrite(pc->data,sizeof(PeoInfo),1,pf);}//关闭文件fclose(pf);pf == NULL;}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{printf("**********************************\n");printf("****1.增加              2.删除****\n");printf("****3.查找              4.修改****\n");printf("****5.展示              6.排序****\n");printf("****0.退出                    ****\n");printf("**********************************\n");
}
void test()
{Contact con;//通讯录InitContact(&con);//初始化int input;do {menu();printf("请输入你的选则:");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DLE:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT:SaveContact(&con);printf("保存成功!!");DestroyContact(&con);printf("空间以释放!!");break;default:printf("选择错误,请重新输入\n"); break;}} while (input);
}int main()
{test();return 0;
}

相关文章:

【通讯录】--C语言

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

通过两种实现方式理解CANoe TC8 demo是如何判断接收的以太网报文里的字段的

假设有一个测试用例,需求是:编写一个测试用例,发送一条icmpv4 echo request报文给DUT,identifier字段设置为10。判断DUT能够回复icmpv4 echo reply报文,且identifier字段值为10。 实现:在canoe的simulation setup界面插入一个test节点,ip地址为:192.168.0.1,mac地址为…...

Mysql- 存储引擎

目录 1.Mysql体系结构 2.存储引擎简介 3.存储引擎特点 InnoDB MyISAM Memory 4.存储引擎选择 1.Mysql体系结构 MySQL整体的逻辑结构可以分为4层&#xff1a; 连接层&#xff1a;进行相关的连接处理、权限控制、安全处理等操作 服务层&#xff1a;服务层负责与客户层进行…...

vite / nuxt3 项目使用define配置/自定义,可以使用process.env.xxx获取的环境变量

每日鸡汤&#xff1a;每个你想要学习的瞬间&#xff0c;都是未来的你向自己求救 首先可以看一下我的这篇文章了解一下关于 process.env 的环境变量。 对于vite项目&#xff0c;在我们初始化项目之后&#xff0c;在浏览器中打印 process.env&#xff0c;只有 NODE_ENV这个变量&…...

在Linux、Ubuntu中跨平台编译ARM(AARCH64)平台的binutils

Binutils 是GNU(https://www.gnu.org/)提供的一组二进制工具的集合。通常,在已经安装了Linux操作系统的个人电脑上,系统就已经自带了这个工具集。但在进行嵌入式开发的时候,可能会用到支持ARM64平台的Binutils,这时就需要用到交叉编译。 此前,在【1】我们已经介绍过Ubun…...

SpringCloudAlibaba微服务实战系列(五)Sentinel1.8.5+Nacos持久化

Sentinel数据持久化 前面介绍Sentinel的流控、熔断降级等功能&#xff0c;同时Sentinel应用也在面临着一个问题&#xff1a;我们在Sentinel后台管理界面中配置了一堆流控、降级规则&#xff0c;但是Sentinel一重启&#xff0c;这些规则全部消失了。那么我们就要考虑Sentinel的持…...

pytest中conftest的用法以及钩子基本使用

一、conftest是什么&#xff1f; conftest是pytest进阶中的高级应用&#xff0c;最近正好用到这一块儿&#xff0c;研究之后&#xff0c;向大家分享该高级应用。 二、使用步骤 1.conftest代码块 以全局性使用driver为主&#xff0c;只启动一次浏览器&#xff1a; pytest.fi…...

数据结构---顺序栈、链栈

特点 typedef struct Stack { int* base; //栈底 int* top;//栈顶 int stacksize //栈的容量; }SqStack; typedef struct StackNode { int data;//数据域 struct StackNode* next; //指针域 }StackNode,*LinkStack; 顺序栈 #define MaxSize 100 typedef struct Stack { int*…...

我的MacBook Pro:维护心得与实用技巧

文章目录 我的MacBook Pro&#xff1a;维护心得与实用技巧工作电脑概况&#xff1a;MacBook Pro 2019款 16 寸日常维护措施个人维护技巧其他建议 我的MacBook Pro&#xff1a;维护心得与实用技巧 无论是学习还是工作&#xff0c;电脑都是IT人必不可少的重要武器。一台好电脑除…...

Higress非K8S安装

Higress非K8S安装 文章目录 Higress非K8S安装环境安装安装higress进入到higress 的目录下修改下nacos的地址启动Higress登录higress管理页面 Higress 是基于阿里内部构建的下一代云原生网关&#xff0c;官网介绍&#xff1a;https://higress.io/zh-cn/docs/overview/what-is-hi…...

QT--day4(定时器事件、鼠标事件、键盘事件、绘制事件、实现画板、QT实现TCP服务器)

QT实现tcpf服务器代码&#xff1a;&#xff08;源文件&#xff09; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTc…...

hjm家族信托科技研究报告

目录 绪论 研究背景与意义 一、选题背景 二、选题意义 研究内容与主要研究方法 一、本文内容 二、研究方法 创新与不足 一、创新 二、不足之处 文献综述与理论基础 文献综述 国外研究现状国内研究现状国内外研究综述 理论基础 金融创新理论组合投资理论生命周期理论…...

[SQL挖掘机] - 视图相关操作

创建视图: create view view_name as select column1, column2, ... from table_name where condition;以上语句创建了一个名为view_name的视图&#xff0c;它基于table_name表格&#xff0c;并选择了列column1、column2等作为结果集。可以使用where子句来指定条件。 注意: 视…...

【Quartus FPGA】EMIF DDR3 读写带宽测试

在通信原理中&#xff0c;通信系统的有效性用带宽来衡量&#xff0c;带宽定义为每秒传输的比特数&#xff0c;单位 b/s&#xff0c;或 bps。在 DDR3 接口的产品设计中&#xff0c;DDR3 读/写带宽是设计者必须考虑的指标。本文主要介绍了 Quartus FPGA 平台 EMIF 参数配置&#…...

Flutter:flutter_local_notifications——消息推送的学习

前言 注&#xff1a; 刚开始学习&#xff0c;如果某些案例使用时遇到问题&#xff0c;可以自行百度、查看官方案例、官方github。 简介 Flutter Local Notifications是一个用于在Flutter应用程序中显示本地通知的插件。它提供了一个简单而强大的方法来在设备上发送通知&#…...

Spring AOP (面向切面编程)原理与代理模式—实例演示

一、AOP介绍和应用场景 Spring 中文文档 (springdoc.cn) Spring | Home 官网 1、AOP介绍&#xff08;为什么会出现AOP &#xff1f;&#xff09; Java是一个面向对象&#xff08;OOP&#xff09;的语言&#xff0c;但它有一些弊端。虽然使用OOP可以通过组合或继承的方…...

什么是SCRUM认证体系 ?

Scrum认证是一个针对个人职业发展的认证体系&#xff0c;基础级认证主要面向Scrum的三个角色&#xff1a;Scrum Master、Scrum Product Owner 和 Developers。Scrum认证体系由Scrum官方机构—国际Scrum联盟&#xff08;ScrumAlliance.org&#xff09;制定和维护&#xff0c;Scr…...

DoIP学习笔记系列:(二)VN5620 DoIP测试配置实践笔记

文章目录 1. 添加.cdd2. CAPL中调用接口发送DoIP请求3. “Ethernet Packet Builder”的妙用4. CANoe也可以做交互界面在进行测试前,先检查车载以太网硬件连线是否正确,需要注意连接两端的Master、Slave,100M、1000M等基本情况,在配置VN5620的时候就可以灵活处理了。成功安装…...

Grafana - TDEngine搭建数据监测报警系统

TDengine 与开源数据可视化系统 Grafana 快速集成搭建数据监测报警系统 一、介绍二、前置条件三、Grafana 安装及配置3.1 下载3.2 安装3.2.1 windows安装 - 图形界面3.2.2 linux安装 - 安装脚本 四、Grafana的TDEngine配置及使用4.1 登录4.2 安装 Grafana Plugin 并配置数据源4…...

ES6基础知识二:ES6中数组新增了哪些扩展?

一、扩展运算符的应用 ES6通过扩展元素符…&#xff0c;好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...document.querySelectorAll(div)] // [<div>, &l…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...