提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
【萌新学习C语言】如何模块化创建静态的通讯录(编译器:vs2022)
有以下功能:
通讯录
人的信息:名字+年龄+性别+电话+地址
1.存放100个人的信息
2.增加联系人
3.删除指定联系人
4.查找联系人
5.修改联系人
6.排序
7.显示联系人
提示:以下是本篇文章正文内容,下面案例可供参考
一、模块化设计
创建test.c源文件来存放main函数
创建contact.c源文件来存放关于实现通讯录的函数
创建contact.h头文件来对函数进行声明
二、通讯录实现步骤
1.创建处通讯录界面菜单函数menu
- 在test.c文件中
- 创建出menu函数并通过输入0-7来实现功能
menu函数代码如下(示例):
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");
}
main函数代码如下:
int main()
{
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("Add\n");
break;
case 2:
printf("Del\n");
break;
case 3:
printf("Search\n");
break;
case 4:
printf("Modify\n");
break;
case 5:
printf("Show\n");
break;
case 6:
printf("Sort");
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("输入非法,请重新输入\n");
break;
}
} while (input);
return 0;
}
main函数里的printf函数只是方便用于调试,看代码是否异常,后面会删除。
调试结果如下:
2.创建联系人信息及通讯录
- 在contact.h文件中 人的信息:名字+年龄+性别+电话+地址
- 用结构体来创建一个联系人的类型。
- 再用一个结构体来创建通讯录,通讯录里包括联系人和联系人的总数。
#define Max 100
#define Max_name 20
#define Max_sex 10
#define Max_tele 12
#define Max_addr 30
//联系人信息
typedef struct PeoInfo
{
char name[Max_name];
int age;
char sex[Max_sex];
char tele[Max_tele];
char addr[Max_addr];
}PeoInfo;
//通讯录信息
typedef struct Contact
{
PeoInfo data[Max];
int count;
}Contact;
3…初始化通讯录
- 在contact.c文件
- 将通讯录初始化为0
代码如下(示例):
//初始化数组
void InitContact(Contact* pc)
{
assert(pc);
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
}
初始化后:
4. 对通讯录进行添加操作
- 写在contact.c文件中
- Add
代码如下:
//添加联系人
void Add(Contact* pc)
{
assert(pc);
//判断通讯录是否已经满了
if (pc->count == Max)
{
printf("通讯录已满,添加失败\n");
return;
}
//添加联系人
printf("请输入姓名:>");
scanf("%s", pc->data[pc->count].name);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->count].age);
printf("请输入性别:>");
scanf("%s", pc->data[pc->count].sex);
printf("请输入电话:>");
scanf("%s", pc->data[pc->count].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("添加成功\n");
}
调试如下:
5.对通讯录进行显示操作
- 写在contact.c文件中
- Show
//显示联系人
void Show(const Contact* pc)
{
assert(pc);
int i = 0;
printf("%-20s%-10s%-10s%-12s%-30s\n", "姓名",
"年龄",
"性别",
"电话",
"地址");
for (i = 0; i < pc->count; i++)
{
printf("%-20s%-10d%-10s%-12s%-30s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
调试如下:
6.对通讯录进行删除操作
- 写在contact.c文件中
- Del
//查找联系人
int FindByName(const Contact* pc)
{
assert(pc);
char name[Max_name] = { 0 };
printf("请输入要查找人的名字:>");
scanf("%s", &name);
int i = 0;
for (i = 0; i <= pc->count-1; i++)
{
if (strcmp(name, pc->data[i].name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人
void Del(Contact* pc)
{
assert(pc);
int i = 0;
//判断通讯录是否为空
if (pc->count == 0)
{
printf("通讯录为空,删除失败\n");
return;
}
//查找联系人
int pos = FindByName(pc);
if (pos == -1)
{
printf("该联系人不存在\n");
return;
}
//删除联系人
for (i = pos; i <= pc->count-1 ; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->count--;
printf("删除成功\n");
}
调试如下:
7.对通讯录进行查找操作
- 写在contact.c文件中
- Search
void Search(Contact* pc)
{
assert(pc);
//判断通讯录是否为空
if (pc->count == 0)
{
printf("通讯录为空,删除失败\n");
return;
}
//查找联系人
int pos = FindByName(pc);
if (pos == -1)
{
printf("该联系人不存在\n");
return;
}
//打印联系人
printf("%-20s%-10s%-10s%-12s%-30s\n", "姓名",
"年龄",
"性别",
"电话",
"地址");
printf("%-20s%-10d%-10s%-12s%-30s\n", pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
调试如下:
7.对通讯录进行修改操作
- 写在contact.c文件中
- Modify
//修改联系人
void Modify(Contact* pc)
{
assert(pc);
//查找联系人
int pos = FindByName(pc);
if (pos == -1)
{
printf("该联系人不存在\n");
return;
}
//修改联系人
printf("请输入姓名:>");
scanf("%s", pc->data[pos].name);
printf("请输入年龄:>");
scanf("%d", &pc->data[pos].age);
printf("请输入性别:>");
scanf("%s", pc->data[pos].sex);
printf("请输入电话:>");
scanf("%s", pc->data[pos].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
调试如下:
8.对通讯录进行排序操作
- 写在contact.c文件中
- Sort
- 这里只实现按照姓名排序
//比较姓名大小
int CmpName(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//按照姓名排序联系人
void Sort(Contact* pc)
{
assert(pc);
//判断通讯录是否为空
if (pc->count == 0)
{
printf("通讯录为空,删除失败\n");
return;
}
//按照姓名排序
qsort(pc->data, pc->count, sizeof(PeoInfo), CmpName);
printf("排序完成\n");
}
调试如下:
3.通讯录全代码如下
- test.c文件下
#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("********** 0. exit **********\n");
printf("**************************************************\n");
}
int main()
{
int input = 0;
//创建通讯录
Contact con;
//初始化通讯录
InitContact(&con);
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
Add(&con);
break;
case 2:
Del(&con);
break;
case 3:
Search(&con);
break;
case 4:
Modify(&con);
break;
case 5:
Show(&con);
break;
case 6:
Sort(&con);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("输入非法,请重新输入\n");
break;
}
} while (input);
return 0;
}
- contact.c文件下
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//初始化数组
void InitContact(Contact* pc)
{
assert(pc);
pc->count = 0;
memset(pc->data, 0, sizeof(pc->data));
}
//添加联系人
void Add(Contact* pc)
{
assert(pc);
//判断通讯录是否已经满了
if (pc->count == Max)
{
printf("通讯录已满,添加失败\n");
return;
}
//添加联系人
printf("请输入姓名:>");
scanf("%s", pc->data[pc->count].name);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->count].age);
printf("请输入性别:>");
scanf("%s", pc->data[pc->count].sex);
printf("请输入电话:>");
scanf("%s", pc->data[pc->count].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("添加成功\n");
}
//显示联系人
void Show(const Contact* pc)
{
assert(pc);
int i = 0;
printf("%-20s%-10s%-10s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->count; i++)
{
printf("%-20s%-10d%-10s%-12s%-30s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
//查找联系人
int FindByName(const Contact* pc)
{
assert(pc);
char name[Max_name] = { 0 };
printf("请输入要查找人的名字:>");
scanf("%s", &name);
int i = 0;
for (i = 0; i <= pc->count-1; i++)
{
if (strcmp(name, pc->data[i].name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人
void Del(Contact* pc)
{
assert(pc);
int i = 0;
//判断通讯录是否为空
if (pc->count == 0)
{
printf("通讯录为空,删除失败\n");
return;
}
//查找联系人
int pos = FindByName(pc);
if (pos == -1)
{
printf("该联系人不存在\n");
return;
}
//删除联系人
for (i = pos; i <= pc->count-1 ; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->count--;
printf("删除成功\n");
}
//查找联系人
void Search(Contact* pc)
{
assert(pc);
//判断通讯录是否为空
if (pc->count == 0)
{
printf("通讯录为空,删除失败\n");
return;
}
//查找联系人
int pos = FindByName(pc);
if (pos == -1)
{
printf("该联系人不存在\n");
return;
}
//打印联系人
printf("%-20s%-10s%-10s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s%-10d%-10s%-12s%-30s\n", pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
//修改联系人
void Modify(Contact* pc)
{
assert(pc);
//查找联系人
int pos = FindByName(pc);
if (pos == -1)
{
printf("该联系人不存在\n");
return;
}
//修改联系人
printf("请输入姓名:>");
scanf("%s", pc->data[pos].name);
printf("请输入年龄:>");
scanf("%d", &pc->data[pos].age);
printf("请输入性别:>");
scanf("%s", pc->data[pos].sex);
printf("请输入电话:>");
scanf("%s", pc->data[pos].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
}
//比较姓名大小
int CmpName(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//按照姓名排序联系人
void Sort(Contact* pc)
{
assert(pc);
//判断通讯录是否为空
if (pc->count == 0)
{
printf("通讯录为空,删除失败\n");
return;
}
//按照姓名排序
qsort(pc->data, pc->count, sizeof(PeoInfo), CmpName);
printf("排序完成\n");
}
- contact.h文件下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#define Max 100
#define Max_name 20
#define Max_sex 10
#define Max_tele 12
#define Max_addr 30
//联系人信息
typedef struct PeoInfo
{
char name[Max_name];
int age;
char sex[Max_sex];
char tele[Max_tele];
char addr[Max_addr];
}PeoInfo;
//通讯录信息
typedef struct Contact
{
PeoInfo data[Max];
int count;
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//添加联系人
void Add(Contact* pc);
//显示联系人
void Show(const Contact* pc);
//删除联系人
void Del(Contact* pc);
//查找联系人
void Search(Contact* pc);
//修改联系人
void Modify(Contact*pc);
//按照姓名排序联系人
void Sort(Contact* pc);