当前位置: 首页 > 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…...

使用CRM分析数据有哪些功能?

CRM数据分析软件可以帮助企业增强竞争力&#xff0c;并更好地了解客户需求及市场变化&#xff0c;助力企业数据分析&#xff0c;并提供实时更新的数据和分析结果&#xff0c;CRM数据分析软件的主要特点是什么&#xff1f;包括以下6个特点。 CRM数据分析软件的主要功能通常包括…...

大数据课程综合实验案例---课设问题汇总

最近翻看两年前的大数据课设&#xff0c;感觉这个大数据课设实验当时答辩 在大数据课设实验过程中&#xff0c;我遇到了很多问题&#xff0c;在这里做出汇总&#xff1a; 1、MySQL启动报错 首先&#xff0c;我的MySQL有时候启动不了&#xff0c;当我输入这个命令的时候&#…...

基于Vue+Element Plus实现表格组件

目录 前言分析实现例子效果图前言 表格对于管理类项目是很重要的,可以只管的展示和比比较数据。使用Element Plus能解决一部分问题,但是还存在一些缺点和不足。 分析 浏览器上表格数据展示空间不足。列显示太多不够直观。完全依赖官方表格组件代码过于臃肿不利于管理和优化…...

MYSQL 主从复制

在读多写少的网络环境下&#xff0c;MySQL 如何优化数据查询方案 假如说一个电商平台 到双十一了 大量的读写操作 如果不做点什么的话 平台就被冲烂了 那我们要怎么办呢? 你或许会想 林北直接一个redis缓存 帮数据库度过难关 这个操作实际上是不行的 因为应用缓存的原则之一…...

网络安全领域关键信息泄露事件引发关注

近日&#xff0c;一家知名网络安全公司发布了一份报告揭露了一起重大信息泄露事件。据称&#xff0c;该事件涉及大量敏感用户数据的泄露引发了全球网络安全领域的广泛关注。 根据报道&#xff0c;该事件发生在全球范围内涉及多个国家和组织。专家指出&#xff0c;此次泄露事件…...

AI 绘画Stable Diffusion 研究(一)sd整合包v4.2 版本安装说明

部署包作者:秋葉aaaki 免责声明: 本安装包及启动器免费提供 无任何盈利目的 大家好&#xff0c;我是风雨无阻。众所周知&#xff0c;StableDiffusion 是非常强大的AI绘图工具&#xff0c;需要详细了解StableDiffusion的朋友&#xff0c;可查看我之前的这篇文章&#xff1a; 最…...

夯实数字化转型安全地基,华东某农商行开源安全治理经验

华东某农村商业银行是一家全国首批组建的股份制农村金融机构。近年来&#xff0c;该农商行坚持“科技强行”战略&#xff0c;进一步夯实数字化核心基础&#xff0c;积极推动金融科技与产品、服务的深度融合&#xff0c;努力拓展数字金融的包容性&#xff0c;让数字金融更有温度…...

第G3周:CGAN|生成手势图像

目录 一、准备工作1. 导入数据2. 数据可视化 二、构建模型1. 构建生成器2. 构建鉴别器 三、训练模型1. 定义损失函数2. 定义优化器3. 训练模型 四、理论基础1.DCGAN原理2.DCGAN网络3.个人感悟 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f…...

wireshark导出H264裸流

导出H264裸流 安装wireshark下载rtp_h264_extractor.lua脚本配置lua脚本重启wireshark筛选 安装wireshark 下载抓包工具&#xff1a;首先&#xff0c;您需要下载并安装一个网络抓包工具&#xff0c;例如Wireshark&#xff08;https://www.wireshark.org&#xff09;或tcpdump&…...

Sentinel针对IP限流

改造限流策略的针对来源选项 import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class Senti…...