网站加入购物车的代码,wordpress 搜索的过程,云搜索app官网,美工培训电商设计培训班开饭了#xff0c;之前写的通讯录#xff0c;是否会有人觉得申请1000人的空间是不是有点用不上呀#xff0c;怎么才能做到要多少申请多少个呢#xff1f;#xff1f;我们学完动态内存管理#xff0c;和文件的相关操作#xff0c;终于可以继续完善我们的通讯录了 船新版本… 开饭了之前写的通讯录是否会有人觉得申请1000人的空间是不是有点用不上呀怎么才能做到要多少申请多少个呢我们学完动态内存管理和文件的相关操作终于可以继续完善我们的通讯录了 船新版本 为了适应各个用户的体验8.18日系统升级请各位用户查看最新的安装包做出以下修改 1.为了不占用更多的空间通讯录容量满时进行扩容操作。 2.通讯录初始化会加载文件中的通讯录成员信息防止出现程序结束后通讯录销毁问题。 3.增加背景音乐功能用户在使用该通讯录时有更好的用户体验别人有的 咱们必须有 4.增加销毁通讯录功能。 5.增加将通讯录保存到文件功能。 静态版链接
通讯录静态版 通讯录结构体的修改
typedef struct pp {struct peoinfo *arr;int sz;int size;}pp;size:通讯录容量大小区别于sz(当前存了多少个人) 将struct peoinfo arr[1000]修改为struct peoinfo *arr 对arr指针指向的地方进行动态内存分配将分配好的地址放到arr中去 扩容函数
void Addbig(pp* p)
{if (p-sz p-size){peoinfo* tmp (peoinfo*)realloc(p-arr, (p-size 2) * sizeof(peoinfo));if (tmp ! NULL){p-arr tmp;}p-size 2;printf(增容 2\n);}
}当通讯录实际容纳的用户大小通讯录的当前容量时开始扩容使用realloc函数参数1要扩容空间的起始地址参数2扩容后总空间字节大小将开辟的空间首地址放到tmp指针变量中去如果扩容成功将扩容好的首地址放到p-arr指针里面去p-size 2每次增加两个容量大小 文件加载到通讯录函数
void Loadcontact(pp* p)
{FILE* fpfopen(contact.txt, rb);if (fp NULL){perror(Loadcontact:);return;}peoinfo tmp { 0 };while (fread(tmp,sizeof(peoinfo),1,fp)){Addbig(p);p-arr[p-sz] tmp;p-sz;}fclose(fp);fp NULL;
}用二进制读的方式打开文件如果未打开返回空指针给fp,然后打印出错误定义一个人信息的结构体变量使用fread函数参数1目标地址参数2一次读多少个字节这里读一个人信息结构体的字节参数3每次读几个这样结构体参数4从那里读文件指针返回值是每次读多少个人信息结构体如果小于参数30.则读完了读不到一个完整人的结构体.每次从文件中读取数据调用扩容函数防止读取数据大于总容量扩容函数会增加总容量大小每次将一个人的信息读到结构体tmp中将tmp里面的一个人信息赋值给p-arr[p-sz];然后当前存储的数目sz; 然后关闭文件将文件指针置空 初始化通讯录函数
void Initcontanct(pp* p)
{/*p-sz 0;memset(p-arr, 0, sizeof(p-arr));*/p-sz 0;p-size SIZE;p-arr (peoinfo*)malloc(p-size * sizeof(peoinfo));if (p-arr NULL){perror( Initcontanct:malloc);return;}memset(p-arr, 0, p-size * sizeof(peoinfo));Loadcontact(p);}初始化通讯录没有存入信息p-sz0;开始通讯录的容量可以存三个人p-size SIZE;前面定义 SIZE 为3动态开辟三个人信息结构体大小的空间将开辟空间的首地址传给指针变量p-arr;如果传的为空指针则打印错误memset,内存操作函数将创建三个容量大小的数据置为0调用Loadcontact§;加载文件中的数据 保存进文件函数
void Savecontact(pp* p)
{FILE* fp fopen(contact.txt, wb);if (fp NULL){perror(Savecontact:);return;}int i 0;for (i 0; i p-sz; i){fwrite(p-arri, sizeof(peoinfo), 1, fp);}fclose(fp);fp NULL;printf(保存成功\n);
}以二进制写的方式打开文件打开失败返回空指针打印错误使用fwrite函数参数要写入文件的数据起始地址参数2每次写入的字节大小参数3每次写1个人信息结构体大小参数3写入文件的地址文件指针循环向文件中写入通讯录每个用户信息循环次数为p-sz,当前通讯录用户人数 通讯录销毁函数
void DestroyContanct(pp* p)
{free(p-arr);p-arr NULL;p-size 0;p-sz 0;printf(销毁成功\n);
}free释放动态申请的内存参数动态申请空间的地址指针置空 容量清0当前用户人数清0 背景音乐函数
头文件
#includewindows.h
#includemmsystem.h//包含多媒体设备接口头文件
#pragma comment(lib,winmm.lib)//加载静态库函数实现
void bgm()
{ //打开音乐mciSendString(open ./music.MP3, 0, 0, 0);//后面参数不用管写0即可//播放音乐mciSendString(play ./music.MP3, 0, 0, 0);//后面参数不用管
}注意上面路径是相对./文件名.文件类型./是在当前目录下也可以使用绝对路径不能出现空格文件类型最好用大写使用qq音乐下载好音乐点击主菜单音频转码转成MP3格式 使用其他的音乐软件播放不出来qq音乐打钱 将音频文件放到当前目录下在vs中找到解决方案右击鼠标找到在文件资源管理器中打开文件夹放到图示位置即可 使用绝对路径复制上面的复制路径D:\C-code\1\elementary-stage-of-c-language\通讯录动态加文件\通讯录动态加文件\music.mp3将反斜杠改成双反‘或者/也行。 如果出现以下错误 调试找到调试属性 高级-字符集 使用多字节字符集就ok了 #源码展示 contanct.h #pragma once
#define _CRT_SECURE_NO_WARNINGS
#includewindows.h#includemmsystem.h//包含多媒体设备接口头文件
#includestdio.h
#include string.h
#include stdlib.h
#pragma comment(lib,winmm.lib)//加载静态库
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TEL 12
#define MAX_ADDR 20
#define SIZE 3
enum opion
{EXIT,ADD,DEL,SEARCH,MODIFY,SORT,PRINT,SAVE,MUSIC,DESTROY
};
typedef struct peoinfo {char name[MAX_NAME];char sex[MAX_SEX];int age;char tel[MAX_TEL];char addr[MAX_ADDR];}peoinfo;typedef struct pp {struct peoinfo *arr;int sz;int size;}pp;
void Initcontanct(pp* p);
void Addcontanct(pp* p);
void Printcontanct(pp* p);
void Delcontanct(pp* p);
void findcontanct(pp* p);
void modifycontanct(pp* p);
void Sortcontanct(pp* p);
void Addbig(pp* p);
void Loadcontact(pp* p);
void Savecontact(pp* p);
void bgm();
void DestroyContanct(pp* p);contanct.c #includecontanct.h
//#includewindows.h
#includegraphics.h//包含图形库头文件
//#includemmsystem.h//包含多媒体设备接口头文件
//#pragma comment(lib,winmm.lib)//加载静态库
void DestroyContanct(pp* p)
{free(p-arr);p-arr NULL;p-size 0;p-sz 0;printf(销毁成功\n);
}
void Addbig(pp* p)
{if (p-sz p-size){peoinfo* tmp (peoinfo*)realloc(p-arr, (p-size 2) * sizeof(peoinfo));if (tmp ! NULL){p-arr tmp;}p-size 2;printf(增容 2\n);}
}
void Loadcontact(pp* p)
{FILE* fpfopen(contact.txt, r);if (fp NULL){perror(Loadcontact:);return;}peoinfo tmp { 0 };while (fread(tmp,sizeof(peoinfo),1,fp)){Addbig(p);p-arr[p-sz] tmp;p-sz;}fclose(fp);fp NULL;
}
void Savecontact(pp* p)
{FILE* fp fopen(contact.txt, wb);if (fp NULL){perror(Savecontact:);return;}int i 0;for (i 0; i p-sz; i){fwrite(p-arri, sizeof(peoinfo), 1, fp);}fclose(fp);fp NULL;printf(保存成功\n);
}
void Initcontanct(pp* p)
{/*p-sz 0;memset(p-arr, 0, sizeof(p-arr));*/p-sz 0;p-size SIZE;p-arr (peoinfo*)malloc(p-size * sizeof(peoinfo));if (p-arr NULL){perror( Initcontanct:malloc);return;}memset(p-arr, 0, p-size * sizeof(peoinfo));Loadcontact(p);}void Addcontanct(pp* p)
{Addbig(p);printf(请输入姓名\n);scanf(%s, p-arr[p-sz].name);printf(请输入性别\n);scanf(%s, p-arr[p-sz].sex);printf(请输入年龄\n);scanf(%d, (p-arr[p-sz].age));printf(请输入电话\n);scanf(%s, p-arr[p-sz].tel);printf(请输入地址\n);scanf(%s, p-arr[p-sz].addr);p-sz;printf(录入成功\n);}
void Printcontanct(pp* p)
{int i 0;printf(******************************************************\n);printf(%-10s %-5s %-5s %-12s %-20s\n, 姓名, 性别, 年龄, 电话, 地址);printf(******************************************************\n);for (i 0; i p-sz; i){printf(%-10s %-5s %-5d %-12s %-20s\n, p-arr[i].name, p-arr[i].sex, p-arr[i].age, p-arr[i].tel, p-arr[i].addr);printf(******************************************************\n);}
}
int find(pp* p, char name[])
{int i 0;for (int i 0; i p-sz; i){if (!strcmp(p-arr[i].name, name))return i;}return -1;
}
void Delcontanct(pp* p)
{char name[MAX_NAME];printf(请输入要删除朋友的名字\n);scanf(%s, name);if (find(p, name) -1){printf(查无此人\n);}else{int k find(p, name);for (int j k; j p-sz - 1; j){p-arr[j] p-arr[j 1];}p-sz--;printf(删除成功\n);}
}
void findcontanct(pp* p)
{char name[MAX_NAME];if (p-sz 0){printf(通讯录为空\n);return;}printf(请输入要查找朋友的名字\n);scanf(%s, name);if (find(p, name) -1){printf(查无此人\n);}else{int k find(p, name);printf(******************************************************\n);printf(%-10s %-5s %-5s %-12s %-20s\n, 姓名, 性别, 年龄, 电话, 地址);printf(%-10s %-5s %-5d %-12s %-20s\n, p-arr[k].name, p-arr[k].sex, p-arr[k].age, p-arr[k].tel, p-arr[k].addr);printf(******************************************************\n);}
}
void modifycontanct(pp* p)
{char name[MAX_NAME];printf(请输入修改朋友的名字\n);scanf(%s, name);if (find(p, name) -1){printf(查无此人\n);}else{int k find(p, name);printf(请输入要修改朋友的信息\n);printf(修改性别-);scanf(%s, p-arr[k].sex);printf(修改年龄-);scanf(%d, (p-arr[k].age));printf(修改电话-);scanf(%s, p-arr[k].tel);printf(修改地址-);scanf(%s, p-arr[k].addr);printf(修改成功\n);}
}
int int_cmp_age(const void* p1, const void* p2)//按年龄比较
{return ((struct peoinfo*)p1)-age - ((struct peoinfo*)p2)-age;
}
void Sortcontanct(pp* p)
{qsort(p-arr, p-sz, sizeof(peoinfo), int_cmp_age);printf(按年龄排序成功快去打印吧\n);
}
void bgm()
{ //打开音乐mciSendString(open ./music.MP3, 0, 0, 0);//后面参数不用管//播放音乐mciSendString(play ./music.MP3, 0, 0, 0);//后面参数不用管
}test.c #includecontanct.h
void menu()
{printf(#######################################\n);printf(#********* 1.add ***************#\n);printf(#********* 2.del ***************#\n);printf(#********* 3.search ***************#\n);printf(#********* 4.modify ***************#\n);printf(#********* 5.sort ***************#\n);printf(#********* 6.print ***************#\n);printf(#********* 7.save ***************#\n);printf(#********* 8.music ***************#\n);printf(#********* 9.Destroy***************#\n);printf(########## 0.exit ################\n);}
void test()
{pp pro;Initcontanct(pro);int input;do {menu();scanf_s(%d, input);switch (input){case ADD:Addcontanct(pro);break;case DEL:Delcontanct(pro);break;case SEARCH:findcontanct(pro);break;case MODIFY:modifycontanct(pro);break;case SORT:Sortcontanct(pro);break;case PRINT:Printcontanct(pro);break;case SAVE:Savecontact(pro);break;case MUSIC:bgm();break;case DESTROY:DestroyContanct(pro);break;case EXIT:printf(退出通讯录\n);break;default:printf(输入错误请重新输入\n);break;}} while (input);
}void main()
{test();}总结
使用动态内存管理以及文件操作优化了静态通讯录不足加上了背景音乐如果对你有帮助的话请一键三连谢谢大家了