通讯录代码
该通讯录可存1000个人信息
1.菜单
打印通讯录功能菜单
void menu()
{
printf("********************\n");
printf("****1.添加 2.删除***\n");
printf("****3.查找 4.修改***\n");
printf("****5.显示 6.清空***\n");
printf("****7.n排序8.退出***\n");
printf("********************\n");
}
2.定义结构体并定义一个宏
定义一个值为值为1000的宏
#define max 1000
定义个人信息结构体
struct c
{
char name[10];
char sex[10];
int age;
char te[20];
char residence[50];
};
在定义一个结构体,包含个人信息和录入人数,创造这个结构体变量a
struct b
{
struct c form[max];
int num;
}a;
3.主函数
将a初始化,创造一个变量i为选项,创造一个函数指针数组f这里的函数都是实现菜单里的功能
int main()
{
struct b a = { 0 };
int i;
do {
void (*f[8])(struct b* ) = { NULL,add,delet,seek,change,show,ck,p };
menu();
printf("put function option\n");
scanf("%d", &i);
if (i == 8)
break;
else if (i > 8 && i < 1)
printf(" choose error\n");
else
f[i](&a);
} while (i);
return 0;
}
4.通讯录功能的实现
1.录入信息
void add(struct b* a)
{
if (a->num > max)
{
printf("空间不可录入\n");
return;
}
printf("输入名字\n");
scanf("%s", a->form[a->num].name);
printf("输入性别\n");
scanf("%s", a->form[a->num].sex);
printf("输入年龄\n");
scanf("%d", &a->form[a->num].age);
printf("输入phone\n");
scanf("%s", a->form[a->num].te);
printf("输入地址\n");
scanf("%s", a->form[a->num].residence);
a->num++;
return;
}
2.删除个人信息
memmove是把&a->form[i + 1]为名的长为 sizeof(a->form[i]) * (a->num - i)的数组覆盖掉名为&a->form[i]数组的后 sizeof(a->form[i]) * (a->num - i)的空间
void delet(struct b* a)
{
int i;
i = check(a);
if (i == -1)
{
printf("查无此人\n");
return;
}
memmove(&a->form[i], &a->form[i + 1], sizeof(a->form[i]) * (a->num - i));
a->num--;
}
后面会解释check函数
3.check检查是否有这个人
int check(struct b* a)
{
int i;
char name[20];
printf("输入此人的名字");
scanf("%s", name);
for (i = 0; i < a->num; i++)
{
if (strcmp(name, a->form[i].name) == 0)
return i;
}
return -1;
}
4.显示个人信息
void seek(struct b* a)
{
int i;
i = check(a);
if (i == -1)
{
printf("查无此人\n");
return;
}
printf("%-10s%-10s%-10s%-20s%-50s\n", "名字", "性别", "年龄", "phone number", "住址");
printf("%-10s%-10s%-10d%-20s%-50s\n", a->form[i].name, a->form[i].sex, a->form[i].age,a->form[i].te, a->form[i].residence);
}
5.改变个人信息
void change(struct b* a)
{
int i;
i = check(a);
if (i == -1)
{
printf("查无此人\n");
return;
}
printf("输入名字\n");
scanf("%s", a->form[i].name);
printf("输入性别\n");
scanf("%s", a->form[i].sex);
printf("输入年龄\n");
scanf("%d", &a->form[i].age);
printf("输入phone\n");
scanf("%s", a->form[i].te);
printf("输入地址\n");
scanf("%s", a->form[i].residence);
}
6.显示全部人信息
void show(struct b* a)
{
int i;
printf("%-10s%-10s%-10s%-20s%-50s\n", "名字", "性别", "年龄", "phone number", "住址");
for(i=0;i<a->num;i++)
printf("%-10s%-10s%-10d%-20s%-50s\n", a->form[i].name, a->form[i].sex, a->form[i].age, a->form[i].te, a->form[i].residence);
}
7.清空所有人信息
将a->num人数清零,再一次录入就会从结构体数组第一位开始录入覆盖掉原有信息
void ck(struct b* a)
{
a->num = 0;
}
8.按照名字排序
void p(struct b* a)
{
qsort(a->form, a->num, sizeof a->form[0], cmp);
}
cmp函数实现
int cmp(struct c* a,struct c* y)
{
return strcmp(a->name, y->name)>0?1:-1;
}