-------------------------------------------------------------------------------------------------------
本通讯录实现了一个普通通讯录的所有功能;包括:联系人的添加,删除,修改,排序,以及清空等功能;采用结构体自定义类型实现;排序部分采用的是冒泡排序。界面比较友好,希望各位朋友批评指正。
-------------------------------------------------------------------------------------------------------
C语言代码:
-----------------------
contacts.h (头文件)
-----------------------# include
# include
# include
# include
# define MAX 1000 //可存放最大联系人的数量
enum
{
_exit_sys, //0——>退出系统
_add_contacts, //1——>添加联系人
_del_contacts, //2——>删除联系人
_lookup_contacts, //3——>查找联系人
_revise_contacts, //4——>修改联系人
_show_contacts, //5——>显示联系人
_sort_contacts, //6——>排序联系人
_empty_contacts //7——>清空联系人
};
typedef struct phone_book //电话本结构类型
{
int order_num;
char name[20];
char sex[6];
int age;
char phone_numb[12];
char addr[50];
}p_book;
/*函数声明*/
int empty_contacts(p_book *contacts_parr);
//int name_cmp(const char * name1, const char *name2);
int sort_contacts(p_book *contacts_parr);
void show_one_contact(p_book *contacts_parr);
int show_contacts(p_book *contacts_parr);
int revise_contacts(p_book *contacts_parr);
int lookup_contacts(p_book *contacts_parr);
int del_contacts(p_book *contacts_parr);
int add_contacts(p_book *contacts_parr);
int phone_book_menu(int option);
void lookup_style();
void help_menu();
------------------------
功能函数(functions)
------------------------/*清空联系人*/
int empty_contacts(p_book *contacts_parr)
{
assert(contacts_parr);
char input_name[20] = "\0";
char sex[6] = "\0";
char phone_numb[12] = "\0";
char addr[50] = "\0";
char back = 'y'; //判断操作是否要继续
char y_n_empty; //是否执行清空操作
p_book *src = NULL;
/*是否确定清空*/
printf("\n\t确定是否清空(y/n)? : ");
fflush(stdin);
scanf("%c", &y_n_empty);
if (y_n_empty == 'y')
{
src = contacts_parr;
while ((src->order_num > 0) && (back == 'y'))
{
src->order_num = 0;
strcpy(src->name, "\0");
strcpy(src->sex, "\0");
src->age = 0;
strcpy(src->phone_numb, "\0");
strcpy(src->addr, "\0");
src++;
if (src->order_num == 0)
{
printf("\n\t联系人已经全部清空!!!\n\n");
printf("\t返回主菜单(y)? :");
fflush(stdin);
scanf("%c", &back);
printf("\n\n");
}
}
}
return (1);
}
/*显示指定联系人的信息*/
void show_one_contact(p_book *contacts_parr)
{
assert(contacts_parr);
p_book *src = contacts_parr;
printf("\n\n\t序号:%d\t", src->order_num);
printf("\n\t\t 姓名:%s\t", src->name);
printf("\t性别:%s", src->sex);
printf("\t年龄:%d\n", src->age);
printf("\t\t 电话号码:%s", src->phone_numb);
printf("\t地址:%s\n\n", src->addr);
}
/*显示全部联系人*/
int show_contacts(p_book *contacts_parr)
{
assert(contacts_parr);
char back = 'n'; //判断操作是否要继续
p_book *src = contacts_parr;
/*通讯录为空*/
if (src->order_num == 0)
{
printf("\n\n\t通讯录为空!!!\n");
}
while (back != 'y')
{
while (src->order_num != 0)
{
printf("\n\n\t序号:%d\t", src->order_num);
printf("\n\t\t 姓名:%s\t", src->name);
printf("\t性别:%s", src->sex);
printf("\t年龄:%d\n", src->age);
printf("\t\t 电话号码:%s", src->phone_numb);
printf("\t地址:%s", src->addr);
src++;
}
printf("\n\n\n\t返回主菜单(y)? :");
fflush(stdin);
scanf("%c", &back);
printf("\n\n");
}
return (1);
}
/*按联系人姓名排序*/
int sort_contacts(p_book *contacts_parr)
{
assert(contacts_parr);
int i = 0, j = 0;
int contacts_num = 0; //联系人个数
char show = 'n'; //判断是否需要打印出联系人
char back = 'n'; //判断操作是否要继续
int sign = 0;
p_book *count = NULL;
p_book *src = NULL;
p_book *print_src = NULL;
p_book tmp[] = { 0 };
while (back != 'y')
{
contacts_num = 0;
count = contacts_parr;
src = contacts_parr;
print_src = contacts_parr;
while (count->order_num > 0)
{
contacts_num++;
count++;
}
for (i = 0; i
{
sign = 0;
for (j = 0; j
{
if (strcmp(src[j].name, src[j + 1].name) > 0)
{
sign = 1;
*tmp = src[j];
src[j] = src[j + 1];
src[j + 1] = *tmp;
src[j].order_num = src[j].order_num - 1;
src[j + 1].order_num = src[j + 1].order_num + 1;
}
}
if (!sign)
{
break;
}
}
/*清空tmp*/
/*src[j].order_num = 0;
strcpy(src[j].name, "\0");
strcpy(src[j].sex, "\0");
src[j].age = 0;
strcpy(src[j].phone_numb, "\0");
strcpy(src[j].addr, "\0");*/
printf("\n\n\t排序完成!!!\n");
printf("\n\t是否需要显示所有联系人(y)? :");
fflush(stdin);
scanf("%c", &show);
if (show == 'y')
{
while (print_src->order_num != 0)
{
printf("\n\n\t序号:%d\t", print_src->order_num);
printf("\n\t\t 姓名:%s\t", print_src->name);
printf("\t性别:%s", print_src->sex);
printf("\t年龄:%d\n", print_src->age);
printf("\t\t 电话号码:%s", print_src->phone_numb);
printf("\t地址:%s", print_src->addr);
print_src++;
}
}
printf("\n\n\t返回主菜单(y)? :");
fflush(stdin);
scanf("%c", &back);
printf("\n\n");
}
return (1);
}
/*修改联系人*/
int revise_contacts(p_book *contacts_parr)
{
assert(contacts_parr);
char revise_name[20] = "\0";
char revise_sex[6] = "\0";
char revise_phone_numb[12] = "\0";
char revise_addr[50] = "\0";
char loop = 'y'; //判断操作是否要继续
p_book *src = NULL;
while (loop == 'y')
{
src = contacts_parr;
printf("\n\n\t请输入被修改人的姓名:");
scanf("%s", revise_name);
while (strcmp(src->name, revise_name) != 0)
{
if (0 == src->order_num)
{
printf("\n\t无此人的信息!\n");
break;
}
src++;
}
if (0 != src->order_num)
{
show_one_contact(src); //显示需要修改联系人原来的信息
printf("\n\n\t请输入该联系人的新信息:\n");
printf("\tname:");
scanf("%s", revise_name);
strcpy(src->name, revise_name);
printf("\tsex:");
scanf("%s", revise_sex);
strcpy(src->sex, revise_sex);
printf("\tage:");
fflush(stdin);
scanf("%d", &src->age);
printf("\tphone_num:");
scanf("%s", revise_phone_numb);
strcpy(src->phone_numb, revise_phone_numb);
printf("\taddr:");
scanf("%s", revise_addr);
strcpy(src->addr, revise_addr);
printf("\n\t修改成功!!!\n\n");
}
printf("\n\n\t继续修改(y)/ 返回主菜单(n)? :");
fflush(stdin);
scanf("%c", &loop);
printf("\n\n");
}
return (1);
}
/*查找方式*/
void lookup_style()
{
printf("\n\n\t *-*-*-*-*-*-*-*-*-*\n");
printf("\t *- 1.按姓名查找 -*\n");
printf("\t *- 2.按电话查找 -*\n");
printf("\t *-*-*-*-*-*-*-*-*-*\n");
}
/*查找联系人*/
int lookup_contacts(p_book *contacts_parr)
{
assert(contacts_parr);
int choose = 0;
char lookup_name[20] = "\0";
char input_phone_numb[12] = "\0";
char loop = 'y'; //判断操作是否要继续
p_book *src = NULL;
while (loop == 'y')
{
src = contacts_parr;
lookup_style();
printf("\n\t请选择:");
fflush(stdin);
scanf("%d", &choose);
if (1 == choose) //按姓名查找
{
printf("\n\t请输入被查找人的姓名:");
scanf("%s", lookup_name);
while (strcmp(src->name, lookup_name) != 0)
{
if (0 == src->order_num)
{
printf("\n\t无此人的信息!\n");
break;
}
src++;
}
if (0 != src->order_num)
show_one_contact(src);
}
else if (2 == choose) //按电话号码查找
{
printf("\n\t请输入被查找人的电话号码:");
scanf("%s", input_phone_numb);
while (strcmp(src->phone_numb, input_phone_numb) != 0)
{
if (0 == src->order_num)
{
printf("\n\t无此人的信息!\n");
break;
}
src++;
}
if (0 != src->order_num)
show_one_contact(src);
}
else
{
printf("\n\t输入的选项不存在!!!\n\n");
}
printf("\n\n\t继续查找(y)/ 返回主菜单(n) ? :");
fflush(stdin);
scanf("%c", &loop);
printf("\n\n");
}
return (1);
}
/*删除联系人*/
int del_contacts(p_book *contacts_parr)
{
assert(contacts_parr);
char del_name[20] = "\0";
char loop = 'y'; //判断操作是否要继续
char y_n_delete; //判断是否删除
p_book tmp[] = { 0 }; //交换临时变量
p_book *src = NULL;
while (loop == 'y')
{
src = contacts_parr;
printf("\n\n\t请输入要删除人的姓名:");
scanf("%s", del_name);
while (strcmp(src->name, del_name) != 0)
{
if (0 == src->order_num)
{
printf("\n\t无此人的信息!\n");
return (1);
}
src++;
}
/*显示该联系人的信息*/
show_one_contact(src);
/*是否确定删除*/
printf("\n\t确定是否删除(y/n)? : ");
fflush(stdin);
scanf("%c", &y_n_delete);
if (y_n_delete == 'y')
{
/*将该联系人信息清除*/
src->order_num = 0;
strcpy(src->name, "\0");
strcpy(src->sex, "\0");
src->age = 0;
strcpy(src->phone_numb, "\0");
strcpy(src->addr, "\0");
printf("\n\t联系人已删除!!!\n");
}
else
{
return (1);
}
/*删除该联系人之后,如果后边还有联系人,则向前移动*/
while ((++src)->order_num > 0)
{
*tmp = *(--src);
*src = *(src + 1);
src++;
*src = *tmp;
(src - 1)->order_num = (src - 1)->order_num - 1;
}
printf("\n\n\t继续删除(y)/ 返回主菜单(n) ? :");
fflush(stdin);
scanf("%c", &loop);
printf("\n\n");
}
return (1);
}
/*添加联系人*/
int add_contacts(p_book *contacts_parr)
{
assert(contacts_parr);
char loop = 'y'; //判断操作是否要继续
char input_name[20] = "\0";
char sex[6] = "\0";
char phone_numb[12] = "\0";
char addr[50] = "\0";
p_book *src = NULL;
while (loop == 'y')
{
src = contacts_parr;
while (src->order_num > 0)
{
src++;
}
src->order_num = ((src - 1)->order_num) + 1; //序号加一
printf("\tname:");
scanf("%s", input_name);
strcpy(src->name, input_name);
printf("\tsex:");
scanf("%s", sex);
strcpy(src->sex, sex);
printf("\tage:");
scanf("%d", &src->age);
printf("\tphone_num:");
scanf("%s", phone_numb);
strcpy(src->phone_numb, phone_numb);
printf("\taddr:");
scanf("%s", addr);
strcpy(src->addr, addr);
printf("\n\n\t继续存入(y)/ 返回主菜单(n) ? :");
fflush(stdin);
scanf("%c", &loop);
printf("\n\n");
}
return (1);
}
/*系统菜单*/
int phone_book_menu(int option)
{
printf("\n\t - phone_book_menu - \n\n");
printf("\t *-*-*-*-*-*-*-*-*-*");
printf("\t *-*-*-*-*-*-*-*-*-*\n");
printf("\t *- 1.添加联系人 -*");
printf("\t *- 2.删除联系人 -*\n");
printf("\t *-*-*-*-*-*-*-*-*-*");
printf("\t *-*-*-*-*-*-*-*-*-*\n\n");
printf("\t *-*-*-*-*-*-*-*-*-*");
printf("\t *-*-*-*-*-*-*-*-*-*\n");
printf("\t *- 3.查找联系人 -*");
printf("\t *- 4.修改联系人 -*\n");
printf("\t *-*-*-*-*-*-*-*-*-*");
printf("\t *-*-*-*-*-*-*-*-*-*\n\n");
printf("\t *-*-*-*-*-*-*-*-*-*");
printf("\t *-*-*-*-*-*-*-*-*-*\n");
printf("\t *- 5.显示联系人 -*");
printf("\t *- 6.排序联系人 -*\n");
printf("\t *-*-*-*-*-*-*-*-*-*");
printf("\t *-*-*-*-*-*-*-*-*-*\n\n");
printf("\t *-*-*-*-*-*-*-*-*-*");
printf("\t *-*-*-*-*-*-*-*-*-*\n");
printf("\t *- 7.清空联系人 -*");
printf("\t *- 0.退出 -*\n");
printf("\t *-*-*-*-*-*-*-*-*-*");
printf("\t *-*-*-*-*-*-*-*-*-*\n\n");
printf("\t请选择:");
scanf("%d", &option);
if (option >= 0 && option <= 7)
{
return (option);
}
else
{
printf("\t对不起,您的输入有误!!!\n");
return (-1);
}
}
/*帮助菜单*/
void help_menu()
{
printf("\n\n\t|*|*|*|*|*|*|*|*|*|—— 欢迎使用XX通讯录 ——|*|*|*|*|*|*|*|*|\n");
printf("\t|*| |*|\n");
printf("\t|*| tips: |*|\n");
printf("\t|*| 1. 姓名最大有效字符长度为19个 (a-z / A-Z) |*|\n");
printf("\t|*| 2. 性别最大有效字符长度为5个 (man /woman) |*|\n");
printf("\t|*| 3. 手机号最大有效字符长度为11个(0— —9) |*|\n");
printf("\t|*| 4. 地址最大有效字符长度为49个 (a-z & A-Z) |*|\n");
printf("\t|*| |*|\n");
printf("\t||*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|\n\n");
printf("\t\t\t\t\t\t\t 继续... ...");
getch();
printf("\n\n\n\n");
}
------------------
main.c(主函数)
------------------int main()
{
int loop = 1; //循环判断条件
int option; //选项
p_book contacts_arr[MAX] = { 0 };
help_menu();
while (loop)
{
option = -1;
while (option == -1)
{
option = phone_book_menu(option); //菜单
}
switch (option)
{
case _add_contacts:
loop = add_contacts(contacts_arr);
break;
case _del_contacts:
loop = del_contacts(contacts_arr);
break;
case _lookup_contacts:
loop = lookup_contacts(contacts_arr);
break;
case _revise_contacts:
loop = revise_contacts(contacts_arr);
break;
case _show_contacts:
loop = show_contacts(contacts_arr);
break;
case _sort_contacts:
loop = sort_contacts(contacts_arr);
break;
case _empty_contacts:
loop = empty_contacts(contacts_arr);
break;
case _exit_sys:
loop = 0;
printf("\n\n\t *-*-*-*-*-*--*- goodbye -*-*--*-*-*-*-*-*-*\n\n\n\n");
break;
default:
loop = 0;
break;
}
}
system("pause");
return (0);
}
程序运行时的部分截图:
1:帮助界面
2:主菜单
3:排序前的联系人
4:排序后的联系人