编辑
前言
大家好,我是程序猿爱打拳。今天我给大家带来的是C语言实现通讯录,主要的实现方式是结构体。
目录
1.设计思想
首先,我们在设计一个通讯录的时候。我们得知道通讯录的基本功能是什么。比如当你在街上遇见一个女孩你很中意她,因此首先你要做的是向她要电话号码,这时候我们手机的通讯录就发挥作用了,当你要到电话号码后你得死皮赖脸一点再问她要姓名然后继续发起攻势问她要住址、年龄。这样通讯录存入的一条记录就诞生了。当然,某一天你跟这个女生聊掰了,你想删除关于她所有的信息。这时你要使用到的功能就是删除信息。当然我们可以把模块设置得更丰富一些,因此我们设计可以有以下几个模块:
- 增加信息
- 删除信息
- 查找信息
- 修改信息
- 显示信息
2.各个模块的实现
(1)增加信息
//函数的声明 void AddContact(Console* pc); //函数的定义 void AddContact(Console* pc) { if (pc->sz == Per_Max) { printf("通讯录人员已满!\n"); return; } printf("请输入姓名:>"); scanf("%s", pc->date[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->date[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->date[pc->sz].sex); printf("请输入地址:>"); scanf("%s", pc->date[pc->sz].addr); printf("请输入电话:>"); scanf("%d", &(pc->date[pc->sz].tele)); pc->sz++; }
(2)删除信息
//函数的声明 void DeleContact(Console* pc); //函数的定义 void DeleContact(Console* pc) { char key[Name_Max] = {0}; int i = 0; int pos = 0; if (pc->sz == 0) { printf("通讯录里面还没有记录!\n"); return; } printf("请输入此人的姓名:>"); scanf("%s", &key); for (i = 0; i < pc->sz; i++) { if (strcmp(pc->date[i].name, key) == 0) { pos = i; break; } } for (i = pos; i < pc->sz-1; i++) { pc->date[i] = pc->date[i+1]; } pc->sz--; printf("删除成功!\n"); }
(3)查找信息
//函数的声明-查找信息 void SearchContact(Console* pc); //函数的定义 void SearchContact(Console* pc) { char key[Name_Max]; int i = 0; int ret = -1; printf("请输入查找人的姓名:>"); scanf("%s", key); for (i = 0; i < pc->sz; i++) { if (strcmp(pc->date[i].name,key) == 0) { ret = 1; break; } } if (ret==-1) { printf("没有此人!"); } else { printf("查找的信息为:\n"); printf("%-10s%-10d%-10s%-10s%-10d\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].addr, pc->date[i].tele ); } }
(4)修改信息
//函数的声明-修改信息 void ModifyContact(Console* pc); //函数的定义 void ModifyContact(Console* pc) { assert(pc); char key[Name_Max]; int i = 0; int ret = -1; printf("请输入你要修改的人姓名:>"); scanf("%s", key); for (i = 0; i < pc->sz; i++) { if (strcmp(pc->date[i].name, key) == 0) { ret = 1; break; } } if (ret == -1) { printf("没有此人!\n"); } else { printf("此人的信息为:\n"); printf("%-10s%-10d%-10s%-10s%-10d\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].addr, pc->date[i].tele ); } printf("请输入姓名:>"); scanf("%s", pc->date[i].name); printf("请输入年龄:>"); scanf("%d", &(pc->date[i].age)); printf("请输入性别:>"); scanf("%s", pc->date[i].sex); printf("请输入地址:>"); scanf("%s", pc->date[i].addr); printf("请输入电话:>"); scanf("%d", &(pc->date[i].tele)); printf("修改成功!\n"); }
(5)显示信息
//函数的声明-显示信息 void ShowContact(Console* pc); //函数的定义 void ShowContact(Console* pc) { int i = 0; printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "年龄", "性别", "地址", "电话"); for (i = 0; i < pc->sz; i++) { printf("%-10s%-10d%-10s%-10s%-10d\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].addr, pc->date[i].tele ); } }
3.最终效果展示
为了编写程序的便利,我们一般模块化编写程序,各个函数用到头文件和函数的声明我们封装到一个名为.h的头文件里面。函数的定义我们放到一个.c的文件里面,主函数我们再放入另一个.c的文件里面。那么我在设计通讯录的工程中,我把各个函数用到头文件和函数的声明放到contact.h文件中,函数的定义放到contact.c文件中,主函数放到test.c文件中。
(1)contact.h文件中
//Person结构体内的参数设置 #define Per_Max 100 #define Name_Max 20 #define Sex_Max 5 #define Addr_Max 20 //各个函数用到的头文件 #include<stdio.h> #include<string.h> #include<assert.h> //定义Person结构体 typedef struct Person { char name[Name_Max]; int age; char sex[Sex_Max]; char addr[Addr_Max]; int tele; }Person; //控制Person结构体 typedef struct Console { Person date[Per_Max]; int sz; }Console; //初始化通讯录 void InitContact(Console* pc); //增加信息 void AddContact(Console* pc); //删除信息 void DeleContact(Console* pc); //查找信息 void SearchContact(Console* pc); //修改信息 void ModifyContact(Console* pc); //显示信息 void ShowContact(Console* pc);
(2)contact.c文件中
//引入contact.h头文件 #include"contact.h" //初始化通讯录 void InitContact(Console* pc) { assert(pc); memset(pc->date, 0, sizeof(pc->date)); pc->sz = 0; } //增加信息 void AddContact(Console* pc) { assert(pc); if (pc->sz == Per_Max) { printf("通讯录人员已满!\n"); return; } printf("请输入姓名:>"); scanf("%s", pc->date[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->date[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->date[pc->sz].sex); printf("请输入地址:>"); scanf("%s", pc->date[pc->sz].addr); printf("请输入电话:>"); scanf("%d", &(pc->date[pc->sz].tele)); pc->sz++; } //删除信息 void DeleContact(Console* pc) { assert(pc); char key[Name_Max] = {0}; int i = 0; int pos = 0; if (pc->sz == 0) { printf("通讯录里面还没有记录!\n"); return; } printf("请输入此人的姓名:>"); scanf("%s", &key); for (i = 0; i < pc->sz; i++) { if (strcmp(pc->date[i].name, key) == 0) { pos = i; break; } } for (i = pos; i < pc->sz-1; i++) { pc->date[i] = pc->date[i+1]; } pc->sz--; printf("删除成功!\n"); } //查找信息 void SearchContact(Console* pc) { assert(pc); char key[Name_Max]; int i = 0; int ret = -1; printf("请输入查找人的姓名:>"); scanf("%s", key); for (i = 0; i < pc->sz; i++) { if (strcmp(pc->date[i].name,key) == 0) { ret = 1; break; } } if (ret==-1) { printf("没有此人!"); } else { printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "年龄", "性别", "地址", "电话"); printf("%-10s%-10d%-10s%-10s%-10d\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].addr, pc->date[i].tele ); } } //修改信息 void ModifyContact(Console* pc) { assert(pc); char key[Name_Max]; int i = 0; int ret = -1; printf("请输入你要修改的人姓名:>"); scanf("%s", key); for (i = 0; i < pc->sz; i++) { if (strcmp(pc->date[i].name, key) == 0) { ret = 1; break; } } if (ret == -1) { printf("没有此人!\n"); } else { printf("此人的信息为:\n"); printf("%-10s%-10d%-10s%-10s%-10d\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].addr, pc->date[i].tele ); } printf("请输入姓名:>"); scanf("%s", pc->date[i].name); printf("请输入年龄:>"); scanf("%d", &(pc->date[i].age)); printf("请输入性别:>"); scanf("%s", pc->date[i].sex); printf("请输入地址:>"); scanf("%s", pc->date[i].addr); printf("请输入电话:>"); scanf("%d", &(pc->date[i].tele)); printf("修改成功!\n"); } //显示信息 void ShowContact(Console* pc) { assert(pc); int i = 0; printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "年龄", "性别", "地址", "电话"); for (i = 0; i < pc->sz; i++) { printf("%-10s%-10d%-10s%-10s%-10d\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].addr, pc->date[i].tele ); } }
(3)test.c文件中
//引入contact.h头文件 #include"contact.h" //菜单 void men() { printf("+--------------+--------------+\n"); printf("| 1.增加信息 | 2.删除信息 |\n"); printf("+--------------+--------------+\n"); printf("| 3.查找信息 | 4.修改信息 |\n"); printf("+--------------+--------------+\n"); printf("| 5.显示信息 | 0.退出程序 |\n"); printf("+--------------+--------------+\n"); } //主函数 int main() { int input = 0; Console con; InitContact(&con); do { men(); printf("请输入你的选项:>"); scanf("%d", &input); switch (input) { case 0: printf("你已退出程序!"); break; case 1: AddContact(&con); break; case 2: DeleContact(&con); break; case 3: SearchContact(&con); break; case 4: ModifyContact(&con); break; case 5: ShowContact(&con); break; default: printf("请选择正确的选项!"); break; } } while (input); return 0; }
效果展示:
编辑
编辑
编辑
编辑
编辑
编辑
注意:
细心的伙伴会发现,我们每一个函数的实现都用到了查找信息。因此我们可以把查找信息专门设置为一个函数。因此每个函数都可以调用查找信息函数,实现函数的嵌套,你可以尝试一下。
当然,每当这个程序退出去以后。所有的信息都会消失,我们得重新输入。这就是单个语言的局限性,因此我们需要学习数据库知识。或者你可以通过.text文件保存下来,你也可以尝试下。
此通讯录可以增添功能,如排序等等。
以上就是本次博文的内容,感谢阅读!
编辑
Never Give Up