一、通讯录的功能:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
- 修改联系人
二、思想:分别封装7个函数来实现上述功能
首先我们定义结构体PersonInfo里面包含联系人的信息(姓名、性别、年龄、电话、地址)然后再定义一个Contact结构体里面包含联系人PersonInfo和使用个数usedSize。
typedef struct PersonInfo
{
//name age tele addr sex
char name[MAX_NAME];
short age;
char tele[MAX_TEL];
char addr[MAX_TEL];
char sex[MAX_SEX];
}PersonInfo;
typedef struct Contact
{
PersonInfo per[MAX_NUMPERSON];
int usedSize;
}Contact;
1.初始化通讯录:
将人数置为0,将联系人的信息全置为0;
void InitContact(Contact *pCon)
{
assert(pCon != NULL);
pCon->usedSize = 0;
memset(pCon->per, 0, sizeof(pCon->per));
}
2.添加联系人信息:
首先判断通讯录是否已经满了,如果已经满了的话则输出“通讯录已满”的字样,否则进行添加操作:找到你需要输入的信息的地址进行输入
void AddContact(Contact *pCon)
{
assert(pCon != NULL);
if (pCon->usedSize == MAX_NUMPERSON)
{
printf("通讯录已经满了\n");
return;
}
printf("请输入姓名=>\n");
scanf("%s", pCon->per[pCon->usedSize].name);
printf("请输入性别=>\n");
scanf("%s", pCon->per[pCon->usedSize].sex);
printf("请输入年龄=>\n");
scanf("%d", &(pCon->per[pCon->usedSize].age));
printf("请输入电话=>\n");
scanf("%s", pCon->per[pCon->usedSize].tele);
printf("请输入地址=>\n");
scanf("%s", pCon->per[pCon->usedSize].addr);
pCon->usedSize++;
printf("添加成功\n");
}
3.删除联系人:
输入你要删除联系人的名字,然后找你要删除联系人的位置,然后将这个联系人之后的联系人通通往前移动一位,然后使用个数usesize减少一个
void DelContact(Contact *pCon)
{
int i = 0;
int j = 0;
char name[MAX_NAME];
int p = pCon->usedSize;
assert(pCon != NULL);
printf("请输入名字=>\n");
scanf("%s", name);
for (i = 0; i < pCon->usedSize; i++)
{
if (!strcmp(pCon->per[i].name, name))
{
pCon->usedSize--;
for (j = i; j < pCon->usedSize - 1; j++)
{
pCon->per[j] = pCon->per[j + 1];
}
printf("删除成功\n");
return;
}
}
if (p >= pCon->usedSize)
{
printf("输入有误\n");
}
}
4.查找联系人:
首先判断通讯录是否为空,为空则输出“通讯录为空”的字样,否则输入你要查找的联系人名字,在通讯录中寻到,找到返回他的下标,没有返回-1;
int SearchContact(Contact *pCon)
{
int i = 0;
char arr[MAX_NAME];
assert(pCon != NULL);
if (pCon->usedSize == 0)
{
printf("通讯录为空\n");
return -1;
}
printf("请输入名字=>\n");
scanf("%s", arr);
for (i = 0; i < pCon->usedSize; i++)
{
if (!strcmp(pCon->per[i].name, arr))
{
return i;
}
}
return -1;
}
5.显示所有的联系人
遍历整个通讯录将每个联系人的信息输出
void ShowContact(Contact *pCon)
{
int i = 0;
assert(pCon != NULL);
printf("%-20s%-10s%-10s%-11s%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pCon->usedSize; i++)
{
printf("%-20s%-10s%-10d%-11s%-15s\n",
pCon->per[i].name,
pCon->per[i].sex,
pCon->per[i].age,
pCon->per[i].tele,
pCon->per[i].addr);
}
}
6.清空所有联系人
将使用个数usesize赋值为0即可。
void ClearContact(Contact *pCon)
{
assert(pCon != NULL);
pCon->usedSize = 0;
printf("清除成功\n");
}
7.按名字排序
首先判断通讯录是否为空,不为空开始排序(这里是使用的是冒泡排序)
void SortContact(Contact *pCon)
{
int i = 0;
int j = 0;
if (pCon->usedSize == 0)
{
printf("通讯录为空\n");
return;
}
assert(pCon != NULL);
for (i = 0; i < pCon->usedSize - 1; i++)
{
for (j = 0; j < pCon->usedSize - 1 - i; j++)
{
if (strcmp(pCon->per[j].name, pCon->per[j + 1].name) > 0)
{
PersonInfo temp;
temp = pCon->per[j];
pCon->per[j] = pCon->per[j + 1];
pCon->per[j + 1] = temp;
}
}
}
}
8.修改联系人
输入你要修改的联系人的名字,遍历整个通讯录找要修改的联系人所在位置,然后对相应信息进行替换。
void AmeContact(Contact *pCon)
{
int ret = 0;
int input = 0;
assert(pCon != NULL);
ret = SearchContact(pCon);
if (ret == -1)
{
printf("输入有误\n");
}
else
{
do
{
menu1();
printf("请输入你的选择\n");
scanf("%d", &input);
switch (input)
{
case 0:
break;
case 1:
printf("更改后的名字:\n");
scanf("%s", pCon->per[ret].name);
break;
case 2:
printf("更改后的性别:\n");
scanf("%s", pCon->per[ret].sex);
break;
case 3:
printf("更改后的年龄:\n");
scanf("%d", pCon->per[ret].age);
break;
case 4:
printf("更改后的电话:\n");
scanf("%s", pCon->per[ret].tele);
break;
case 5:
printf("更改后的地址:\n");
scanf("%s", pCon->per[ret].addr);
break;
default:
printf("输入有误\n");
break;
}
} while (input);
}
}
代码:
concat.h :函数的声明,结构体的定义和相关信息的定义
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#ifndef __CONTACT__H__
#define __CONTACT__H__
enum Option
{
EXIT,
ADD,
SEAR,
DEL,
SHOW,
CLEAR,
SORT,
AME
};
#define MAX_NAME 20
#define MAX_TEL 11
#define MAX_ADDR 15
#define MAX_SEX 3
#define MAX_NUMPERSON 1000
//个人信息
typedef struct PersonInfo
{
//name age tele addr sex
char name[MAX_NAME];
short age;
char tele[MAX_TEL];
char addr[MAX_TEL];
char sex[MAX_SEX];
}PersonInfo;
//通讯录
typedef struct Contact
{
PersonInfo per[MAX_NUMPERSON];
int usedSize;//被使用的个数
}Contact;
void InitContact(Contact *pCon);
void AddContact(Contact *pCon);
int SearchContact(Contact *pCon);
void DelContact(Contact *pCon);
void ShowContact(Contact *pCon);
void ClearContact(Contact *pCon);
void SortContact(Contact *pCon);
#endif// __CONTACT__H__
concat.c :函数的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include"concat.h"
void InitContact(Contact *pCon)
{
assert(pCon != NULL);
pCon->usedSize = 0;
memset(pCon->per, 0, sizeof(pCon->per));
}
#if 1
void AddContact(Contact *pCon)
{
assert(pCon != NULL);
if (pCon->usedSize == MAX_NUMPERSON)
{
printf("通讯录已经满了\n");
return;
}
printf("请输入姓名=>\n");
scanf("%s", pCon->per[pCon->usedSize].name);
printf("请输入性别=>\n");
scanf("%s", pCon->per[pCon->usedSize].sex);
printf("请输入年龄=>\n");
scanf("%d", &(pCon->per[pCon->usedSize].age));
printf("请输入电话=>\n");
scanf("%s", pCon->per[pCon->usedSize].tele);
printf("请输入地址=>\n");
scanf("%s", pCon->per[pCon->usedSize].addr);
pCon->usedSize++;
printf("添加成功\n");
}
#endif
int SearchContact(Contact *pCon)
{
int i = 0;
char arr[MAX_NAME];
assert(pCon != NULL);
if (pCon->usedSize == 0)
{
printf("通讯录为空\n");
return -1;
}
printf("请输入名字=>\n");
scanf("%s", arr);
for (i = 0; i < pCon->usedSize; i++)
{
if (!strcmp(pCon->per[i].name, arr))
{
return i;
}
}
return -1;
}
void DelContact(Contact *pCon)
{
int i = 0;
int j = 0;
char name[MAX_NAME];
int p = pCon->usedSize;
assert(pCon != NULL);
printf("请输入名字=>\n");
scanf("%s", name);
for (i = 0; i < pCon->usedSize; i++)
{
if (!strcmp(pCon->per[i].name, name))
{
pCon->usedSize--;
for (j = i; j < pCon->usedSize - 1; j++)
{
pCon->per[j] = pCon->per[j + 1];
}
printf("删除成功\n");
return;
}
}
if (p >= pCon->usedSize)
{
printf("输入有误\n");
}
}
void ShowContact(Contact *pCon)
{
int i = 0;
assert(pCon != NULL);
printf("%-20s%-10s%-10s%-11s%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pCon->usedSize; i++)
{
printf("%-20s%-10s%-10d%-11s%-15s\n",
pCon->per[i].name,
pCon->per[i].sex,
pCon->per[i].age,
pCon->per[i].tele,
pCon->per[i].addr);
}
}
void ClearContact(Contact *pCon)
{
assert(pCon != NULL);
pCon->usedSize = 0;
printf("清除成功\n");
}
void menu1()
{
printf(" 修改内容如下: \n");
printf(" 1.名字 2.性别 \n");
printf(" 3.年龄 4.电话 \n");
printf(" 5.地址 0.退出 \n");
}
void AmeContact(Contact *pCon)
{
int ret = 0;
int input = 0;
assert(pCon != NULL);
ret = SearchContact(pCon);
if (ret == -1)
{
printf("输入有误\n");
}
else
{
do
{
menu1();
printf("请输入你的选择\n");
scanf("%d", &input);
switch (input)
{
case 0:
break;
case 1:
printf("更改后的名字:\n");
scanf("%s", pCon->per[ret].name);
break;
case 2:
printf("更改后的性别:\n");
scanf("%s", pCon->per[ret].sex);
break;
case 3:
printf("更改后的年龄:\n");
scanf("%d", pCon->per[ret].age);
break;
case 4:
printf("更改后的电话:\n");
scanf("%s", pCon->per[ret].tele);
break;
case 5:
printf("更改后的地址:\n");
scanf("%s", pCon->per[ret].addr);
break;
default:
printf("输入有误\n");
break;
}
} while (input);
}
}
void SortContact(Contact *pCon)
{
int i = 0;
int j = 0;
if (pCon->usedSize == 0)
{
printf("通讯录为空\n");
return;
}
assert(pCon != NULL);
for (i = 0; i < pCon->usedSize - 1; i++)
{
for (j = 0; j < pCon->usedSize - 1 - i; j++)
{
if (strcmp(pCon->per[j].name, pCon->per[j + 1].name) > 0)
{
PersonInfo temp;
temp = pCon->per[j];
pCon->per[j] = pCon->per[j + 1];
pCon->per[j + 1] = temp;
}
}
}
}
test.c:调用函数实现通讯录的功能
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include "concat.h"
void menu()
{
printf("*********1.add*************2.search**********\n");
printf("*********3.del*************4.show************\n");
printf("*********5.clear***********6.sort************\n");
printf("*********0.exit************7.amend***********\n");
}
void start()
{
int ret = 0;
int in = 0;
//初始化通讯录 数组 usedSize
Contact con;
InitContact(&con);
do
{
menu();
printf("请输入你的操作>>");
scanf("%d",&in);
switch(in)
{
case ADD:
AddContact(&con);
break;
case SEAR:
ret = SearchContact(&con);
if (ret == -1)
{
printf("查找失败\n");
}
else
{
printf("查找成功\n");
ShowContact(&(con));
}
break;
case DEL:
DelContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case CLEAR:
ClearContact(&con);
break;
case SORT:
SortContact(&con);
break;
case AME:
AmeContact(&con);
default :
printf("输入错误\n");
break;
}
}while(in);
}
int main()
{
start();
return 0;
}