怎么用C语言实现一个通讯录?
程序员文章站
2022-05-27 08:23:39
实现一个通讯录
要求:
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息...
实现一个通讯录
要求:
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
思路:
tdd(测试驱动开发)思想,模块化!
代码实现
头文件contact的实现
#ifndef _contact_h__ #define _contact_h__ #define max_name 20 #define max_sex 5 #define max_phone 20 #define max_addr 30 #define max_peo 1000 enum option //通讯录的功能选项 { exit, //退出 add, //添加联系人信息 delete, //删除指定联系人信息 search, //查找指定联系人信息 modify, //修改指定联系人信息 show, //显示所有联系人信息 empty, //清空所有联系人 sort, //以名字排序所有联系人 }; enum mod_list//修改联系人信息的选项 { exitmodify, name, sex, age, phone, address, }; enum sort_list//排序方式的选项 { exit_sort, name_sort, age_sort, phone_sort, address_sort, }; typedef struct peoinfo { char name[max_name];//名字 char sex[max_sex];//性别 int age;//年龄 char phone[max_phone];//电话 char address[max_addr];//地址 }peoinfo; typedef struct contact { peoinfo data[max_peo];//通讯录 int count;//通讯录人数 }contact,*pcontact; void menu(); void initcontact(pcontact pc);//初始化通讯录函数 void addcontact(pcontact pc);//添加联系人信息函数 void deletecontact(pcontact pc);//删除指定联系人信息函数 void searchcontact(pcontact pc);//查找指定联系人信息函数 void modifycontact(pcontact pc);//修改指定联系人信息函数 void showcontact(pcontact pc);//显示所有联系人信息函数 void emptycontact(pcontact pc);//清空所有联系人函数 void sortcontact(pcontact pc);//排序所有联系人函数 #endif头文件bubble_sort的实现
#ifndef _bubble_sort_h__ #define _bubble_sort_h__ void bubble_sort(void *base, int sz, int width, int(*cmp)(const void *e1, const void *e2)); int cmp_name(const void* e1, const void* e2); int cmp_age(const void* e1, const void* e2); int cmp_phone(const void* e1, const void* e2); int cmp_address(const void* e1, const void* e2); #endifcontact定义函数的实现
#define _crt_secure_no_warnings 1 #include #include #include #include #include "contact.h" #include "bubble_sort.h" void menu()//功能选择菜单 { printf("*****************************************\n"); printf("********* 1.add 2.delete *********\n"); printf("********* 3.search 4.modify *********\n"); printf("********* 5.show 6.empty *********\n"); printf("********* 7.sort 0.exit *********\n"); printf("*****************************************\n"); } void mod_list()//修改信息选择菜单 { printf("*****************************************\n"); printf("********* 1.name 2.sex *********\n"); printf("********* 3.age 4.phone *********\n"); printf("********* 5.address 0.exit *********\n"); printf("*****************************************\n"); } void sort_list()//排序方式选择菜单 { printf("*****************************************\n"); printf("********* 1.name 2.age *********\n"); printf("********* 3.phone 4.address *********\n"); printf("********* 0.exit *********\n"); printf("*****************************************\n"); } int find_person(pcontact pc)//查找有无该联系人,若有,则返回该联系人下标;若无,返回-1 { char person_name[max_name]; int i = 0; assert(pc); printf("请输入要查找人的姓名:"); assert(1 == scanf("%s", person_name)); for (i = 0; i < pc->count; i++) { if (strcmp(person_name, pc->data[i].name)==0) return i;//所查找联系人存在 } return -1;//不存在 } void initcontact(pcontact pc)//初始化通讯录 { assert(pc); pc->count = 0; memset(pc->data, 0, sizeof(pc->data)); } void addcontact(pcontact pc)//添加联系人 { assert(pc); if (pc->count == max_peo) { printf("请注意,通讯录已满!\n"); return; } printf("-----------------------------------------\n"); printf("请输入名字:"); scanf("%s", pc->data[pc->count].name); printf("请输入性别:"); scanf("%s", pc->data[pc->count].sex); printf("请输入年龄:"); scanf("%d", &(pc->data[pc->count].age)); printf("请输入电话:"); scanf("%s", pc->data[pc->count].phone); printf("请输入地址:"); scanf("%s", pc->data[pc->count].address); pc->count++; printf("-----------------------------------------\n"); } void deletecontact(pcontact pc)//删除联系人 { assert(pc); if (pc->count == 0) { printf("通讯录为空\n"); return; } else { int ret = find_person(pc);//查找有无该联系人,若有,则返回该联系人下标;若无,返回-1。 if (ret == -1) { printf("无该联系人!\n"); return; } else { int i = 0; for (i = ret; i < pc->count; i++)//删除指定联系人后,将后续联系人往前移动 { pc->data[i] = pc->data[i + 1]; } pc->count--; printf("删除联系人成功!\n"); } } } void searchcontact(pcontact pc)//查找指定联系人 { assert(pc); if (pc->count == 0) { printf("通讯录为空\n"); return; } int ret = find_person(pc);//查找有无该联系人,若有,则返回该联系人下标;若无,返回-1。 if (ret == -1) { printf("无该联系人!\n"); return; } else { printf("-----------------------------------------\n"); printf("该联系人信息:\n");//打印该联系人信息 printf("名字: %s\n性别: %s\n年龄: %d\n电话: %s\n地址: %s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].phone, pc->data[ret].address); printf("-----------------------------------------\n"); } } void modifycontact(pcontact pc)//修改指定联系人信息 { assert(pc); if (pc->count == 0) { printf("通讯录为空\n"); return; } int ret = find_person(pc);//查找有无该联系人,若有,则返回该联系人下标;若无,返回-1。 if (ret == -1) { printf("无该联系人!\n"); return; } else { int input = 0; mod_list();//修改联系人信息的选项 printf("请选择要修改的信息:"); assert(1 == scanf("%d", &input)); switch (input) { case name: printf("请输入修改后的名字:"); scanf("%s", pc->data[ret].name); break; case sex: printf("请输入修改后的性别:"); scanf("%s", pc->data[ret].sex); break; case age: printf("请输入修改后的年龄:"); scanf("%s", pc->data[ret].age); break; case phone: printf("请输入修改后的电话:"); scanf("%s", pc->data[ret].phone); break; case address: printf("请输入修改后的地址:"); scanf("%s", pc->data[ret].address); break; default: printf("选择错误,请重新选择\n"); break; } } } void showcontact(pcontact pc)//显示 { assert(pc); int i = 0; if (pc->count == 0) { printf("通讯录为空\n"); return; } printf("-----------------------------------------\n"); for (i = 0; i < pc->count; i++) { printf("名字: %s\n性别: %s\n年龄: %d\n电话: %s\n地址: %s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].phone, pc->data[i].address); } printf("-----------------------------------------\n"); } void emptycontact(pcontact pc)//清空 { assert(pc); pc->count = 0; memset(pc->data, 0, sizeof(pc->data));//初始化函数 printf("清空通讯录成功!\n"); } void sortcontact(pcontact pc)//排序所有联系人函数 { assert(pc); if (pc->count == 0) { printf("通讯录为空\n"); return; } int input = 0; sort_list();//排序方式的选项 printf("请选择按什么方式排序:"); assert(1 == scanf("%d", &input)); switch (input) { case name_sort: bubble_sort(pc->data, pc->count, sizeof(peoinfo), cmp_name);//以名字排序 break; case age_sort: bubble_sort(pc->data, pc->count, sizeof(peoinfo), cmp_age);//以年龄排序 break; case phone_sort: bubble_sort(pc->data, pc->count, sizeof(peoinfo), cmp_phone);//以电话排序 break; case address_sort: bubble_sort(pc->data, pc->count, sizeof(peoinfo), cmp_address);//以地址排序 break; default: printf("选择错误,请重新选择\n"); break; } printf("通讯录排序成功!\n"); }bubble_sort定义函数的实现
#define _crt_secure_no_warnings 1 #include #include #include #include #include "contact.h" #include "bubble_sort.h" int cmp_name(const void* e1, const void* e2)//比较名字 { assert(e1&&e2); return (strcmp(((peoinfo *)e1)->name, ((peoinfo *)e2)->name)); } int cmp_age(const void* e1, const void* e2)//比较年龄 { assert(e1&&e2); return (*(peoinfo *)e1).age - (*(peoinfo *)e2).age; } int cmp_phone(const void* e1, const void* e2)//比较电话 { assert(e1&&e2); return (strcmp(((peoinfo *)e1)->phone, ((peoinfo *)e2)->phone)); } int cmp_address(const void* e1, const void* e2)//比较地址 { assert(e1&&e2); return (strcmp(((peoinfo *)e1)->address, ((peoinfo *)e2)->address)); } void swap(char *e1, char *e2, int width)//交换信息 { int i = 0; assert(e1&&e2); for (i = 0; i < width; i++) { char tmp = *((char*)e1 + i); *((char*)e1 + i) = *((char*)e2 + i); *((char*)e2 + i) = tmp; } } void bubble_sort(void *base, int sz, int width, int(*cmp)(const void *e1, const void *e2))//排序 { int i = 0; int j = 0; assert(base&&cmp); for (i = 0; i < sz - 1; i++) { for (j = 0; j < sz - 1 - i; j++) { if (cmp((char *)base + width*j, (char *)base + width*(j + 1))>0) swap((char *)base + width*j, (char *)base + width*(j + 1), width); } } }main函数的实现
#define _crt_secure_no_warnings 1 #include #include #include #include "contact.h" #include "bubble_sort.h" int main() { contact my_con; void(*opion[8])(pcontact) = { 0, addcontact, deletecontact, searchcontact, modifycontact, showcontact, emptycontact, sortcontact }; int input = 0; initcontact(&my_con);//初始化通讯录 do { menu(); printf("请选择操作功能:"); assert(1==scanf("%d", &input)); opion[input](&my_con);//使用函数指针数组选择功能,作用相当于switch选择语句 } while(input); system("pause"); return 0; }