实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
一个人的信息有名字、性别、年龄、电话和住址,这些信息如果要单独设一个变量而且这些变量有许多不同的类型,用起来比较麻烦。学过自定义类型之后就可以将这些成员放到一个结构体中。
首先自定义一个结构体类型:
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADD_MAX 30
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
print
};
typedef struct PeoInfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADD_MAX];
} PeoInfo;
typedef struct Contact
{
PeoInfo data[MAX];//可以放1000个人的信息
int sz; //记通讯录中已经保存的信息个数
}Contact;
在解决基本的类型定义后,考虑到要实现通讯录的功能,所以要建立一个函数,考虑到是选择功能,所以用switch语句,又因为要实现连续选择,所以要把switch语句放在do...while循环中,用户可以连续选择和随时退出。
void menu()
{
printf("*****************************\n");
printf("******1.add 2.del *****\n");
printf("******3.search 4.modify****\n");
printf("******5.sort 6.print ****\n");
printf("******0.exit *****************\n");
printf("*****************************\n");
}
void test()
{
//增删查找修改
int input = 0;
//创建通讯录
Contact con; // 通讯录
//初始化通讯录
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
Delecontact(&con);
break;
case SEARCH:
Searchcontact(&con);
break;
case MODIFY:
break;
case SORT:
break;
case print:
PrintContact(&con);
break;
case EXIT:
printf("退出\n");
break;
default:
{
printf("输入错误,请重新输入\n");
}
}
} while (input);
}
int main()
{
test();
return 0;
}
ADD、EXIT等成员属于枚举类型,对应的值默认为0-6,如此设计可以增加代码的观赏性和稳定性。一个模块对应一个函数,简单明了。
结构体初始化:在使用结构体前,需要将结构体里面的内容初始化,如果不初始化结构体,则会使结构体里面的成员存在乱码的情况。
所以要将成员全部初始化为0。
void Con_Init(Contact* Con)
{
assert(Con);
Con->sz = 0;
memset(Con->date, 0, sizeof(Con->date)); //这里的Con->date是数组名,不是指针,大小是date数组的大小。
}
在初始化之后,开始写功能实现。
1、添加成员信息。
void Add_Contact(Contact* Con)
{
assert(Con);
if (Con->sz == MAX)
{
printf("通讯录已满,无法添加\n");
return;
}
printf("请输入姓名:>\n");
scanf("%s", Con->date[Con->sz].Name);
printf("请输入年龄:>\n");
scanf("%d", &Con->date[Con->sz].Age);
printf("请输入性别:>\n");
scanf("%s", Con->date[Con->sz].Sex);
printf("请输入电话:>\n");
scanf("%s", Con->date[Con->sz].Tele);
printf("请输入地址:>\n");
scanf("%s", Con->date[Con->sz].Addr);
printf("输入完毕\n");
Con->sz++;
}
2、打印
在添加完成员信息后,需要验证自己的代码,所以需要打印出通讯录的信息。
void Print_Contact(Contact* Con)
{
assert(Con);
int i = 0;
printf("%-20s %-5s %-5s %-15s %-15s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < Con->sz; i++)
{
printf("%-20s %-5s %-5d %-15s %-15s\n", Con->date[i].Name, Con->date[i].Sex, Con->date[i].Age, Con->date[i].Tele, Con->date[i].Addr);
}
}
3、删除成员信息
删除成员信息需要用到字符串比较函数,如果函数的返回值为0,则就返回数组的下标,找到数组的下标之后,只需要这个下标以后的元素,往前挪一个单位即可,同时成员的个数也得减一。
static int Find_Name(Contact* Con, char* name)
{
assert(Con && name);
int i = 0;
for (i = 0; i < Con->sz; i++)
{
if ( strcmp(Con->date[i].Name, name) ==0)
{
return i;
}
}
return -1;
}
void Del_Contact(Contact* Con)
{
if (Con->sz == 0)
{
printf("成员不足,无法删除\n");
return;
}
char name[20] = { 0 };
printf("请输入删除成员的名字:>\n");
scanf("%s", name);
int ret = Find_Name(Con, name);
if (ret == -1)
{
printf("要删除的人不存在\n");
return;
}
int j = 0;
for (j = ret; j < Con->sz - 1; j++)
{
Con->date[j] = Con->date[j + 1];
}
Con->sz--;
printf("删除成功\n");
}
4、搜索成员信息
跟删除成员信息是一样的,只是不需要删除。
void Search_Contact(Contact* Con)
{
if (Con->sz == 0)
{
printf("暂无成员信息,无法搜索\n");
return;
}
char name[20] = { 0 };
printf("请输入成员名字:>\n");
scanf("%s", name);
int ret = Find_Name(Con, name);
if (ret == -1)
{
printf("要查找的人不存在\n");
return;
}
printf("%-20s %-5s %-5s %-15s %-15s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-20s %-5s %-5d %-15s %-15s\n", Con->date[ret].Name, Con->date[ret].Sex, Con->date[ret].Age, Con->date[ret].Tele, Con->date[ret].Addr);
}
以上只是实现了通讯录的部分功能,其它功能还在学习中,如有错误,欢迎批评指正。
本文含有隐藏内容,请 开通VIP 后查看