C语言实现八种功能的通讯录(添加、删除、查找、修改、显示、排序、退出、清空)

通讯录功能概要及前提说明

此通讯录利用C语言完成,可以实现八种功能的通讯录(添加、删除、查找、修改、显示、排序、退出、清空)
在这里插入图片描述
代码由三部分组成,为什么要写成三部分而不写成一部分可以参考我以前的博客,如下:
链接: link

文章目录

  • 通讯录功能概要及前提说明
  • 1.通信录具体功能
  • 2.初始化菜单
  • 3.通讯录存储的信息
  • 4.通讯录基本框架
  • 6.各个部分功能模块声明
  • 7.初始化模块
  • 8.增加联系人模块
  • 9.显示通讯录模块
  • 10.删除用户模块
  • 11.查找用户模块
  • 12.修改用户信息模块
  • 13.排序用户信息模块
  • 14.清除模块
  • 15.完整源代码


1.通信录具体功能

通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.清空所有联系人
7.以名字/年龄/地址排序所有联系人

2.初始化菜单

void  menu()
{printf("*********************************************\n");printf("*********************************************\n");printf("*********************************************\n");printf("*********1.添加           2.删除*************\n");printf("*********3.查找           4.修改*************\n");printf("*********5.显示           6.排序*************\n");printf("*********7.退出           8.清空*************\n");printf("*********************************************\n");printf("*********************************************\n");printf("*********************************************\n");
}

3.通讯录存储的信息

使用 typedef 将 struct peoinfo 类型自定义成 peoinfo 更加方边后续使用。
利用宏定义设定各个参数的值,后续不需要再重新定义。

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100//最大人数typedef struct peoinfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];}peoinfo;typedef struct contact
{peoinfo data[MAX];int sz;//记录当前人的信息个数
}contact;

其中,创建存放联系人的通讯录Contact,存放MAX个联系人对应的信息。sz用于记录当前储存联系人的数量。

4.通讯录基本框架

enum option
{add=1, del=2,search=3,modify,show,sort,run,clc	
};int main()
{int input = 0;contact con;//通讯录//初始化initcontact(&con);do{menu();printf("请输入功能:");scanf("%d", &input);switch (input){case add:addcontact(&con);break;case del:delcontact(&con);break;case search:searchcontact(&con);break;case modify:modifycontact(&con);break;case show:showcontact(&con);break;case sort:sortcontact(&con);break;case run:printf("退出通讯录\n");break;case clc:clccontact(&con);break;default:printf("输入非法,请重新输入!\n");break;}} while (input != 7);return 0;
}

我们知道case后只能加整数,为了更加直观的看到每一种功能,我们可以创建枚举类型替换这些整数,枚举类型成员的值从0开始递增1,适用于代替case后的整数,因为我么的菜单选项是从1到8,所以这里我们定义枚举的第一个值为1,这样后面就会默认排序到8。

通讯录运行通过do-while实现,内部调用menu函数打印开始菜单,然后提示用户选择功能。

6.各个部分功能模块声明

void initcontact(contact* pc);void addcontact(contact* pc);void showcontact(contact* pc);void delcontact(contact* pc);void searchcontact(contact* pc);void modifycontact(contact* pc);void sortcontact(contact* pc);void clccontact(contact* pc);

代码的基本框架搭建完毕,我们就要实现每一个选项的功能。这里是定义每一个功能的头文件,声明后才能在别的原文件中使用。

7.初始化模块

void initcontact(contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));}

给定的代码是一个函数initcontact,它用于初始化一个名为contact的结构体指针pc。以下是对代码的分析:

①函数声明:void initcontact(contact* pc)

声明了一个名为initcontact的函数,它接受一个结构体指针pc作为参数,并且没有返回值(即返回类型为void)。

②断言:assert(pc) 断言确保pc指针不为空。如果pc为空,断言将失败,并导致程序终止。

③初始化:pc->sz = 0 将结构体指针pc的成员变量sz的值设置为0。这意味着将sz用作计数器或存储元素数量的变量。

④内存清零:memset(pc->data, 0, sizeof(pc->data))

使用memset函数将结构体指针pc的成员变量data的内存块清零。sizeof(pc->data)用于确定pc->data成员的大小,以确保清零操作覆盖整个内存块。

⑤通过这些操作,函数initcontact将结构体指针pc所指向的contact结构体进行初始化。初始化的结果是将sz设置为0,并将data的内存块清零。

8.增加联系人模块

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].tele);printf("请输入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("通讯录已添加\n");Sleep(2000);
}

该代码定义了一个名为addcontact的函数,函数参数为一个指向contact结构体的指针pc。

①函数首先使用assert函数进行断言,确保指针pc不为空。

②然后判断通讯录的当前大小是否达到了最大值(MAX),如果达到了最大值则打印提示信息并返回。

③如果通讯录未满,则依次输入联系人的姓名、年龄、性别、电话和地址,并将这些信息保存到通讯录中。

④ 最后,将通讯录的大小加1,并打印添加成功的提示信息。使用Sleep函数暂停程序执行2秒后再弹出菜单继续选择。使使用者方便观察。

9.显示通讯录模块

void showcontact(contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录为空\n");return;}int i = 0;printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}Sleep(2000);
}

该代码定义了一个名为showcontact的函数,函数参数为一个指向contact结构体的指针pc。

①函数首先使用assert函数进行断言,确保指针pc不为空。

②然后判断通讯录的大小是否为0,如果为0则打印提示信息并返回。

③接下来,使用一个循环遍历通讯录中的每个联系人,并依次打印其姓名、年龄、性别、电话和地址。

④ 最后,使用Sleep函数暂停程序执行2秒。

需要注意的是,该代码依赖于一些未给出的头文件和结构体定义,例如contact结构体的定义。另外,该代码使用了格式化输出函数printf,其中使用了%-10s、%-5d等格式控制符,用于设置输出字段的宽度和对齐方式。

10.删除用户模块

int findname(contact* pc, char name[])
{assert(pc);int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return 1;}}return -1;
}void delcontact(contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}printf("输入要删除人的名字:");scanf("%s", name);int ret = findname(pc,name);if (ret == -1){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");Sleep(2000);
}

该代码定义了两个函数:findname和delcontact。

findname函数用于在通讯录中查找指定姓名的联系人,函数参数为一个指向contact结构体的指针pc和一个字符数组name。

①函数首先使用assert函数进行断言,确保指针pc不为空。

②然后使用一个循环遍历通讯录中的每个联系人,通过strcmp函数比较联系人的姓名是否与指定的name相等。如果相等,则返回1表示找到了该联系人。

③如果遍历完整个通讯录都没有找到匹配的姓名,则返回-1表示未找到。

④delcontact函数用于从通讯录中删除指定姓名的联系人,函数参数为一个指向contact结构体的指针pc。

⑤函数首先使用assert函数进行断言,确保指针pc不为空。

⑥然后判断通讯录的大小是否为0,如果为0则打印提示信息并返回。

⑦接下来,依次输入要删除的联系人的姓名,并调用findname函数查找该联系人是否存在。如果不存在,则打印提示信息并返回。

⑧如果存在,使用一个循环从找到的位置开始,将后面的联系人逐个往前移动一位,实现删除该联系人的功能。

⑨最后,将通讯录的大小减1,并打印删除成功的提示信息。使用Sleep函数暂停程序执行2秒。

11.查找用户模块

void searchcontact(contact* pc)
{char name[NAME_MAX];assert(pc);printf("请输入要查找人的姓名:");scanf("%s", name);int ret = findname(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}printf("查询成功!!\n");printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].tele,pc->data[ret].addr);Sleep(2000);
}

该代码定义了一个名为searchcontact的函数,函数参数为一个指向contact结构体的指针pc。

①函数首先使用assert函数进行断言,确保指针pc不为空。

②然后输入要查找的联系人的姓名。

③接下来,调用findname函数查找该姓名的联系人在通讯录中的位置。如果返回值为-1,则打印提示信息并返回。

④如果返回值不为-1,表示找到了该联系人,打印查询成功的提示信息。

⑤然后,使用printf函数按照一定的格式打印该联系人的姓名、年龄、性别、电话和地址。

⑥最后,使用Sleep函数暂停程序执行2秒。

12.修改用户信息模块

void modifycontact(contact* pc)
{char name[NAME_MAX];assert(pc);printf("请输入要查找人的姓名:");scanf("%s", name);int ret = findname(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}printf("请输入名字:");scanf("%s", pc->data[ret].name);printf("请输入年龄:");scanf("%d", &(pc->data[ret].age));printf("请输入性别:");scanf("%s", pc->data[ret].sex);printf("请输入电话:");scanf("%s", pc->data[ret].tele);printf("请输入地址:");scanf("%s", pc->data[ret].addr);printf("修改成功!\n");}

该代码定义了一个名为modifycontact的函数,函数参数为一个指向contact结构体的指针pc。

①函数首先使用assert函数进行断言,确保指针pc不为空。

②然后输入要修改的联系人的姓名。

③接下来,调用findname函数查找该姓名的联系人在通讯录中的位置。如果返回值为-1,则打印提示信息并返回。

④如果返回值不为-1,表示找到了该联系人,依次输入要修改的联系人的姓名、年龄、性别、电话和地址,并将这些信息更新到通讯录中。

⑤最后,打印修改成功的提示信息。

13.排序用户信息模块

int cmp_name(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}int cmp_age(const void* p1, const void* p2)
{return ((peoinfo*)p1)->age-((peoinfo*)p2)->age;
}int cmp_addr(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}void sortcontact(contact* pc)
{int i = 0;char sort_choose[10];char sort_choose1[] = "name";char sort_choose2[] = "age";char sort_choose3[] = "addr";A:printf("请输入根据什么进行排序:");scanf("%s", sort_choose);if (strcmp(sort_choose,sort_choose1) == 0){//利用qsort 函数qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name);}else if (strcmp(sort_choose,sort_choose2) == 0){qsort(pc->data, pc->sz, sizeof((pc->data)[1]), cmp_age);}else if (strcmp(sort_choose,sort_choose3) == 0){qsort(pc->data, pc->sz, sizeof((pc->data)[4]), cmp_addr);}else{printf("无此排序参数,请重新输入参数\n");goto A;}//打印列标题printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");//打印数据for (i = 0; i < pc->sz; i++){printf("%-10s%-5d%-5s%-12s%-30s\t\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}Sleep(2000);
}

该代码定义了三个比较函数:cmp_name、cmp_age和cmp_addr。这些函数用于在排序通讯录时比较联系人信息的不同字段。

①cmp_name函数用于比较联系人姓名的大小,函数参数为指向两个联系人信息结构体的指针p1和p2。通过调用strcmp函数比较两个联系人的姓名,并返回比较结果。

② cmp_age函数用于比较联系人年龄的大小,函数参数为指向两个联系人信息结构体的指针p1和p2。通过将第一个联系人的年龄减去第二个联系人的年龄,并返回比较结果。

③cmp_addr函数用于比较联系人地址的大小,函数参数为指向两个联系人信息结构体的指针p1和p2。通过调用strcmp函数比较两个联系人的地址,并返回比较结果。

④sortcontact函数用于对通讯录中的联系人进行排序,函数参数为一个指向contact结构体的指针pc。

⑤函数首先定义一些变量和字符串数组用于接收用户输入的排序参数。

⑥然后,通过标签A实现一个循环,提示用户输入根据什么进行排序。根据用户的输入,分别调用qsort函数进行排序。排序时,根据用户的选择调用不同的比较函数。

⑦如果用户输入的排序参数无效,则打印提示信息并跳转回标签A,要求用户重新输入。

⑧排序完成后,先打印列标题,然后依次打印排序后的联系人信息。

⑨最后,使用Sleep函数暂停程序执行2秒。

14.清除模块

void clccontact(contact* pc)
{pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));printf("通讯录已经清空!!!\n");Sleep(2000);
}

此代码实现了一个清空通讯录的函数。(即和初始化模块一样)函数接收一个指向联系人结构体的指针,将通讯录结构体中的数据清空,包括sz(通讯录中已有联系人数量)和data(存放联系人信息的数组)。最后输出提示信息“通讯录已经清空!!!”并延时2秒。

此代码的功能比较简单,只是清空通讯录。可以作为通讯录管理系统的一个基本操作函数之一。

15.完整源代码

test.c如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "adressbook.h"void  menu()
{printf("*********************************************\n");printf("*********************************************\n");printf("*********************************************\n");printf("*********1.添加           2.删除*************\n");printf("*********3.查找           4.修改*************\n");printf("*********5.显示           6.排序*************\n");printf("*********7.退出           8.清空*************\n");printf("*********************************************\n");printf("*********************************************\n");printf("*********************************************\n");
}enum option
{add=1, del=2,search=3,modify,show,sort,run,clc	
};int main()
{int input = 0;contact con;//通讯录//初始化initcontact(&con);do{menu();printf("请输入功能:");scanf("%d", &input);switch (input){case add:addcontact(&con);break;case del:delcontact(&con);break;case search:searchcontact(&con);break;case modify:modifycontact(&con);break;case show:showcontact(&con);break;case sort:sortcontact(&con);break;case run:printf("退出通讯录\n");break;case clc:clccontact(&con);break;default:printf("输入非法,请重新输入!\n");break;}} while (input != 7);return 0;
}

addressbook.c如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include "adressbook.h"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].tele);printf("请输入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("通讯录已添加\n");Sleep(2000);
}void showcontact(contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录为空\n");return;}int i = 0;printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}Sleep(2000);
}int findname(contact* pc, char name[])
{assert(pc);int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return 1;}}return -1;
}void delcontact(contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}printf("输入要删除人的名字:");scanf("%s", name);int ret = findname(pc,name);if (ret == -1){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");Sleep(2000);
}void searchcontact(contact* pc)
{char name[NAME_MAX];assert(pc);printf("请输入要查找人的姓名:");scanf("%s", name);int ret = findname(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}printf("查询成功!!\n");printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");printf("%-10s%-5d%-5s%-12s%-30s\n", pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].tele,pc->data[ret].addr);Sleep(2000);
}void modifycontact(contact* pc)
{char name[NAME_MAX];assert(pc);printf("请输入要查找人的姓名:");scanf("%s", name);int ret = findname(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}printf("请输入名字:");scanf("%s", pc->data[ret].name);printf("请输入年龄:");scanf("%d", &(pc->data[ret].age));printf("请输入性别:");scanf("%s", pc->data[ret].sex);printf("请输入电话:");scanf("%s", pc->data[ret].tele);printf("请输入地址:");scanf("%s", pc->data[ret].addr);printf("修改成功!\n");}int cmp_name(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}int cmp_age(const void* p1, const void* p2)
{return ((peoinfo*)p1)->age-((peoinfo*)p2)->age;
}int cmp_addr(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}void sortcontact(contact* pc)
{int i = 0;char sort_choose[10];char sort_choose1[] = "name";char sort_choose2[] = "age";char sort_choose3[] = "addr";A:printf("请输入根据什么进行排序:");scanf("%s", sort_choose);if (strcmp(sort_choose,sort_choose1) == 0){//利用qsort 函数qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name);}else if (strcmp(sort_choose,sort_choose2) == 0){qsort(pc->data, pc->sz, sizeof((pc->data)[1]), cmp_age);}else if (strcmp(sort_choose,sort_choose3) == 0){qsort(pc->data, pc->sz, sizeof((pc->data)[4]), cmp_addr);}else{printf("无此排序参数,请重新输入参数\n");goto A;}//打印列标题printf("%-10s%-5s%-5s%-12s%-30s\n", "名字", "年龄", "性别", "电话", "地址");//打印数据for (i = 0; i < pc->sz; i++){printf("%-10s%-5d%-5s%-12s%-30s\t\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}Sleep(2000);
}void clccontact(contact* pc)
{pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));printf("通讯录已经清空!!!\n");Sleep(2000);
}

addressbook.h如下:

#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <Windows.h>typedef struct peoinfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];}peoinfo;typedef struct contact
{peoinfo data[MAX];int sz;//记录当前人的信息个数
}contact;void initcontact(contact* pc);void addcontact(contact* pc);void showcontact(contact* pc);void delcontact(contact* pc);void searchcontact(contact* pc);void modifycontact(contact* pc);void sortcontact(contact* pc);void clccontact(contact* pc);

大家只需要将此代码,按照文章开头设置为三部分,点击运行即可。

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

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

相关文章

【postgresql】替换 mysql 中的ifnull()

数据库由mysql 迁移到postgresql&#xff0c;程序在执行查询时候报错。 HINT: No function matches the given name and argument types. You might need to add explicit type casts. CONTEXT: referenced column: ifnull 具体SQL: SELECT ifnull(phone,) FROM c_user p…

内存管理和模板

目录 定位new表达式 定位new使用的池化技术&#xff1a; ​编辑 malloc和free与new和delete的区别&#xff1a; 内存泄漏&#xff1a; 模板 显示实例化 两个不同参数的模板 模板函数与函数&#xff1a; 类模板 []重载&#xff1a; 定位new表达式 class A { public:A(int …

大数据时代,数据治理

一、大数据时代还需要数据治理吗&#xff1f; 数据平台发展过程中随处可见的数据问题 大数据不是凭空而来&#xff0c;1981年第一个数据仓库诞生&#xff0c;到现在已经有了近40年的历史&#xff0c;相对数据仓库来说我还是个年轻人。而国内企业数据平台的建设大概从90年代末…

ToBeWritten之攻击者模拟

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

Word | 简单可操作的快捷公式编号、右对齐和引用方法

1. 问题描述 在理工科论文的写作中&#xff0c;涉及到大量的公式输入&#xff0c;我们希望能够按照章节为公式进行编号&#xff0c;并且实现公式居中&#xff0c;编号右对齐的效果。网上有各种各样的方法来实现&#xff0c;操作繁琐和简单的混在一起&#xff0c;让没有接触过公…

路由综合实验

RIP配置 在R1上配置 rip 1 #此处的1表示进程号&#xff0c;非版本号 version 2 #选择rip版本2 network 100.0.0.0 network 12.0.0.0 network 13.0.0.0 #rip宣告时只能宣告主类网络&#xff0c;实际上是对内宣告为主类网络&#xff0c;对外转发时时携带子网掩码的在R2上…

【postgresql】 ERROR: multiple assignments to same column “XXX“

Cause: org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; 原因&#xff1a;or…

Java开发需要的网络基础知识,搞清楚计算机网络底层原理

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言 计算机基础是…

变电站运维服务方案

一、背景与目标 随着电力行业的快速发展&#xff0c;变电站的数量和规模不断扩大&#xff0c;运维服务的需求也日益增长。为了确保变电站的安全、稳定、高效运行&#xff0c;提高运维服务质量&#xff0c;本文档旨在提供一套全面的变电站运维服务方案。 二、服务范围 …

lv5 嵌入式开发-6 线程的取消和互斥

目录 1 线程通信 – 互斥 2 互斥锁初始化 – pthread_mutex_init 3 互斥锁销毁 pthread_mutex_destroy 4 申请锁 – pthread_mutex_lock 5 释放锁 – pthread_mutex_unlock 6 读写锁 7 死锁的避免 8 条件变量&#xff08;信号量&#xff09; 9 线程池概念和实现 9.1 …

CCS介绍

CCS介绍 设置主体颜色 修改字体的颜色和大小 安装一些插件 CCS中的App中心 切换工作空间 导入工程

el-table-column默认选中一个复选框和只能单选事件

表格代码 <el-table ref"contractTable" v-loading"loading" :data"contractList" selection-change"contractSelectionChange" style"margin-top: 10%;"><el-table-column type"selection" width"…

【分享】Word文档如何批量转换成PDF?

Word格式比较容易编辑&#xff0c;是工作中经常用到的文档工具&#xff0c;有时候为了避免文档在传送中出现乱码&#xff0c;或者防止被随意更改&#xff0c;很多人会把Word文档转换成PDF&#xff0c;那Word文档要怎样转成PDF呢&#xff1f;如果Word文档很多&#xff0c;有没有…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码&#xff0c;可以获取当前日期和星期几&#xff0c;并输出在一周内的每天早上和晚上&#xff1a; // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…

云安全【阿里云ECS攻防】

关于VPC的概念还请看&#xff1a;记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色&#xff0c;那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候&#xff…

Three.js后期处理简明教程

后期处理&#xff08;Post Processing&#xff09;通常是指对 2D 图像应用某种效果或滤镜。 在 THREE.js 中我们有一个包含一堆网格物体的场景。 我们将该场景渲染为 2D 图像。 通常&#xff0c;该图像会直接渲染到画布中并显示在浏览器中&#xff0c;但我们可以将其渲染到渲染…

人机逻辑中的家族相似性与非家族相似性

维特根斯坦的家族相似性理论是他在《哲学研究》中提出的一个重要概念。他认为&#xff0c;语言游戏是一种人们使用语言的方式&#xff0c;不同的语言游戏之间可能存在相似性&#xff0c;就像一个家族的成员之间存在相似性一样。维特根斯坦认为&#xff0c;相似性不是通过一个共…

Quartz 体系结构

Quartz的体系结构 Quartz的重要组件 Scheduler 用于与调度程序交互的主程序接口。 Scheduler调度程序-任务执行计划表&#xff0c;只有安排进执行计划的任务Job&#xff08;通过scheduler.scheduleJob方法安排进执行计划&#xff09;&#xff0c;当它预先定义的执行时间到了的时…

mac 解决 vscode 权限不足问题,Insufficient permissions

commod 空格&#xff0c;输入终端并打开写入指令 sudo chown -R xxxxxx1 xxxxx2&#xff08;例如我的sudo chown -R admin Desktop&#xff0c;具体参数查看下方&#xff09; x1: 用户名&#xff0c;可通过左上角查看 x2: 目标文件夹。可以另起一个终端&#xff0c;用cd 和 l…

Unity当中的灯光类型

文章目录 前言一、Directional平行光二、Point点灯三、Spot 聚光灯四、Area面光灯&#xff0c;只用于烘培 前言 Unity当中的灯光类型 一、Directional平行光 Unity当中最重要的灯管类型&#xff0c;类似现实中的太阳光 二、Point点灯 类似现实中的灯泡&#xff0c;萤火虫&a…