目录
一,开发思路及框架设计
二,开发及代码
源码
contact.c
test.c
contact.h
三,总结
大家在学习完C语言的结构体章节知识后,会不会有疑问?结构体在实际应用开发中有哪些作用呢?今天,小编给大家分享一个结构体板块的一个小型实战项目,通讯录的实现(源码放在文章末尾)!!!
一,开发思路及框架设计
该通讯录包含的信息:
该通讯录开发的功能:
- 增加联系人的信息
- 删除指定联系人的信息
- 修改指定联系人的信息
- 查找指定联系人的信息
- 联系人信息的排序
- 显示通讯录联系人的信息
二,开发及代码
创建项目
test.c? ? ? ? ? ? ? ? ? ? ? 测试通讯录
contact.c? ? ? ? ? ? ? ? 通讯录的实现
contact.h? ? ? ? ? ? ? ? 通讯录的声明
1)通讯录菜单的打印
#include <stdio.h>
void menu() {
printf("**************************************\n");
printf("***** 1. add 2. del *****\n");
printf("***** 3. search 4. modify *****\n");
printf("***** 5. show 6. sort *****\n");
printf("***** 0. exit *****\n");
printf("**************************************\n");
}
int main() {
int input = 0;
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 0:
break;
default:
break;
}
} while (input);
return 0;
}
运行如下:
这样,初步的菜单打印就已经实现了,接下来就是根据菜单添加想要的功能了
2)创建通讯录并使通讯录格式化
首先我们创建一个结构体,里面包含人的成员信息,其次要创建一个完整的通讯录,里面包含个人信息和人数,这样一个完整的通讯录就创建好了
为了确保通讯录的人员信息写入的准确性,我们需要将创建好的通讯录初始化,说白了就是给创建好的通讯录格式化,我们创建一个InitContact函数来初始化。
这里涉及到结构体传参,我们传过去的是地址
?
?这个InitContact函数走下来之后,我们的通讯录格式化工作就完成,为了更好的演示,我们通过调试来打开监视,看看这些成员变量是否初始化成功,如下图所示:
?走到这里,创建通讯录以及格式化通讯录就完成了
3)添加个人信息到通讯录
我们利用结构体指针来指向特定的信息,以此来增加联系人的信息,代码如下:
void AddContact(struct Contact* pc) {
//判断通讯录人员是否满了
assert(pc); //确保pc不是空指针
if (pc->sz == MAX) {
printf("通讯录已满,无法添加数据\n");
return;
}
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
代码运行如下:
?
4)显示联系人信息
这里需要注意的是,我们为了美观,需要打印一个行号,里面包括姓名,性别等等,还需要考虑打印联系人信息的对齐,代码如下:
void ShowContact(struct Contact* pc) {
int i = 0;
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
代码运行如下:
?
5)删除指定联系人信息
这里既然要删除,那就必须有个查找联系人名字的功能,所以这里我们写入一个?FindByName函数,以便于来删除指定联系人,代码如下:
int FindByName(const struct Contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
void DelContact(struct Contact* pc) {
char name[MAX_NAME];
printf("请输入要删除人的名字:");
scanf("%s", name);
//查找一下指定的人是否存在
int ret = FindByName(pc, name);
if (ret == -1)
printf("要删除的人不存在\n");
else
{
//删除
int j = 0;
for (j = ret; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("成功删除指定联系人\n");
}
}
代码运行如下:
6)查找联系人信息
上一步删除指定联系人已经为查找做了铺垫,代码如下:
void SearchContact(const struct Contact* pc) {
char name[MAX_NAME];
printf("请输入要查找的人的名字:");
scanf("%s", name);
//查找一下指定的人是否存在
int ret = FindByName(pc, name);
if (ret == -1)
printf("要查找的人不存在\n");
else
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tele,
pc->data[ret].addr);
}
}
代码运行结果如下:
7)修改联系人信息
void ModifyContact(struct Contact* pc) {
printf("请输入要修改人的名字:>");
char name[MAX_NAME];
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
printf("要修改的人不存在\n");
else
{
printf("请输入名字:");
scanf("%s", pc->data[ret].name);
printf("请输入性别:");
scanf("%s", pc->data[ret].sex);
printf("请输入年龄:");
scanf("%d", &(pc->data[ret].age));
printf("请输入电话:");
scanf("%s", pc->data[ret].tele);
printf("请输入地址:");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
}
代码运行结果如下:
8)排序联系人信息
排序这里会涉及到一个按照什么方式来进行排序,这里我们就以年龄为例,这里只需要使用一个qstort函数就搞定了,代码如下:
int CmpByAge(const void* e1, const void* e2)
{
return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;
}
//按照年龄来排序
void SortContact(struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByAge);
}
?代码运行结果如下:
?到这里,一个通讯录基本就实现了!!!
源码:
#include "contact.h"
#include <string.h>
#include <assert.h>
void InitContact(struct Contact* pc) {
assert(pc);
pc->sz = 0;
memset(pc->data, 0, 100 * sizeof(struct PeoInfo));
}
void AddContact(struct Contact* pc) {
//判断通讯录人员是否满了
assert(pc); //确保pc不是空指针
if (pc->sz == MAX) {
printf("通讯录已满,无法添加数据\n");
return;
}
printf("请输入名字:");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
void ShowContact(const struct Contact* pc) {
int i = 0;
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
int FindByName(const struct Contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
void DelContact(struct Contact* pc) {
char name[MAX_NAME];
printf("请输入要删除人的名字:");
scanf("%s", name);
//查找一下指定的人是否存在
int ret = FindByName(pc, name);
if (ret == -1)
printf("要删除的人不存在\n");
else
{
//删除
int j = 0;
for (j = ret; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("成功删除指定联系人\n");
}
}
void SearchContact(const struct Contact* pc) {
char name[MAX_NAME];
printf("请输入要查找的人的名字:");
scanf("%s", name);
//查找一下指定的人是否存在
int ret = FindByName(pc, name);
if (ret == -1)
printf("要查找的人不存在\n");
else
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tele,
pc->data[ret].addr);
}
}
void ModifyContact(struct Contact* pc) {
printf("请输入要修改人的名字:>");
char name[MAX_NAME];
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
printf("要修改的人不存在\n");
else
{
printf("请输入名字:");
scanf("%s", pc->data[ret].name);
printf("请输入性别:");
scanf("%s", pc->data[ret].sex);
printf("请输入年龄:");
scanf("%d", &(pc->data[ret].age));
printf("请输入电话:");
scanf("%s", pc->data[ret].tele);
printf("请输入地址:");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
}
int CmpByAge(const void* e1, const void* e2)
{
return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;
}
//按照年龄来排序
void SortContact(struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByAge);
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#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("***** 0. exit *****\n");
printf("**************************************\n");
}
int main() {
int input = 0;
struct Contact con;//创建通讯录
InitContact(&con); //初始化通讯录
do {
menu();
printf("请选择:");
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 0:
break;
default:
break;
}
} while (input);
return 0;
}
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
//表示一个人的信息
struct PeoInfo {
char name[MAX_NAME];
char sex[MAX_SEX];
char tele[MAX_TELE];
int age;
char addr[MAX_ADDR];
};
//完整的通讯录
struct Contact {
struct PeoInfo data[MAX];
int sz; //sz表示人数,如果写入一个人的信息,让sz++,来达到统计人数的效果
};
//初始化通讯录
void InitContact(struct Contact* pc);
//添加联系人信息到通讯录
void AddContact(struct Contact* pc);
//显示通讯录联系人信息
void ShowContact(const struct Contact* pc);
//删除指定联系人信息
void DelContact(struct Contact* pc);
//查找联系人信息
void SearchContact(const struct Contact* pc);
//修改联系人信息
void ModifyContact(struct Contact* pc);
//排序联系人信息
void SortContact(const struct Contact* pc);
三,总结
通讯录的实现看似不难,但是在一些细节上还是挺复杂,里面涉及到结构体是的知识较为广泛,包括结构体传参,结构体指针等等,如对上文有意见或者有错误,还请大佬们斧正,觉得有帮助的童鞋们,创作不易,蟹蟹三连!
|