目录
通讯录介绍
初步分析
代码实现
通讯录介绍
我们每个人在手机里都有一个功能丰富的通讯录,里面不仅记录了亲人、朋友的一些基本信息:姓名,电话,住址等,我们还能对其进行 *** 作,随时的删改联系人的信息。如今,我们就用学过的C语言知识来编写一个能储存1000个人信息(姓名、性别、年龄、电话、住址)的简易通讯录,并可以实现如下功能:
初步分析1. 增加指定联系人
2. 删除指定联系人
3. 查找指定联系人
4. 修改指定联系人
5. 对通讯录就某一内容进行排序
6. 打印目前通讯录储存的所有信息
首先,对于通讯录要储存1000个人的信息,每个人的信息结构都是统一的,所以可以考虑定义一个结构体来表示一个联系人的所有信息:
typedef struct PeoInfo //一个人的信息
{
char name [NAME_MAX];
char sex [SEX_MAX];
int age;
char tele [TELE_MAX];
char addr [ADDR_MAX];
}PeoInfo; // 结构体重命名
其次,在增加或者删减通讯录里联系人的时候,我们也需要知道此时通讯录是否为空或者是否满置,另外,由于要实现通讯录的增删查改功能,在对通讯录具体某个联系人进行设置时,我们就需要知道当前这个联系人的位置,所以,我们可以使用一个计数变量 sz 来统计此时通讯录储存的联系人的数量,此时计数变量 sz 与1000个人的信息合称为通讯录(Contact):
typedef struct Contact
{
PeoInfo data[MAX]; //可以存放1000个人的信息
int sz; //记录通讯录中已经保存的信息个数
}Contact;
在对通讯录进行 *** 作时,有六个功能(增、删、查、改、打印、排序),考虑到会使用switch语句,为了让代码功能更加明确,可以将这几个功能定义成枚举的形式:
//利用枚举将几个功能列举
enum Func
{
EXIT,
ADD,
DELETE,
SEARCH,
MODIFY,
SORT,
PRINT
};
这样,基本要使用的人的信息,通讯录的结构以及各功能的列举就定义好了, 和猜数字小游戏一样,利用 menu 菜单结构来显示可以选择的基本功能:
void menu()
{
printf("***************************************\n");
printf("**** 1.ADD 2.DELDTE ****\n");
printf("**** 3.SEARCH 4.MODIFY ****\n");
printf("**** 5.SORT 6.PRINT ******\n");
printf("**** 0.EXIT ******\n");
printf("***************************************\n");
}
代码实现
为了实现模块化,我们将专门测试通讯录的功能的代码放到源文件 menu.c 里,再创建一个头文件
tongxun.h 和一个源文件 tongxun.c 来放置实现通讯录的功能的代码,即 contact.h 作为接口的声明,可以将类型的声明和函数的声明均放在这个头文件里,tongxun.c 作为接口的实现,即每个功能函数的具体实现。
menu.c 文件:
#define _CRT_SECURE_NO_WARNINGS 1
//编写通讯录:功能包含:增 删 查 改 排序 修改 退出
#include "tongxun.h"
void menu()
{
printf("***************************************\n");
printf("**** 1.ADD 2.DELDTE ****\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;
//初始化通讯录
InitPeoInf(&Con);
//主菜单
menu();
//选择功能
do
{
printf("请输入要执行的功能: ");
scanf("%d",&input);
switch(input)
{
//增
case ADD:
AddPeoInf(&Con);
break;
//删
case DELETE:
DEPeoInf(&Con);
break;
//查
case SEARCH:
SEARPeoInf(&Con);
break;
//改
case MODIFY:
MODIPeoInf(&Con);
break;
//排序
case SORT:
SORTPeoInf(&Con);
break;
//打印
case PRINT:
PrintCon(&Con);
break;
//退出
case EXIT:
break;
default:
break;
}
}while(input);
}
int main()
{
test();
return 0;
}
tongxun.h 文件:
#define _CRT_SECURE_NO_WARNINGS 1
//头文件
#include
#include
#include
//定义用到的几个宏,便于之后的修改
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define DEL_MAX 12
#define ADDR_MAX 30
//设定一个结构体保存人的信息,并重命名
typedef struct PeoInf
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char del[DEL_MAX];
char addr[ADDR_MAX];
}PeoInf;
//将人的信息和通讯录当前存储的人的个数放在一起统称为通讯录,并重命名
typedef struct Contact
{
PeoInf data[MAX];
int sz;
}Contact;
//利用枚举将几个功能列举
enum Func
{
EXIT,
ADD,
DELETE,
SEARCH,
MODIFY,
SORT,
PRINT
};
enum CHOICE
{
NAME,
SEX,
AGE,
DEL,
ADDR
};
//初始化通讯录
void InitPeoInf(Contact *pc);
//打印通讯录
void PrintCon(Contact *pc);
//添加联系人
void AddPeoInf(Contact *pc);
//删除指定联系人
void DEPeoInf(Contact *pc);
//查找联系人
void SEARPeoInf(Contact *pc);
//修改联系人
void MODIPeoInf(Contact *pc);
//排序
void SORTPeoInf(Contact *pc);
tongxun.c 文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include "tongxun.h"
//初始化通讯录
void InitPeoInf(Contact *pc)
{
memset(pc->data,0,sizeof(pc->data));
pc->sz=0;
}
//打印通讯录
void PrintCon(Contact *pc)
{
int i=0;
printf("%-8s %-5s %-5s %-12s %-20s\n","姓名","性别","年龄","电话","地址");
for(i=0;isz;i++)
{
printf("%-8s %-5s %-5d %-12s %-20s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].del,pc->data[i].addr);
}
}
//添加联系人
void AddPeoInf(Contact *pc)
{
if(MAX == pc->sz)
{
printf("添加失败!\n");
return;
}
printf("请输入联系人的姓名:");
scanf("%s",pc->data[pc->sz].name);
printf("请输入联系人的性别:");
scanf("%s",pc->data[pc->sz].sex);
printf("请输入联系人的年龄:");
scanf("%d",&pc->data[pc->sz].age);
printf("请输入联系人的电话:");
scanf("%s",pc->data[pc->sz].del);
printf("请输入联系人的地址:");
scanf("%s",pc->data[pc->sz].addr);
pc->sz++;
printf("添加成功!\n");
}
//删除联系人
int SearchOne(Contact *pc,char name[])
{
int i=0;
for(i=0;isz;i++)
{
if(strcmp(name,pc->data[i].name) == 0)
{
return i;
}
}
//没有找到返回-1
return -1;
}
void DEPeoInf(Contact *pc)
{
char name[NAME_MAX];
int pos=0;
int j=0;
if(0 == pc->sz)
{
printf("通讯录为空,不可删除!\n");
return;
}
printf("请输入要删除联系人的姓名:\n");
scanf("%s",name);
//查找联系人:找到返回所在位置及sz,找不到返回-1
pos=SearchOne(pc,name);
if(pos == -1)
{
printf("要删除的人不存在!\n");
return;
}
for(j=pos;jsz-1;j++)
{
pc->data[j]=pc->data[j+1];
}
pc->sz--;
printf("删除成功!\n");
}
//查找联系人
void SEARPeoInf(Contact *pc)
{
char name[NAME_MAX];
int pos=0;
int j=0;
printf("请输入要查找的联系人的姓名:\n");
scanf("%s",name);
//查找联系人:找到返回所在位置及sz,找不到返回-1
pos=SearchOne(pc,name);
if(pos == -1)
{
printf("要查找的人不存在!\n");
return;
}
else
{
printf("%-8s %-5s %-5s %-12s %-20s\n","姓名","性别","年龄","电话","地址");
printf("%-8s %-5s %-5d %-12s %-20s\n",pc->data[pos].name,pc->data[pos].sex,pc->data[pos].age,pc->data[pos].del,pc->data[pos].addr);
}
}
//修改联系人
void MODIPeoInf(Contact *pc)
{
//先找到要修改的联系人
char name[NAME_MAX];
int pos=0;
int j=0;
printf("请输入要修改的联系人的姓名:\n");
scanf("%s",name);
//查找联系人:找到返回所在位置及sz,找不到返回-1
pos=SearchOne(pc,name);
if(pos == -1)
{
printf("要修改的人不存在!\n");
return;
}
else
{
printf("请输入新联系人的姓名:");
scanf("%s",pc->data[pos].name);
printf("请输入联系人的性别:");
scanf("%s",pc->data[pos].sex);
printf("请输入联系人的年龄:");
scanf("%d",&pc->data[pos].age);
printf("请输入联系人的电话:");
scanf("%s",pc->data[pos].del);
printf("请输入联系人的地址:");
scanf("%s",pc->data[pos].addr);
}
printf("修改成功!");
}
//排序
//按姓名排序
int cmp_by_name(const void* e1,const void* e2)
{
return strcmp(((PeoInf*)e1)->name,((PeoInf*)e2)->name);
}
//按性别排序
int cmp_by_sex(const void* e1,const void* e2)
{
return strcmp(((PeoInf*)e1)->sex,((PeoInf*)e2)->sex);
}
//按年龄排序
int cmp_by_age(const void* e1,const void* e2)
{
return ((PeoInf*)e1)->age - ((PeoInf*)e2)->age;
}
//按电话排序
int cmp_by_del(const void* e1,const void* e2)
{
return ((PeoInf*)e1)->del - ((PeoInf*)e2)->del;
}
//按地址排序
int cmp_by_addr(const void* e1,const void* e2)
{
return strcmp(((PeoInf*)e1)->addr,((PeoInf*)e2)->addr);
}
//按指定内容排序
void SORTPeoInf(Contact *pc)
{
int choose=0;
printf("请输入要排序的内容:\n");
scanf("%d",&choose);
switch(choose)
{
case NAME:
qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_by_name);
break;
case SEX:
qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_by_sex);
break;
case AGE:
qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_by_age);
break;
case DEL:
qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_by_del);
break;
case ADDR:
qsort(pc->data,pc->sz,sizeof(pc->data[0]),cmp_by_addr);
break;
default:
break;
}
printf("排序成功!\n");
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)