实现一个通讯录:
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名,年龄,电话,地址,性别。
提供方法:
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.以名字排序所有联系人
7.清空所有联系人
实现时注意的要点:
1.用结构体来存储联系人的信息->PeoInfo
2.用数组来存储总共多少个联系人,并用count来记录有多少个联系人
3.使用枚举来实现程序的可读性
以下是代码实现:
头文件contact.h
#ifndef __CONTACT_H__ #define __CONTACT_H__ #include<stdio.h> #include<string.h> enum OPTION { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT, EMPTY }; enum Modify { EXIT1, NAME, AGE, TEL, ADDR, SEX }; #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TEL 50 #define MAX_ADDR 100 #define MAX 1000 typedef struct PeoInfo //用数组存放通讯录中的人数,而人的信息用结构体存储 { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tel[MAX_TEL]; char addr[MAX_ADDR]; }PeoInfo; typedef struct Contact //此结构体存放要修改的数组和记录当前元素的个数变量 { PeoInfo data[MAX] ; int count ; //存放当前元素的个数 }Contact,*pContact ; //Contact是一种类型,对struct Contact *进行了类型重命名,则pContact是一种指针类型,如同int * void InitContact(pContact pc); //初始化数组和count void AddContact(pContact pc ); //添加 int find(pContact pc); //查找指定联系人的信息 void DelContact(pContact pc); //删除 void SearchContact(pContact pc); //查找 void ModifyContact(pContact pc); //修改 void ShowContact(pContact pc); //显示 void SortContact(pContact pc); //排序 void EmptyContact(pContact pc); //清空 #endif // !__CONTACT_H__
contact.c
#include"contact.h" void Modifymenu() { printf("**********************\n"); printf("******* 1.NAME ******\n"); printf("******* 2.AGE ******\n"); printf("******* 3.TEL ******\n"); printf("******* 4.ADDR ******\n"); printf("******* 5.SEX ******\n"); printf("******* 0.EXIT1******\n"); } void InitContact(pContact pc) //初始化数组和count { pc->count = 0; memset(pc->data, 0, sizeof(pc->data)); } void AddContact(pContact pc) //添加 { if (pc->count == MAX) { printf("通讯录已满\n"); return ; } //进行添加操作 printf("请输入名字->"); scanf("%s", pc->data[pc->count].name); printf("请输入年龄->"); scanf("%d", &(pc->data[pc->count].age)); printf("请输入电话->"); scanf("%s", pc->data[pc->count].tel); printf("请输入地址->"); scanf("%s", pc->data[pc->count].addr); printf("请输入性别->"); scanf("%s", pc->data[pc->count].sex); pc->count++; } int find(pContact pc) ///查找指定联系人的信息 { int i = 0; char name[MAX_NAME]; printf("请输入要查找联系人的姓名->\n"); scanf("%s", name); for (i = 0; i < pc->count; i++) { if (strcmp(name, pc->data[i].name) == 0) { return i; //查找成功返回下标 } } return -1; //跳出循环说明没有找到,返回-1 } void DelContact(pContact pc) //删除 { int i = 0; if (pc->count == 0) { printf("通讯录为空\n"); return; } //删除操作,在进行删除操作时,先要进行查找这个联系人,如果这个联系人存在才能进行删除,否则不能删除 int ret = find(pc); //用一个变量接收函数返回值,如果返回不为-1,就说明可以进行删除操作 if (ret != -1) //可以进行删除操作,删除操作的本质是让数组-1,count-1,所查找的联系 人,而返回的ret为该下标值,怎么删掉这个值呢?,就是把后面的值往前挪 { for (i = ret; i < pc->count -ret- 1; i++) //往前挪 { pc->data[i] = pc->data[i + 1]; } pc->count--; printf("删除成功\n"); } else { printf("该联系人不存在\n"); } } void ShowContact(pContact pc) //显示 { int i = 0; if (pc->count == 0) { printf("通讯录为空\n"); return; } for (i = 0; i < pc->count; i++) { printf("%-5s %-3d %-5s %-11s %-5s", pc->data[i].name, pc->data[i].age, pc->data[i].sex,pc->data[i].tel,pc->data[i].addr); printf("\n"); } printf("———————————————————\n"); } void SearchContact(pContact pc) //查找 { //查找联系人,查找完成后显示联系人的信息 int ret = find(pc); if (ret != -1) { printf("姓名: %s 年龄: %d 性别: %s 电话: %s 地址: %s\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tel, pc->data[ret].addr); } else { printf("查找失败,该联系人不存在\n"); return; } printf("———————————————————\n"); } void ModifyContact(pContact pc) //修改 { //修改时,先要进行查询,判断联系人是否存在 int ret = find(pc); int input = 0; if (ret != -1) { Modifymenu(); printf("请输入要修改的信息->"); scanf("%d", &input); switch (input) { case NAME: printf("请输入修改后的姓名->"); scanf("%s", pc->data[ret].name); break; case AGE: printf("请输入修改后的年龄->"); scanf("%d", &(pc->data[ret].age)); break; case SEX: printf("请输入修改后的性别->"); scanf("%s", pc->data[ret].sex); break; case TEL: printf("请输入修改后的电话->"); scanf("%s", pc->data[ret].tel); break; case ADDR: printf("请输入修改后的地址->"); scanf("%s", pc->data[ret].addr); break; case EXIT1: break; default: printf("输入错误\n"); break; } printf("修改成功\n"); } else { printf("该联系人不存在\n"); return; } } void SortContact(pContact pc) //排序,以名字的方式排序 { //采用冒泡排序 int i = 0; int j = 0; for (i = 0; i < pc->count - 1; i++) { for (j = 0; j < pc->count - 1; j++) { if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) { PeoInfo tmp; //定义一个同样类型的变量 tmp = pc->data[j]; pc->data[j] = pc->data[j + 1]; pc->data[j + 1] = tmp; } } } printf("排序完成\n"); printf("———————————————————\n"); ShowContact(pc); printf("———————————————————\n"); } void EmptyContact(pContact pc) //清空 { memset(pc->data, 0, sizeof(pc->data)); pc->count = 0; printf("清空成功\n"); printf("———————————————————\n"); }
test.c
#include"contact.h" void menu() { printf("*********************************\n"); printf("**** 1.add 2.del ****\n"); printf("**** 3.search 4.modify ****\n"); printf("**** 5.show 6.sort ****\n"); printf("**** 7.empty 0.exit ****\n"); printf("*********************************\n"); } int main() { int input = 0; Contact my_con; InitContact(&my_con); do { menu(); printf("请选择->"); scanf("%d", &input); switch (input) { case ADD: AddContact(&my_con); //传入的是地址 break; case DEL: DelContact(&my_con); break; case SEARCH: SearchContact(&my_con); break; case MODIFY: ModifyContact(&my_con); break; case SHOW: ShowContact(&my_con); break; case SORT: SortContact(&my_con); break; case EMPTY: EmptyContact(&my_con); break; case EXIT: break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }
下图为操作结果: