通讯录情况介绍
1.通讯录的文件结构:
整个通讯录的实现包括三个文件:contact_test.c文件、Contact.c文件和Contact.h文件。每条好友的信息都是通讯录中的一条记录,每个记录包括:好友姓名、性别、年龄、电话和地址五个信息。
- contact_test.c 通讯录程序的入口文件(main函数),进行函数功能测试
- Contact.c 存放通讯录功能函数的具体实现
- Contact.h 存放通讯录对外暴露的功能函数的声明、全局变量以及需要的头文件
2.通讯录的数据存储结构:顺序存储的结构体数组
3.通讯录支持的功能:
- 新建(初始化)通讯录:bool InitContact(Contact* C);
- 添加记录:bool AddContact(Contact* P);
- 显示记录:bool ShowContact(const Contact* C);
- 删除记录:bool DelContact(Contact* P);
- 查找记录:bool Search(const Contact* P);
- 修改记录:bool Modify(Contact* P);
- 按照指定信息对记录排序:bool SortContact(Contact* P);
通讯录实现涉及的常用知识(实用思想)
- 封装:本文共封装了三个常用算法的功能函数,包括查找算法和数据信息输入输出,以解决整个通讯录实现过程中代码重复的问题。
- static的应用:为避免函数、功能在不同文件的冲突,规定某些功能只能在本文件范围内使用。
- qsort排序函数:对结构体类内部各类型数据进行排序的实现(待实现)
- 插入删除算法:对象是结构体数组中的元素,本质上仍是顺序表的插入删除操作。
代码实现
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);(待实现)