- 首页 > 知识库 > >
实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
实现这个通讯录小项目可以分三个 tect.c实现函数功能const.h来装头文件
gitee我把代码放在这两条链接里 。
https://gitee.com/ding-xushengyun/test.git
https://gitee.com/ding-xushengyun/test.git
另外一个.文件来调用 。
先在.h中创一个结构体来包括姓名、性别、年龄、电话、住址
#pragma once#define _CRT_SECURE_NO_WARNINGS#define NUME_NAME 10#define NUME_SEX 4#define NUME_TELE 20#define NUME_ADDRESS 30//结构体--通讯录个人内容 。typedef struct peoInfo{char name[NUME_NAME];char sex[NUME_SEX];char tele[NUME_TELE];char address[NUME_ADDRESS];int age;}peoInfo;
结构体里面char name[10]也对不过最好写宏,这样容易改数字 。
声明完结构体我们还要 写一个可以容纳1000个人的结构体数组,我们还得要一个sz来记录通讯录有多少个人信息 。这两个参数,无论查找 添加都得用,直接传俩个参数太零散了 。
我们可以再用一个结构体来包括这两个//sz--记录通讯录保存的个数;con记录储存个人信息
typedef struct contact{peoInfo pos[NUME_MAX];int sz;}contact;
当然1000也用宏表示,便于修改 。
#define NUME_MAX 1000
然后声明contact con;
我们需要把它初始化为0(这个必须,例如:sz不初始化sz加减就 无效)
//初始化,通讯录 。
void Init_cotact(contact* pc){memset(pc->pos, 0, NUME_MAX);pc->sz = 0;}
可知道memset头文件
初始化这个可以用到通讯录清空这个功能上 。
void elime_contact(contact* pc){ //清空,引用一下初始化为0的函数 。Init_cotact(pc); printf("已经清空完成\n");}
正文:
首先先做个目录然后可以用switch case来做选项,因为多次输入我们可以采用do while来实现多次输入 。
当然case 1: case 2: 中的数字替换可以人机器来理解的更快 。
enum menu{ EXIT,//0 ADD,//1 DEL,//2 FIND,//3 MOD,//4 SHOW,//5 ELIME,//6 SORT//7};
void menu(){printf("**********************************\n");printf("*********简易通讯录***************\n");printf("**********************************\n");printf("----------------------------------\n");printf("***1.add2.del3.find***\n");printf("***4.mod5.show6.elim***\n");printf("***7.sort0.exit****\n");printf("----------------------------------\n");printf("**********************************\n");printf("**********************************\n");printf("**********************************\n");} int main(){int input = 0;contact con;Init_cotact(&con);//初始化,通讯录 。menu();do{printf("请选择:<");scanf("%d", &input);switch (input){case EXIT:printf("退出通讯录\n");break;case ADD:add_contact(&con);//添加break;case DEL:del_contact(&con);//删除break;case FIND:find_contact(&con);//查找break;case MOD:mod_contact(&con);//修改break;case SHOW:show_contact(&con);//显示break;case ELIME:elime_contact(&con);//清空break;case SORT:qort_contact(&con);//排序break;default:printf("输入无效,重新输入\n");break;}} while (input);//exit退出input为0时,退出 。return 0;}
实现通讯录的添加功能
void add_contact(contact* pc){ if (pc->sz == NUME_MAX)//NUME_MAX就是1000,宏 。{printf("通讯录已满\n");return; } //录入信息 。printf("请输入要添加人的姓名:\n"); scanf("%s", pc->pos[pc->sz].name); printf("请输入要添加人的性别:\n"); scanf("%s", pc->pos[pc->sz].sex); printf("请输入要添加人的年龄:\n"); scanf("%d", &(pc->pos[pc->sz].age)); printf("请输入要添加人的电话:\n"); scanf("%s", pc->pos[pc->sz].tele); printf("请输入要添加人的住址:\n"); scanf("%s", pc->pos[pc->sz].address); pc->sz++; printf("添加成功\n");}
然后再来实现显示功能 。
void show_contact(const contact* pc){ assert(pc);//来检验pc是不是空指针,是的话报错 。int i = 0; printf("%-10s %-10s %-10s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "住址"); for (i = 0; i < pc->sz; i++) {printf("%-10s %-10s %-10d %-12s %-30s\n", pc->pos[i].name, pc->pos[i].sex, pc->pos[i].age,pc->pos[i].tele, pc->pos[i].address); }}
添加 显示 功能都成功 。
删除修改查找功能有相同点如果通讯录里有这个人信息必须要查找到这个人信息所在的位置我们可以来封装一个函数(功能用来查找,找到返回下标,找不到返回负数 。)
int find_(contact* pc, char* name){ int i = 0; for (i = 0; i < pc->sz; i++) {if (strcmp(pc->pos[i].name, name) == 0)return i; } return -1;}int found(contact* pc){ char name[NUME_NAME]; scanf("%s", name); //查找 。int num = find_(pc, name); if (num == -1) {printf("通讯录中没有此人\n");return -2; } return num;}然后我们来实现这三个功能
void del_contact(contact* pc){ if (pc->sz == 0) {printf("通讯录为空无法删除\n");return; } int j = 0; printf("请输入你要删除地人的姓名:"); int num = found(pc); if (num == -2)return; //删除 。for (j = num; j < pc->sz - 1; j++) {pc->pos[j] = pc->pos[j + 1]; } pc->sz--; printf("删除成功\n");}void find_contact(contact* pc){ printf("请输入你要查找地人的姓名:"); int num = found(pc); if (num == -2)return; printf("%-10s %-10s %-10s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "住址"); printf("%-10s %-10s %-10d %-12s %-30s\n", pc->pos[num].name, pc->pos[num].sex, pc->pos[num].age, pc->pos[num].tele, pc->pos[num].address);}void mod_contact(contact* pc){ printf("请输入你要修改地人的姓名:"); int num = found(pc); if (num == -2)return; //修改 memset(pc->pos+num, 0, 1);//找到修改的地址后直接清楚重新添加 。printf("修改:请输入姓名:\n"); scanf("%s", pc->pos[num].name); printf("修改:请输入性别:\n"); scanf("%s", pc->pos[num].sex); printf("修改:请输入年龄:\n"); scanf("%d", &(pc->pos[num].age)); printf("修改:请输入电话:\n"); scanf("%s", pc->pos[num].tele); printf("修改:请输入住址:\n"); scanf("%s", pc->pos[num].address); printf("修改成功\n");}
通讯录排序我们可以用qsort这库函数
int cmp(const peoInfo* e1, const peoInfo* e2){ assert(e1 && e2); return strcmp(e1->name, e2->name);}int cmp1(const peoInfo* e1, const peoInfo* e2){ assert(e1 && e2); return strcmp(e1->sex, e2->sex);}int cmp2(const int* e1, const int* e2){ assert(e1 && e2); return (*e1) - (*e2);}int cmp3(const peoInfo* e1, const peoInfo* e2){ assert(e1 && e2); return strcmp(e1->tele, e2->tele);}int cmp4(const peoInfo* e1, const peoInfo* e2){ assert(e1 && e2); return strcmp(e1->address, e2->address);}void qort_contact(contact* pc){ int a = 0; printf("1.姓名 2.性别 3.年龄 4.电话 5.住址\n"); printf("请选择按几号排序?"); scanf("%d", &a); if (a == 1)qsort(pc->pos, pc->sz, sizeof(pc->pos[0]), cmp); else if (a == 2)qsort(pc->pos, pc->sz, sizeof(pc->pos[0]), cmp1); else if (a == 3)qsort(pc->pos, pc->sz, sizeof(pc->pos[0]), cmp2); else if (a == 4)qsort(pc->pos, pc->sz, sizeof(pc->pos[0]), cmp3); else if (a == 5)qsort(pc->pos, pc->sz, sizeof(pc->pos[0]), cmp4); printf("排序完成\n");}需要注意的是它需要传 1.要排序的数组 2.元素个数3.每个元素个数的大小4.比较的方式 。
【c语言:通讯录的简易实现】当然第四个需要自己来写个函数 。