简单的通讯录——第一版

实现效果如下图:

此C语言通讯录用来存储1000个人的信息,每个成员的信息包括有姓名、性别、年龄、电话、住址。


这次我们C语言通讯录V1.0提供的功能有:

1、添加联系人

2、删除联系人

3、修改联系人

4、查看所有联系人的信息

5、以名字排序所有联系人

7、清空所有联系人

8、退出系统


总体过程实现:

首先定义一个结构体,存储其中一位成员的信息,信息包括姓名、性别、年龄、电话和住址。

通讯录所实现的各个功能进行封装函数。


看过了C语言扫雷的朋友应该知道有C语言扫雷有三个部分,所以C语言通讯录的实现也包括了三个部分

通讯录的实现包括三个部分:

1总体框架——头文件的实现

2具体的函数的功能实现——封装函数

3测试部分


头文件部分代码实现如下:

test.h

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

#pragma warning(disable:4996)
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 20
#define ADD_MAX 50
#define MAX_SIZE 1000

struct contact
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char address[ADD_MAX];
};

struct A {
	struct contact arr[MAX_SIZE];
	int i;
};

void Print_menu();
void Add(struct A*con);
int dedelete_contact(struct A*con);
int revise_contact(struct A *pcon);
void print_contact(struct A *con);
int find_position(struct A*pcon);
int find_contact(struct A*pcon);
void _init_contact(struct A *pcon);
void put_empty(struct A *pcon);
void sort_name(struct A *pcon);

函数部分代码实现如下:

contact.c

#include"test.h"

//添加联系人的信息
void Add(struct A*con)
{
	printf("请输入名字:");
	scanf("%s", con->arr[con->i].name);//char类型在scanf中不需要取地址符
	printf("请输入性别:");
	scanf("%s", con->arr[con->i].sex);
	printf("请输入年龄:");
	scanf("%d",&(con->arr[con->i].age));//int类型在scanf中需要输入取地址符
	printf("请输入电话:");
	scanf("%s", con->arr[con->i].tele);
	printf("请输入地址:");
	scanf("%s", con->arr[con->i].address);
	con->i++;
	printf("添加完毕!\n");
}

//删除联系人
int dedelete_contact(struct A*pcon)
{
	int i = 0;
	int ret = find_position(pcon);//通过查找函数的返回值来确定
	printf("删除联系人\n");
	if (ret != -1)
	{
		for (i = ret; i < pcon->i - 1; i++)//通过后面的数据覆盖前面的数据达到删除数据的目的
		{
			pcon->arr[i] = pcon->arr[i + 1];
		}
		pcon->i--;
		return 1;
	}
	else
		printf("没有找到此联系人,无法删除此联系人\n");
	return 0;
}

//修改联系人的信息
int revise_contact(struct A *pcon)
{
	int ret = find_position(pcon);
	if (ret != -1)
	{
		printf("请输入需要修改联系人的信息:\n");
		printf("请输入名字:");
		scanf("%s", pcon->arr[ret].name);
		printf("请输入性别:");
		scanf("%s", pcon->arr[ret].sex);
		printf("请输入年龄:");
		scanf("%d", &(pcon->arr[ret].age));
		printf("请输入电话号码:");
		scanf("%s", pcon->arr[ret].tele);
		printf("请输入地址:");
		scanf("%s", pcon->arr[ret].address);
		return 1;
	}
	else
		printf("没有找到需要修改的联系人!!\n");
	return 0;
}

//查看所有联系人的信息
void print_contact(struct A *con)
{
	int i = 0;
	printf("打印所有联系人的信息\n");
	printf("%-10s%-5s%-5s%-15s%-20s\n", "name", "sex", "age", "tele", "address");
	for (i = 0; i < con->i ; i++)
	{
		printf("%-10s%-5s%-5d%-15s%-20s\n", con->arr[i].name, con->arr[i].sex, con->arr[i].age,
			con->arr[i].tele, con->arr[i].address);
	}
	printf("\n");
}

//搜索联系人的位置
int find_position(struct A*pcon)
{
	int i = 0;
	char name[20];
	printf("请输入需要查找联系人的名字:");
	scanf("%s", name);
	for (i = 0; i < pcon->i; i++)
	{
		if (strcmp(pcon->arr[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}


//搜索联系人的信息
int find_contact(struct A*pcon)
{
	printf("查找联系人\n");
	int ret = find_position(pcon);
	if (ret != -1)
	{
		printf("姓名:%s\n",pcon->arr[ret].name);
		printf("性别:%s\n",pcon->arr[ret].sex);
		printf("年龄:%d\n",pcon->arr[ret].age);
		printf("电话号码:%s\n",pcon->arr[ret].tele);
		printf("地址:%s\n",pcon->arr[ret].address);
		return 1;
	}
	else
		printf("没有找到此联系人!!\n");
	return 0;
}

//清空所有联系人
void put_empty(struct A *pcon)
{
	printf("清空联系人\n");
	memset(pcon->arr, 0, 1000 * sizeof(struct contact));
	pcon->i = 0;
}

//以名字排序所有联系人
void sort_name(struct A *pcon)
{
	printf("排序\n");
	char ch = 0;
	int i = 0;
	int j = 0;
	printf("请选择排序方式(‘<’代表由z->a,'>'代表由a->z):");
	fflush(stdin);
	scanf("%c", &ch);
	int flag = 0;
	if (ch == '>')
	{

		for (i = 0; i < pcon->i; i++)
		{
			flag = 0;
			for (j = 0; j < pcon->i - i - 1; j++)
			{
				if (strcmp(pcon->arr[j].name, pcon->arr[j + 1].name)>0)
				{
					struct contact tmp = { 0 };
					tmp = pcon->arr[j];
					pcon->arr[j] = pcon->arr[j + 1];
					pcon->arr[j + 1] = tmp;
					flag = 1;
				}

			}
			if (flag == 0)
				break;
		}
	}
	else if (ch == '<')
	{
		for (i = 0; i < pcon->i; i++)
		{
			flag = 0;
			for (j = 0; j < pcon->i - i - 1; j++)
			{
				if (strcmp(pcon->arr[j].name, pcon->arr[j + 1].name)<0)
				{
					struct contact tmp = { 0 };
					tmp = pcon->arr[j];
					pcon->arr[j] = pcon->arr[j + 1];
					pcon->arr[j + 1] = tmp;
					flag = 1;
				}
			}
			if (flag == 0)
				break;
		}
	}
	else
		printf("选择错误,请返回重新选择:\n");
	printf("排序结束!\n");
}


void _init_contact(struct A *pcon)
{
	pcon->i = 0;
	memset(pcon->arr, 0, MAX_SIZE * sizeof(struct contact));
}

void Print_menu()
{
	printf("*************************************************\n");
	printf("*********      通讯录 v1.0             **********\n");
	printf("*********     1、添加联系人            **********\n");
	printf("*********     2、删除联系人            **********\n");
	printf("*********     3、修改联系人            **********\n");
	printf("*********     4、查看所有联系人        **********\n");
	printf("*********     5、搜索联系人的信息      **********\n");
	printf("*********     6、以名字排序所有联系人  **********\n");
	printf("*********     7、清空所有联系人        **********\n");
	printf("*********     8、退出系统              **********\n");
	printf("*************************************************\n");
}

测试部分代码如下:

test.c

#include "test.h"

void test()
{
	struct A con;
	int input = 1;
	_init_contact(&con);
	while(input)
	{
		Print_menu();
		printf("请选择序号:");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				Add(&con);
				break;
			case 2:
				dedelete_contact(&con);
				break;
			case 3:
				revise_contact(&con);
				break;
			case 4:
				print_contact(&con);
				break;
			case 5:
				find_contact(&con);
				break;
			case 6:
				sort_name(&con);
				break;
			case 7:
				put_empty(&con);
				break;
			case 8:
				break;
			default:
				break;
		}
	}

}

int main()
{
	test();
	system("pause");
	return 0;
}


总结:虽然这是通讯录的第一个版本,但是让我对于函数的运用和结构体的运用有了一个很深刻的印象。从第一个小程序C语言扫雷到现在的C语言通讯录,我对于C语言的一些运用方面感觉更加的成熟,虽然写这个程序中遇到了一些麻烦,但是我希望各位都可以自己去想,多思考才可以学的更加深刻。最后,如有不对,请多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值