一:函数思想
1.因为程序代码较多,为了避免程序过于繁杂,将程序分成了两个.c文件(contact.c)和(test.c)和一个contact .h文件。
2.cantact.h文件内容主要包括函数名和结构体的定义。
3.contact.c文件主要用于定义函数的实现,而test.c则主要起到测试的作用
2.程序代码
1.contact .h文件中的内容
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define name_max 20
#define sex_max 10
#define tele_max 20
#define addr_max 30
#define people_max 1000
//为了后期维护的方便
enum Choose
{ //枚举
EXIT,
ADD,
DEL,
MODEFY,
SEARCH,
SHOW,
SORT,
};
typedef struct PeopleInfo
{ //定义的联系人信息结构体
char name[name_max];
int age;
char sex[sex_max];
char tele[tele_max];
char addr[addr_max];
}PeoInfo;
typedef struct Contact
{ //为了便于引用,进行了封装
struct PeopleInfo data[people_max];
int sz;
}Contact;
void InitContact(Contact* con);
void AddInformation(Contact *con);
void ShowContact(const Contact *con);
void Delcontact(Contact *con);
void SearchContact(const Contact *con);
void ModefyContact( Contact *con);
void SortContact(Contact *con);
2.contact.c文件内容
在函数的功能中多个函数要用到查找这个功能,所以定义了FindInfo函数从而减少了工作量
#include"contact.h"
void InitContact(Contact* con)
{ //初始化
assert(con);
con->sz = 0;
memset(con->data,0,sizeof(con->data));
}
void AddInformation(Contact *con)
{ //添加联系人
assert(con);
if(con->sz == people_max)
{
printf("通讯录已满,无法继续添加!\n");
}
else
{
printf("请输入要添加联系人的姓名:");
scanf("%s",con->data[con->sz].name);
printf("请输入要添加联系人的年龄:");
scanf("%d",&(con->data [con->sz].age));
printf("请输入要添加联系人的性别:");
scanf("%s",con->data[con->sz].sex);
printf("请输入要添加联系人的电话:");
scanf("%s",con->data[con->sz].tele);
printf("请输入要添加联系人的住址:");
scanf("%s",con->data[con->sz].addr);
con->sz++;
}
}
void ShowContact(const Contact *con)
{ //打印联系人
int i=0;
assert(con);
printf("%10s\t%5s\t%5s\t%10s\t%10s\n",
"姓名","年龄","性别","电话","住址");
for(i=0;i<con->sz;i++)
{
printf("%10s\t%5d\t%5s\t%10s\t%10s\n",
con->data[i].name,
con->data[i].age,
con->data[i].sex,
con->data[i].tele,
con->data[i].addr);
}
}
int FindInfo(const Contact *con,char* name)
{ //查找联系人
int i=0;
for(i=0;i<con->sz;i++)
{
if(strcmp(con->data[i].name,name) == 0) //strcmp函数的用法
{
return i;
}
}
return -1;
}
void Delcontact(Contact *con)
{
/*方法一:自带查找功能的删除函数
int i=0;
int j=0;
char name[name_max]={0};
if(con->sz==0)
{
printf("通讯录已空,无法继续删除!\n");
return;
}
else
{
printf("请输入要删除联系人的姓名:");
scanf("%s",name);
for(i=0;i<con->sz;i++)
{
if(strcmp(con->data[i].name,name) == 0)
{
break;
}
}
if(i==con->sz)
{
printf("要删除的用户不存在,请重新输入!\n");
return;
}
for(j=i; j<con->sz-1;j++)
{
con->data[j]=con->data[j+1];
}
con->sz--;
}*/
//方法二:
int j=0;
int tmp;
char name[name_max]={0};
assert(con);
if(con->sz==0)
{
printf("通讯录已空,无法继续删除!\n");
return;
}
printf("请输入要删除联系人的姓名:");
scanf("%s",name);
tmp=FindInfo(con,name);
if(tmp==-1)
{
printf("要删除的用户不存在,请重新输入!\n");
return ;
}
else
{
for(j=tmp; j<con->sz-1;j++)
{
con->data[j]=con->data[j+1];
}
con->sz--;
printf("删除成功!\n");
}
}
void SearchContact(const Contact *con)
{
char name[name_max]={0};
int tem=0;
printf("请输入你要查找人的姓名:");
scanf("%s",name);
tem=FindInfo(con,name);
if(tem == -1)
{
printf("你要查找的人不存在!\n");
}
else
{
printf("%10s\t%5s\t%5s\t%10s\t%10s\n",
"姓名","年龄","性别","电话","住址");
printf("%10s\t%5d\t%5s\t%10s\t%10s\n",
con->data[tem].name,
con->data[tem].age,
con->data[tem].sex,
con->data[tem].tele,
con->data[tem].addr);
}
}
void ModefyContact( Contact *con)
{ //修改联系人信息
char name[name_max]={0};
int tem=0;
assert(con);
printf("请输入你要修改人的姓名:");
scanf("%s",name);
tem=FindInfo(con,name);
if(tem == -1)
{
printf("你要修改的人不存在!\n");
}
else
{
printf("请输入要添加联系人的姓名:");
scanf("%s",con->data[tem].name);
printf("请输入要添加联系人的年龄:");
scanf("%d",&(con->data [tem].age));
printf("请输入要添加联系人的性别:");
scanf("%s",con->data[tem].sex);
printf("请输入要添加联系人的电话:");
scanf("%s",con->data[tem].tele);
printf("请输入要添加联系人的住址:");
scanf("%s",con->data[tem].addr);
}
}
void SortContact(Contact *con)
{ //对联系人的姓名进行排序
int i=0;
int j=0;
assert(con);
for(i=0;i<con->sz-1;i++)
{
int flag = 1;
for(j=0;j<con->sz-1-i;j++)
{
if(strcmp(con->data[j].name,con->data[j+1].name)>0)
{
PeoInfo tmp=con->data[j];
con->data[j]=con->data[j+1];
con->data[j+1]=tmp;
flag = 0;
}
}
if(flag ==1)
break;
}
}
3.test.c文件内容
#include"contact.h"
void menu()
{ //选项菜单
printf("#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#\n");
printf("#*#1.添加联系人 2.删除联系人 #*#\n");
printf("#*#3.修改联系人 4.查找联系人 #*#\n");
printf("#*#5.打印联系人 6.对联系人排序 #*#\n");
printf("#*#0.退出程序 #*#\n");
printf("#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#\n");
}
void text()
{
int input;
Contact con;
InitContact(&con);
do
{
menu( );
printf("请输入您的选择:");
scanf("%d",&input);
switch(input)
{
case ADD:
AddInformation(&con);
break;
case DEL:
Delcontact(&con);
break;
case MODEFY:
ModefyContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
SortContact(&con);
break;
case EXIT:
printf("退出程序!\n");
break;
default :
printf("输入错误,请重新输入!\n");
break;
}
}while(input);
}
int main()
{
text( );
return 0;
}
三:总结
1.观察别人的代码建立了这个通讯录的大体框架,从大佬的代码中发现了自己的好多不足之处。
2.通过这个通讯录的实现使我更加深刻的感受到了结构体和结构体指针的魅力所在,并且对结构体的知识起到了一定的复习作用。
3.大胆去写,才能发现不足、才能改正不足。