目录
介绍
相信许多同学在大学期间,学习计算机相关课程的时候,都有一个令人头疼的问题——课程设计。那么本片文章就详细的分享一个用C语言实现简单通讯录的项目,供同学们学习和参考(文章最后会附上源程序)。
项目分析
1.通讯录能够存储联系人信息包括:名字,年龄,性别,电话,住址。
2.够对通讯录进行增加、删除、查找、更改、显示等功能。
下面就让我们一步一步的来实现它。
整题框架
包含文件:
1.main函数文件(main.c),主程序运行
2.通讯录函数文件(contact.c),用来实现通讯录的增删查改、显示功能
3.通讯录头文件(contact.h),用来定义和声明函数。
主函数框架:
首先,进入程序时我们要打印一个菜单,提醒用户进行什么操作,然后系统根据用户选择不同的操作做出相应的响应。因此,我们的主函数框架就是用一个do...while()循环,循环内嵌套一个switch语句(根据用户输入不同的选择,实现不同的功能)。具体看下面代码
void menu() 显示菜单
void menu()
{
printf("******************************\n");
printf("****1.Add 2.Del ********\n");//增加 删除
printf("****3.Search 4.Modify******\n");//查找 更改
printf("****5.Show 0.Exit ******\n");//显示 退出
printf("******************************\n");
}
main()主函数
int main()
{
int input = 0;
do
{
menu(); //打印菜单
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case 1:
//Add_contact(&con);
break;
case 2:
// Del_contact(&con);
break;
case 3:
// Search_contact(&con);
break;
case 4:
//Modify_contact(&con);
break;
case 5:
//Show_contact(&con);
break;
case 0:
printf("退出通讯录");
break;
default:
printf("选择错误,请重新选择");
break;
}
}while(input);
return 0;
}
上面case 后的函数我们暂且不管,下文会一一介绍,先让我们运行一下上面的代码看看效果。
下面,我们分别输入 1、8、0看看有什么效果
好了,我们可以看到主要框架我们已经实现,接下来就一一实现增加、删除、更改、查找、显示函数就ok了。
通讯录初始化
通讯录创建
我们已经知道,通讯录里面要存放名字,年龄,性别等信息,那么应该如何存储呢?
我们可以创建一个结构体,用来存放这些信息。看下面代码
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 20
#define peo_max 1000
struct peoInfor
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
};
这里,我们对名字、性别、电话、地址的大小进行了宏定义,提高代码的可修改性和移植性。
接下来,我们思考一个问题:我们要想向通讯录里增加成员,如何增加呢?如何判断通讯录是不是已经满了呢?如果没有满,应该增加到第几个位置呢?
因此,经过思考,我们应该加入一个变量,这个变量用来存放当前通讯录成员的数量。所以我们对结构体做一个修改。如下
struct peoInfor
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
};
struct contact
{
struct peoInfor data[peo_max];//存放联系人信息 peo_max 为通讯录存放的最大联系人数量
int size; //当前已有联系人个数
};
上面代码中,我们定义了一个通讯录结构体,这个结构体内包含一个成员信息结构体和一个当前成员数量的变量。
下面我们在主函数中开始处创建一个struct contact 的结构体变量就OK啦。(假设变量名为con)
struct contact con;
初始化函数
就像我们刚买回来一个手机,通讯录里面肯定一个成员都没有。因此初始化就是成员信息为0;
我们在contact.h 文件中定义一个初始化函数
void Init_contact(struct contact* ps);
这里对初始化函数做几点解释:
1.struct contact* ps,我们要能够对通讯录进行修改,所以我们传过来的是地址,用指针接收
2.返回类型void,我们只用修改内容,因此不需要返回任何值。
接下来我们在contact.c中实现初始化函数代码:
void Init_contact(struct contact* ps)
{
memset(ps->data,0,sizeof(ps->data));
ps->size = 0;
}
这里介绍一下memset( )函数: 将缓冲区设置为指定字符。
void *memset( void *dest, int c, size_t count ); 第一个参数为指向的目标地址,第二个参数为要设置的字符,第三个参数为要设置的地址的大小(字节)。
现在,主函数可以写成这样:
int main()
{
int input = 0;
struct contact con;
Init_contact(&con);//初始化通讯录
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case 1:
//Add_contact(&con);
break;
case 2:
//Del_contact(&con);
break;
case 3:
// Search_contact(&con);
break;
case 4:
// Modify_contact(&con);
break;
case 5:
// Show_contact(&con);
break;
case 0:
printf("退出通讯录");
break;
default:
printf("选择错误,请重新选择");
break;
}
}while(input);
return 0;
}
到这里,我们初始化就完成了,下面开始实现其他函数。
Add_contact()函数
和上面的初始化函数一样,首先在contact.h中定义函数 void Add_contact(struct contact* ps);然后在contact.c中实现。具体看下面代码
void Add_contact(struct contact* ps)
{
if(ps->size == peo_max)
{
printf("通讯录满,无法添加\n");
}
else
{
printf("请输入名字:>");
scanf("%s",ps->data[ps->size].name);
printf("请输入年龄:>");
scanf("%d",&(ps->data[ps->size].age));
printf("请输入性别:>");
scanf("%s",ps->data[ps->size].sex);
printf("请输入电话:>");
scanf("%s",ps->data[ps->size].tele);
printf("请输入地址:>");
scanf("%s",ps->data[ps->size].addr);
ps->size ++;
printf("添加成功\n");
}
}
首先我们要判断一下,当前通讯录是否已经满了。如果没满,我们就依次存入信息。
需要注意的是:
1.scanf("%s",ps->data[ps->size].name); 在这行代码中,由于name是一个数组,因此不需要取地址&符号。而scanf("%d",&(ps->data[ps->size].age)); 中 age是一个整形变量,因此&不能省略。
2.每存入一个成员信息后,size要加一。
Show_contact()函数
和上面一样先在头文件中声明void Show_contact(const struct contact* ps);然后在contact.c中实现。
//显示通讯录
void Show_contact(const struct contact* ps)
{
int i = 0;
if(ps->size == 0)
{
printf("通讯录为空\n");
}
else
{
for(i=0;i < ps->size;i++)
{
printf("名字:%-3s\t 年龄:%-3d\t 性别:%-3s\t 电话:%-3s\t 地址:%-3s\n",
ps->data[i].name,
ps->data[i].age,
ps->data[i].sex,
ps->data[i].tele,
ps->data[i].addr);
}
}
}
这里需要注意的是,由于我们只需要显示通讯录内容,不对内容更改,因此用const修饰一下。
好了到这里我们已经成功了一大半了,那么让我们看看效果。
Del_contact()函数
声明:void Del_contact(struct contact* ps);
实现:这里我们根据查找联系人名字进行删除操作。那么具体如何删除的呢?
假设我们有5个联系人,我们把第三个删除,然后后面的第四个、第五个依次向前移位一次。
//删除联系人
void Del_contact(struct contact* ps)
{
char name[NAME_MAX];
printf("请输入删除人员的名字:>");
scanf("%s",name);
int i = 0;
//查找联系人
for(i=0;i < ps->size;i++)
{
if(strcmp(name,ps->data[i].name ) == 0)//两个字符串比较
{
break;
}
}
//删除
if(i == ps->size)
{
printf("该联系人不存在\n");
}
else
{
int j = 0;
for(j=i;j < ps->size-1;j++)
{
ps->data[j] = ps->data[j+1];
}
ps->size--;
printf("删除成功\n");
}
}
这里介绍下int strcmp( const char *string1, const char *string2 )函数
函数功能:对两个字符串按位比较(比较对应位的ascall码的大小),如“abcde” < “abdef”
返回值:如果字符串1 > 字符串2 返回一个大于0 的数
如果字符串1 = 字符串2 返回 0
如果字符串1 < 字符串2 返回一个小于0 的数
需要注意,删除联系人后,size -1
下面我们测试一下代码效果:
Search_contact()函数
声明:void Search_contact(const struct contact* ps);
实现:根据名字查找
//查找联系人
void Search_contact(const struct contact* ps)
{
char name[NAME_MAX];
printf("输入查找人的名字:>\n");
scanf("%s",name);
int i = 0;
for(i=0;i<ps->size;i++)
{
if(strcmp(name,ps->data[i].name) == 0)
{
printf("名字:%-3s\t 年龄:%-3d\t 性别:%-3s\t 电话:%-3s\t 地址:%-3s\n",
ps->data[i].name,
ps->data[i].age,
ps->data[i].sex,
ps->data[i].tele,
ps->data[i].addr);
break;
}
}
if(i == ps->size)
{
printf("没找到该联系人\n");
}
}
这段代码与上面的大同小异,就不再介绍啦。
演示:
Modify_contact()函数
声明:void Modify_contact(struct contact* ps);
实现:
//更改联系人信息
void Modify_contact(struct contact* ps)
{
char name[NAME_MAX];
printf("输入要修改联系人的名字:>\n");
scanf("%s",name);
int i = 0;
for(i=0;i<ps->size;i++)
{
if(strcmp(name,ps->data[i].name) == 0)
{
printf("请输入名字:>");
scanf("%s",ps->data[i].name);
printf("请输入年龄:>");
scanf("%d",&(ps->data[i].age));
printf("请输入性别:>");
scanf("%s",ps->data[i].sex);
printf("请输入电话:>");
scanf("%s",ps->data[i].tele);
printf("请输入地址:>");
scanf("%s",ps->data[i].addr);
printf("修改成功\n");
break;
}
}
if(i == ps->size)
{
printf("联系人不存在");
}
}
演示:
最后,为了使代码的可读性更高,我们对不同的case进行一个宏定义。
#define Add 1
#define Del 2
#define Search 3
#define Modify 4
#define Show 5
#define Exit 0
主函数就可以改成:
#include "contact.h"
#define Add 1
#define Del 2
#define Search 3
#define Modify 4
#define Show 5
#define Exit 0
void menu()
{
printf("******************************\n");
printf("****1.Add 2.Del ********\n");
printf("****3.Search 4.Modify******\n");
printf("****5.Show 0.Exit ******\n");
printf("******************************\n");
}
int main()
{
int input = 0;
struct contact con;
Init_contact(&con);//初始化通讯录
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case Add:
Add_contact(&con);
break;
case Del:
Del_contact(&con);
break;
case Search:
Search_contact(&con);
break;
case Modify:
Modify_contact(&con);
break;
case Show:
Show_contact(&con);
break;
case 0:
printf("退出通讯录");
break;
default:
printf("选择错误,请重新选择");
break;
}
}while(input);
return 0;
}
好了,到这里我们这个简单的通讯录就实现啦。
源程序
链接:https://pan.baidu.com/s/1IfdLnEcAJnsyXVAPjz8ruQ?pwd=1234
提取码:1234
希望帮助到的同学给个三连呀~