C语言实现通讯录管理系统—动态内存分配型
一、通讯录功能需求分析:
为了实现通讯录管理系统,为此,要保证实现以下的功能:
通讯录最开始初始化后能存放3个人的信息,当空间存放满的时候,再增加2个联系人信息、如果再发现不够使用,每次增加2个联系人的信息、、每个人的信息
包含:名字、年龄、性别、电话、地址、除此之外,还是实现:增加人的信息、删除人的信息、修改指定人的信息、查找指定人的信息、清空联系人的信息、显
示联系人的信息、排序通讯录的信息、销毁通讯录。
二、文件架构分析:
1、test.c — 用来测试通讯录的模块、主函数接口引入。
2、contact.h — 关于通讯录相关的 类型的定义、函数的声明、库函数的头文件等、
3、contact.c — 函数的实现、
写完contact.h、contact.c 之后,将两者引用到 test.c 中使用即可满足要求。
三、代码,分模块呈现:
3.1 主函数(main函数)部分:
int main()
{int input = 0;//创建通讯录,结构体类型在头文件中定义的,所以要引头文件,通讯录中当前有几个元素://int sz = 0;//创建通讯录Contact con; //con就是通讯录,也可以直接进行初始化,但是为了更好的体现模块化,就对初始化通讯录封装一个函数。//如果想把其中的一部分初始化为0,就必须使用函数来做了。//初始化通讯录//使用malloc函数在堆区上动态开辟一块连续的内存空间,并把该空间的起始位置的地址放在结构体指针变量data中。//初始化整型变量sz=0;//初始化整型变量capacity为当前最大的容量、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 SORT:SortContact(&con);break;//显示所有联系人的信息case PRINT://虽然只是打印信息,不会改变实参的信息,但是考虑的效率的话,还是使用传址调用比较好,结构体传参最好传地址。PrintContact(&con);break;//清空所有联系人的信息case CLEAR:ClearContact(&con);break;case EXIT://现在存放联系人信息的内存空间是动态开辟的,当退出的时候,该空间要被释放掉才行、//销毁通讯录DestoryContact(&con);printf("退出通讯录\n");break;default:printf("选择错误,请重新进行选择:>");break;}} while (input);//如果有同名的,一律操作第一个出现该名字的那个成员,因为遍历是从前往后遍历的,在这里不考虑同名的情况。return 0;
}
3.2 menu菜单函数部分:
void menu()
{printf("*********************************\n");printf("****** 1、add 2、del ******\n");printf("****** 3、search 4、modify ****\n");printf("****** 5、sort 6、print******\n");printf("****** 7、clear 0、exit *****\n");printf("*********************************\n");
}
在这里注意一下各种功能的编号与switch中的case的选择对应起来。
3.3 枚举类型的声明部分:
enum Option//枚举成员变量从0开始,依次递增1;
{//枚举中的变量一般都采用大写。EXIT,ADD,DEL,SEARCH,MODIFY,SORT,PRINT,CLEAR
};
枚举类型的定义,要注意的是,枚举成员变量按照顺序默认从0开始,依次递增1,也可给枚举成员变量设置初值、
3.4 初始化通讯录部分:
//初始化 通讯录函数
void InitContact(Contact* pc)
{pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));if (pc->data == NULL){//开辟内存空间失败perror("InitContact"); //由于在函数InitContact中进行的操作,如果开辟失败,报错是该函数足够的空间、return; //由于InitContact函数的返回类型是void类型,所以直接返回 return,即可。}//在这里对结构体指针变量data指向的内存空间中的内容不进行初始化,可以初始化,也可以不初始化;(pc->sz) = 0;//初始化后默认为0、(pc->capacity) = DEFAULT_SZ;//初始化后默认为DEFAULT_SZ个、
}
3.5 增加通讯录联系人信息部分:
//增加联系人的信息 —— 动态
void AddContact(Contact* pc)
{//通讯录满员-> 增容if (pc->sz == pc->capacity){//增容PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ)*sizeof(PeoInfo));if (ptr == NULL){//增容失败perror("AddContact");perror("增容联系人\n");return;}else{//增容成功 pc->data = ptr;pc->capacity += INC_SZ;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].addr);printf("请输入电话:>");scanf("%s", pc->data[pc->sz].tele);(pc->sz)++;printf("增加联系人员成功\n");//在这里,虽然[ ]的优先级高于->,,但是,data和[ ]是不可以先进行结合的,因为,这是在一个调用函数中,形参那部分接受到的只有指针变量pc//也就是说,如果后两者进行结合的话,系统根本就不知道data是什么东西,所以它结合出来是错误的,即,虽然[ ]的优先级高于->,但是后两者不能//进行结合会出错,所以,即使[]的优先级比较高,还是先让data和->进行结合,即先进行pc->data的操作,在结构体成员变量中找到了指针变量data,//又因为该指针变量data指向了由malloc函数在堆区上动态开辟的内存空间的起始位置的地址,相当于数组首元素的地址,在这里不是特例,所以,//就等价于找到了该数组的数组名,即,pc->data === 数组名, 知道了数组名,再通过数组下标进行访问数组中的元素。
3.6 显示联系人信息的部分:
//显示联系人的信息
void PrintContact(const Contact* pc)
{//打印出所有人的信息,即sz个人的信息。int i = 0;//打印标题printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "名字", "年龄", "性别", "电话", "地址");// \t === tab//打印数据for (i = 0; i < (pc->sz); i++){printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[i].name, pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}//先进行pc->和data的结合,找到了结构体中的指针变量data,而该指针变量中存放的是由malloc函数在堆区上动态开辟的内存空间的起始位置的地址,相当于数组首元素的地址,//在这里不是特例,所以,就等价于找到了该数组的数组名,即,pc->data === 数组名,, 知道了数组名,再通过数组下标进行访问数组中的元素,找到了了数组下标为i的元素//即找到了一个变量,再通过点来访问该人的姓名等,,由于姓名是一个数组,找到的就是整个数组,整个数组又可以使用数组名来表示,即:pc->data[i].name === name ,没有sizeof和&,//代表数组首元素的地址,然后再以%s进行打印,除了年龄是一个变量,其他的都是数组,和name同理。
3.7 删除联系人信息的部分:
//因为该函数只是为了满足删除,查找,修改功能的需要,而这三个功能对应的函数的实现都会在该 .c 文件内进行实现,所以,对于这个函数
//只需要在该 .c 文件内执行即可,不许要暴露给别人,,所以,在前面加上static,就固定了该函数只在目前所在的 .c 文件内进行工作即可。
//static 修饰函数,本质上是改变了函数的链接属性。
static int Find_By_Name(const Contact* pc,char name[])//数组形式接收,数组形式接受的话就不考虑const的使用了。
{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[MAX_NAME] = { 0 };if (pc->sz == 0){printf("通讯录为空、不可以再进行删除操作\n");return;}//删除某个人的信息printf("请输入要删除人员的姓名:>");scanf("%s", name);//1、查找要删除的人//不管是删除还是查找还是修改,都需要使用到查找这个功能,所以就单独把该功能拿出来封装一个函数;int pos=Find_By_Name(pc,name);//一级指针传参和数组名传参//不存在该人if (pos == -1){printf("要删除的人员不存在\n");return;}//2、存在该人员,要进行删除,把数组该位置上的人员删除之后,数组后面的人员依次往前移动一个位置。int i = 0;for (i = pos; i < (pc->sz - 1); i++){pc->data[i] = pc->data[i + 1]; }//pc->sz -= 1;pc->sz--;//如果想删除最后一个,是删除不掉的,因为,如果10个元素,最后一个下标为9,判断条件是<9,,所以不进入循环,但是//循环后面还有pc->sz--,,成员个数少了1,再显示人员信息的时候,访问不到最后一个人员了,,即使没删掉,也访问不掉,//最后的结果和删掉最后一个人员的效果是一样的。//假设MAX=3,把最后一个元素删除,本质上并没有从数组中删除掉,而是因为sz减1,打印的时候不访问最后一个元素,看起来和删除的效果是一样的,现在由于//看起来删了,本质上没删去,如果再添加新元素会怎么样呢?//因为删除完之后,元素个数就会减去1,由原来的3变成了2,,再添加新元素的时候,就会直接把新元素的内容放在下标为2的位置上,这样的话,即使之前的最后一个元素//没删去,也会被新的元素覆盖掉,添加完之后元素个数加1,再打印出来就是添加成员后的信息,是对的。printf("删除联系人员成功\n");
}
3.8 查找联系人信息的部分:
//查找联系人信息
void SearchContact(const Contact* pc)
{char name[MAX_NAME] = { 0 };//查找某个人的信息printf("请输入要查找人员的姓名:>");scanf("%s", name);int pos = Find_By_Name(pc, name);//要查找的人员不存在if (pos == -1){printf("要查找的人员不存在\n");return;}else{//2、存在该人员,找出之后并打印出该成员的信息//打印标题printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "名字", "年龄", "性别", "电话", "地址");// \t === tab//打印数据printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}
3.9 修改联系人信息的部分:
//修改指定联系人的信息
void ModifyContact(Contact* pc)
{char name[MAX_NAME] = { 0 };//修改某个人的信息printf("请输入要修改人员的姓名:>");scanf("%s", name);int pos = Find_By_Name(pc, name);//要修改的人员不存在if (pos == -1){printf("要修改的人员不存在\n");return;}else{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");}
}
3.10 排序联系人信息的部分:
enum Option_qsort
{exit_qsort,name,age,sex,addr,tele
};
void menu_qsort()
{printf("*****************************\n");printf("***** 1、name 2、age *****\n");printf("***** 3、sex 4、addr *****\n");printf("***** 5、tele 0、exit_sort*\n");printf("*****************************\n");
}//按照名字进行排序
int Conpare_ByName(const void*e1, const void* e2)
{return strcmp( ((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name );
}//按照年龄进行排序
int Conpare_ByAge(const void*e1, const void* e2)
{return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}//按照性别进行排序
int Conpare_BySex(const void*e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->sex, ((PeoInfo*)e2)->sex);
}//按照地址进行排序
int Conpare_ByAddr(const void*e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->addr, ((PeoInfo*)e2)->addr);
}//按照电话进行排序
int Conpare_ByTele(const void*e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->tele, ((PeoInfo*)e2)->tele);
}void print(Contact* pc)
{int i = 0;printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}
//排序联系人的信息
void SortContact(Contact* pc)
{int input = 0;do{menu_qsort();printf("请选择排序的方式:>");scanf("%d", &input);switch (input){//按照名字进行排序case name://这里求数组元素个数的时候,不要使用整个数组的大小比上数组首元素的大小,因为我们在这里排序的时候,仅对已添加的成员进行排序,比如添加的成员个数是3的话,//就对这3个元素进行排序,如果开辟的数组有1000个元素,但是只添加3个的话,如果使用整个数组的大小比上数组首元素的大小,求出来的就是1000,意思是对1000个元素进行排序//这样是不对的,应该对添加进去的3个元素进行排序,pc->sz,这个整体就已经代表了元素个数是3,不需要再计算了,所以,使用下面的代码即可。qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByName);print(pc);break;//按照年龄进行排序case age:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAge);print(pc);break;//按照性别进行排序case sex:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_BySex);print(pc);break;//按照地址进行排序case addr:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAddr);print(pc);break;//按照电话进行排序case tele:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByTele);print(pc);break;//退出排序case exit_qsort:printf("退出排序\n");printf("\n");break;//选择错误default:printf("选择排列方式错误,请重新进行选择:>\n");break;}}while (input);
}
要知道库函数qsort的使用规则,上述代码可以实现多次排序,并且可以按照不同的要求进行排序,要注意的是,不同类型的内容进行排序的时候,两个元素的比较方式不同,要写出不同的代码。
3.11 清空所有联系人信息的部分:
//清空所有联系人的信息
void ClearContact(Contact* pc)
{(pc->sz) = 0;memset(pc->data, 0, sizeof(pc->data));printf("清空成功\n");printf("\n");//在此过程把sz置为了0,再次打印的时候,不进入遍历的循环,不打印数据,直接出程序。
}
使用memset内存设置函数,并把数组元素个数设为0,值得注意的是:在此过程把sz置为了0,再次打印的时候,不进入遍历的循环,不打印数
据,直接出程序,所以效果和清空所有联系人的效果一样、
3.12 销毁通讯录的部分:
//销毁通讯录
void DestoryContact(Contact* pc)
{//释放free(pc->data);pc->data = NULL;pc->sz = 0;pc->capacity = 0;
}
四、代码以文件进行呈现:
4.1 test.c源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"//通讯录
//每个人的信息包含:名字、年龄、性别、电话、地址、
//增加人的信息、删除人的信息、修改指定人的信息、查找指定人的信息、排序通讯录的信息、清除所有信息、显示联系人信息,销毁通讯录、//动态增长版本
//1、通讯录最开始初始化后能存放3个人的信息,
//2、当空间存放满的时候,再增加2个联系人信息、
//3、如果再发现不够使用,每次增加2个联系人的信息、enum Option//枚举成员变量从0开始,依次递增1;
{//枚举中的变量一般都采用大写。EXIT,ADD,DEL,SEARCH,MODIFY,SORT,PRINT,CLEAR
};void menu()
{printf("*********************************\n");printf("****** 1、add 2、del ******\n");printf("****** 3、search 4、modify ****\n");printf("****** 5、sort 6、print******\n");printf("****** 7、clear 0、exit *****\n");printf("*********************************\n");
}int main()
{int input = 0;//创建通讯录,结构体类型在头文件中定义的,所以要引头文件,通讯录中当前有几个元素://int sz = 0;//创建通讯录Contact con; //con就是通讯录,也可以直接进行初始化,但是为了更好的体现模块化,就对初始化通讯录封装一个函数。//如果想把其中的一部分初始化为0,就必须使用函数来做了。//初始化通讯录//使用malloc函数在堆区上动态开辟一块连续的内存空间,并把该空间的起始位置的地址放在结构体指针变量data中。//初始化整型变量sz=0;//初始化整型变量capacity为当前最大的容量、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 SORT:SortContact(&con);break;//显示所有联系人的信息case PRINT://虽然只是打印信息,不会改变实参的信息,但是考虑的效率的话,还是使用传址调用比较好,结构体传参最好传地址。PrintContact(&con);break;//清空所有联系人的信息case CLEAR:ClearContact(&con);break;case EXIT://现在存放联系人信息的内存空间是动态开辟的,当退出的时候,该空间要被释放掉才行、//销毁通讯录DestoryContact(&con);printf("退出通讯录\n");break;default:printf("选择错误,请重新进行选择:>");break;}} while (input);//如果有同名的,一律操作第一个出现该名字的那个成员,因为遍历是从前往后遍历的,在这里不考虑同名的情况。return 0;
}
4.2 contact.c源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"//初始化 通讯录函数
void InitContact(Contact* pc)
{pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));if (pc->data == NULL){//开辟内存空间失败perror("InitContact"); //由于在函数InitContact中进行的操作,如果开辟失败,报错是该函数足够的空间、return; //由于InitContact函数的返回类型是void类型,所以直接返回 return,即可。}//在这里对结构体指针变量data指向的内存空间中的内容不进行初始化,可以初始化,也可以不初始化;(pc->sz) = 0;//初始化后默认为0、(pc->capacity) = DEFAULT_SZ;//初始化后默认为DEFAULT_SZ个、
}//增加联系人的信息 —— 动态
void AddContact(Contact* pc)
{//通讯录满员-> 增容if (pc->sz == pc->capacity){//增容PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ)*sizeof(PeoInfo));if (ptr == NULL){//增容失败perror("AddContact");perror("增容联系人\n");return;}else{//增容成功 pc->data = ptr;pc->capacity += INC_SZ;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].addr);printf("请输入电话:>");scanf("%s", pc->data[pc->sz].tele);(pc->sz)++;printf("增加联系人员成功\n");//在这里,虽然[ ]的优先级高于->,,但是,data和[ ]是不可以先进行结合的,因为,这是在一个调用函数中,形参那部分接受到的只有指针变量pc//也就是说,如果后两者进行结合的话,系统根本就不知道data是什么东西,所以它结合出来是错误的,即,虽然[ ]的优先级高于->,但是后两者不能//进行结合会出错,所以,即使[]的优先级比较高,还是先让data和->进行结合,即先进行pc->data的操作,在结构体成员变量中找到了指针变量data,//又因为该指针变量data指向了由malloc函数在堆区上动态开辟的内存空间的起始位置的地址,相当于数组首元素的地址,在这里不是特例,所以,//就等价于找到了该数组的数组名,即,pc->data === 数组名, 知道了数组名,再通过数组下标进行访问数组中的元素。
}//显示联系人的信息
void PrintContact(const Contact* pc)
{//打印出所有人的信息,即sz个人的信息。int i = 0;//打印标题printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "名字", "年龄", "性别", "电话", "地址");// \t === tab//打印数据for (i = 0; i < (pc->sz); i++){printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[i].name, pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}//先进行pc->和data的结合,找到了结构体中的指针变量data,而该指针变量中存放的是由malloc函数在堆区上动态开辟的内存空间的起始位置的地址,相当于数组首元素的地址,//在这里不是特例,所以,就等价于找到了该数组的数组名,即,pc->data === 数组名,, 知道了数组名,再通过数组下标进行访问数组中的元素,找到了了数组下标为i的元素//即找到了一个变量,再通过点来访问该人的姓名等,,由于姓名是一个数组,找到的就是整个数组,整个数组又可以使用数组名来表示,即:pc->data[i].name === name ,没有sizeof和&,//代表数组首元素的地址,然后再以%s进行打印,除了年龄是一个变量,其他的都是数组,和name同理。
}//因为该函数只是为了满足删除,查找,修改功能的需要,而这三个功能对应的函数的实现都会在该 .c 文件内进行实现,所以,对于这个函数
//只需要在该 .c 文件内执行即可,不许要暴露给别人,,所以,在前面加上static,就固定了该函数只在目前所在的 .c 文件内进行工作即可。
//static 修饰函数,本质上是改变了函数的链接属性。
static int Find_By_Name(const Contact* pc,char name[])//数组形式接收,数组形式接受的话就不考虑const的使用了。
{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[MAX_NAME] = { 0 };if (pc->sz == 0){printf("通讯录为空、不可以再进行删除操作\n");return;}//删除某个人的信息printf("请输入要删除人员的姓名:>");scanf("%s", name);//1、查找要删除的人//不管是删除还是查找还是修改,都需要使用到查找这个功能,所以就单独把该功能拿出来封装一个函数;int pos=Find_By_Name(pc,name);//一级指针传参和数组名传参//不存在该人if (pos == -1){printf("要删除的人员不存在\n");return;}//2、存在该人员,要进行删除,把数组该位置上的人员删除之后,数组后面的人员依次往前移动一个位置。int i = 0;for (i = pos; i < (pc->sz - 1); i++){pc->data[i] = pc->data[i + 1]; }//pc->sz -= 1;pc->sz--;//如果想删除最后一个,是删除不掉的,因为,如果10个元素,最后一个下标为9,判断条件是<9,,所以不进入循环,但是//循环后面还有pc->sz--,,成员个数少了1,再显示人员信息的时候,访问不到最后一个人员了,,即使没删掉,也访问不掉,//最后的结果和删掉最后一个人员的效果是一样的。//假设MAX=3,把最后一个元素删除,本质上并没有从数组中删除掉,而是因为sz减1,打印的时候不访问最后一个元素,看起来和删除的效果是一样的,现在由于//看起来删了,本质上没删去,如果再添加新元素会怎么样呢?//因为删除完之后,元素个数就会减去1,由原来的3变成了2,,再添加新元素的时候,就会直接把新元素的内容放在下标为2的位置上,这样的话,即使之前的最后一个元素//没删去,也会被新的元素覆盖掉,添加完之后元素个数加1,再打印出来就是添加成员后的信息,是对的。printf("删除联系人员成功\n");
}//查找联系人信息
void SearchContact(const Contact* pc)
{char name[MAX_NAME] = { 0 };//查找某个人的信息printf("请输入要查找人员的姓名:>");scanf("%s", name);int pos = Find_By_Name(pc, name);//要查找的人员不存在if (pos == -1){printf("要查找的人员不存在\n");return;}else{//2、存在该人员,找出之后并打印出该成员的信息//打印标题printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "名字", "年龄", "性别", "电话", "地址");// \t === tab//打印数据printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}//修改指定联系人的信息
void ModifyContact(Contact* pc)
{char name[MAX_NAME] = { 0 };//修改某个人的信息printf("请输入要修改人员的姓名:>");scanf("%s", name);int pos = Find_By_Name(pc, name);//要修改的人员不存在if (pos == -1){printf("要修改的人员不存在\n");return;}else{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");}
}enum Option_qsort
{exit_qsort,name,age,sex,addr,tele
};
void menu_qsort()
{printf("*****************************\n");printf("***** 1、name 2、age *****\n");printf("***** 3、sex 4、addr *****\n");printf("***** 5、tele 0、exit_sort*\n");printf("*****************************\n");
}//按照名字进行排序
int Conpare_ByName(const void*e1, const void* e2)
{return strcmp( ((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name );
}//按照年龄进行排序
int Conpare_ByAge(const void*e1, const void* e2)
{return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}//按照性别进行排序
int Conpare_BySex(const void*e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->sex, ((PeoInfo*)e2)->sex);
}//按照地址进行排序
int Conpare_ByAddr(const void*e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->addr, ((PeoInfo*)e2)->addr);
}//按照电话进行排序
int Conpare_ByTele(const void*e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->tele, ((PeoInfo*)e2)->tele);
}void print(Contact* pc)
{int i = 0;printf("%-10s\t%-5s\t%-5s\t%-12s\t%-50s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-10s\t%-5d\t%-5s\t%-12s\t%-50s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}
//排序联系人的信息
void SortContact(Contact* pc)
{int input = 0;do{menu_qsort();printf("请选择排序的方式:>");scanf("%d", &input);switch (input){//按照名字进行排序case name://这里求数组元素个数的时候,不要使用整个数组的大小比上数组首元素的大小,因为我们在这里排序的时候,仅对已添加的成员进行排序,比如添加的成员个数是3的话,//就对这3个元素进行排序,如果开辟的数组有1000个元素,但是只添加3个的话,如果使用整个数组的大小比上数组首元素的大小,求出来的就是1000,意思是对1000个元素进行排序//这样是不对的,应该对添加进去的3个元素进行排序,pc->sz,这个整体就已经代表了元素个数是3,不需要再计算了,所以,使用下面的代码即可。qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByName);print(pc);break;//按照年龄进行排序case age:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAge);print(pc);break;//按照性别进行排序case sex:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_BySex);print(pc);break;//按照地址进行排序case addr:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByAddr);print(pc);break;//按照电话进行排序case tele:qsort(pc->data, pc->sz, sizeof(pc->data[0]), Conpare_ByTele);print(pc);break;//退出排序case exit_qsort:printf("退出排序\n");printf("\n");break;//选择错误default:printf("选择排列方式错误,请重新进行选择:>\n");break;}}while (input);
}//清空所有联系人的信息
void ClearContact(Contact* pc)
{(pc->sz) = 0;memset(pc->data, 0, sizeof(pc->data));printf("清空成功\n");printf("\n");//在此过程把sz置为了0,再次打印的时候,不进入遍历的循环,不打印数据,直接出程序。
}//销毁通讯录
void DestoryContact(Contact* pc)
{//释放free(pc->data);pc->data = NULL;pc->sz = 0;pc->capacity = 0;
}
4.3 contact.h头文件
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//类型的定义、通讯录中要放1000个人的信息,每个人的信息要包括名字、年龄、性别、电话、地址等,所以要定义成一个结构体,而该结构体要在两个源文件中使用,所以最好定义在头文件中,这样只需要包含一下头文件就可以频繁的使用了。//定义结构体类型:
#define MAX_NAME 20 //全大写
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX 1000#define DEFAULT_SZ 3 //初始化联系人信息的个数为3、
#define INC_SZ 2 //增量为2、typedef struct PeoInfo
{//char name[20];//直接写成固定值就写死了,不方便后期的修改,所以使用#define 来定义一个常量,后期直接改变#define中的内容即可。char name[MAX_NAME];//同上,性别也使用#define来定义char sex[MAX_SEX];int age;char tele[MAX_TELE];char addr[MAX_ADDR];
}PeoInfo;//使用typedef对结构体类型重命名为:PeoInfo//结构体嵌套
//通讯录— 动态、
typedef struct Contact //重命名
{//PeoInfo* data = (PeoInfo*)malloc(3 * sizeof(PeoInfo);//存放添加进去的联系人的信息//但是还是在一个结构体成员变量中,一般不初始化,直接写出等号左边的内容即可。PeoInfo* data;//结构体指针变量data指向在堆区上动态开辟的内存空间的起始位置的地址,存放联系人信息、int sz;//记录当前通讯录中有效信息的个数int capacity;//用来表示通讯录的最大容量、
}Contact;
//将在堆区上动态开辟的内存空间的首元素的地址放在指针变量data中,并且使用整型变量sz去记录已有的有效的联系人的个数,其次再使用整型变量capacity来表示当前通讯录的最大容量;
//因为最初的时候,初始化该动态开辟的内存空间中能存放3个人的信息,所以说,capacity的初始值为当前最大的容量、//初始化通讯录
void InitContact(Contact* pc);//增加联系人的信息
void AddContact(Contact* pc);//显示联系人的信息
void PrintContact(const Contact* pc);
//const放在*的左边,指的就是指针变量pc指向的内容不可以被修改,pc指向了通讯录con,所以通讯录中的内容,即数组和sz都不可以发生改变,又因为联系人
//的每个信息都是数组中每一个元素的子集,现要求整个数组都不能改变,所以每个元素中的内容就更不能改变。//删除联系人信息
void DelContact(Contact* pc);//查找联系人的信息
void SearchContact(const Contact* pc);//修改指定联系人
void ModifyContact(Contact* pc);//排序联系人的信息
void SortContact(Contact* pc);
//如果在*左边加const,那么pc指向的内容就不能改变,pc指向了一个数组和sz,其中,排序的话,sz的个数没有变化, 但是,数组各元素之间会有排序,这个顺序就会导致
//数组的内容发生了改变,所以,不可以加const。//清空所有联系人的信息
void ClearContact(Contact* pc);//销毁通讯录
void DestoryContact(Contact* pc);
通讯录动态内存分配版本的基本功能已经实现,如果对您有帮助,记得点赞收藏,谢谢各位~
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- NoSQL之redis主从复制、数据类型、应用场景
1、string list hash结构中,每个至少完成5个命令,包含插入 修改 删除 查询,list 和hash还需要增加遍历的操作命令 string命令操作 [rootlocalhost ~]# redis-cli 127.0.0.1:6379> APPEND k1 hello #该键并不存在,因此append…...
2024/4/14 4:12:13 - python烟花效果的代码实例|CSDN创作打卡
python烟花效果的代码实例一、整体概念梳理二、基本知识:用Python和Tkinter设计烟花三、使用Tkinter模拟四、全部代码一、整体概念梳理 在本篇文章里小编给大家整理的是关于python烟花效果的代码实例,对此有兴趣的朋友们可以在跟着学习参考下。 天天敲代…...
2024/4/14 4:12:28 - (15)函数指针与回调函数
函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: typedef int (*fun_ptr)(int,int); // 声明一…...
2024/4/14 4:12:18 - 蓝桥杯·寒假百校真题大联赛(大学B组)(第2期)
蓝桥杯寒假百校真题大联赛(大学B组)(第2期) 里面有些填空题...
2024/4/27 23:27:37 - 密文电报方法
题目:a等价于额,z等价于的,依次类推 解题思路:按照规律依次替换 代码: #include<stdio.h> #include<string.h> int main() {printf("Input:\n"); int i; printf("原文:&q…...
2024/4/27 22:24:25 - IDEA左下角找不到Services
...
2024/4/14 4:12:23 - python psutil as_dict()获取进程信息
psutil PyPI import psutil ppsutil.Process(0)p.as_dict(attrs[pid]) psutil.process_iter([pid]) 常见进程信息关键字 {memory_maps: [ ],create_time: 1643117006.619562,pid: 8776,memory_info: ,status: running,ionice: <IOPriority.IOPRIO_NORMAL:2>,ppid: 13…...
2024/4/14 4:12:23 - 蓝桥杯练习系统 算法提高 队列操作
试题 算法提高 队列操作 Ideas 这题没什么技巧吧,用数组来模拟队列操作,按照指令来就可以了,帮助回忆一下队列的一些操作。 Code Python def solve():queue list()n int(input())for _ in range(n):string input()if string[0] 1: …...
2024/4/14 4:12:38 - 纷享销客自定义函数:实战100例(全网最全,持续更新...)
自定义函数是纷享低代码能力的实现方案,是纷享销客PaaS能力的重要组成部分,此文档主要提供纷享自定义函数实用案例,交流、咨询自定义函数、API接口相关问题:wangzhifengtongdog.com.cn 来源:纷享销客CRM 公共函数库 实…...
2024/4/7 17:14:21 - 用字母打印菱形
num1list(range(1,10,2)) num2list(range(7,0,-2)) list1num1num2 #print(list1) for j in list1: print(("*" *j).center(10)) for i in list1[:5]: print((chr(ord(“A”)(i-1)//2)*i).center(9)) for i in list1[5:]: print((chr(ord(“E”)(9-i)//2)*i).center…...
2024/4/14 4:12:08 - C语言:数组
数组: 由若干个相同类型 的相关数据项,按顺序存储在一起 ,构成的数组;数组其实是同种类型,有序的数据的集合。 数组名: 用统一的名字命名标识这组数据,这个名字就是数组名。 数组元素: 构成数组…...
2024/4/14 4:12:43 - Golang 028. 奶牛生子问题
【基础入门题】Golang 028. 奶牛生子问题 一只刚出生的奶牛,4岁时生1只奶牛,以后每一年生1只。现在给你一只刚出生的奶牛,求20年后有多少奶牛? 什么破题目,奶牛也有公母的吧,就假定全是母的并且可以单性…...
2024/4/20 0:33:09 - 记录下准备蓝桥杯的过程吧
参加:蓝桥杯软件组C语言大学A组。 目标:省三(大学前的学生时代都没得过这么大的奖………………)。 好好准备吧。...
2024/4/14 4:12:33 - 蓝桥杯VIP 基础练习 芯片测试 python解析
一、题目详情 1.问题描述 有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。 每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时࿰…...
2024/4/24 19:17:40 - AtCoder Beginner Contest 236 (C-E)
C - Route Map 题意:给定n个S串和m个T串,对于每一个S串问是否其出现在T串中。 题解:map模拟记录T串,对于S,询问map中是否存在就行。 AC代码: #include <iostream> #include <algorithm> #inc…...
2024/4/20 7:38:11 - 调用七牛云简单的上传附件的方法
需要引入Qinu的包 appid,和appkey申请注册的时候会有 Bucket “kettle1” 这个是在上面新建的空间名。 // See https://aka.ms/new-console-template for more informationusing Qiniu.Http; using Qiniu.Storage; using Qiniu.Util; Mac mac new Mac("appid", &q…...
2024/4/14 4:13:04 - JavaScript变量
01-变量 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, ini…...
2024/4/5 4:08:03 - vue项目插件:style-resoures-loader——样式文件自动注入
作用: 将css 预处理器的一些公共的样式文件变量,比如:variables , mixins , functions自动注入到每个样式文件或者vue组件中style标签中; 避免在每个样式文件中手动的import导入,然后在各个css 文件中直接使用 变量。…...
2024/4/14 4:13:09 - dolphinscheduler-2.0.1安装
Dolphinscheduler2.0.1安装文档 参考文档和下载地址:https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/installation/pseudo-cluster.html 一:安装步骤 1:创建dolphinscheduler用户,给用户添加密码和对应的权限。 …...
2024/4/14 4:13:29 - Python第三方包安装
目录第三方包1. pip的升级:2. pip使用国内源2.1 临时使用:2.2 永久修改2.2.1 方法一3. Pycharm中安装第三方包第三方包 在Python标准库以外还存在成千上万并且不断增加的其他组件 (从单独的程序、模块、软件包直到完整的应用开发框架),访问P…...
2024/4/14 4:13:19
最新文章
- 第一个大型汽车ITU-T车载语音通话质量实验室投入使用
中国汽车行业蓬勃发展,尤其是新能源汽车风起云涌,无论是国内还是海外需求旺盛的趋势下,除乘用车等紧凑型车外,中型汽车如MPV、小巴、小型物流车,大型汽车如重卡、泥头车等亦加入了手机互联、智驾的科技行列,…...
2024/4/27 23:38:14 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 爱自然生命力粤东中心家风家教高端研讨会在广东汕头盛大开启
2024年3月30日,爱自然生命力粤东中心家风家教高端研讨会在广东汕头金海湾大酒店隆重召开。 (图为活动现场) 本次由爱自然生命力体系粤东中心主办的粤东家风家教高端研讨会,主题为“携手校家社,共筑新格局”࿰…...
2024/4/27 1:44:56 - git总结
建议配合gitlab实操 git分区:工作区(修改的地方),暂存区(add),本地仓库(commit) 常用命令 初次使用配置 git config --global user.name "xxx" git config --global user.email "xxxqq.com" 这2个是针对整个主机的全局…...
2024/4/26 0:33:49 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/26 21:56:58 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/26 22:01:59 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57