✨欢迎来到脑子不好的小菜鸟的文章✨
🎈创作不易,麻烦点点赞哦🎈
所属专栏:项目
我的主页:脑子不好的小菜鸟
文章特点:关键点和步骤讲解放在
代码相应位置
引言:
1.菜单
通讯录也如同游戏,需要菜单来供使用者选择,因此要用do...while...(第一次看我文章的小伙伴可以看看我这两篇文章啦:1.扫雷游戏(有讲解)-CSDN博客 2.猜数字游戏(C语言实现)-CSDN博客)
2.功能总结
通讯录有很多功能,因此我们在做出它之前总结一下他的功能:
1.添加联系人
2.删除联系人
3.查看联系人
4.查找联系人
5.排序联系人
(根据自己的需要,可以是电话号码从小到大,也可以是名字从小到大)
6.修改联系人
0.退出
(退出是退出循环,所以设为0合适)
文件准备:
与游戏一样,通常需要三个文件:
1.contact.h
包含函数的声明和某些重要量的定义,这些量定义在头文件中方便源文件的使用,也方便代码的统一修改,使之灵活(用define来说明,如:扫雷中的行和列(row和col))
2.contact.c
包含重要的函数实现部分
3.test.c
包含菜单和某些变量的定义(如:扫雷中的棋盘)
开始制作
1.菜单
还是熟悉的do...while...啦
//菜单
void menu()
{
//添加,删除,显示,查找,排序,修改,退出
printf("***************************\n");
printf("***1.Add 2.Del ***\n");
printf("***3.Show 4.Search***\n");
printf("***5.Sort 6.Modify***\n");
printf("***0.exit ***\n");
printf("***************************\n");
}
int main()
{
int input;
Contact con;//重要变量
char name[NAME_MAX] = { 0 };
//变量创建
InitContact(&con);
do
{
menu();
printf("请输入你的操作:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("添加联系人\n");
Add(&con);
break;
case 2:
printf("删除联系人\n");
Del(&con);
break;
case 3:
printf("显示联系人\n");
Show(&con);
break;
case 4:
printf("查找联系人\n");
printf("请输入查找人的姓名:\n");
scanf("%s", name);
Search(&con, name);
break;
case 5:
printf("排序\n");
Sort(&con);
printf("排序成功\n");
break;
case 6:
printf("修改联系人\n");
printf("请输入修改人的姓名:\n");
scanf("%s", name);
Modify(&con,name);
break;
case 0:
printf("退出\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
}while (input);
return 0;
}
2.contact.h函数的实现
头文件中为函数类型的声明
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 30
#define MAX 100
typedef struct PeoInfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
char tele[TELE_MAX];
char address[ADDRESS_MAX];
int age;
}PeoInfo;
typedef struct Contact
{
PeoInfo data[MAX];
int count;
}Contact;
void InitContact(Contact* con);
void Add(Contact* con);
void Del(Contact* con);
void Show(Contact* con);
int FindPeo(Contact* con, char name[]);
void Sort(Contact* con);
void Modify(Contact* con, char name[]);
void Search(Contact* con, char name[]);
3.contact.c函数的实现
初始化部分:
void InitContact(Contact* con)
{
con->count = 0;
memset(con->data, 0, sizeof(con->data));//记得用法!!!!!!!!!!!
}
这里运用了memset函数,具体函数如图所示:
由图可知,需要包含头文件<string.h> ,
void* dest:要被初始化的地址(通常为数组名);
int c:用于初始化的数(该题初始化为0);
size_t count:被初始化的元素个数
注意:!!!!!!!
memset函数是以字节来赋值的,所以count部分都是用sizeof(...)来表示,()内为要被初始化的数组名
Add部分:
void Add(Contact* con)
{
assert(con);
//避免空指针,断言,记得包含头文件:<assert.h>
printf("请输入联系人名字:\n");
scanf("%s", con->data[con->count].name);
printf("请输入联系人性别:\n");
scanf("%s", con->data[con->count].sex);
printf("请输入联系人电话:\n");
scanf("%s", con->data[con->count].tele);
printf("请输入联系人地址:\n");
scanf("%s", con->data[con->count].address);
printf("请输入联系人年龄:\n");
scanf("%d", &(con->data[con->count].age));
/*年龄不是数组,要取地址*/
con->count++;
/*记得++*/
}
Sort部分:
运用了qsort函数,具体可参考该文章:qsort函数的使用和模拟实现排序-CSDN博客
void cmp(const void* e1, const void* e2)
{
return (strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name));
/*比较的是字符串,要运用strcmp函数,记得头文件:<string.h>*/
/*强制转换为结构体类型*/
// return ((PeoInfo*)e1)->tele - ((PeoInfo*)e2)->tele);
/*按照号码排序*/
}
void Sort(Contact* con)
{
assert(con);
qsort(con->data, con->count, sizeof(PeoInfo),cmp);//通过名字排序
/*因为比较的是结构体*/
}
Show部分:
void Show(Contact* con)
{
printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
for (int i = 0; i < con->count; i++)
{
printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
con->data[i].sex,
con->data[i].tele,
con->data[i].address,
con->data[i].age);
}
}
剩下的部分都要运用到查找部分,我将查找部分写为了FindPeo函数
FindPeo部分:
int FindPeo(Contact* con,char name[])
{
assert(con);
for (int i = 0; i < con->count; i++)
{
if (strcmp(name, con->data[i].name) == 0)//如果名字相同,则返回下标
return i;
}
return -1;//未找到,返回-1
}
Del部分:
void Del(Contact* con)
{
assert(con);
char name[NAME_MAX];
printf("请输入联系人名字:\n");
scanf("%s", name);
int j = FindPeo(con, name);
if (FindPeo(con, name) != -1)
{
for (int i = j; i < con->count - 1; i++)
{
con->data[i] = con->data[i + 1];
}
con->count--;
printf("删除成功\n");
}
else
printf("未找到该联系人,删除失败\n");
}
Search部分:
void Search(Contact* con, char name[])
{
int i=FindPeo(con, name);
if(i==-1)
printf("没有找到该联系人\n");
else
{
printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
con->data[i].sex,
con->data[i].tele,
con->data[i].address,
con->data[i].age);
}
}
Modify部分:
void Modify(Contact* con, char name[])
{
assert(con);
int i = FindPeo(con, name);
if (FindPeo(con, name)==-1)
{
printf("未找到该联系人,更改失败\n");
}
else
{
printf("请输入联系人名字:\n");
scanf("%s", con->data[i].name);
printf("请输入联系人性别:\n");
scanf("%s", con->data[i].sex);
printf("请输入联系人电话:\n");
scanf("%s", con->data[i].tele);
printf("请输入联系人地址:\n");
scanf("%s", con->data[i].address);
printf("请输入联系人年龄:\n");
scanf("%d", &(con->data[i].age));
printf("更改成功\n");
}
}
好的,现在只需在test.c部分运用一些语句修饰就可以啦!
4.test.c函数的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
/*静态通讯录*/
void menu()
{
//添加,删除,显示,查找,排序,修改,退出
printf("***************************\n");
printf("***1.Add 2.Del ***\n");
printf("***3.Show 4.Search***\n");
printf("***5.Sort 6.Modify***\n");
printf("***0.exit ***\n");
printf("***************************\n");
}
int main()
{
int input;
Contact con;
char name[NAME_MAX] = { 0 };
/*记得初始化啊!!!!!!!!!!*/
InitContact(&con);
do
{
menu();
printf("请输入你的操作:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("添加联系人\n");
Add(&con);
break;
case 2:
printf("删除联系人\n");
Del(&con);
break;
case 3:
printf("显示联系人\n");
Show(&con);
break;
case 4:
printf("查找联系人\n");
printf("请输入查找人的姓名:\n");
scanf("%s", name);
Search(&con, name);
break;
case 5:
printf("排序\n");
Sort(&con);
printf("排序成功\n");
break;
case 6:
printf("修改联系人\n");
printf("请输入修改人的姓名:\n");
scanf("%s", name);
Modify(&con,name);
break;
case 0:
printf("退出\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
}while (input);
return 0;
}
总结:
contact.h:
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDRESS_MAX 30
#define MAX 100
typedef struct PeoInfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
char tele[TELE_MAX];
char address[ADDRESS_MAX];
int age;
}PeoInfo;
typedef struct Contact
{
PeoInfo data[MAX];
int count;
}Contact;
void InitContact(Contact* con);
void Add(Contact* con);
void Del(Contact* con);
void Show(Contact* con);
int FindPeo(Contact* con, char name[]);
void Sort(Contact* con);
void Modify(Contact* con, char name[]);
void Search(Contact* con, char name[]);
contact.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void InitContact(Contact* con)
{
con->count = 0;
memset(con->data, 0, sizeof(con->data));//记得用法!!!!!!!!!!!
}
void Add(Contact* con)
{
assert(con);
printf("请输入联系人名字:\n");
scanf("%s", con->data[con->count].name);
printf("请输入联系人性别:\n");
scanf("%s", con->data[con->count].sex);
printf("请输入联系人电话:\n");
scanf("%s", con->data[con->count].tele);
printf("请输入联系人地址:\n");
scanf("%s", con->data[con->count].address);
printf("请输入联系人年龄:\n");
scanf("%d", &(con->data[con->count].age));
//年龄不是数组,要取地址
con->count++;
}
void Del(Contact* con)
{
assert(con);
char name[NAME_MAX];
printf("请输入联系人名字:\n");
scanf("%s", name);
int j = FindPeo(con, name);
if (FindPeo(con, name) != -1)
{
for (int i = j; i < con->count - 1; i++)
{
con->data[i] = con->data[i + 1];
}
con->count--;
printf("删除成功\n");
}
else
printf("未找到该联系人,删除失败\n");
}
int FindPeo(Contact* con,char name[])/*!!!!!!!是数组啊,不是字符啊!!!!!!*/
{
assert(con);
for (int i = 0; i < con->count; i++)
{
if (strcmp(name, con->data[i].name) == 0)
return i;
}
return -1;
}
void Search(Contact* con, char name[])
{
int i=FindPeo(con, name);
if(i==-1)
printf("没有找到该联系人\n");
else
{
printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
con->data[i].sex,
con->data[i].tele,
con->data[i].address,
con->data[i].age);
}
}
void cmp(const void* e1, const void* e2)
{
return (strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name));
}
void Sort(Contact* con)
{
assert(con);
//pai_xu_by_name(con);
qsort(con->data, con->count, sizeof(PeoInfo),cmp);//通过名字排序
/*因为比较的是结构体*/
}
void Modify(Contact* con, char name[])
{
assert(con);
int i = FindPeo(con, name);
if (FindPeo(con, name)==-1)
{
printf("未找到该联系人,更改失败\n");
}
else
{
printf("请输入联系人名字:\n");
scanf("%s", con->data[i].name);
printf("请输入联系人性别:\n");
scanf("%s", con->data[i].sex);
printf("请输入联系人电话:\n");
scanf("%s", con->data[i].tele);
printf("请输入联系人地址:\n");
scanf("%s", con->data[i].address);
printf("请输入联系人年龄:\n");
scanf("%d", &(con->data[i].age));
printf("更改成功\n");
}
}
void Show(Contact* con)
{
printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30s\n", "姓名", "性别", "电话", "地址", "年龄");
for (int i = 0; i < con->count; i++)
{
printf("%-20s\t%-20s\t%-10s\t%-20s\t%-30d\n", con->data[i].name,
con->data[i].sex,
con->data[i].tele,
con->data[i].address,
con->data[i].age);
}
}
test.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
/*静态通讯录*/
void menu()
{
//添加,删除,显示,查找,排序,修改,退出
printf("***************************\n");
printf("***1.Add 2.Del ***\n");
printf("***3.Show 4.Search***\n");
printf("***5.Sort 6.Modify***\n");
printf("***0.exit ***\n");
printf("***************************\n");
}
int main()
{
int input;
Contact con;
char name[NAME_MAX] = { 0 };
/*记得初始化啊!!!!!!!!!!*/
InitContact(&con);
do
{
menu();
printf("请输入你的操作:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("添加联系人\n");
Add(&con);
break;
case 2:
printf("删除联系人\n");
Del(&con);
break;
case 3:
printf("显示联系人\n");
Show(&con);
break;
case 4:
printf("查找联系人\n");
printf("请输入查找人的姓名:\n");
scanf("%s", name);
Search(&con, name);
break;
case 5:
printf("排序\n");
Sort(&con);
printf("排序成功\n");
break;
case 6:
printf("修改联系人\n");
printf("请输入修改人的姓名:\n");
scanf("%s", name);
Modify(&con,name);
break;
case 0:
printf("退出\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
}while (input);
return 0;
}
恭喜你啦,今天又进步了一点点~