自定义类型——通讯录

这种运用了多种自定义函数的程序,还是得用到前文提到的分模块的写法,来编写程序。

这里先展示源程序:

1.源程序

contact.h

#define _CRT_SECURE_NO_WARNINGS 1

#define Max_name 20
#define Max_sex 5
#define Max_tele 15
#define Max_addr 20
#define MAX 100



#include<stdio.h>
#include<assert.h>
#include<string.h>

typedef struct PeoInfo
{
	char name[Max_name];
	int age;
	char sex[Max_sex];
	char tele[Max_tele];
	char addr[Max_addr];
}PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;

}Contact;







//初始化通讯录
void InitContact(Contact* pc);
//增
void AddContact(Contact* pc);
//删
void DelContact(Contact* pc);
//查
void SearchContact(Contact* pc);
//显示
void ShowContact(Contact* pc);
//改
void ModifyContact(Contact* pc);

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"



//在内部中使用的查找函数
int FindByName(char* name, Contact* pc)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

//增加
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 100)
	{
		printf("通讯录已经满了");
		return;
	}
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入住址:>");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
}

//显示
void ShowContact( const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr
		);
	}
}

//删除
void DelContact(Contact* pc)
{
	char name[Max_name ];
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	int tag = 0;
	tag=FindByName(name,pc);
	int i = 0;
	if (tag == -1)
	{
		printf("没找到该联系人");
		return;
	}

	for (i = tag; i < (pc->sz) - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
}

//查找
void SearchContact(Contact* pc)
{
	char name[Max_name];
	printf("请输入要查找的联系人的名字:>");
	scanf("%s", name);
	int tag = 0;
	tag=FindByName(name, pc);
	if (tag == -1)
	{
		printf("未找到该联系人\n");
		return;
	}


	printf("查找的联系人信息如下\n");
	printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");

	printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
		pc->data[tag].name,
		pc->data[tag].age,
		pc->data[tag].sex,
		pc->data[tag].tele,
		pc->data[tag].addr);


}

//修改
void ModifyContact(Contact* pc)
{
	char name[Max_name];
	printf("请输入要查找的联系人的名字:>");
	scanf("%s", name);
	int tag = 0;
	tag = FindByName(name, pc);
	if (tag == -1)
	{
		printf("未找到该联系人\n");
		return;
	}

	printf("请输入名字:>");
	scanf("%s", pc->data[tag].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[tag].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[tag].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[tag].tele);
	printf("请输入住址:>");
	scanf("%s", pc->data[tag].addr);



}


test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

enum option
{
	Exit,
	ADD,
	DEL,
	SEARCH,
	Modify,
    Show,
	Sort,
              
};

void menu()
{
	printf("***************************************\n");
	printf("*********1.ADD             2.DEL*******\n");
	printf("*********3.SEARCH          4.Modify****\n");
	printf("*********5.Show            6.Sort******\n");
	printf("*********0.Exit                  ******\n");
	printf("***************************************\n");
	printf("***************************************\n");

}
void test()
{
	int input = 0;
	Contact con;
	InitContact(&con);

	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case Modify:
			ModifyContact(&con);
			break;
		case Show:
			ShowContact(&con);
			break;
		case Sort:
			SortContact(&con);
			break;
		case Exit:
			break;
		default:
			printf("");
			break;
		}

	} while (input);
	
}

int main()
{
	test();
	return 0;
}

2.分析

接下来就是对整体通讯录创作的分析:

我们先对通讯录所要存储的数据进行一个整合,全部都放进一个结构体中

typedef struct PeoInfo
{
    char name[Max_name];
    int age;
    char sex[Max_sex];
    char tele[Max_tele];
    char addr[Max_addr];
}PeoInfo;

然后,我们需要用一个数组来存储数据,那数组的类型又该是什么呢?

typedef struct Contact
{
    PeoInfo data[MAX];
    int sz;//用于实时记录通讯录中存储了多少个联系人

}Contact;

有了存储类型后,我们需要一个菜单来对用户的选择来进行分流

   这里用了switch语句,然后用枚举类型对0,1.。。进行了重定义

enum option
{
    Exit,
    ADD,
    DEL,
    SEARCH,
    Modify,
    Show,
    Sort,
              
};

void menu()
{
    printf("***************************************\n");
    printf("*********1.ADD            2.DEL*******\n");
    printf("*********3.SEARCH     4.Modify****\n");
    printf("*********5.Show            6.Sort******\n");
    printf("*********0.Exit                        ******\n");
    printf("***************************************\n");
    printf("***************************************\n");

}
void test()
{
    int input = 0;
    Contact con;
    InitContact(&con);

    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case ADD:
            AddContact(&con);
            break;
        case DEL:
            DelContact(&con);
            break;
        case SEARCH:
            SearchContact(&con);
            break;
        case Modify:
            ModifyContact(&con);
            break;
        case Show:
            ShowContact(&con);
            break;
        case Sort:
            SortContact(&con);
            break;
        case Exit:
            break;
        default:
            printf("");
            break;
        }

    } while (input);
    
}

3.函数的实现

紧接着就是对于各个函数的实现了

初始化函数

//初始化通讯录
void InitContact(Contact* pc)
{
	assert(pc);
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

增加函数

//增加
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 100)
	{
		printf("通讯录已经满了");
		return;
	}
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入住址:>");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
}

显示函数

//显示
void ShowContact( const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr
		);
	}
}

内部使用的查找函数


//在内部中使用的查找函数
int FindByName(char* name, Contact* pc)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

删除函数

//删除
void DelContact(Contact* pc)
{
	char name[Max_name ];
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	int tag = 0;
	tag=FindByName(name,pc);
	int i = 0;
	if (tag == -1)
	{
		printf("没找到该联系人");
		return;
	}

	for (i = tag; i < (pc->sz) - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
}

查找函数

//查找
void SearchContact(Contact* pc)
{
	char name[Max_name];
	printf("请输入要查找的联系人的名字:>");
	scanf("%s", name);
	int tag = 0;
	tag=FindByName(name, pc);
	if (tag == -1)
	{
		printf("未找到该联系人\n");
		return;
	}


	printf("查找的联系人信息如下\n");
	printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");

	printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
		pc->data[tag].name,
		pc->data[tag].age,
		pc->data[tag].sex,
		pc->data[tag].tele,
		pc->data[tag].addr);


}

修改函数

//修改
void ModifyContact(Contact* pc)
{
	char name[Max_name];
	printf("请输入要查找的联系人的名字:>");
	scanf("%s", name);
	int tag = 0;
	tag = FindByName(name, pc);
	if (tag == -1)
	{
		printf("未找到该联系人\n");
		return;
	}

	printf("请输入名字:>");
	scanf("%s", pc->data[tag].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[tag].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[tag].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[tag].tele);
	printf("请输入住址:>");
	scanf("%s", pc->data[tag].addr);



}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值