C进阶-简易通讯录的实现

题目要求:

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

代码实现:

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

typedef struct book_t
{
	char name[10];
	char sex[4];
	int age;
	char tel[20];
	char address[50];
}book;

typedef struct node_t
{
	book data[1000];
	int count;
}node;

void init(node *pnode);//初始化通讯录
void add(node *pnode);//添加联系人信息
void delete(node *pnode);//删除指定联系人信息
void search(node *pnode);//查找指定联系人信息
void change(node *pnode);//修改指定联系人信息
void show(node *pnode);//显示所有联系人信息
void clear(node *pnode);//清空所有联系人
void sort(node *pnode);//以名字排序所有联系人
static int findName(node *pnode, char name[]);// 查找指定条目下标

void main()
{
	int choice = 1;
	node n;
	init(&n);
	while (choice)
	{
		printf("***********通讯录***********\n");
		printf("【1】add         【2】delete\n");
		printf("【3】search      【4】change\n");
		printf("【5】show        【6】clear\n");
		printf("【7】sort        【0】exit \n");
		printf("****************************\n");

		printf("功能选择>> ");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			add(&n); break;
		case 2:
			delete(&n); break;
		case 3:
			search(&n); break;
		case 4:
			change(&n); break;
		case 5:
			show(&n); break;
		case 6:
			clear(&n); break;
		case 7:
			sort(&n); break;
		case 0:
			system(exit); break;
		default:
			printf("输入有误,请重新输入!");
		}
	}
	return 0;
}
void init(node *pnode)//初始化通讯录
{
	assert(pnode != NULL);
	pnode->count = 0;
	memset(pnode->data, 0, sizeof(pnode->data));
}


void add(node *pnode)//添加联系人信息
{
	assert(pnode != NULL);

	printf("姓名:");
	scanf("%s", pnode->data[pnode->count].name);
	printf("性别:");
	scanf("%s", pnode->data[pnode->count].sex);
	printf("年龄:");
	scanf("%d", &pnode->data[pnode->count].age);
	printf("电话:");
	scanf("%s", pnode->data[pnode->count].tel);
	printf("住址:");
	scanf("%s", pnode->data[pnode->count].address);
	pnode->count++;
	printf("联系人成功添加:\n", pnode->count);

}

static int findName(node *pnode, char name[])// 查找指定条目下标
{
	assert(pnode != NULL);
	int i = 0;
	for (i = 0; i < pnode->count; i++)
	{
		if (strcmp(pnode->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;//没找到
}

void delete(node *pnode)//删除指定联系人信息
{
	assert(pnode != NULL);
	node *p = pnode;
	char name[10];
	if (p->count == 0)
	{
		printf("通讯录为空!");
		return 0;
	}
	
	printf("请输入删除对象:");
	scanf("%s", name);
	int tmp=findName(p, name);
	if (tmp == -1)
	{
		printf("删除目标不存在!\n");
		return 0;
	}
	
	for (int i = tmp; i < p->count; i++)
	{
		p->data[i] = p->data[i + 1];
	}
	printf("删除成功!\n");
	pnode->count--;
}

void search(node *pnode)//查找指定联系人信息
{
	assert(pnode != NULL);
	node *p = pnode;
	
	if (p->count == 0)
	{
		printf("通讯录为空!");
		return 0;
	}
	char name[10];
	int i = 0;
	printf("查找对象:");
	scanf("%s", name);
	int tmp=findName(p,name);
	if (tmp != -1)
	{

		printf("姓名:%s\n", p->data[tmp].name);
		printf("性别:%s\n", p->data[tmp].sex);
		printf("年龄:%d\n", p->data[tmp].age);
		printf("电话:%s\n", p->data[tmp].tel);
		printf("住址:%s\n", p->data[tmp].address);
	}
	if (tmp==-1) 
	{
		printf("联系人不存在,查找失败!\n");
		return 0;
	}
}

void change(node *pnode)//修改指定联系人信息
{
	assert(pnode != NULL);	
	node *p = pnode;
	int i = 0;
	char name[10] = { 0 };

	if (p->count == 0)
	{
		printf("通讯录为空!\n");
		return 0;
	}

	printf("请输入要修改联系人的姓名:>");
	scanf("%s", name);

	 int tmp= findName(p, name);
	if (tmp != -1)
	{
		printf("修改内容:1-名字,2-性别,3-年龄,4-电话,5-住址");
		int c;
		scanf("%d", &c);
		switch (c)
		{
		case 1:
			printf("请输入新的姓名:");
			scanf("%s", p->data[tmp].name);
			break;
		case 2:
			printf("请输入新的性别:");
			scanf("%s", &p->data[tmp].sex);
			break;
		case 3:
			printf("请输入新的年龄:");
			scanf("%d", &p->data[tmp].age);
			break;
		case 4:
			printf("请输入新的电话:");
			scanf("%s", p->data[tmp].tel);
			break;
		case 5:
			printf("请输入新的地址:");
			scanf("%s", p->data[tmp].address);
			break;
		default:
			printf("输入有误,修改失败\n");
		}
		printf("修改成功\n");
	}
	if (tmp == -1)
	{
		printf("联系人不存在,查找失败!\n");
		return 0;
	}
	
}
void show(node *pnode)//显示所有联系人信息
{
	assert(pnode != NULL);
	node *p = pnode;
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		printf("联系人%d\n", i);
		printf("姓名:%s\n", p->data[i].name);
		printf("性别:%s\n", p->data[i].sex);
		printf("年龄:%d\n", p->data[i].age);
		printf("电话:%s\n", p->data[i].tel);
		printf("住址:%s\n", p->data[i].address);
		printf("\n");
	}
}
void clear(node *pnode)//清空所有联系人
{
	init(pnode);
}

void sort(node *pnode)//以名字排序所有联系人
{
	int i, j;
	node *p = pnode;
	book tmp;
	for (i = 0; i < p->count - 1; i++)
	{
		for (j = 0; j < p->count - 1 - i; j++)
		{
			if (strcmp(p->data[j].name, p->data[j + 1].name) < 0)
			{
				tmp = p->data[j];
				p->data[j] = p->data[j + 1];
				p->data[j + 1] = tmp;
			}
		}
	}
}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小熊爱吃软糖吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值