通讯录情况介绍


1.通讯录的文件结构:

整个通讯录的实现包括三个文件:contact_test.c文件、Contact.c文件和Contact.h文件。每条好友的信息都是通讯录中的一条记录,每个记录包括:好友姓名、性别、年龄、电话和地址五个信息。

  • contact_test.c 通讯录程序的入口文件(main函数),进行函数功能测试
  • Contact.c 存放通讯录功能函数的具体实现
  • Contact.h 存放通讯录对外暴露的功能函数的声明、全局变量以及需要的头文件

简单的通讯录的实现(C语言)_#define

2.通讯录的数据存储结构:顺序存储的结构体数组
3.通讯录支持的功能:
  1. 新建(初始化)通讯录:bool InitContact(Contact* C);
  2. 添加记录:bool AddContact(Contact* P);
  3. 显示记录:bool ShowContact(const Contact* C);
  4. 删除记录:bool DelContact(Contact* P);
  5. 查找记录:bool Search(const Contact* P);
  6. 修改记录:bool Modify(Contact* P);
  7. 按照指定信息对记录排序:bool SortContact(Contact* P);


通讯录实现涉及的常用知识(实用思想)

  1. 封装:本文共封装了三个常用算法的功能函数,包括查找算法和数据信息输入输出,以解决整个通讯录实现过程中代码重复的问题。
  2. static的应用:为避免函数、功能在不同文件的冲突,规定某些功能只能在本文件范围内使用。
  3. qsort排序函数:对结构体类内部各类型数据进行排序的实现(待实现)
  4. 插入删除算法:对象是结构体数组中的元素,本质上仍是顺序表的插入删除操作。

代码实现

contact_test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"

//通讯录的实现
//此文件用于功能函数的测试(程序入口)

int main(){
	int input = 0;
	//声明通讯录变量、并初始化
	Contact Con1;
	InitContact(&Con1);

	do{
		menu();
		printf("请选择你要进行的操作:>");
		scanf("%d", &input);

		switch (input)
		{
		case ADD://Add
			AddContact(&Con1);
			break;
		case DEL://Del
			DelContact(&Con1);
			break;
		case SEARCH://Search
			Search(&Con1);
			break;
		case MODIFY://Modify
			Modify(&Con1);
			break;
		case SHOW://Show
			ShowContact(&Con1);
			break;
		case SORT://Sort(待实现)
			break;
		case EXIT://Exit
			printf("你已经退出.\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);

	return 0;
}
Contact.c文件
#define _CRT_SECURE_NO_WARNINGS 1
//此文件用于功能函数的实现、以及封装的一些内部功能函数
#include "Contact.h"

//1.菜单的实现
void menu(){
	printf("************************************\n");
	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");
}


//初始化通讯录
bool InitContact(Contact* C){
	assert(C);
	memset(C->contact, 0, sizeof(C->contact));
	C->size = 0;
	return true;
}

//封装一个内部的查找指定姓名的函数,并返回该名字对应的下标,找不到返回-1
static int FindName(const Contact* P, char name[NAME_SIZE]){
	int i = 0;
	for (i = 0; i < P->size; i++){
		if (0 == strcmp(P->contact[i].name, name)){
			return i;
		}
	}
	return -1;
}

//封装一个内部的输出指定下标的好友信息的函数
static void PrintInfo(const Contact* P, int pos){
	printf("%-10s\t%-2s\t%-2s\t%-13s\t%-30s\n", "姓名", "性别", "年龄", "电话号码", "地址");
	printf("%-10s\t%-2s\t%-2d\t%-13s\t%-30s\n",
		P->contact[pos].name,
		P->contact[pos].gender,
		P->contact[pos].age,
		P->contact[pos].phone,
		P->contact[pos].addr);
}

//封装一个内部的录入到指定位置(下标)好友信息的函数
static void InputInfo(Contact* P, int pos){
	printf("请输入好友名字:>");
	scanf("%s", P->contact[pos].name);
	printf("请输入好友性别:>");
	scanf("%s", P->contact[pos].gender);
	printf("请输入好友年龄:>");
	scanf("%d", &(P->contact[pos].age));
	printf("请输入好友的电话号码:>");
	scanf("%s", P->contact[pos].phone);
	printf("请输入好友的地址:>");
	scanf("%s", P->contact[pos].addr);
}

//通讯录功能的实现
//2.Add添加一条记录
bool AddContact(Contact* P){
	if (P->size == MAX){
		printf("通讯录已满。\n");
		return false;
	}
	else{
		InputInfo(P, P->size);		
		P->size++;
		printf("添加好友到通讯录成功。\n");
		return true;
	}
}

//3.Del删除记录:删除通讯录中名为name的好友信息
bool DelContact(Contact* P){
	printf("请输入你要删除的联系人的名字:>");
	char name[NAME_SIZE];
	scanf("%s", name);
	
	//找到名字位name的好友
	/*int i = 0;
	for (i = 0; i < P->size; i++){
		if (0 == strcmp(P->contact[i].name, name)){
			break;
		}
	}*/
	int pos = FindName(P, name);
	//遍历完通讯录未发现名为name的好友
	if (pos == -1){
		printf("你要删除的好友不存在.\n");
		return false;
	}
	//删除好友(以后面覆盖前面好友的方式删除)
	else{
		int j = 0;
		for (j = pos; j < P->size-1; j++){
			P->contact[j] = P->contact[j + 1];
		}
		//memset(&(P->contact[P->size]), 0, sizeof(P->contact[P->size]));
		P->size--;
		printf("联系人: %s删除成功.\n", name);
	}
		return true;
	
}

//4.查找通讯录中名为name的好友,并打印其信息
bool Search(const Contact* P){
	printf("请输入你要查找的好友姓名:>");
	char name[NAME_SIZE];
	scanf("%s", name);
	//查找
	int pos = FindName(P, name);
	
	if (pos == -1){
		printf("你要查找的好友%s不存在。\n", name);
		return false;
	}
	else{
		//打印好友信息
		PrintInfo(P, pos);
	}
	return true;
}

//5.修改指定好友的信息
bool Modify(Contact* P){
	printf("请输入你想要修改的好友的姓名:>");
	char name[NAME_SIZE];
	scanf("%s", name);
	//找到要删除的好友姓名
	int pos = FindName(P, name);
	//未找到
	if (pos == -1){
		printf("抱歉,你要修改的好友%s不存在。\n", name);
		return false;
	}
	else{
		//先输出好友的原信息,再重新填写好友的信息
		printf("原信息:\n"); PrintInfo(P, pos);
		printf("请输入修改后的信息:\n"); InputInfo(P, pos);
	}
	return true;
}

//6.显示通讯录的全部记录
bool ShowContact(const Contact* C){
	if (!C->size){
		printf("通讯录空空如也……\n");
		return false;
	}
	else
	{
		printf("%-10s\t%-2s\t%-2s\t%-13s\t%-30s\n", "姓名", "性别", "年龄", "电话号码", "地址");
		for (int i = 0; i < C->size; i++){
			printf("%-10s\t%-2s\t%-2d\t%-13s\t%-30s\n",
				C->contact[i].name,
				C->contact[i].gender,
				C->contact[i].age,
				C->contact[i].phone,
				C->contact[i].addr);
		}
	}
	return true;
}

//7.按照..对通讯录进行排序(待实现)
bool SortContact();
Contact.h
//此头文件用于声明(对外暴露的)函数、变量

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

#define MAX 100
#define NAME_SIZE 10
#define GENDER_SIZE 2
#define PHONE_SIZE 12
#define ADDR_SIZE 30


enum Option{
	EXIT,//0
	ADD, //1
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};

//定义通讯录数据的存储结构,用于存放一个好友的信息(信息包括以下5个信息)
typedef struct PeopleInfo{
	char name[NAME_SIZE];
	char gender[GENDER_SIZE];
	int age;
	char phone[PHONE_SIZE];
	char addr[ADDR_SIZE];
	
}Peopleinfo;

//定义通讯录存储结构
typedef struct Contact{
	struct PeopleInfo contact[MAX];   //最大可以存放MAX条记录的通讯录
	int size;                         //通讯录当前存放的记录数量
}Contact;

// 声明通讯录功能函数
//1.菜单
void menu();

//初始化通讯录
bool InitContact(Contact* C);

//2.添加记录
bool AddContact(Contact* P);

//3.显示记录
bool ShowContact(const Contact* C);

//4.删除记录
bool DelContact(Contact* P);

//5.查找记录
bool Search(const Contact* P);

//6.修改记录
bool Modify(Contact* P);
//7.记录排序
bool SortContact(Contact* P);(待实现)