目录
一.分段介绍主要函数
1.初始化函数
void initcontact(mem* pcont)
{
assert(pcont!=NULL);
memset(pcont->per, 0, sizeof(cont) * 20);
pcont->size = 0;
pcont->capacity = 20;
}//初始化通讯录
2.增加用户信息函数
void addcontact(mem* pcont)
{
assert(pcont != NULL);
if (pcont->size == pcont->capacity)
{
printf("已经满了\n");
return;
}
printf("请输入您要添加的人的名字>");
scanf("%s", pcont->per[pcont->size].name);
printf("请输入他的性别>");
scanf("%s", pcont->per[pcont->size].sex);
printf("请输入他的年龄>");
scanf("%d", &pcont->per[pcont->size].age);
printf("请输入家庭地址>");
scanf("%s", pcont->per[pcont->size].addr);
printf("请输入电话号码>");
scanf("%s", pcont->per[pcont->size].tel);
pcont->size++;//增加后人数+1
}//增加用户
3.摧毁通讯录函数
void destroy(mem* pcont)
{
assert(pcont != NULL);
memset(pcont->per, 0, sizeof(cont) * pcont->capacity);//初始化sizeof(cont) * pcont->capacity字节为0
pcont->size = 0;
pcont->capacity = 0;
}//摧毁通讯录
4.显示通讯录函数
void showcontact(mem* pcont)
{
for (int i = 0; i < pcont->size; i++)
{
printcontact(pcont, i);
}
printf("这就是所有已经存储的通讯录信息\n");
}//展示通讯录,即把通讯录种内容打印出来
5.查找通讯录函数
void findcontact(mem* pcont)
{
assert(pcont != NULL);
if (pcont->size == 0)
printf("没有数据,请加入");
printf("请输入查找人姓名>");
char name[20];
scanf("%s", name);
int i;
for (i = 0; i < pcont->size; i++)
{
if (strcmp(pcont->per[i].name, name) == 0)//比较字符串大小函数,通过字符串每个字符的ascii值进行比较,>0则左比右大
{
break;
}
}//在这之前退出表示查找到此人
if (i >= pcont->size)
{
printf("查无此人\n");
return;
}
printcontact(pcont, i);
}//查找通讯录
6.删除通讯录函数
void delcontact(mem* pcont)
{
assert(pcont != NULL);
char name2[20];
int i;
printf("请输入要删除的用户姓名>");
scanf("%s", name2);
if (pcont->size == 0)
printf("没有可以删除的信息,请添加\n");
for (i = 0; i < pcont->size; i++)
{
if (strcmp(pcont->per[i].name, name2) == 0)
{
break;
}
}
if (i >= pcont->size)
{
printf("要删除的信息不存在\n");
return;
}
for (int pos = i; pos < pcont->size - 1; pos++)
{
pcont->per[pos] = pcont->per[pos + 1];
}//通过向前覆盖的方式删除此人的信息
pcont->size--;
printf("通讯录信息删除成功\n");
}//按照名字删除
7.修改通讯录函数
void modcontact(mem* pcont)
{
assert(pcont != NULL);
int i;
char name[20];
printf("请输入想要删除的人的姓名>");
scanf("%s", name);
for (i = 0; i < pcont->size; i++)
{
if (strcmp(pcont->per[i].name, name) == 0)
{
break;
}
}
if (i >= pcont->size)
{
printf("查无此人,无法修改\n");
return;
}
while (1)//通过while循环使得可以在未退出前,修改这个人的所有信息
{
int num = 0;
printf("请输入你要修改的数据,请用数字代替\n1-姓名,2-性别,3-年龄,4-地址,5-号码,其他-退出修改>>");
scanf("%d", &num);
if (num == 1)
{
scanf("%s", pcont->per[i].name);
}
else if (num == 2)
{
scanf("%s", pcont->per[i].sex);
}
else if (num == 3)
{
scanf("%d", &pcont->per[i].age);
}
else if (num == 4)
{
scanf("%s", pcont->per[i].addr);
}
else if (num == 5)
{
scanf("%s", pcont->per[i].tel);
}
else {
printf("修改完毕\n");
break;
}
}
}//修改通讯录
8.清空通讯录函数
void clearcontact(mem* pcont)
{
assert(pcont != NULL);
pcont->size = 0;//取size为0,不用输出,默认为清空
printf("通讯录删除成功\n");
}//清空通讯录
9.排序通讯录函数
void sortcontact(mem* pcont)
{
assert(pcont != NULL);
for (int i = 0; i < pcont->size - 1; ++i)
{
for (int j = 0; j < pcont->size - 1 - i; ++j)
{
if (strcmp(pcont->per[j].name, pcont->per[j + 1].name) > 0)
{
cont temp = pcont->per[j + 1];
pcont->per[j + 1] = pcont->per[j];
pcont->per[j] = temp;
}
}
}//冒泡排序
printf("通讯录排序成功\n");
}//排序通讯录
二.代码主体
1.contact.c
#include"contact.h"
void printcontact(mem* pcont,int size)
{
printf("%-5s%-3s%-3d%-10s%-15s\n", pcont->per[size].name,
pcont->per[size].sex,
pcont->per[size].age,
pcont->per[size].addr,
pcont->per[size].tel);
}//内部函数
void initcontact(mem* pcont)
{
assert(pcont!=NULL);
memset(pcont->per, 0, sizeof(cont) * 20);
pcont->size = 0;
pcont->capacity = 20;
}//初始化通讯录
void addcontact(mem* pcont)
{
assert(pcont != NULL);
if (pcont->size == pcont->capacity)
{
printf("已经满了\n");
return;
}
printf("请输入您要添加的人的名字>");
scanf("%s",pcont->per[pcont->size].name);
printf("请输入他的性别>");
scanf("%s", pcont->per[pcont->size].sex);
printf("请输入他的年龄>");
scanf("%d", &pcont->per[pcont->size].age);
printf("请输入家庭地址>");
scanf("%s", pcont->per[pcont->size].addr);
printf("请输入电话号码>");
scanf("%s", pcont->per[pcont->size].tel);
pcont->size++;//增加后人数+1
}//增加用户
void destroy(mem* pcont)
{
assert(pcont != NULL);
memset(pcont->per, 0, sizeof(cont) * pcont->capacity);//初始化sizeof(cont) * pcont->capacity字节为0
pcont->size = 0;
pcont->capacity = 0;
}//摧毁通讯录
void showcontact(mem* pcont)
{
for (int i = 0; i < pcont->size; i++)
{
printcontact(pcont, i);
}
printf("这就是所有已经存储的通讯录信息\n");
}//展示通讯录,即把通讯录种内容打印出来
void findcontact(mem *pcont)
{
assert(pcont!=NULL);
if (pcont->size == 0)
printf("没有数据,请加入");
printf("请输入查找人姓名>");
char name[20];
scanf("%s", name);
int i ;
for (i=0; i < pcont->size; i++)
{
if (strcmp(pcont->per[i].name, name)==0)//比较字符串大小函数,通过字符串每个字符的ascii值进行比较,>0则左比右大
{
break;
}
}//在这之前退出表示查找到此人
if (i >= pcont->size)
{
printf("查无此人\n");
return;
}
printcontact(pcont, i);
}//查找通讯录
void delcontact(mem* pcont)
{
assert(pcont != NULL);
char name2[20];
int i;
printf("请输入要删除的用户姓名>");
scanf("%s", name2);
if (pcont->size == 0)
printf("没有可以删除的信息,请添加\n");
for (i = 0; i < pcont->size; i++)
{
if (strcmp(pcont->per[i].name, name2) == 0)
{
break;
}
}
if (i >= pcont->size)
{
printf("要删除的信息不存在\n");
return;
}
for (int pos = i; pos < pcont->size - 1; pos++)
{
pcont->per[pos] = pcont->per[pos + 1];
}//通过向前覆盖的方式删除此人的信息
pcont->size--;
printf("通讯录信息删除成功\n");
}//按照名字删除
void modcontact(mem*pcont)
{
assert(pcont!=NULL);
int i;
char name[20];
printf("请输入想要删除的人的姓名>");
scanf("%s", name);
for (i = 0; i < pcont->size; i++)
{
if (strcmp(pcont->per[i].name, name) == 0)
{
break;
}
}
if (i >= pcont->size)
{
printf("查无此人,无法修改\n");
return;
}
while (1)//通过while循环使得可以在未退出前,修改这个人的所有信息
{
int num=0;
printf("请输入你要修改的数据,请用数字代替\n1-姓名,2-性别,3-年龄,4-地址,5-号码,其他-退出修改>>");
scanf("%d", &num);
if (num == 1)
{
scanf("%s", pcont->per[i].name);
}
else if (num == 2)
{
scanf("%s", pcont->per[i].sex);
}
else if (num == 3)
{
scanf("%d", &pcont->per[i].age);
}
else if (num == 4)
{
scanf("%s", pcont->per[i].addr);
}
else if (num == 5)
{
scanf("%s", pcont->per[i].tel);
}
else {
printf("修改完毕\n");
break;
}
}
}//修改通讯录
void clearcontact(mem* pcont)
{
assert(pcont != NULL);
pcont->size = 0;//取size为0,不用输出,默认为清空
printf("通讯录删除成功\n");
}//清空通讯录
void sortcontact(mem* pcont)
{
assert(pcont != NULL);
for (int i = 0; i < pcont->size - 1; ++i)
{
for (int j = 0; j < pcont->size - 1 - i; ++j)
{
if (strcmp(pcont->per[j].name, pcont->per[j + 1].name) > 0)
{
cont temp = pcont->per[j + 1];
pcont->per[j + 1] = pcont->per[j];
pcont->per[j] = temp;
}
}
}//冒泡排序
printf("通讯录排序成功\n");
}//排序通讯录
2.menu.c
#include"contact.h"
int main(void)
{
int select=11;
mem pcont;
initcontact(&pcont);
while (select)
{
printf("**************************\n");
printf("**************************\n");
printf("*********通 讯 录*********\n");
printf("**************************\n");
printf("[1]添加 [2]查找\n");
printf("[3]删除 [4]修改\n");
printf("[5]展示 [6]清空\n");
printf("[7]排序 [0]退出\n");
printf("**************************\n");
printf("请输入您的选择>");
scanf("%d", &select);
switch (select)
{
case 1:addcontact(&pcont); break;//增加
case 2:findcontact(&pcont); break;//查找
case 3:delcontact(&pcont); break;//删除
case 4:modcontact(&pcont); break;//修改
case 5:showcontact(&pcont); break;//展示
case 6:clearcontact(&pcont); break;//清空
case 7:sortcontact(&pcont); break;//整理
default:printf("输入错误,请重新输入\n");
}
}
destroy(&pcont);
printf("通讯录退出,拜拜--");
}
3.contact.h
#include<stdio.h>
#include<assert.h>
#include<string.h>
typedef struct contact
{
char name[7];
char sex[3];
int age;
char addr[15];
char tel[15];
}cont;//单个个体的信息
typedef struct member
{
int size;
int capacity;
cont per[20];//最大成员数
}mem;//录入信息的成员
//姓名,性别,年龄,手机号,居住地址
void initcontact(mem* pcont);
void addcontact(mem* pcont);
void showcontact(mem* pcont);
void findcontact(mem* pcont);
void delcontact(mem* pcont);
void modcontact(mem*pcont);
void clearcontact(mem* pcont);
void destroy(mem* pcont);
void sortcontact(mem* pcont);
三.改进建议
1.使用malloc动态开辟内存
2.使用枚举关键字定义switch增强可读性
3.使用宏常量代替数字方便修改范围
4.美化界面不足