作者:~小明学编程~
文章专栏:C语言练习题
目之所及皆为回忆,心之所向皆为过往
目录
前言
contact.h
text.c
contact.c
初始化函数
增加成员函数
删除成员函数
Find函数
删除成员
查找成员函数
修改成员函数
展示所有成员函数
成员排序函数
源码
本次文章主要介绍C语言实现通讯录,其中我们创建了三个文件,分别是test.c用于测试,里面主要是主函数和简单的菜单函数,然后是我们的contact.h头文件主要存放一些预处理,枚举类型的申明结构体的申明和函数的申明等,最后就是我们的contact.c,里面主要是各个函数的实现。
首先给大家介绍一下我们的头文件。
#define MAX 1000
#define MAX_name 20
#define MAX_sex 5
#define MAX_tele 12
#define MAX_addr 30
#include
#include
//枚举类型
enum Option
{
exit,
add,
del,
search,
modify,
show,
sort
};
//结构体类型用于存储用户数据
struct people
{
char name[MAX_name];
int age;
char sex[MAX_sex];
char tele[MAX_tele];
char addr[MAX_addr];
};
//通讯录类型用于存储数据和用户数量
struct contact
{
struct people data[MAX];//存放一个信息
int size;//记录当前已经有的元素个数
};
//函数申明
//初始化通讯录
void InitContact(struct contact* ps);
//增加成员
void Addcontact(struct contact* ps);
//展示成员
void Show_contact(struct contact* ps);
//删除成员
void DelContact(struct contact* ps);
//查找元素
void SearchContact(struct contact* ps);
//修改元素
void ModifyContact(struct contact* ps);
//排序成员
void Sort_contact(struct contact* ps);
里面主要就是我们的一些申明还有我们定义的结构体和枚举类型。
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("******** 欢迎进入通讯录系统 ********\n");
printf("******* 1.增加 2.删除 *******\n");
printf("******* 3.查找 4.修改 *******\n");
printf("******* 5.展示 6.排序 *******\n");
printf("************** 0.退出 **************\n");
printf("************************************\n");
}
int main()
{
int input = 0;
//创建通讯录
struct contact con;
//初始化通讯录
InitContact(&con);
do
{
//菜单
menu();
printf("请选择:\n");
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:
Show_contact(&con);
break;
case sort:
Sort_contact(&con);
break;
case exit:
printf("退出程序!\n");
break;
default:
printf("输入有误!\n");
break;
}
} while (input);
return 0;
}
该文件存放的是程序的主体部分,用过while循环和我们的switch语句实现循环选择和选择我们想要实现的功能。
此文件里面主要放的就是函数的实现了,下面逐一给大家详细介绍。
//初始化函数
void InitContact(struct contact* ps)
{
//将data里面的数据全部-初始化为0
memset(ps->data, 0, sizeof(ps->data));
//通讯录的最初值是0个元素
ps->size = 0;
}
我们利用C语言自带的库函数memset将我们data数字里面的数据全部置1。
//增添成员函数
void Addcontact(struct contact* ps)
{
if (ps->size == MAX)
{
printf("通讯录已满!\n");
}
else
{
printf("请输入名字:");
scanf("%s", ps->data[ps->size].name);
printf("请输入年龄:");
scanf("%d", &(ps->data[ps->size].age));
printf("请输入性别:");
scanf("%s", ps->data[ps->size].sex);
printf("请输入电话:");
scanf("%s", ps->data[ps->size].tele);
printf("请输入地址:");
scanf("%s", ps->data[ps->size].addr);
ps->size++;
printf("该用户信息添加成功!\n");
}
}
实现的主要思路就是通过指针直接指向我们的结构体中的指定位置对其赋值。
//查找指定成员
static int Find(struct contact* ps, char name[MAX_name])
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (strcmp(ps->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
我们通过循环遍历和字符串比较函数匹配指定的名字并返回相应的序号找到相对应的成。
//删除成员函数
void DelContact(struct contact* ps)
{
char name[MAX_name];
printf("请输入想删除人的名字:");
scanf("%s", name);
int pos = Find(ps, name);
if (pos == -1)
{
printf("查无此人!\n");
}
else
{
for (int j = pos; j < ps->size - 1; j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->size--;
printf("删除成功!\n");
}
}
当我们找到指定成员时就可以通过循环用后面的成员将前面的成员逐一代替掉,进而达到删除成员的目的。
//查找成员函数
void SearchContact(struct contact* ps)
{
char name[MAX_name];
printf("请输入想查找人的姓名:");
scanf("%s", name);
int pos = Find(ps, name);
if (pos == -1)
{
printf("查无此人!\n");
}
else
{
printf("%-7s\t%-4s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-7s\t%-4d\t%-5s\t%-12s\t%-20s\n", ps->data[pos].name,
ps->data[pos].age, ps->data[pos].sex, ps->data[pos].tele, ps->data[pos].addr);
}
}
当我们的成员比较多的时候我们通过指定人的姓名可以直接查找到相关的数据,然后将其打印出来。
//修改数据函数
void ModifyContact(struct contact* ps)
{
int ret = 0;
char name[MAX_name];
printf("请输入想修改人的姓名:");
scanf("%s", name);
int pos = Find(ps, name);
if (pos == -1)
{
printf("查无此人!\n");
}
else
{
printf("***********************************\n");
printf("******** 1.姓名 2.年龄 ***********\n");
printf("******** 3.性别 4.电话 ***********\n");
printf("******** 5.地址 0.放弃修改********\n");
printf("***********************************\n");
printf("请输入想要修改的元素:");
scanf("%d", &ret);
switch (ret)
{
case 1:
printf("请输入名字:");
scanf("%s", ps->data[pos].name);
break;
case 2:
printf("请输入年龄:");
scanf("%d", &(ps->data[pos].age));
break;
case 3:
printf("请输入性别:");
scanf("%s", ps->data[pos].sex);
break;
case 4:
printf("请输入电话:");
scanf("%s", ps->data[pos].tele);
break;
case 5:
printf("请输入地址:");
scanf("%s", ps->data[pos].addr);
break;
case 0:
printf("放弃修改!\n");
default:
printf("输入有误!\n");
}
}
}
首先我们通过Find函数找到想要修改的成员,然后我们通过switch语句选择我们想要修改的内容,然后进行修改就行了。
//展示所有成员函数
void Show_contact(struct contact* ps)
{
if (ps->size == 0)
{
printf("通讯录为空!\n");
}
else
{
printf("%-7s\t%-4s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i < ps->size; i++)
{
printf("%-7s\t%-4d\t%-5s\t%-12s\t%-20s\n", ps->data[i].name,
ps->data[i].age, ps->data[i].sex, ps->data[i].tele, ps->data[i].addr);
}
}
}
这里我们通过for循环将所有的成员逐一打印出来。
//成员排序函数
void Sort_contact(struct contact* ps)
{
int i = 0;
int j = 0;
for (i = 0; i < ps->size; i++)
{
for (j = 0; j < ps->size - i - 1; j++)
{
if (strcmp((ps->data[j].name), (ps->data[j + 1].name)) > 0)
{
struct people data = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = data;
}
}
}
}
这里排序是按照名字排序的,采用的是我们冒泡排序的思想,用过字符串的比较,让我们从小到大开始排序。
contact.h
#define MAX 1000
#define MAX_name 20
#define MAX_sex 5
#define MAX_tele 12
#define MAX_addr 30
#include
#include
//枚举类型
enum Option
{
exit,
add,
del,
search,
modify,
show,
sort
};
//结构体类型用于存储用户数据
struct people
{
char name[MAX_name];
int age;
char sex[MAX_sex];
char tele[MAX_tele];
char addr[MAX_addr];
};
//通讯录类型用于存储数据和用户数量
struct contact
{
struct people data[MAX];//存放一个信息
int size;//记录当前已经有的元素个数
};
//函数申明
//初始化通讯录
void InitContact(struct contact* ps);
//增加成员
void Addcontact(struct contact* ps);
//展示成员
void Show_contact(struct contact* ps);
//删除成员
void DelContact(struct contact* ps);
//查找元素
void SearchContact(struct contact* ps);
//修改元素
void ModifyContact(struct contact* ps);
//排序成员
void Sort_contact(struct contact* ps);
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化函数
void InitContact(struct contact* ps)
{
//将data里面的数据全部-初始化为0
memset(ps->data, 0, sizeof(ps->data));
//通讯录的最初值是0个元素
ps->size = 0;
}
//增添成员函数
void Addcontact(struct contact* ps)
{
if (ps->size == MAX)
{
printf("通讯录已满!\n");
}
else
{
printf("请输入名字:");
scanf("%s", ps->data[ps->size].name);
printf("请输入年龄:");
scanf("%d", &(ps->data[ps->size].age));
printf("请输入性别:");
scanf("%s", ps->data[ps->size].sex);
printf("请输入电话:");
scanf("%s", ps->data[ps->size].tele);
printf("请输入地址:");
scanf("%s", ps->data[ps->size].addr);
ps->size++;
printf("该用户信息添加成功!\n");
}
}
//展示所有成员函数
void Show_contact(struct contact* ps)
{
if (ps->size == 0)
{
printf("通讯录为空!\n");
}
else
{
printf("%-7s\t%-4s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i < ps->size; i++)
{
printf("%-7s\t%-4d\t%-5s\t%-12s\t%-20s\n", ps->data[i].name,
ps->data[i].age, ps->data[i].sex, ps->data[i].tele, ps->data[i].addr);
}
}
}
//查找指定成员
static int Find(struct contact* ps, char name[MAX_name])
{
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (strcmp(ps->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//删除成员函数
void DelContact(struct contact* ps)
{
char name[MAX_name];
printf("请输入想删除人的名字:");
scanf("%s", name);
int pos = Find(ps, name);
if (pos == -1)
{
printf("查无此人!\n");
}
else
{
for (int j = pos; j < ps->size - 1; j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->size--;
printf("删除成功!\n");
}
}
//查找成员函数
void SearchContact(struct contact* ps)
{
char name[MAX_name];
printf("请输入想查找人的姓名:");
scanf("%s", name);
int pos = Find(ps, name);
if (pos == -1)
{
printf("查无此人!\n");
}
else
{
printf("%-7s\t%-4s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-7s\t%-4d\t%-5s\t%-12s\t%-20s\n", ps->data[pos].name,
ps->data[pos].age, ps->data[pos].sex, ps->data[pos].tele, ps->data[pos].addr);
}
}
//修改数据函数
void ModifyContact(struct contact* ps)
{
int ret = 0;
char name[MAX_name];
printf("请输入想修改人的姓名:");
scanf("%s", name);
int pos = Find(ps, name);
if (pos == -1)
{
printf("查无此人!\n");
}
else
{
printf("***********************************\n");
printf("******** 1.姓名 2.年龄 ***********\n");
printf("******** 3.性别 4.电话 ***********\n");
printf("******** 5.地址 0.放弃修改********\n");
printf("***********************************\n");
printf("请输入想要修改的元素:");
scanf("%d", &ret);
switch (ret)
{
case 1:
printf("请输入名字:");
scanf("%s", ps->data[pos].name);
printf("修改成功!\n");
break;
case 2:
printf("请输入年龄:");
scanf("%d", &(ps->data[pos].age));
printf("修改成功!\n");
break;
case 3:
printf("请输入性别:");
scanf("%s", ps->data[pos].sex);
printf("修改成功!\n");
break;
case 4:
printf("请输入电话:");
scanf("%s", ps->data[pos].tele);
printf("修改成功!\n");
break;
case 5:
printf("请输入地址:");
scanf("%s", ps->data[pos].addr);
printf("修改成功!\n");
break;
case 0:
printf("放弃修改!\n");
default:
printf("输入有误!\n");
}
}
}
//成员排序函数
void Sort_contact(struct contact* ps)
{
int i = 0;
int j = 0;
for (i = 0; i < ps->size; i++)
{
for (j = 0; j < ps->size - i - 1; j++)
{
if (strcmp((ps->data[j].name), (ps->data[j + 1].name)) > 0)
{
struct people data = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = data;
}
}
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("******** 欢迎进入通讯录系统 ********\n");
printf("******* 1.增加 2.删除 *******\n");
printf("******* 3.查找 4.修改 *******\n");
printf("******* 5.展示 6.排序 *******\n");
printf("************** 0.退出 **************\n");
printf("************************************\n");
}
int main()
{
int input = 0;
//创建通讯录
struct contact con;
//初始化通讯录
InitContact(&con);
do
{
//菜单
menu();
printf("请选择:\n");
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:
Show_contact(&con);
break;
case sort:
Sort_contact(&con);
break;
case exit:
printf("退出程序!\n");
break;
default:
printf("输入有误!\n");
break;
}
} while (input);
return 0;
}