通讯录函数实现

目录

一.分段介绍主要函数

1.初始化函数

2.增加用户信息函数

3.摧毁通讯录函数

4.显示通讯录函数

5.查找通讯录函数

6.删除通讯录函数

7.修改通讯录函数

8.清空通讯录函数

9.排序通讯录函数

二.代码主体

1.contact.c

2.menu.c

3.contact.h

三.改进建议


一.分段介绍主要函数

1.初始化函数

void initcontact(mem* pcont)
{
    assert(pcont!=NULL);
    memset(pcont->per, 0, sizeof(cont) * 20);
    pcont->size = 0;
    pcont->capacity = 20;
}//初始化通讯录

2.增加用户信息函数

void addcontact(mem* pcont)
{
	assert(pcont != NULL);
	if (pcont->size == pcont->capacity)
	{
		printf("已经满了\n");
		return;
	}
	printf("请输入您要添加的人的名字>");
	scanf("%s", pcont->per[pcont->size].name);
	printf("请输入他的性别>");
	scanf("%s", pcont->per[pcont->size].sex);
	printf("请输入他的年龄>");
	scanf("%d", &pcont->per[pcont->size].age);
	printf("请输入家庭地址>");
	scanf("%s", pcont->per[pcont->size].addr);
	printf("请输入电话号码>");
	scanf("%s", pcont->per[pcont->size].tel);
	pcont->size++;//增加后人数+1
}//增加用户

3.摧毁通讯录函数

void destroy(mem* pcont)
{
	assert(pcont != NULL);
	memset(pcont->per, 0, sizeof(cont) * pcont->capacity);//初始化sizeof(cont) * pcont->capacity字节为0
	pcont->size = 0;
	pcont->capacity = 0;
}//摧毁通讯录

4.显示通讯录函数

void showcontact(mem* pcont)
{
	for (int i = 0; i < pcont->size; i++)
	{
		printcontact(pcont, i);
	}
	printf("这就是所有已经存储的通讯录信息\n");
}//展示通讯录,即把通讯录种内容打印出来

5.查找通讯录函数

void findcontact(mem* pcont)
{
	assert(pcont != NULL);
	if (pcont->size == 0)
		printf("没有数据,请加入");
	printf("请输入查找人姓名>");
	char name[20];
	scanf("%s", name);
	int i;
	for (i = 0; i < pcont->size; i++)
	{
		if (strcmp(pcont->per[i].name, name) == 0)//比较字符串大小函数,通过字符串每个字符的ascii值进行比较,>0则左比右大
		{
			break;
		}
	}//在这之前退出表示查找到此人
	if (i >= pcont->size)
	{
		printf("查无此人\n");
		return;
	}
	printcontact(pcont, i);
}//查找通讯录

6.删除通讯录函数

void delcontact(mem* pcont)
{
	assert(pcont != NULL);
	char name2[20];
	int i;
	printf("请输入要删除的用户姓名>");
	scanf("%s", name2);
	if (pcont->size == 0)
		printf("没有可以删除的信息,请添加\n");
	for (i = 0; i < pcont->size; i++)
	{
		if (strcmp(pcont->per[i].name, name2) == 0)
		{
			break;
		}
	}
	if (i >= pcont->size)
	{
		printf("要删除的信息不存在\n");
		return;
	}
	for (int pos = i; pos < pcont->size - 1; pos++)
	{
		pcont->per[pos] = pcont->per[pos + 1];
	}//通过向前覆盖的方式删除此人的信息
	pcont->size--;
	printf("通讯录信息删除成功\n");
}//按照名字删除

7.修改通讯录函数

void modcontact(mem* pcont)
{
	assert(pcont != NULL);
	int i;
	char name[20];
	printf("请输入想要删除的人的姓名>");
	scanf("%s", name);
	for (i = 0; i < pcont->size; i++)
	{
		if (strcmp(pcont->per[i].name, name) == 0)
		{
			break;
		}
	}
	if (i >= pcont->size)
	{
		printf("查无此人,无法修改\n");
		return;
	}
	while (1)//通过while循环使得可以在未退出前,修改这个人的所有信息
	{
		int num = 0;
		printf("请输入你要修改的数据,请用数字代替\n1-姓名,2-性别,3-年龄,4-地址,5-号码,其他-退出修改>>");
		scanf("%d", &num);
		if (num == 1)
		{
			scanf("%s", pcont->per[i].name);
		}
		else if (num == 2)
		{
			scanf("%s", pcont->per[i].sex);
		}
		else if (num == 3)
		{
			scanf("%d", &pcont->per[i].age);
		}
		else if (num == 4)
		{
			scanf("%s", pcont->per[i].addr);
		}
		else if (num == 5)
		{
			scanf("%s", pcont->per[i].tel);
		}
		else {
			printf("修改完毕\n");
			break;
		}
	}
}//修改通讯录

8.清空通讯录函数

void clearcontact(mem* pcont)
{
	assert(pcont != NULL);
	pcont->size = 0;//取size为0,不用输出,默认为清空
	printf("通讯录删除成功\n");
}//清空通讯录

9.排序通讯录函数

void sortcontact(mem* pcont)
{
	assert(pcont != NULL);
	for (int i = 0; i < pcont->size - 1; ++i)
	{
		for (int j = 0; j < pcont->size - 1 - i; ++j)
		{
			if (strcmp(pcont->per[j].name, pcont->per[j + 1].name) > 0)
			{
				cont temp = pcont->per[j + 1];
				pcont->per[j + 1] = pcont->per[j];
				pcont->per[j] = temp;
			}
		}
	}//冒泡排序
	printf("通讯录排序成功\n");
}//排序通讯录

二.代码主体

1.contact.c

#include"contact.h"
void printcontact(mem* pcont,int size)
{
    printf("%-5s%-3s%-3d%-10s%-15s\n", pcont->per[size].name,
        pcont->per[size].sex,
        pcont->per[size].age,
        pcont->per[size].addr,
        pcont->per[size].tel);
}//内部函数
void initcontact(mem* pcont)
{
    assert(pcont!=NULL);
    memset(pcont->per, 0, sizeof(cont) * 20);
    pcont->size = 0;
    pcont->capacity = 20;
}//初始化通讯录
void addcontact(mem* pcont)
{
    assert(pcont != NULL);
    if (pcont->size == pcont->capacity)
    {
        printf("已经满了\n");
        return;
    }
    printf("请输入您要添加的人的名字>");
    scanf("%s",pcont->per[pcont->size].name);
    printf("请输入他的性别>");
    scanf("%s", pcont->per[pcont->size].sex);
    printf("请输入他的年龄>");
    scanf("%d", &pcont->per[pcont->size].age);
    printf("请输入家庭地址>");
    scanf("%s", pcont->per[pcont->size].addr);
    printf("请输入电话号码>");
    scanf("%s", pcont->per[pcont->size].tel);
    pcont->size++;//增加后人数+1
}//增加用户
void destroy(mem* pcont)
{
    assert(pcont != NULL);
    memset(pcont->per, 0, sizeof(cont) * pcont->capacity);//初始化sizeof(cont) * pcont->capacity字节为0
    pcont->size = 0;
    pcont->capacity = 0;
}//摧毁通讯录
void showcontact(mem* pcont)
{
    for (int i = 0; i < pcont->size; i++)
    {
        printcontact(pcont, i);
    }
    printf("这就是所有已经存储的通讯录信息\n");
}//展示通讯录,即把通讯录种内容打印出来
void findcontact(mem *pcont)
{
    assert(pcont!=NULL);
    if (pcont->size == 0)
        printf("没有数据,请加入");
    printf("请输入查找人姓名>");
    char name[20];
    scanf("%s", name);
    int i ;
    for (i=0; i < pcont->size; i++)
    {
        if (strcmp(pcont->per[i].name, name)==0)//比较字符串大小函数,通过字符串每个字符的ascii值进行比较,>0则左比右大
        {
            break;
        }
    }//在这之前退出表示查找到此人
    if (i >= pcont->size)
    {
        printf("查无此人\n");
        return;
    }
    printcontact(pcont, i);
}//查找通讯录
void delcontact(mem* pcont)
{
    assert(pcont != NULL);
    char name2[20];
    int i;
    printf("请输入要删除的用户姓名>");
    scanf("%s", name2);
    if (pcont->size == 0)
        printf("没有可以删除的信息,请添加\n");
    for (i = 0; i < pcont->size; i++)
    {
        if (strcmp(pcont->per[i].name, name2) == 0)
        {
            break;
        }
    }
    if (i >= pcont->size)
    {
        printf("要删除的信息不存在\n");
        return;
    }
    for (int pos = i; pos < pcont->size - 1; pos++)
    {
        pcont->per[pos] = pcont->per[pos + 1];
    }//通过向前覆盖的方式删除此人的信息
    pcont->size--;
    printf("通讯录信息删除成功\n");
}//按照名字删除
void modcontact(mem*pcont)
{
    assert(pcont!=NULL);
    int i;
    char name[20];
    printf("请输入想要删除的人的姓名>");
    scanf("%s", name);
    for (i = 0; i < pcont->size; i++)
    {
        if (strcmp(pcont->per[i].name, name) == 0)
        {
            break;
        }
    }
    if (i >= pcont->size)
    {
        printf("查无此人,无法修改\n");
        return;
    }
    while (1)//通过while循环使得可以在未退出前,修改这个人的所有信息
    {
        int num=0;
        printf("请输入你要修改的数据,请用数字代替\n1-姓名,2-性别,3-年龄,4-地址,5-号码,其他-退出修改>>");
        scanf("%d", &num);
        if (num == 1)
        {
            scanf("%s", pcont->per[i].name);
        }
        else if (num == 2)
        {
            scanf("%s", pcont->per[i].sex);
        }
        else if (num == 3)
        {
            scanf("%d", &pcont->per[i].age);
        }
        else if (num == 4)
        {
            scanf("%s", pcont->per[i].addr);
        }
        else if (num == 5)
        {
            scanf("%s", pcont->per[i].tel);
        }
        else {
            printf("修改完毕\n");
            break;
        }
    }
}//修改通讯录
void clearcontact(mem* pcont)
{
    assert(pcont != NULL);
    pcont->size = 0;//取size为0,不用输出,默认为清空
    printf("通讯录删除成功\n");
}//清空通讯录
void sortcontact(mem* pcont)
{
    assert(pcont != NULL);
    for (int i = 0; i < pcont->size - 1; ++i)
    {
        for (int j = 0; j < pcont->size - 1 - i; ++j)
        {
            if (strcmp(pcont->per[j].name, pcont->per[j + 1].name) > 0)
            {
                cont temp = pcont->per[j + 1];
                pcont->per[j + 1] = pcont->per[j];
                pcont->per[j] = temp;
            }
        }
    }//冒泡排序
    printf("通讯录排序成功\n");
}//排序通讯录

2.menu.c

#include"contact.h"
int main(void)
{
    int select=11;
    mem pcont;
    initcontact(&pcont);
    while (select)
    {
        printf("**************************\n");
        printf("**************************\n");
        printf("*********通 讯 录*********\n");
        printf("**************************\n");
        printf("[1]添加            [2]查找\n");
        printf("[3]删除            [4]修改\n");
        printf("[5]展示            [6]清空\n");
        printf("[7]排序            [0]退出\n");
        printf("**************************\n");
        printf("请输入您的选择>");
        scanf("%d", &select);
        switch (select)
        {
        case 1:addcontact(&pcont); break;//增加
        case 2:findcontact(&pcont); break;//查找
        case 3:delcontact(&pcont); break;//删除
        case 4:modcontact(&pcont); break;//修改
        case 5:showcontact(&pcont); break;//展示
        case 6:clearcontact(&pcont); break;//清空
        case 7:sortcontact(&pcont); break;//整理
        default:printf("输入错误,请重新输入\n");
        }
    }
    destroy(&pcont);
    printf("通讯录退出,拜拜--");
}

3.contact.h

#include<stdio.h>
#include<assert.h>
#include<string.h>
typedef struct contact
{
    char name[7];
    char sex[3];
    int age;
    char addr[15];
    char tel[15];
}cont;//单个个体的信息
typedef struct member
{
    int size;
    int capacity;
    cont per[20];//最大成员数
}mem;//录入信息的成员
//姓名,性别,年龄,手机号,居住地址

void initcontact(mem* pcont);
void addcontact(mem* pcont);
void showcontact(mem* pcont);
void findcontact(mem* pcont);
void delcontact(mem* pcont);
void modcontact(mem*pcont);
void clearcontact(mem* pcont);
void destroy(mem* pcont);
void sortcontact(mem* pcont);

三.改进建议

1.使用malloc动态开辟内存

2.使用枚举关键字定义switch增强可读性

3.使用宏常量代替数字方便修改范围

4.美化界面不足

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值