实现一个通讯录;
通讯录可以用来存储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.add 2.del 3.find***n"); printf("***4.mod 5.show 6.elim***n"); printf("***7.sort 0.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 %-30sn", "名字", "性别", "年龄", "电话", "住址"); for (i = 0; i < pc->sz; i++) { printf("%-10s %-10s %-10d %-12s %-30sn", 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 %-30sn", "名字", "性别", "年龄", "电话", "住址"); printf("%-10s %-10s %-10d %-12s %-30sn", 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.比较的方式。
当然第四个需要自己来写个函数。



