前言:
今天我们做一个简单的通讯录,同时也能加深对C语言的理解。
实现一个通讯录,我们要在通讯录中保存人的信息:
名字、年龄、性别、电话、地址。
我们也要知道编写通讯录的流程:
通讯录中存放100个人的信息
增加联系人
删除联系人
修改联系人
查找联系人
显示所有联系人的信息
排序功能.
首先创建三个文件然后在进行编写:
test.c——测试通讯录
contact.h——函数和类型的声明
contact.c——函数的实现
一、在通讯录中存放100个人的信息
1.1设置保存人信息的结构体
//定义一个结构体 typedef struct Communication { char name[20];//姓名 int age;//年龄 char sex[5];//性别 char tele[12];//电话 char addr[30];//地址 }com;
以上的内容如果经常用到的话,我们就#define来定义标识符
更改后:
#define MAX 100//可以增加的人数 #define NAME_MAX 20//姓名 #define SEX_MAX 5//性别 #define TELE_MAX 12//电话 #define ADDR_MAX 20//地址 //定义一个结构体 typedef struct Communication { char name[NAME_MAX];//姓名 int age;//年龄 char sex[SEX_MAX];//性别 char tele[TELE_MAX];//电话 char addr[ADDR_MAX];//地址 }com;
1.2设置一个通讯录,并且初始化
在构建一个结构体,定义一个通讯录
//定义一个通讯录 typedef struct Comcation { com data[100];//可以存100个人的信息 int sz;//记录存放人的位置 }contact;
让通讯录初始化
//通讯录初始化 void initCantact(contact* pc) { memset(pc->data, 0, sizeof(pc->data));//开辟空间,并且赋值为0 pc->sz = 0; }
做个菜单:
void menu(void) { printf("————————————————————\n"); printf("|***************************************|\n"); printf("|*****1.增加联系人 2.删除联系人*****|\n"); printf("|*****3.修改联系人 4.查找联系人*****|\n"); printf("|*****5.显示所有联系人 6.排序 *****|\n"); printf("|*****7.清除所有联系人 0.退出程序 ****|\n"); printf("|***************************************|\n"); printf("————————————————————\n"); }
二、增加联系人
静态存储,存储满了,就不能在增加
//增加联系人 void Addcontact(contact* pc) { if (pc->sz == MAX) { printf("通讯录已满,无法添加\n"); return; } printf("请输入名字:"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话号码:"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("成功增加联系人\n"); }
三、删除联系人
先找到要删除的人的下标sz,然后从找到的下标开始往后遍历,把后面的值移到前移位,最后吧总数sz减1,当然还要注意下标为0时的特殊情况。
//删除联系人 void Delcontact(contact* pc) { if (pc->sz == 0) { printf("没有联系人,无需删除\n"); return; } char arr[20] = {0}; assert(pc); printf("请输入要删除的人的名字:"); scanf("%s",arr);//名字 int n; n= Findcontact(pc,arr); if (n == -1) { printf("没找到\n"); return; } else//找到了 { int i = 0; for (i = n; i < pc->sz - 1; i++)//从当前位置开始,把后面的值都往前面挪一位 { pc->data[i] = pc->data[i + 1]; } pc->sz--; } printf("成功删除联系人\n"); }
四、修改联系人
先对联系人为0进行判断,然后在输入要修改的人的姓名,找到修改人的位置,把该位置上的信息全部更改,达到修改的目的。
//修改联系人 void Modfycontatc( contact* pc) { assert(pc); char name[20] = { 0 }; if (pc->sz == 0) { printf("没有联系人,无需修改\n"); return; } printf("请输入要修改人的名字;"); scanf("%s", name); int n=0; n = Findcontact( pc, name); if (n == -1) { printf("要修改的人不存在\n"); } else { printf("请输入修改后的名字:"); scanf("%s", pc->data[n].name); printf("请输入修改后的年龄:"); scanf("%d", &(pc->data[n].age)); printf("请输入修改后的性别:"); scanf("%s", pc->data[n].sex); printf("请输入修改后的电话号码:"); scanf("%s", pc->data[n].tele); printf("请输入修改后的地址:"); scanf("%s", pc->data[n].addr); printf("修改成功\n"); } }
五、查找指定联系人
先查找联系人,要判断下标为0时情况,返回该联系人的位置i,
//查找联系人 int Findcontact( contact* pc, char arr[20]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, arr)==0)//找到了 { return i; } } return -1;//没找到 }
查找指定联系人:根据返回的信息i,找到该联系人的位置,然后判断是否找到在打印。
//查找指定联系人 void Searchcontact(contact* pc) { assert(pc); char p[20] = {0}; printf("请输入要查找人的姓名:"); scanf("%s", p); int n = Findcontact(pc, p); if (n == -1) { printf("要查找的人不存在\n"); } else { printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n","名字","年龄","性别","电话","地址"); //打印数据 printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[n].name, pc->data[n].age, pc->data[n].sex, pc->data[n].tele, pc->data[n].addr); } }
六、显示所有联系人的信息
直接遍历打印已经添加的联系人
//显示联系人 void Showcontact(const contact* pc) { int i = 0; for (i = 0; i < pc->sz; i++) { printf("%s\t%d\t%s\t%s\t%s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } }
七、排序功能
这里我用到了快排,然后通过回调函数comper进行比较
int comper(const void* p1, const void* p2)//字符比较 { return strcmp(((com*)p1)->name, ((com*)p2)->name); } //按名字进行排序 void Sortcontact(contact* pc) { qsort(pc->data, pc->sz, sizeof(com), comper); }
八、清空所有联系人
直接让sz赋值0就可以了
//清空联系人 void Emptycontact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("联系人为空,无需清空\n"); } else { pc->sz = 0; printf("清空成功\n"); } }
九、完整代码
一个静态版本的通讯录完成了,写完后能够加深对C语言的理解,有兴趣的朋友可以去尝试尝试
9.1cantact.h头文件
函数的声明和定义:
#pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #define MAX 100//可以增加的人数 #define NAME_MAX 20//姓名 #define SEX_MAX 5//性别 #define TELE_MAX 12//电话 #define ADDR_MAX 20//地址 //定义一个结构体 typedef struct Communication { char name[NAME_MAX];//姓名 int age;//年龄 char sex[SEX_MAX];//性别 char tele[TELE_MAX];//电话 char addr[ADDR_MAX];//地址 }com; //定义一个通讯录 typedef struct Comcation { com data[MAX];//可以存100个人的信息 int sz;//记录存放人的位置 }contact; //给通讯录赋初值 void initCantact(contact* pc); //菜单 void menu(void); //增加联系人 void Addcontact(contact* pc); //显示联系人 void Showcontact(const contact* pc); //删除联系人 void Delcontact(contact* pc); //查找联系人 int Findcontact(contact* pc, char arr[20]); //查找指定联系人 void Searchcontact(contact* pc); //修改联系人 void Modfycontatc(contact* pc); //联系人按名字进行排序 void Sortcontact(contact* pc); //清空联系人 void Emptycontact(contact* pc);
9.2cantact.c源文件
函数的实现:
#include "cantact.h" //通讯录初始化 void initCantact(contact* pc) { assert(pc); memset(pc->data, 0, sizeof(pc->data));//开辟空间,并且赋值为0 pc->sz = 0; } //增加联系人 void Addcontact(contact* pc) { assert(pc); if (pc->sz == MAX) { printf("通讯录已满,无法添加\n"); return; } printf("请输入名字:"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话号码:"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("成功增加联系人\n"); } //显示联系人 void Showcontact(const contact* pc) { assert(pc); printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n\n", "名字", "年龄", "性别", "电话", "地址"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } } //查找联系人 int Findcontact( contact* pc, char arr[20]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, arr)==0)//找到了 { return i; } } return -1;//没找到 } //删除联系人 void Delcontact(contact* pc) { if (pc->sz == 0) { printf("没有联系人,无需删除\n"); return; } char arr[20] = {0}; assert(pc); printf("请输入要删除的人的名字:"); scanf("%s",arr);//名字 int n; n= Findcontact(pc,arr); if (n == -1) { printf("没找到\n"); return; } else//找到了 { int i = 0; for (i = n; i < pc->sz - 1; i++)//从当前位置开始,把后面的值都往前面挪一位 { pc->data[i] = pc->data[i + 1]; } pc->sz--; } printf("成功删除联系人\n"); } //查找指定联系人 void Searchcontact(contact* pc) { assert(pc); char p[20] = {0}; printf("请输入要查找人的姓名:"); scanf("%s", p); int n = Findcontact(pc, p); if (n == -1) { printf("要查找的人不存在\n"); } else { printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n","名字","年龄","性别","电话","地址"); //打印数据 printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[n].name, pc->data[n].age, pc->data[n].sex, pc->data[n].tele, pc->data[n].addr); } } //修改联系人 void Modfycontatc( contact* pc) { assert(pc); char name[20] = { 0 }; if (pc->sz == 0) { printf("没有联系人,无需修改\n"); return; } printf("请输入要修改人的名字;"); scanf("%s", name); int n=0; n = Findcontact( pc, name); if (n == -1) { printf("要修改的人不存在\n"); } else { printf("请输入修改后的名字:"); scanf("%s", pc->data[n].name); printf("请输入修改后的年龄:"); scanf("%d", &(pc->data[n].age)); printf("请输入修改后的性别:"); scanf("%s", pc->data[n].sex); printf("请输入修改后的电话号码:"); scanf("%s", pc->data[n].tele); printf("请输入修改后的地址:"); scanf("%s", pc->data[n].addr); printf("修改成功\n"); } } int comper(const void* p1, const void* p2)//字符比较 { return strcmp(((com*)((contact*)p1)->data)->name, ((com*)((contact*)p2)->data)->name); } //按名字进行排序 void Sortcontact(contact* pc) { qsort(pc, pc->sz, sizeof(pc->data[0]), comper);//快排 } //清空联系人 void Emptycontact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("联系人为空,无需清空\n"); } else { pc->sz = 0; printf("清空成功\n"); } }
9.3test.c源文件
测试通讯录:
#include "cantact.h" //菜单 void menu(void) { printf("————————————————————\n"); printf("|***************************************|\n"); printf("|*****1.增加联系人 2.删除联系人*****|\n"); printf("|*****3.修改联系人 4.查找联系人*****|\n"); printf("|*****5.显示所有联系人 6.排序 *****|\n"); printf("|*****7.清除所有联系人 0.退出程序 ****|\n"); printf("|***************************************|\n"); printf("————————————————————\n"); } int main() { int input = 0; //通讯录初始化 contact pc; initCantact( &pc); do { menu(); printf("请选择:\n"); scanf("%d", &input);// switch (input) { case 1: Addcontact(&pc);//增加联系人 break; case 2: Delcontact(& pc);//删除联系人 break; case 3: Modfycontatc(&pc);//修改联系人 break; case 4: Searchcontact(&pc);//查找指定联系人 break; case 5: Showcontact(&pc);//显示联系人 break; case 6: Sortcontact(&pc);//按名字进行排序 break; case 7: //清空所以联系人 Emptycontact(&pc); break; case 0: printf("退出程序\n"); break; default: printf("输入错误,重新输入\n"); } } while (input); return 0; }