惠济区城乡建设局网站,保定网站制作策划,获取文章内容 wordpress,济南又出现5例通讯录功能概要及前提说明
此通讯录利用C语言完成#xff0c;可以实现八种功能的通讯录#xff08;添加、删除、查找、修改、显示、排序、退出、清空#xff09; 代码由三部分组成#xff0c;为什么要写成三部分而不写成一部分可以参考我以前的博客#xff0c;如下…通讯录功能概要及前提说明
此通讯录利用C语言完成可以实现八种功能的通讯录添加、删除、查找、修改、显示、排序、退出、清空 代码由三部分组成为什么要写成三部分而不写成一部分可以参考我以前的博客如下 链接: link 文章目录 通讯录功能概要及前提说明1.通信录具体功能2.初始化菜单3.通讯录存储的信息4.通讯录基本框架6.各个部分功能模块声明7.初始化模块8.增加联系人模块9.显示通讯录模块10.删除用户模块11.查找用户模块12.修改用户信息模块13.排序用户信息模块14.清除模块15.完整源代码 1.通信录具体功能
通讯录可以用来存储100个人的信息每个人的信息包括姓名、性别、年龄、电话、住址 提供方法 1.添加联系人信息 2.删除指定联系人信息 3.查找指定联系人信息 4.修改指定联系人信息 5.显示所有联系人信息 6.清空所有联系人 7.以名字/年龄/地址排序所有联系人 2.初始化菜单
void menu()
{printf(*********************************************\n);printf(*********************************************\n);printf(*********************************************\n);printf(*********1.添加 2.删除*************\n);printf(*********3.查找 4.修改*************\n);printf(*********5.显示 6.排序*************\n);printf(*********7.退出 8.清空*************\n);printf(*********************************************\n);printf(*********************************************\n);printf(*********************************************\n);
}3.通讯录存储的信息
使用 typedef 将 struct peoinfo 类型自定义成 peoinfo 更加方边后续使用。 利用宏定义设定各个参数的值后续不需要再重新定义。
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100//最大人数typedef struct peoinfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];}peoinfo;typedef struct contact
{peoinfo data[MAX];int sz;//记录当前人的信息个数
}contact;其中创建存放联系人的通讯录Contact存放MAX个联系人对应的信息。sz用于记录当前储存联系人的数量。 4.通讯录基本框架
enum option
{add1, del2,search3,modify,show,sort,run,clc
};int main()
{int input 0;contact con;//通讯录//初始化initcontact(con);do{menu();printf(请输入功能);scanf(%d, input);switch (input){case add:addcontact(con);break;case del:delcontact(con);break;case search:searchcontact(con);break;case modify:modifycontact(con);break;case show:showcontact(con);break;case sort:sortcontact(con);break;case run:printf(退出通讯录\n);break;case clc:clccontact(con);break;default:printf(输入非法请重新输入!\n);break;}} while (input ! 7);return 0;
}我们知道case后只能加整数为了更加直观的看到每一种功能我们可以创建枚举类型替换这些整数枚举类型成员的值从0开始递增1适用于代替case后的整数因为我么的菜单选项是从1到8所以这里我们定义枚举的第一个值为1这样后面就会默认排序到8。 通讯录运行通过do-while实现内部调用menu函数打印开始菜单然后提示用户选择功能。 6.各个部分功能模块声明
void initcontact(contact* pc);void addcontact(contact* pc);void showcontact(contact* pc);void delcontact(contact* pc);void searchcontact(contact* pc);void modifycontact(contact* pc);void sortcontact(contact* pc);void clccontact(contact* pc);代码的基本框架搭建完毕我们就要实现每一个选项的功能。这里是定义每一个功能的头文件声明后才能在别的原文件中使用。 7.初始化模块
void initcontact(contact* pc)
{assert(pc);pc-sz 0;memset(pc-data, 0, sizeof(pc-data));}给定的代码是一个函数initcontact它用于初始化一个名为contact的结构体指针pc。以下是对代码的分析 ①函数声明void initcontact(contact* pc) 声明了一个名为initcontact的函数它接受一个结构体指针pc作为参数并且没有返回值即返回类型为void。 ②断言assert(pc) 断言确保pc指针不为空。如果pc为空断言将失败并导致程序终止。 ③初始化pc-sz 0 将结构体指针pc的成员变量sz的值设置为0。这意味着将sz用作计数器或存储元素数量的变量。 ④内存清零memset(pc-data, 0, sizeof(pc-data)) 使用memset函数将结构体指针pc的成员变量data的内存块清零。sizeof(pc-data)用于确定pc-data成员的大小以确保清零操作覆盖整个内存块。 ⑤通过这些操作函数initcontact将结构体指针pc所指向的contact结构体进行初始化。初始化的结果是将sz设置为0并将data的内存块清零。 8.增加联系人模块
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);Sleep(2000);
}该代码定义了一个名为addcontact的函数函数参数为一个指向contact结构体的指针pc。 ①函数首先使用assert函数进行断言确保指针pc不为空。 ②然后判断通讯录的当前大小是否达到了最大值MAX如果达到了最大值则打印提示信息并返回。 ③如果通讯录未满则依次输入联系人的姓名、年龄、性别、电话和地址并将这些信息保存到通讯录中。 ④ 最后将通讯录的大小加1并打印添加成功的提示信息。使用Sleep函数暂停程序执行2秒后再弹出菜单继续选择。使使用者方便观察。 9.显示通讯录模块
void showcontact(contact* pc)
{assert(pc);if (pc-sz 0){printf(通讯录为空\n);return;}int i 0;printf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);for (i 0; i pc-sz; i){printf(%-10s%-5d%-5s%-12s%-30s\n, pc-data[i].name,pc-data[i].age,pc-data[i].sex,pc-data[i].tele,pc-data[i].addr);}Sleep(2000);
}该代码定义了一个名为showcontact的函数函数参数为一个指向contact结构体的指针pc。 ①函数首先使用assert函数进行断言确保指针pc不为空。 ②然后判断通讯录的大小是否为0如果为0则打印提示信息并返回。 ③接下来使用一个循环遍历通讯录中的每个联系人并依次打印其姓名、年龄、性别、电话和地址。 ④ 最后使用Sleep函数暂停程序执行2秒。 需要注意的是该代码依赖于一些未给出的头文件和结构体定义例如contact结构体的定义。另外该代码使用了格式化输出函数printf其中使用了%-10s、%-5d等格式控制符用于设置输出字段的宽度和对齐方式。 10.删除用户模块
int findname(contact* pc, char name[])
{assert(pc);int i 0;for (i 0; i pc-sz; i){if (strcmp(pc-data[i].name, name) 0){return 1;}}return -1;
}void delcontact(contact* pc)
{char name[NAME_MAX];assert(pc);if (pc-sz 0){printf(通讯录为空无法删除\n);return;}printf(输入要删除人的名字);scanf(%s, name);int ret findname(pc,name);if (ret -1){printf(要删除的人不存在\n);return;}int i 0;for (i ret; i pc-sz-1 ; i){pc-data[i] pc-data[i 1];}pc-sz--;printf(删除成功\n);Sleep(2000);
}该代码定义了两个函数findname和delcontact。 findname函数用于在通讯录中查找指定姓名的联系人函数参数为一个指向contact结构体的指针pc和一个字符数组name。 ①函数首先使用assert函数进行断言确保指针pc不为空。 ②然后使用一个循环遍历通讯录中的每个联系人通过strcmp函数比较联系人的姓名是否与指定的name相等。如果相等则返回1表示找到了该联系人。 ③如果遍历完整个通讯录都没有找到匹配的姓名则返回-1表示未找到。 ④delcontact函数用于从通讯录中删除指定姓名的联系人函数参数为一个指向contact结构体的指针pc。 ⑤函数首先使用assert函数进行断言确保指针pc不为空。 ⑥然后判断通讯录的大小是否为0如果为0则打印提示信息并返回。 ⑦接下来依次输入要删除的联系人的姓名并调用findname函数查找该联系人是否存在。如果不存在则打印提示信息并返回。 ⑧如果存在使用一个循环从找到的位置开始将后面的联系人逐个往前移动一位实现删除该联系人的功能。 ⑨最后将通讯录的大小减1并打印删除成功的提示信息。使用Sleep函数暂停程序执行2秒。 11.查找用户模块
void searchcontact(contact* pc)
{char name[NAME_MAX];assert(pc);printf(请输入要查找人的姓名);scanf(%s, name);int ret findname(pc, name);if (ret -1){printf(要查找的人不存在\n);return;}printf(查询成功\n);printf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);printf(%-10s%-5d%-5s%-12s%-30s\n, pc-data[ret].name,pc-data[ret].age,pc-data[ret].sex,pc-data[ret].tele,pc-data[ret].addr);Sleep(2000);
}该代码定义了一个名为searchcontact的函数函数参数为一个指向contact结构体的指针pc。 ①函数首先使用assert函数进行断言确保指针pc不为空。 ②然后输入要查找的联系人的姓名。 ③接下来调用findname函数查找该姓名的联系人在通讯录中的位置。如果返回值为-1则打印提示信息并返回。 ④如果返回值不为-1表示找到了该联系人打印查询成功的提示信息。 ⑤然后使用printf函数按照一定的格式打印该联系人的姓名、年龄、性别、电话和地址。 ⑥最后使用Sleep函数暂停程序执行2秒。 12.修改用户信息模块
void modifycontact(contact* pc)
{char name[NAME_MAX];assert(pc);printf(请输入要查找人的姓名);scanf(%s, name);int ret findname(pc, name);if (ret -1){printf(要修改的人不存在\n);return;}printf(请输入名字);scanf(%s, pc-data[ret].name);printf(请输入年龄);scanf(%d, (pc-data[ret].age));printf(请输入性别);scanf(%s, pc-data[ret].sex);printf(请输入电话);scanf(%s, pc-data[ret].tele);printf(请输入地址);scanf(%s, pc-data[ret].addr);printf(修改成功\n);}该代码定义了一个名为modifycontact的函数函数参数为一个指向contact结构体的指针pc。 ①函数首先使用assert函数进行断言确保指针pc不为空。 ②然后输入要修改的联系人的姓名。 ③接下来调用findname函数查找该姓名的联系人在通讯录中的位置。如果返回值为-1则打印提示信息并返回。 ④如果返回值不为-1表示找到了该联系人依次输入要修改的联系人的姓名、年龄、性别、电话和地址并将这些信息更新到通讯录中。 ⑤最后打印修改成功的提示信息。 13.排序用户信息模块
int cmp_name(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)-name, ((peoinfo*)p2)-name);
}int cmp_age(const void* p1, const void* p2)
{return ((peoinfo*)p1)-age-((peoinfo*)p2)-age;
}int cmp_addr(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)-addr, ((peoinfo*)p2)-addr);
}void sortcontact(contact* pc)
{int i 0;char sort_choose[10];char sort_choose1[] name;char sort_choose2[] age;char sort_choose3[] addr;A:printf(请输入根据什么进行排序);scanf(%s, sort_choose);if (strcmp(sort_choose,sort_choose1) 0){//利用qsort 函数qsort(pc-data, pc-sz, sizeof((pc-data)[0]), cmp_name);}else if (strcmp(sort_choose,sort_choose2) 0){qsort(pc-data, pc-sz, sizeof((pc-data)[1]), cmp_age);}else if (strcmp(sort_choose,sort_choose3) 0){qsort(pc-data, pc-sz, sizeof((pc-data)[4]), cmp_addr);}else{printf(无此排序参数请重新输入参数\n);goto A;}//打印列标题printf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);//打印数据for (i 0; i pc-sz; i){printf(%-10s%-5d%-5s%-12s%-30s\t\n,pc-data[i].name,pc-data[i].age,pc-data[i].sex,pc-data[i].tele,pc-data[i].addr);}Sleep(2000);
}该代码定义了三个比较函数cmp_name、cmp_age和cmp_addr。这些函数用于在排序通讯录时比较联系人信息的不同字段。 ①cmp_name函数用于比较联系人姓名的大小函数参数为指向两个联系人信息结构体的指针p1和p2。通过调用strcmp函数比较两个联系人的姓名并返回比较结果。 ② cmp_age函数用于比较联系人年龄的大小函数参数为指向两个联系人信息结构体的指针p1和p2。通过将第一个联系人的年龄减去第二个联系人的年龄并返回比较结果。 ③cmp_addr函数用于比较联系人地址的大小函数参数为指向两个联系人信息结构体的指针p1和p2。通过调用strcmp函数比较两个联系人的地址并返回比较结果。 ④sortcontact函数用于对通讯录中的联系人进行排序函数参数为一个指向contact结构体的指针pc。 ⑤函数首先定义一些变量和字符串数组用于接收用户输入的排序参数。 ⑥然后通过标签A实现一个循环提示用户输入根据什么进行排序。根据用户的输入分别调用qsort函数进行排序。排序时根据用户的选择调用不同的比较函数。 ⑦如果用户输入的排序参数无效则打印提示信息并跳转回标签A要求用户重新输入。 ⑧排序完成后先打印列标题然后依次打印排序后的联系人信息。 ⑨最后使用Sleep函数暂停程序执行2秒。 14.清除模块
void clccontact(contact* pc)
{pc-sz 0;memset(pc-data, 0, sizeof(pc-data));printf(通讯录已经清空\n);Sleep(2000);
}此代码实现了一个清空通讯录的函数。(即和初始化模块一样)函数接收一个指向联系人结构体的指针将通讯录结构体中的数据清空包括sz通讯录中已有联系人数量和data存放联系人信息的数组。最后输出提示信息“通讯录已经清空”并延时2秒。 此代码的功能比较简单只是清空通讯录。可以作为通讯录管理系统的一个基本操作函数之一。 15.完整源代码
test.c如下
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.h
#include adressbook.hvoid menu()
{printf(*********************************************\n);printf(*********************************************\n);printf(*********************************************\n);printf(*********1.添加 2.删除*************\n);printf(*********3.查找 4.修改*************\n);printf(*********5.显示 6.排序*************\n);printf(*********7.退出 8.清空*************\n);printf(*********************************************\n);printf(*********************************************\n);printf(*********************************************\n);
}enum option
{add1, del2,search3,modify,show,sort,run,clc
};int main()
{int input 0;contact con;//通讯录//初始化initcontact(con);do{menu();printf(请输入功能);scanf(%d, input);switch (input){case add:addcontact(con);break;case del:delcontact(con);break;case search:searchcontact(con);break;case modify:modifycontact(con);break;case show:showcontact(con);break;case sort:sortcontact(con);break;case run:printf(退出通讯录\n);break;case clc:clccontact(con);break;default:printf(输入非法请重新输入!\n);break;}} while (input ! 7);return 0;
}addressbook.c如下
#define _CRT_SECURE_NO_WARNINGS 1
#include adressbook.hvoid initcontact(contact* pc)
{assert(pc);pc-sz 0;memset(pc-data, 0, sizeof(pc-data));}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);Sleep(2000);
}void showcontact(contact* pc)
{assert(pc);if (pc-sz 0){printf(通讯录为空\n);return;}int i 0;printf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);for (i 0; i pc-sz; i){printf(%-10s%-5d%-5s%-12s%-30s\n, pc-data[i].name,pc-data[i].age,pc-data[i].sex,pc-data[i].tele,pc-data[i].addr);}Sleep(2000);
}int findname(contact* pc, char name[])
{assert(pc);int i 0;for (i 0; i pc-sz; i){if (strcmp(pc-data[i].name, name) 0){return 1;}}return -1;
}void delcontact(contact* pc)
{char name[NAME_MAX];assert(pc);if (pc-sz 0){printf(通讯录为空无法删除\n);return;}printf(输入要删除人的名字);scanf(%s, name);int ret findname(pc,name);if (ret -1){printf(要删除的人不存在\n);return;}int i 0;for (i ret; i pc-sz-1 ; i){pc-data[i] pc-data[i 1];}pc-sz--;printf(删除成功\n);Sleep(2000);
}void searchcontact(contact* pc)
{char name[NAME_MAX];assert(pc);printf(请输入要查找人的姓名);scanf(%s, name);int ret findname(pc, name);if (ret -1){printf(要查找的人不存在\n);return;}printf(查询成功\n);printf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);printf(%-10s%-5d%-5s%-12s%-30s\n, pc-data[ret].name,pc-data[ret].age,pc-data[ret].sex,pc-data[ret].tele,pc-data[ret].addr);Sleep(2000);
}void modifycontact(contact* pc)
{char name[NAME_MAX];assert(pc);printf(请输入要查找人的姓名);scanf(%s, name);int ret findname(pc, name);if (ret -1){printf(要修改的人不存在\n);return;}printf(请输入名字);scanf(%s, pc-data[ret].name);printf(请输入年龄);scanf(%d, (pc-data[ret].age));printf(请输入性别);scanf(%s, pc-data[ret].sex);printf(请输入电话);scanf(%s, pc-data[ret].tele);printf(请输入地址);scanf(%s, pc-data[ret].addr);printf(修改成功\n);}int cmp_name(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)-name, ((peoinfo*)p2)-name);
}int cmp_age(const void* p1, const void* p2)
{return ((peoinfo*)p1)-age-((peoinfo*)p2)-age;
}int cmp_addr(const void* p1, const void* p2)
{return strcmp(((peoinfo*)p1)-addr, ((peoinfo*)p2)-addr);
}void sortcontact(contact* pc)
{int i 0;char sort_choose[10];char sort_choose1[] name;char sort_choose2[] age;char sort_choose3[] addr;A:printf(请输入根据什么进行排序);scanf(%s, sort_choose);if (strcmp(sort_choose,sort_choose1) 0){//利用qsort 函数qsort(pc-data, pc-sz, sizeof((pc-data)[0]), cmp_name);}else if (strcmp(sort_choose,sort_choose2) 0){qsort(pc-data, pc-sz, sizeof((pc-data)[1]), cmp_age);}else if (strcmp(sort_choose,sort_choose3) 0){qsort(pc-data, pc-sz, sizeof((pc-data)[4]), cmp_addr);}else{printf(无此排序参数请重新输入参数\n);goto A;}//打印列标题printf(%-10s%-5s%-5s%-12s%-30s\n, 名字, 年龄, 性别, 电话, 地址);//打印数据for (i 0; i pc-sz; i){printf(%-10s%-5d%-5s%-12s%-30s\t\n,pc-data[i].name,pc-data[i].age,pc-data[i].sex,pc-data[i].tele,pc-data[i].addr);}Sleep(2000);
}void clccontact(contact* pc)
{pc-sz 0;memset(pc-data, 0, sizeof(pc-data));printf(通讯录已经清空\n);Sleep(2000);
}addressbook.h如下
#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100#include stdio.h
#include assert.h
#include string.h
#include Windows.htypedef struct peoinfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];}peoinfo;typedef struct contact
{peoinfo data[MAX];int sz;//记录当前人的信息个数
}contact;void initcontact(contact* pc);void addcontact(contact* pc);void showcontact(contact* pc);void delcontact(contact* pc);void searchcontact(contact* pc);void modifycontact(contact* pc);void sortcontact(contact* pc);void clccontact(contact* pc);大家只需要将此代码按照文章开头设置为三部分点击运行即可。