通讯录模拟

该通讯录实现了一下功能

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

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"constact.h"
int main()
{
	Contact con;   //先创建一个结构体变量
	InitContact(&con);
	int input = 0;
	do
	{
		menu();
		printf("请选择");
		scanf("%d", &input);
		switch (input)   
		{
		case ADD:                 //该switch选项用的枚举
			AddContact(&con);
			break;
		case SEAR:
			SearContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case CLEAR:
			ClearContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		default:
			printf("输入有误\n");
			break;
		}
	} while (input);
	return 0;
}

constact.h

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


enum Option
{
	EXIT,          //枚举。第一个的值默认为0,下面按顺序递增
	ADD,
	SEAR,
	DEL,
	SHOW,
	CLEAR,
	SORT
};

#define MAX_NAME 20           //宏定义各个值的最大值
#define MAX_ADDR 20      
#define MAX_TEL 11
#define MAX_SEX 3
#define MAX_PERSONNUM 1000

typedef struct Personinfo
{
	char name[MAX_NAME];
	char tele[MAX_TEL];
	short age;
	char addr[MAX_ADDR];
	char sex[MAX_SEX];
}Personinfo;

typedef struct Contact
{
	Personinfo per[MAX_PERSONNUM];  //结构体数组
	int usedsize;     //用来计数联系人
}Contact;

void menu();
void InitContact(Contact *p);
void AddContact(Contact *p);
void DelContact(Contact *p);
int SearContact(Contact *p);
void ShowContact(Contact *p);
void ClearContact(Contact *p);
void SortContact(Contact *p);

constct.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"constact.h"
void menu()
{
	printf("**********1、添加联系人************************\n");
	printf("**********2、查找联系人************************\n");
	printf("**********3、删除联系人************************\n");
	printf("**********4、展示联系人************************\n");
	printf("**********5、清空联系人************************\n");
	printf("**********6、排序联系人************************\n");
}

void InitContact(Contact *p)
{
	assert(p != NULL);  //断言指针不为空
	memset(p, 0, sizeof(p));  //清零
	p->usedsize = 0;   //把联系人的统计数记为0
}

void AddContact(Contact *p)
{
	assert(p != NULL);
	printf("姓名:");
	scanf("%s", p->per[p->usedsize].name);
	printf("电话:");
	scanf("%s", p->per[p->usedsize].tele);
	printf("年龄:");
	scanf("%d", &(p->per[p->usedsize].age));
	printf("地址:");
	scanf("%s", p->per[p->usedsize].addr);
	printf("性别:");
	scanf("%s", p->per[p->usedsize].sex);
	printf("添加成功!\n\n");
	(p->usedsize)++;   //每添加一个联系人,数值就加1
}

int SearContact(Contact *p)
{
	assert(p != NULL);
	char name[MAX_NAME];
	printf("输入姓名:");
	scanf("%s", name);
	int i = 0;
	if (p->usedsize == 0)  //如果联系人的总数为0就不找了
	{
		printf("查无此人\n\n");
		return -1;                       //这个函数里的return 是为了下面的删除del函数的调用
	}
	for (i = 0; i < p->usedsize; i++)
	{
		if (strcmp(name, p->per[i].name) == 0)  //如果输入的姓名找到了就打印出来
		{
			printf("%-20s%-11s%-7s%-20s%-11s\n\n", "姓名", "电话", "年龄", "地址", "性别");
			printf("%-20s%-11s%-7d%-20s%-11s\n\n", p->per[i].name, p->per[i].tele, p->per[i].age, p->per[i].addr, p->per[i].sex);
			return i;
		}
	}
	printf("查无此人\n\n");
	return -1;
}

void DelContact(Contact *p)
{
	assert(p != NULL);
	int j = 0;
	int i = SearContact(p);   //把找到的i的返回值赋值给这里的i
	if (i != -1)
	{
		for (j = i; j < p->usedsize - 1; j++)
		{
			p->per[j] = p->per[j + 1];         //把后面的联系人赋给前面的联系人,最后的效果是把i之后的联系人向前移动一位
		}
		printf("删除成功!\n\n");
	}
	else
	{
		printf("查无此人\n\n");
	}
	p->usedsize--;           //删除了要把总数减1
}

void ShowContact(Contact *p)
{
	assert(p != NULL);
	int i = 0;
	printf("%-20s%-11s%-7s%-20s%-11s\n\n", "姓名", "电话", "年龄", "地址", "性别");//注意规格
	for (i = 0; i < p->usedsize; i++)
	{
		printf("%-20s%-11s%-7d%-20s%-11s\n\n", p->per[i].name, p->per[i].tele, p->per[i].age, p->per[i].addr, p->per[i].sex);
	}
}

void ClearContact(Contact *p)
{
	assert(p != NULL);
	InitContact(p);            //调用前面的重置函数来清空
	printf("清空成功!\n\n");
}

void SortContact(Contact *p)
{
	assert(p != NULL);
	int i = 0;
	int j = 0;
	int flag = 0;
	Personinfo tmp;   //创立一个结构体变量
	for (i = 0; i < p->usedsize - 1; i++)       //冒泡排序
	{
		for (j = 0; j < p->usedsize - 1 - i; j++)
		{
			if (strcmp(p->per[j].name, p->per[j + 1].name) == 1)
			{
				tmp = p->per[j];
				p->per[j] = p->per[j + 1];  
				p->per[j + 1] = tmp;
				flag = 1;
			}
		}
		if (flag == 0)
		{
			return;
		}
	}
	printf("按字母排序成功,按4看看吧!\n\n");
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值