//分了三个模块来写的+一个前言
//前言
//代码实现的流程 1. 选择界面 根据自己的需求制作
//2.定义一个数组用来存放我们要存放的信息 此处涉及到数组的初始化 注意是结构体数组 此外还引用宏 方便以后的修改 改一次就好 一劳永益逸
//3.抵达一个do while循环 进去干了再说 然后紧跟Switch语句的步伐
//4.对自己函数进行定义和初始化
//本篇当中 用到了一个添加的函数 这个函数里面不用重新定义一些变量 我们传过去了通讯录的地址之后就会通过这个指针依次找到我们想要修改的元素 然后我们注意在添加之后对size++
//之后在此处会有show的函数 这个函数可以显示我们存进去了多少个people 打印出来给我们看 里面就是采用了循环 我们循环的停止就是size的大小 因为如果还没有被修改的就不需要打印了
//此处再次体现size的作用之处
//第二个函数 就是删除的函数 这个函数我们采用的方法就是一次让后面的元素往前顶替从而达到修改的效果 (注意在删除之前我们要注意找到要删除的下标,我们通过返回的下标再进一步进行修改)
//注意循环的次数 1 2 3 4 如果把3删掉 4往前一下就行 然后把最后一个删掉 就行 在本次里面就是size-- 说明通讯录里面少了一个元素
//对于修改函数 的前提还是要查找到那个项的下标 电脑需要指引才可以继续下去 对于查找函数说一下就是注意返回值 我们通过返回值进行判断 找不到就返回-1 找到就返回姓名所在下标
//方便我们的使用下标进行打印或者修改 修改函数找到就是和添加那个模板一样的效果了
//test.c
#define _CRT_SECURE_NO_WARNINGS
#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");
}
//增删查改 的前提是要有这个通讯录才行
int main()
{
int input = 0;
struct contact con;//
创建通讯录---
//struct people con[max];//存放1000个人的信息 我们定义了一个数组 可以存放信息
inintcontact(&con);//对通讯录进行初始化的函数 传地址可以改变
do
{
menu();
printf("请选择\n");
scanf("%d", &input);
switch (input)//进行选择的分支
{
case add://这样写的话就具有了意义 我们就不用回去看是什么意思了 但是我感觉没必要 哈哈
addcontact(&con);//这里为了改变 这个size 所以我们传址进去 这个size放进去是为了判定还有几个空间
break;
case del:
deletecontact(&con);
break;
case search:
searchcontact(&con);
break;
case modify:
modifycontact(&con);
break;
case show:
showcontact(&con);
break;
case sort:
sortcontact(&con);
break;
case 0:
printf("退出");
break;
default:
printf("输入错误");
break;
}
} while (input);
}
contact.c//用于函数的实现
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
static int findbyname(struct contact* ps, char name[maxname])//查找借助name来实现 static 使得这个函数只能在这个contact.c这里面使用 我们不想让这个函数暴露出去 因为用户不需要知道
{
int i = 0;
for (i = 0; i < ps->size-1; i++)
{
if (0 == strcpy(ps->data[i].name, name))
{
return i;//返回下标
}
}
return -1;//这个是找不到的情况
}
void inintcontact(struct contact* ps)
{
memset(ps->data, 0, sizeof(ps->data));//初始化为0
ps->size = 0;//初始化为0
}
void addcontact(struct contact* ps)
{
//1.判断通讯录有没有满
if (ps->size == max)
{
printf("通讯录已满--若想扩增--请自行操作");
}
else//进行增添元素
{
printf("请输入名字");//进行提示
scanf("%s", ps->data[ps->size].name);//这个指向下标的意思是放到第几个元素 然后.name的意思是找到输入name
printf("请输入年龄");
scanf("%d", &(ps->data[ps->size].age));//age应当进行取地址操作 这个size的下标是指的数组的下标是什么 我们从下标0开始 拿到数组里面的元素
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("添加成功");
}
}
void showcontact(const struct contact* ps)//这个用于显示 你加进去的数据 const说明不进行修改
{
if (ps->size == 0)
{
printf("通讯录为空\n");
}
else
{
int i = 0;
printf("%-20s\t %-4s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "地址");//这里进行打印 前面的内容都是修饰打印好不好看的
for (i = 0; i < ps->size; i++)//有几个元素就打印几个
{
printf("%-20s\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);//打印时前面添加符号代表左对齐
}
}
}
void deletecontact(struct contact* ps)//删除指定联系人
{
char name[maxname];
printf("请输入删除人的名字");
scanf("%s", name);
//1.查找 要删除的人的下标
int ret = findbyname(ps,name);//找到返回名字所在元素的下标 找不到返回-1
//int i = 0;
//for (i = 0; i < ps->size; i++)
//{
// if (0 == strcmp(ps->data[i].name, name))
// {
// break;
// }
//}
//2.删除那个
if (ret == -1)
{
printf("要删除的用户不存在");
}
//if (i == ps->size)//这是找完之后都没有
//{
// printf("要删除的用户不存在");
//}
else
{
//删除数据 停下来的那个位置就是我们要删除的位置 然后我们把i+1的位置赋给他 1 2 3 4 5 6 7 8 我们最后一次是把8放到7的位置也就是把下标为7放到下标为6的上边 假设要删4
int j = 0;
for (j = ret; j < (ps->size)-1; j++)//我们最后一次是把
{
ps->data[j] = ps->data[j + 1];///就是把后面的元素一个个往后面挪
}
ps->size--;//这里说明少了一个元素
printf("删除成功");
}
}
void searchcontact(struct contact* ps)//查找指定人的信息
{
char name[maxname];
printf("请输入要查找人的信息");
scanf("%s", name);
//这里需要一个查找的函数
int ret = findbyname(ps, name);
if (ret == -1)
{
printf("没找到");
}
else//直接把这些值打印出来 借助刚刚的值
{
printf("%-20s\t %-4s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "地址");
printf("%-20s\t %-4d\t %-5s\t %-12s\t %-20s\n",
ps->data[ret].name,
ps->data[ret].age,
ps->data[ret].sex,
ps->data[ret].tele,
ps->data[ret].addr);
}
}
void modifycontact(struct contact* ps)
{
char name[maxname];
printf("输入修改人名字");
scanf("%s", name);
int ret = findbyname(ps, name);
if (ret == -1)
{
printf("要修改的人不存在");
}
else//这里可以拿过来添加的那个模版来实现
{
printf("请输入修改后名字");//进行提示
scanf("%s", ps->data[ret].name);//就是需要改一下那个对应的数组下标
printf("请输入年龄");
scanf("%d", &(ps->data[ret].age));
printf("请输入性别");
scanf("%s", ps->data[ret].sex);
printf("请输入电话");
scanf("%s", ps->data[ret].tele);
printf("请输入地址");
scanf("%s", ps->data[ret].addr);
printf("修改完成\n");
}
}
//void sortcontact(struct contact* ps)
//{
// //1.排序
//
//
//
//}
//contact.h//函数的声明
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define max 1000 //在这里定义方便以后的修改 一次更改全部OK
#define maxname 20
#define maxsex 5
#define maxtele 12
#define maxaddr 30
enum option
{
exit,//0
add,//1
del,//2
search,//3
modify,//4
show,//5
sort//6
};
struct people
{
char name[maxname];//怎么去描述人
int age;
char sex[maxsex];
char tele[maxtele];
char addr[maxaddr];
};
//通讯录类型
struct contact
{
struct people data[max];//只要存放1000个人的信息是不够的 这俩可以被称为通讯录类型
int size;//还要有可以查看当前已经有的元素个数
};
//声明函数
//初始化一个通讯录
void inintcontact(struct contact* ps);
//增添一个人的信息
void addcontact(struct contact* ps);
//打印通讯录中的人
void showcontact(const struct contact* ps);//这里加const 是想说我们指向的那个对像是不会被改变的 我们只是打印一下看看
//删除指定的联系人
void deletecontact(struct contact* ps);
//查找指定的联系人
void searchcontact(struct contact* ps);
//修改指定联系人
void modifycontact(struct contact* ps);
void sortcontact(struct contact* ps);
|