首先,书写一个东西要清楚框架和需求
1.通讯录中能够存储1000个人的信息
每个人的信息包括:
名字 + 性别 + 年龄 + 电话 + 地址
2.增加人的信息
3.删除人的信息
4.修改人的信息
5.查找指定人的信息
在这里,创建 头文件contact.h 源文件contact.c 源文件text.c 创建三个文件来写而不放在一个文件来写是为了简洁干净,容易让人看的明白
头文件用来创建已知库函数的内容实现和定义一些数值和定义自定义函数
源文件contact.c用来具体阐述自定义函数的实现
源文件text.c用来测试通讯录的实现
#define _CRT_SECURE_NO_WARNINGS
#define MAX_NAME 20
#define MAX_SEX 20
#define MAX_TELE 12
#define MAX_ADDR 20 //在这里定义数是因为以后需要修改数据只需要修改这里的就可以
#define MAX 1000 //不用一个个修改
#include
#include
#define _CRT_SECURE_NO_WARNINGS
//类型的定义
typedef struct peopleInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}peopleInfo;
//创建通讯录---静态版本
typedef struct peoplesum
{
peopleInfo data[MAX]; //存入库中总人数
int sz; //当前存入库中的人数
}contact;
void Initcontact(contact* pc);
void Addcontact(contact* pc); //添加函数的自定义
void Printcontact(contact* pc); //打印函数的自定义
void Delcontact(contact* pc); //删除函数的自定义
void Searchcontact(contact* pc); //搜索函数的自定义
void Modifycontact(contact* pc); //修改函数的自定义
以上是库函数contact.h的全部内容
#include"contact.h"
#define _CRT_SECURE_NO_WARNINGS
void Initcontact(contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data); //此处初始化 peopleInfo,用到memset(起始地址,初始化的内容,初始化多少个字节)contact con ={0}在这里也可以,但是有些复杂情况不可以
} //为什么用pc->data,是因为 pc是一个变量,不直接用data是因为需要指明谁的data数组
void Addcontact(contact* pc)
{
if (pc->sz == MAX)
{
printf("空间已满,无法添加");
}
else
{
//添加信息 添加的信息放在sz
printf("请输入名字:");
scanf("%s\n", pc->data[pc->sz].name); //[pc->sz] 是指下标,前面没有&是因为name为数组
printf("请输入年龄:");
scanf("%d\n", &pc->data[pc->sz].age);
printf("请输入性别:");
scanf("%s\n", pc->data[pc->sz].sex);
printf("请输入电话:");
scanf("%s\n", pc->data[pc->sz].tele);
printf("请输入地址:");
scanf("%s\n", pc->data[pc->sz].addr);
pc->sz++;
printf("完成");
}
}
void Printcontact(contact * pc)
{
int i = 0;
//打印标题
printf(" % -20s\t % -5s\t %-5s\t % -10s\t % -10s\n", "名字","年龄","性别","电话", "地址");
//打印数据
printf("%-20s\t %-5s\t %-5s\t %-10s\t %-10s\n",pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
int Findbyname(contact* pc, char name)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1; //找不到
}
void Delcontact(contact* pc)
{
char name[MAX_NAME] = { 0 };
if (pc->sz == 0)
{
printf("空间为空,无法删除");
}
printf("请输入要删除的人的名字:");
scanf("s", name);
//查询到要删除的人,假如没有
int pos = Findbyname(pc, name);
if (pos == -1)
{
printf("要删除的人不存在\n");
}
//假如有
int j = 0;
for (j = pos; j < pc->sz - 1; j++ ) //为什么要-1,若1=10时候,i=1就是第11个
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--; //若要是删除最后一个数据不就不会进入循环了吗?不会进入循环的话sz--,则会减掉一个数据,而减掉的数据则是最后一个
printf("删除成功");
}
void Searchcontact(contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("请输入要删除的人的名字:");
scanf("s", name);
//查询到要查找的人,假如没有
int pos = Findbyname(pc, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
}
else
{
printf(" % -20s\t % -5s\t %-5s\t % -10s\t % -10s\n", "名字","年龄","性别","电话","地址");
printf("%-20s\t %-5s\t %-5s\t %-10s\t %-10s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
}
void Modifycontact(contact* pc)
{
char name[MAX_NAME] = { 0 };
if (pc->sz == 0)
{
printf("空,无法修改");
}
printf("请输入要修改的人的名字:");
scanf("s", name);
//查询到要修改的人,假如没有
int pos = Findbyname(pc, name);
if (pos == -1)
{
printf("要删除的人不存在\n");
}
//有
else
{
printf("请输入名字:");
scanf("%s\n", pc->data[pc->sz].name); //[pc->sz] 是指下标,前面没有&是因为name为数组
printf("请输入年龄:");
scanf("%d\n", &pc->data[pc->sz].age);
printf("请输入性别:");
scanf("%s\n", pc->data[pc->sz].sex);
printf("请输入电话:");
scanf("%s\n", pc->data[pc->sz].tele);
printf("请输入地址:");
scanf("%s\n", pc->data[pc->sz].addr);
}
}
以上是源文件contact.c的内容,因为是对自定义函数的实现,而自定义函数的创建是头文件创建的,所以在文件开头要包含上头文件#include"contact.h"
#define _CRT_SECURE_NO_WARNINGS
#include"shuxie.h"
//1.通讯录中能够存储1000个人的信息
//每个人的信息包括:
// 名字 + 性别 + 年龄 + 电话 + 地址
// 2.增加人的信息
// 3.删除人的信息
// 4.修改人的信息
// 5.查找指定人的信息
int main()
{
enum opintion
{
ADD,
DEL,
SEARCH,
MODIFY,
PRINT,
EXIT,
};
int input = 0;
//通讯录创建
contact con; //通讯录
//初始化通讯录
InitContact(&con); //为什么不能传con, 1)传值是不能修改内容的,万一以后需要修改值就不能修改了 2)占内存太大
do
{
scanf("%d\n", &input);
switch (input)
{
case ADD:
//完成添加操作
Addcontact(&con);
break;
case DEL:
//删除
Delcontact(&con);
break;
case SEARCH:
//
Searchcontact(&con);
break;
case MODIFY:
//
Modifycontact(&con);
break;
case PRINT:
//
Printcontact(&con); //虽然不用修改但是占内存
break;
case EXIT:
//
printf("推出通讯录");
default:
//
printf("输入错误");
}
} while (input);
return 0;
}
同理,也要包含头文件contact.h,以上是text.c的全部内容
以上是静态版本下的通讯录代码,动态下不太熟练,等熟练后再进行完善。