通讯录功能
- 添加联系人信息(名字,性别,年龄,电话号码,家庭住址)
- 输出指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 打印所有联系人信息
- 对所有联系人(通过名字)排序
- 保存当前通讯录内容(以二进制形式保存到当前文件夹中的contactinformation这个数据文件里)
文件分装
对应文件的代码
contact.h
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
#define DEFAULT_SIZE 3
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT,
SAVE
};
struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
};
struct Contact
{
struct PeoInfo* data;
int size;
int capacity;
};
void InitContact(struct Contact* p);
void AddContact(struct Contact* p);
void ShowContact(struct Contact* p);
void SearchContact(struct Contact* p);
void DelContact(struct Contact* p);
void ModifyContact(struct Contact* p);
void SortContact(struct Contact* p);
void DistroyContact(struct Contact* p);
void SaveContact(struct Contact* p);
contact.c
#include"contact.h"
static void CheckCapacity(struct Contact* p)
{
if (p->size == p->capacity)
{
struct PeoInfo* tmp = (struct PeoInfo*)realloc(p->data, (2 + p->capacity) * sizeof(struct PeoInfo));
if (tmp != NULL)
{
p->data = tmp;
p->capacity += 2;
}
else
{
printf("CheckCapacity::%s\n", strerror(errno));
return;
}
}
}
static void LoadContact(struct Contact* p)
{
FILE* pf = fopen("contactinformation", "rb");
if (pf == NULL)
{
printf("LoadContact::%s\n", strerror(errno));
}
struct PeoInfo tmp = { 0 };
while (fread(&tmp, sizeof(struct PeoInfo), 1, pf))
{
CheckCapacity(p);
*(p->data + p->size) = tmp;
p->size++;
}
fclose(pf);
pf = NULL;
}
void InitContact(struct Contact* p)
{
p->data = (struct PeoInfo*)malloc(DEFAULT_SIZE * sizeof(struct PeoInfo));
if (p->data == NULL)
{
printf("InitContact::%s\n", strerror(errno));
return;
}
p->size = 0;
p->capacity= DEFAULT_SIZE;
LoadContact(p);
}
void AddContact(struct Contact* p)
{
void CheckCapacity(p);
printf("请输入名字:>");
scanf("%s",(*((p->data)+(p->size))).name);
printf("请输入性别:>");
scanf("%s", (*((p->data) + (p->size))).sex);
printf("请输入年龄:>");
scanf("%d", &(*((p->data) + (p->size))).age);
printf("请输入电话号码:>");
scanf("%s", (*((p->data) + (p->size))).tele);
printf("请输入住址:>");
scanf("%s", (*((p->data) + (p->size))).addr);
printf("添加成功\n");
p->size++;
}
void ShowContact(struct Contact* p)
{
if (p->size == 0)
{
printf("通讯录内容为空\n");
}
else
{
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "住址");
int i = 0;
for (i = 0; i < p->size; i++)
{
printf("%-20s\t%-4s\t%-5d\t%-12s\t%-20s\n",
(*((p->data) + i)).name,
(*((p->data) + i)).sex,
(*((p->data) + i)).age,
(*((p->data) + i)).tele,
(*((p->data) + i)).addr);
}
}
}
static int Search_By_Name(struct Contact* p,char* pc)
{
int i = 0;
for (i = 0; i < p->size; i++)
{
if (strcmp((*((p->data) + i)).name, pc) == 0)
{
return i;
}
}
return -1;
}
void SearchContact(struct Contact* p)
{
char name[MAX_NAME] = { 0 };
printf("请输入要查找人的姓名:>");
scanf("%s", name);
int flag = Search_By_Name(p, name);
if (flag == -1)
{
printf("要查找人的信息不存在\n");
}
else
{
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "住址");
printf("%-20s\t%-4s\t%-5d\t%-12s\t%-20s\n",
(*((p->data) + flag)).name,
(*((p->data) + flag)).sex,
(*((p->data) + flag)).age,
(*((p->data) + flag)).tele,
(*((p->data) + flag)).addr);
}
}
void DelContact(struct Contact* p)
{
char name[MAX_NAME] = { 0 };
printf("请输入要删除人的名字:>");
scanf("%s", name);
int flag = Search_By_Name(p, name);
if (flag == -1)
{
printf("要删除的人不存在\n");
}
else
{
int i = 0;
for (i = flag; i < p->size-1; i++)
{
*(p->data + i) = *(p->data + i + 1);
}
printf("删除成功\n");
p->size--;
}
}
void ModifyContact(struct Contact* p)
{
char name[MAX_NAME] = { 0 };
printf("请输入要修改人的名字:>");
scanf("%s", name);
int flag=Search_By_Name(p, name);
if (flag == -1)
{
printf("要修改人的信息不存在\n");
}
else
{
printf("请输入名字:>");
scanf("%s", (*((p->data) + flag)).name);
printf("请输入性别:>");
scanf("%s", (*((p->data) + flag)).sex);
printf("请输入年龄:>");
scanf("%d", &(*((p->data) + flag)).age);
printf("请输入电话号码:>");
scanf("%s", (*((p->data) + flag)).tele);
printf("请输入住址:>");
scanf("%s", (*((p->data) + flag)).addr);
printf("修改成功\n");
}
}
static int Cmp_Struct(void* p1, void* p2)
{
return strcmp(((struct PeoInfo*)p1)->name , ((struct PeoInfo*)p2)->name);
}
static void Swap(void* p1, void* p2, int width)
{
while (width)
{
char tmp = *(char*)p1;
*(char*)p1 = *(char*)p2;
*(char*)p2 = tmp;
++(char*)p1;
++(char*)p2;
width--;
}
}
static void My_Bubble_Sort(void* p, int sz, int width, int(*cmp)(void*, void*))
{
int i = 0;
int j = 0;
int flag = 1;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)p + (j*width), (char*)p + ((j + 1)*width)) > 0)
{
Swap((char*)p + (j*width), (char*)p + ((j + 1)*width), width);
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
void SortContact(struct Contact* p)
{
My_Bubble_Sort(p->data,p->size,sizeof(p->data[0]),Cmp_Struct);
printf("排序完成\n");
}
void DistroyContact(struct Contact* p)
{
free(p->data);
p->data = NULL;
printf("退出通讯录\n");
}
void SaveContact(struct Contact* p)
{
FILE* pf = fopen("contactinformation", "wb");
if (pf == NULL)
{
printf("SaveContact::%s\n", strerror(errno));
return;
}
int i = 0;
for (i = 0; i < p->size; i++)
{
fwrite(p->data + i, sizeof(struct PeoInfo), 1, pf);
}
printf("保存成功\n");
fclose(pf);
pf = NULL;
}
test.c
#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("***** 7.save 0.exit *****\n");
printf("****************************************\n");
}
int main()
{
struct Contact con = {0};
InitContact(&con);
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case EXIT://0
SaveContact(&con);
DistroyContact(&con);
break;
case ADD://1
AddContact(&con);
break;
case DEL://2
DelContact(&con);
break;
case SEARCH://3
SearchContact(&con);
break;
case MODIFY://4
ModifyContact(&con);
break;
case SHOW://5
ShowContact(&con);
break;
case SORT://6
SortContact(&con);
ShowContact(&con);
break;
case SAVE://7
SaveContact(&con);
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)