本文章展示和讲解通过c语言编写通讯录及其各个功能
目录
1.编程的大致思路
对于通讯录,我们想到的第一个功能也是首要他的作用当然就是存放联系人的各种信息,包括姓名,电话,住址等等。此外,还有对联系人的增减,排序和信息修改等其他功能
对于选择功能来操作,需要一个选择界面来进行种种后续的操作。
所以首先,我们要设计一个菜单,上面注明我们想实现的功能和选择的方式。
设计好了菜单,我们就该实现各种功能了。因为功能偏多,所以我们要分开一个一个函数分别实现。
最重要的对于联系人信息的存放,我们知道联系人的信息有多种,他们的类型也是不同的。这时平时我们所考虑的数组是难以实现,就该搬结构体上场了。有了信息的存放和功能的实现再加上菜单的功能选择,我们的通讯录大致上也出来了。
下面,我们一一将其实现。
2.菜单的构建
大致用符号搭建一个,如果有其他的想法能够更好的运用符号可以结合自己的想法。但最重要的是当作功能的选择与操作引导
void menu()//菜单
{
printf("************************************\n");
printf("****** 1. add 2. del ******\n");
printf("****** 3. search 4. modify ******\n");
printf("****** 5. show 6. sort ******\n");
printf("****** 7. empty 0. exit ******\n");
printf("************************************\n");
}
3.联系人的存放(结构体的定义与声明)
typedef struct people//通讯录个人信息表格
{
char name[20];
int age;
char sex[5];
char addr[30];
char number[12];
}people; //重命名结构体
typedef struct contact//存放个人信息和目前存放人数->通讯录
{
people data[100];//存放个人信息总量
int sz;//目前存放人数
}contact;
4.功能的实现
首先,我们要对结构体类型的数组进行初始化
void initcontact(contact* pc)//初始化,全部初始化为0
{
pc->sz = 0;//给结构体的成员赋值
memset(pc->data, 0, sizeof(pc->data));//被赋值对象,赋的值,给多少字节赋值
}
4.1.联系人的增加
void addcontact(contact* pc)//增添信息
{
if (pc->sz == 100)//查看存放人数是否上限
{
printf("通讯录已满,无法添加\n");
return;//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].addr);
printf("请输入电话:");
scanf("%s", pc->data[pc->sz].number);
pc->sz++;//每存放完一位就移动到下标后一位
}
4.2.联系人的删除
删除功能是对指定的联系人进行删除,所以我们要先找到存放所要删除的联系人信息存放的位置才能将其删除
这里的删除是通过将下一位联系人的信息赋值给被删除联系人的位置,将其覆盖,达到删除的效果。
既然要通过联系人的姓名找到信息存放的位置,那我们还要实现一个删除函数的前置函数,能够通过名字找到联系人的信息存放位置
4.2.1.通过联系人姓名找到其信息存放位置的实现
int findname(contact* pc, char name[])//根据姓名查找通讯录中已存人物
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)//通过传参的姓名与已存放的姓名进行遍历与对比
{
return i;//返回查到联系人所存储的下标
}
}
return -1;//未查询到该姓名的联系人返回-1
}
4.2.2删除函数的实现
void delcontact(contact* pc)//删除,将后一位直接覆盖到所要删除的信息中
{
char name[20] = { 0 };//通过姓名找到所要删除的信息
if (pc->sz == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
printf("请输入所要删除的人的姓名:");
scanf("%s", name);//字符串不用取地址
int ret = findname(pc, name);//通过姓名查询联系人的信息
if (ret == -1)
{
printf("该人物不存在\n");
return;
}
for (int i = ret; i < pc->sz - 1; i++)//将所被删除联系人后一位的联系人信息
{ //向前覆盖
pc->data[i] = pc->data[i + 1];
}
pc->sz--;//已存放的人数记得删除后减少一位
printf("删除成功\n");
}
4.3联系人的查找并显示
这里也结合了上面根据姓名查找联系人的函数
void searchcontact(contact* pc)//查找联系人
{
char name[20] = { 0 };
printf("输入所要查找联系人的姓名:");
scanf("%s", name);
int ret = findname(pc, name);
if (ret == -1)
{
printf("所找联系人不存在\n");
return;
}
printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "姓名", "年龄", "性别", "地址", "电话");
printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[ret].name,
pc->data[ret].age,
pc->data[ret].sex,
pc->data[ret].addr,
pc->data[ret].number);
}
4.4联系人信息的修改
void modifycontact(contact* pc)
{
char name[20];
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[pc->sz].addr);
printf("请输入修改后的电话:");
scanf("%s", pc->data[ret].number);
printf("修改完成\n");
}
4.5目前联系人信息的展示
void showcontact(contact* pc)//显示已有联系人
{
printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
for (int i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].addr,
pc->data[i].number);
}
}
4.6根据姓名将联系人排序
void sortcontact(contact* pc)//con
{
for (int i = 0; i < pc->sz - 1; i++)//冒泡排序
{
for (int j = 0; j < pc->sz - 1 - i; j++)
{
if (strcmp((pc->data[j].name), (pc->data[j + 1].name)) > 0)
{
people tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序完毕\n");
printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
for (int i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].addr,
pc->data[i].number);
}
}
4.7清空目前联系人的信息
void emptycontact(contact* pc)//清空
{
pc->sz = 0;//存放人数变为0
memset(pc->data, 0, sizeof(pc->data));//memset再将其全部赋值成0
printf("清空完毕\n");
}
5.主函数的设计
上面,我们完成了对各个功能的设计,现在就像拼积木一样将他们组装起来。
int main()
{
int input = 0;
contact con;
initcontact(&con);//初始化
do
{
menu();//菜单
printf("请选择输出相应数字选择操作\n");
scanf("%d", &input);
switch (input)
{
case 1:
addcontact(&con);//增加
break;
case 2:
delcontact(&con);//删除
break;
case 3:
searchcontact(&con);//查找
break;
case 4:
modifycontact(&con);//修改
break;
case 5:
showcontact(&con);//展示
break;
case 6:
sortcontact(&con);//排序
break;
case 7:
emptycontact(&con);//清空
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("选择无效,请重新输出\n");
break;
}
} while (input);
return 0;
}
6.头文件(结构体与各部分函数的声明)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void menu();//菜单
typedef struct people//通讯录个人信息表格
{
char name[20];
int age;
char sex[5];
char addr[30];
char number[12];
}people;
typedef struct contact//存放个人信息和目前存放人数->通讯录
{
people data[100];//存放个人信息
int sz;//目前存放人数
}contact;
void initcontact(contact *pc);//初始化通讯录
void addcontact(contact* pc);//功能1,增添信息
void delcontact(contact* pc);//功能2,删除信息
void searchcontact(contact* pc);//功能3,查找联系人
void modifycontact(contact* pc);//功能4,修改已存联系人信息
void showcontact(contact* pc);//功能5,显示已有联系人
void sortcontact(contact* pc);//功能6,根据姓名排序
void emptycontact(contact* pc);//功能7,清空
7.完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void menu();//菜单
typedef struct people//通讯录个人信息表格
{
char name[20];
int age;
char sex[5];
char addr[30];
char number[12];
}people;
typedef struct contact//存放个人信息和目前存放人数->通讯录
{
people data[100];//存放个人信息
int sz;//目前存放人数
}contact;
void initcontact(contact *pc);//初始化通讯录
void addcontact(contact* pc);//功能1,增添信息
void delcontact(contact* pc);//功能2,删除信息
void searchcontact(contact* pc);//功能3,查找联系人
void modifycontact(contact* pc);//功能4,修改已存联系人信息
void showcontact(contact* pc);//功能5,显示已有联系人
void sortcontact(contact* pc);//功能6,根据姓名排序
void emptycontact(contact* pc);//功能7,清空
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()//菜单
{
printf("************************************\n");
printf("****** 1. add 2. del ******\n");
printf("****** 3. search 4. modify ******\n");
printf("****** 5. show 6. sort ******\n");
printf("****** 7. empty 0. exit ******\n");
printf("************************************\n");
}
void initcontact(contact* pc)//初始化,全部初始化为0
{
pc->sz = 0;//给结构体的成员赋值
memset(pc->data, 0, sizeof(pc->data));//被赋值对象,赋的值,给多少字节赋值
}
void addcontact(contact* pc)//增添信息
{
if (pc->sz == 100)
{
printf("通讯录已满,无法添加\n");
return;//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].addr);
printf("请输入电话:");
scanf("%s", pc->data[pc->sz].number);
pc->sz++;
}
int findname(contact* pc, char name[])//根据姓名查找通讯录中已存人物
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;//返回查到人物所存储的下标
}
}
return -1;
}
void delcontact(contact* pc)//删除,将后一位直接覆盖到所要删除的信息中
{
char name[20] = { 0 };//通过姓名找到所要删除的信息
if (pc->sz == 0)
{
printf("通讯录为空,无法删除\n");
return;
}
printf("请输入所要删除的人的姓名:");
scanf("%s", name);//字符串不用取地址
int ret = findname(pc, name);
if (ret == -1)
{
printf("该人物不存在\n");
return;
}
for (int i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
}
void searchcontact(contact* pc)//查找联系人
{
char name[20] = { 0 };
printf("输入所要查找联系人的姓名:");
scanf("%s", name);
int ret = findname(pc, name);
if (ret == -1)
{
printf("所找联系人不存在\n");
return;
}
printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "姓名", "年龄", "性别", "地址", "电话");
printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[ret].name,
pc->data[ret].age,
pc->data[ret].sex,
pc->data[ret].addr,
pc->data[ret].number);
}
void modifycontact(contact* pc)
{
char name[20];
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[pc->sz].addr);
printf("请输入修改后的电话:");
scanf("%s", pc->data[ret].number);
printf("修改完成\n");
}
void showcontact(contact* pc)//显示已有联系人
{
printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
for (int i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].addr,
pc->data[i].number);
}
}
void sortcontact(contact* pc)//con
{
for (int i = 0; i < pc->sz - 1; i++)
{
for (int j = 0; j < pc->sz - 1 - i; j++)
{
if (strcmp((pc->data[j].name), (pc->data[j + 1].name)) > 0)
{
people tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序完毕\n");
printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
for (int i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].addr,
pc->data[i].number);
}
}
void emptycontact(contact* pc)//清空
{
pc->sz = 0;//给结构体的成员赋值
memset(pc->data, 0, sizeof(pc->data));//被赋值对象,赋的值,给多少字节赋值
printf("清空完毕\n");
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
int main()
{
int input = 0;
contact con;
initcontact(&con);//初始化
do
{
menu();
printf("请选择输出相应数字选择操作\n");
scanf("%d", &input);
switch (input)
{
case 1:
addcontact(&con);
break;
case 2:
delcontact(&con);
break;
case 3:
searchcontact(&con);
break;
case 4:
modifycontact(&con);
break;
case 5:
showcontact(&con);
break;
case 6:
sortcontact(&con);
break;
case 7:
emptycontact(&con);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("选择无效,请重新输出\n");
break;
}
} while (input);
return 0;
}