课设——c语言实现通讯录

目录

介绍

项目分析

整题框架

包含文件:

主函数框架:

void menu() 显示菜单

main()主函数

 通讯录初始化

通讯录创建

初始化函数

Add_contact()函数

Show_contact()函数

 Del_contact()函数

Search_contact()函数

Modify_contact()函数

源程序


介绍

        相信许多同学在大学期间,学习计算机相关课程的时候,都有一个令人头疼的问题——课程设计。那么本片文章就详细的分享一个用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

希望帮助到的同学给个三连呀~

  • 27
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值