通讯录功能
添加,删除,查找,修改, 全部,
储存
文件结构
头文件,函数文件,函数头文件。目录结构
提示:以下是本篇文章正文内容,下面案例可供参考
一、主函数文件(入口)
代码如下
#include "Contact.h"
void menu() {
printf("1.Add 2.Del\n");
printf("3.Search 4.Modeify\n");
printf("5.Show 6.Sort\n");
printf(" 7.存储 \n");
printf(" 0.exit \n ");
}
int main() {
int input = 0;
//创建通讯录
//struct Contact con;//包含1000个元素数组
//使用柔性数组版本
struct Contact con;//包含data指针和size和capacity
//初始化通讯录
InitContact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input){
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
break;
case Save:
SaveContact(&con);
break;
case 0:
break;
SaveContact(&con);
//释放动态空间
Destry(&con);
printf("退出");
default:
printf("选择错误");
}
} while (input);
return 0;
}
二、函数声明文件
#include<stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#define Max 1000
#define Namesize 20
#define Sexsize 5
#define TeleSize 5
#define AddrSize 12
#define Def 3
//个人信息
typedef struct PeoInfo{
char name[Namesize];
int age;
char sex[Sexsize];
char tele[TeleSize];
char addr[AddrSize];
}PeoInfo;
//枚举选项
enum option{
EXIT,//0
ADD,//1
DEL,//2
SEARCH,//3
MODIFY,//4
SHOW,
SORT,
Save
};
//通讯录类型
typedef struct Contact
{
//struct PeoInfo data[Max];//存放1000个信息;->1000个 struct PeoInfo 这样的数据类型
//int size;记录已经有多少人信息
//使用柔性数组
struct PeoInfo* data;//存放1000个信息;->1000个 struct PeoInfo 这样的数据类型
int size;记录已经有多少人信息
int capacity;//记录当前通讯最大容量
}Contact;
//声明函数
void InitContact(struct Contact* ps);
void AddContact(struct Contact* ps);
//删除
void DelContact( struct Contact* ps);
void ShowContact(const struct Contact* ps);
void SearchContact(const struct Contact* ps);
void ModifyContact(struct Contact* ps);
void Destry(struct Contact* ps);
//保存
void SaveContact(struct Contact* ps);
//加载文件
void Loding(struct Contact* ps);
三,函数的实现
#include "Contact.h"
//函数实现
//检查容量代码CheckCapacity
void CheckCapacity(struct Contact* ps)
{
if (ps->size==ps->capacity)
{
//增加空间
struct PeoInfo*ptr= realloc(ps->data, (ps->capacity + 2) * sizeof(struct PeoInfo));
if (ptr != NULL)
{
ps->data = ptr;
ps->capacity += 2;
printf("增加空间成功");
}
else
{
printf("增加失败");
}
}
}
void InitContact(struct Contact* ps)
{
//memset(ps->data, 0, sizeof(ps->data));
//ps->size = 0;//设置通讯录初始化0个元素
ps->data = (struct PeoInfo*)malloc(Def * sizeof(struct PeoInfo));//开辟一个3*Peinfo这样的结构体类型
if (ps->data==NULL)
{
//申请空间失败
return;
}
ps->size = 0;
ps->capacity = Def;
Loding(ps);//将文件添加到到数据里
//
}
void CheckCapacity(struct Contact* ps);
void Loding(Contact* ps)
{
PeoInfo tmp = { 0 };
FILE* pfRead = fopen("contat.dat", "rb");
if (pfRead == NULL){
printf("LoadContact::%s\n", strerror(errno));
return;
}
//读取文件,存放到通讯录中
while (fread(&tmp, sizeof(PeoInfo), 1, pfRead))
{
CheckCapacity(ps);
ps->data[ps->size] = tmp;
ps->size++;
}
fclose(pfRead);
pfRead = NULL;
}
void AddContact(struct Contact* ps)
{
//if (ps->size == Max)
//{
// printf("通讯录已经满!");
//}
//else
//{
// printf("请输入名字>>");
// scanf("%s", ps->data[ps->size].name);//ps->size下标
// printf("请输入年龄>>");
// scanf("%d", &(ps->data[ps->size].age));//age不是一个数组需要取地址操作
// 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("添加成功\n");
//}
//检测当前通讯录的容量
//如果满了,就增加空间
CheckCapacity(ps);
//增加数据
printf("请输入名字>>");
scanf("%s", ps->data[ps->size].name);//ps->size下标
printf("请输入年龄>>");
scanf("%d", &(ps->data[ps->size].age));//age不是一个数组需要取地址操作
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("添加成功\n");
}
void ShowContact(const struct Contact* ps)
{
if (ps->size == 0)
{
printf("通讯录为空格\n");
}
else
{
int i = 0;
//% -20s对齐
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);
}
}
}
// static(私有)
static int FindbyName(const struct Contact* ps, char name[Namesize])
{
int i = 0;
for (i = 0; i < ps->size; i++) {
if (0 == strcmp(ps->data[i].name, name))
{
return i;
}
}
return -1;
}
void DelContact( struct Contact* ps)
{
char name[Namesize];
int ret = 0;
printf("请输入要删除人的名字:>");
scanf("%s", name);
//1.查找要删除的人在什么位置
//找到了返回名字元素所在元素下标
//找不到返回-1
ret=FindbyName(ps,name);//查找名字函数
//2.删除
if (ret ==-1)
{
printf("要删除的人不存\n");
}
else
{
//删除数据
int j = 0;
for (j = ret; j < ps->size - 1; j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->size--;
printf("删除成功\n");
}
}
void SearchContact(const struct Contact* ps)
{
int ret = 0;
char name[Namesize];
printf("请输入要查找人的名字:>");
scanf("%s", name);
ret = FindbyName(ps, name);
if (ret == -1)
{
printf("要查找的人不存在\n");
}
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)
{
int ret = 0;
char name[Namesize];
printf("请输入要修改的名字:>");
scanf("%s", name);
ret = FindbyName(ps, name);
if (ret == -1)
{
printf("要修改的人不存在\n");
}
else
{
printf("开始修改操作>>");
printf("请输入名字>>");
scanf("%s", ps->data[ret].name);//ps->size下标
printf("请输入年龄>>");
scanf("%d", &(ps->data[ret].age));//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 Destry(struct Contact* ps)
{
free(ps->data);
ps->data = NULL;
}
void SaveContact(struct Contact* ps)
{
FILE* pfWrite = fopen("contat.dat", "wb");
if (pfWrite == NULL)
{
printf("SaveContact::%s\n", strerror(errno));
return;
}
//写通讯录中数据到为文件中
int i = 0;
for (i = 0; i < ps->size; i++)
{
fwrite(&(ps->data[i]),sizeof(PeoInfo), 1, pfWrite);
}
fclose(pfWrite);
pfWrite = NULL;
}
功能测试
添加
删除功能
查询功能
修改功能
存储功能