【简易通讯录】—–C语言实现
该通讯录实现了一个普通通讯录所具有的基本功能:联系人的添加,删除,修改,排序,查找,清空等功能。使用了结构体自定义类型实现,排序部分使用了冒泡排序。
头文件部分:
#ifndef __CONTACTS_H_
#define __CONTACTS_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define MAX 1000
#define NAME_MAX 20
#define TELE_MAX 12
#define SEX_MAX 5
#define ADDR_MAX 40
typedef struct PeoInfo
{
char name[NAME_MAX];
char tele[TELE_MAX];
char sex[SEX_MAX];
char addr[ADDR_MAX];
int age;
}PeoInfo;
typedef struct contact
{
PeoInfo contact[MAX];
int sz;
}contact, *pContact;
//初始化通讯录
void Init_contact(pContact pcon);
//添加联系人
void Add_contacts(pContact pcon);
//删除联系人
void Del_contacts(pContact pcon);
//查找联系人
void Find_contacts(pContact pcon);
//修改联系人
void Mod_contacts(pContact pcon);
//显示联系人
void Show_contacts(pContact pcon);
//排序联系人
void Sort_contacts(pContact pcon);
//清空联系人
void Empty_contacts(pContact pcon);
#endif //__CONTACTS_H_
测试部分
#define _CRT_SECURE_NO_WARNINGS 1
#include "contacts.h"
enum
{
Exit,
Add,
Del,
Find,
Mod,
Sort,
Show,
Empty,
};
void menu()
{
printf("\n");
printf("\n");
printf("\t |*|*|*|*|*|*|*|*|*|*|*|*|*|*| |*|*|*|*|*|*|*|*|*|*|*|*|*|*|\n");
printf("\t |*| 1.添加联系人 |*| |*| 2.删除联系人 |*|\n");
printf("\t |*|*|*|*|*|*|*|*|*|*|*|*|*|*| |*|*|*|*|*|*|*|*|*|*|*|*|*|*|\n");
printf("\n");
printf("\t |*|*|*|*|*|*|*|*|*|*|*|*|*|*| |*|*|*|*|*|*|*|*|*|*|*|*|*|*|\n");
printf("\t |*| 3.查找联系人 |*| |*| 4.修改联系人 |*|\n");
printf("\t |*|*|*|*|*|*|*|*|*|*|*|*|*|*| |*|*|*|*|*|*|*|*|*|*|*|*|*|*|\n");
printf("\n");
printf("\t |*|*|*|*|*|*|*|*|*|*|*|*|*|*| |*|*|*|*|*|*|*|*|*|*|*|*|*|*|\n");
printf("\t |*| 5.排序联系人 |*| |*| 6.显示联系人 |*|\n");
printf("\t |*|*|*|*|*|*|*|*|*|*|*|*|*|*| |*|*|*|*|*|*|*|*|*|*|*|*|*|*|\n");
printf("\n");
printf("\t |*|*|*|*|*|*|*|*|*|*|*|*|*|*| |*|*|*|*|*|*|*|*|*|*|*|*|*|*|\n");
printf("\t |*| 7.清空联系人 |*| |*| 0.退出 |*|\n");
printf("\t |*|*|*|*|*|*|*|*|*|*|*|*|*|*| |*|*|*|*|*|*|*|*|*|*|*|*|*|*|\n");
}
void test()
{
int input = 0;
contact my_con;
Init_contact(&my_con);
do
{
menu();
printf("请输入你的选择>:\n");
scanf("%d", &input);
switch (input)
{
case Add:
Add_contacts(&my_con);
break;
case Del:
Del_contacts(&my_con);
break;
case Find:
Find_contacts(&my_con);
break;
case Mod:
Mod_contacts(&my_con);
break;
case Sort:
Sort_contacts(&my_con);
break;
case Show:
Show_contacts(&my_con);
break;
case Empty:
Empty_contacts(&my_con);
break;
case Exit:
printf("********谢谢你的使用,拜拜*******\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}
功能实现部分
#include "contacts.h"
//通讯录初始化
void Init_contact(pContact pcon)
{
assert(pcon != NULL);
//sizeof里数组名代表整个数组
memset(pcon->contact, 0, sizeof(pcon->contact));
pcon->sz = 0;
}
//添加联系人
void Add_contacts(pContact pcon)
{
assert(pcon != NULL);
if (pcon->sz == MAX)
{
printf("通讯录已满!!!\n");
return;
}
printf("请输入姓名:>\n");
scanf("%s", pcon->contact[pcon->sz].name);
printf("请输入电话号:>\n");
scanf("%s", pcon->contact[pcon->sz].tele);
printf("请输入性别:>\n");
scanf("%s", pcon->contact[pcon->sz].sex);
printf("请输入年龄:>\n");
//年龄不是数组类型,所以一定要取地址
scanf("%d", &(pcon->contact[pcon->sz].age));
printf("请输入地址:>\n");
scanf("%s", pcon->contact[pcon->sz].addr);
(pcon->sz)++;
printf("录入成功!!!\n");
}
int Find(pContact pcon ,char name[])
{
assert(pcon != NULL);
int i = 0;
for (i = 0; i < pcon->sz; i++)
{
if (strcmp((pcon->contact[i].name), name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人
void Del_contacts(pContact pcon)
{
assert(pcon != NULL);
char name[NAME_MAX] = { 0 };
if (pcon->sz == 0)
{
printf("通讯录为空\n");
return;
}
printf("请输入想删除人的名字\n");
scanf("%s", name);
int ret = Find(pcon,name);
if (ret == -1)
{
printf("没有该联系人\n");
}
else
{
int i = 0;
for (i = ret; i < pcon->sz; i++)
{
pcon->contact[i] = pcon->contact[i + 1];
}
pcon-> sz--;
printf("删除成功\n");
}
}
//查找联系人,并显示他的全部信息
void Find_contacts(pContact pcon)
{
char name[NAME_MAX];
assert(pcon != NULL);
printf("请输入想要查找人的名字\n");
scanf("%s", name);
int ret = Find(pcon,name);
if (ret == -1)
{
printf("没有该联系人\n");
}
else
{
printf("%10s\t%12s\t%5s\t%3d\t%20s\n",
pcon->contact[ret].name,
pcon->contact[ret].tele,
pcon->contact[ret].sex,
pcon->contact[ret].age,
pcon->contact[ret].addr);
}
}
mneu1()
{
printf("\n");
printf("\n");
printf("\t *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
printf("\t *-*-*-* 1 .姓名 2. 电话 *-*-*-*\n");
printf("\t *-*-*-* 3. 性别 4. 年龄 *-*-*-*\n");
printf("\t *-*-*-* 5. 地址 0. 退出 *-*-*-*\n");
printf("\t *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");
printf("\n");
}
//修改联系人
void Mod_contacts(pContact pcon)
{
char name[NAME_MAX] = { 0 };
int input = 0;
assert(pcon != NULL);
printf("请输入要修改联系人的姓名\n");
scanf("%s", name);
int ret = Find(pcon, name);
if (ret == -1)
{
printf("该联系人不存在\n");
return;
}
do
{
mneu1();
printf("请输入要修改的选项\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入新的姓名:>\n");
scanf("%s", pcon->contact[ret].name);
break;
case 2:
printf("请输入新的电话号:>\n");
scanf("%s", pcon->contact[ret].tele);
break;
case 3:
printf("请输入性别:>\n");
scanf("%s", pcon->contact[ret].sex);
break;
case 4:
printf("请输入年龄:>\n");
scanf("%d", &(pcon->contact[ret].age));
break;
case 5:
printf("请输入新的地址\n");
scanf("%s", pcon->contact[ret].name);
break;
case 0:
break;
default:
printf("输入错误\n");
}
} while (input);
printf("修改成功\n");
}
//按姓名排序
void Sort_contacts(pContact pcon)
{
int i = 0;
int j = 0;
int flag = 0;
assert(pcon != NULL);
//如果只有一个联系人就不用排序
if (pcon->sz == 1)
{
return;
}
//用冒泡排序以联系人的名字升序
for (i = 0; i < pcon->sz - 1; i++)
{
for (j = 0; j < pcon->sz - i - 1; j++)
{
if (strcmp(pcon->contact[j].name, pcon->contact[j + 1].name) > 0)
{
PeoInfo tmp = pcon->contact[j];
pcon->contact[j] = pcon->contact[j + 1];
pcon->contact[j + 1] = tmp;
flag = 1;
}
}
if (flag == 0)
{
break;
}
}
printf("排序成功\n");
Show_contacts(pcon);
}
//清空联系人
void Empty_contacts(pContact pcon)
{
char back = 0;
assert(pcon != NULL);
printf("是否清空全部联系人:y.是 n.否\n");
fflush(stdin);
scanf("%c", &back);
if (back == 'y')
{
while ((back == 'y') && (pcon->sz > 0))
{
strcpy(pcon->contact[pcon->sz].name, "\0");
strcpy(pcon->contact[pcon->sz].tele, "\0");
strcpy(pcon->contact[pcon->sz].sex, "\0");
strcpy(pcon->contact[pcon->sz].addr, "\0");
pcon->contact[pcon->sz].age = 0;
pcon->sz--;
if (pcon->sz == 0)
{
printf("已清空全部联系人\n");
return;
}
}
}
}
//显示联系人
void Show_contacts(pContact pcon)
{
assert(pcon != NULL);
printf("%12s\t%12s\t%5s\t%3s\t%20s\n", "name","tele","sex","age","addr");
int i = 0;
for (i = 0; i < pcon->sz; i++)
{
printf("%10s\t%12s\t%5s\t%3d\t%20s\n",
pcon->contact[i].name,
pcon->contact[i].tele,
pcon->contact[i].sex,
pcon->contact[i].age,
pcon->contact[i].addr);
}
}
程序运行时的截图
主菜单:
排序前联系人显示:
排序后联系人显示:
想要修改联系人是选择菜单: