一、通讯录功能分为以下模块:
a)信息创建模块:对信息进行录入,通过进行相关操作,保存所需的文件;
b)信息查询:在信息载入和信息创建的前提下,对某人的信息进行查询;
c)信息修改:在信息载入和信息创建的前提下,对需更改信息的某人进行修改;
d)信息删除:在信息载入和信息创建的前提下,对某人的信息进行删除;
e)信息显示:在信息载入和信息创建的前提下,显示出系统所有人的信息;
f )信息排序:在信息载入和信息创建的前提下,根据姓名对通讯录排序;
g)清空信息:在信息载入和信息创建的前提下,清空通讯录;
h)保存信息:在信息载入和信息创建的前提下,对通讯录进行相关的编辑后,保存所需的文件;
i)退出程序:退出该程序,结束程序运行。
二、代码分为三部分:头文件、函数、测试函数
头文件:#contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
//#define MAX 1000 //通讯录最大容量
#define NAMEMAX 10
#define TELE 12
#define ADDR 25
#define SEX 5
#define CAPACITY 3 //当前容量
#define FILENAME "daima.txt"
typedef struct Peoinfo
{
char name[NAMEMAX];
char sex[SEX];
int age;
char addr[ADDR];
char tele[TELE];
}Pof;
typedef struct Contact
{
Pof *data; //信息储存的区域
int sz; //有效元素的个数
int capacity; //容量
char filename[100]; //文件名
}Contact,*p;
void Init(p list); //初始化函数
void Add(p pcon); //录入函数
void Show(const p pcon); //显示函数
void Delete(p pcon); //删除函数
void Search(p pcon); //寻找函数
void Modify(p pcon); //修改函数
void Sort(p pcon); //排序函数
void Clear(p pcon); //清空函数
void Addcapacity(p pcon); //增容函数
void Save(p pcon); //保存文件
void display(p pcon); //文件读入函数
void Destory(p pcon); //释放内存函数
#endif
函数:#contact.c
#include"contact.h"
void display(p pcon) //文件读入函数
{
int i = 0;
FILE*pfin = fopen(FILENAME, "r");
if (pfin == NULL)
{
perror("fopen");
exit(EXIT_FAILURE);
}
Pof tem = { 0 };
while (fread(&tem, sizeof(Pof), 1, pfin) != 0)
{
Addcapacity(pcon); //加载信息要先开辟空间
pcon->data[i] = tem;
i++;
pcon->sz++;
}
printf("读入成功");
fclose(pfin);
}
void Save(p pcon) //数据写入文件函数
{
int i = 0;
FILE*pf = fopen(FILENAME, "w");
if (pf == NULL)
{
perror("fopen");
exit(EXIT_FAILURE);
}
for (i = 0; i < pcon->sz; i++)
{
fwrite(pcon->data+i, sizeof(Pof), 1, pf);
}
fclose(pf);
}
void Init(p list) //初始化函数
{
list->sz = 0;
list->data = malloc(CAPACITY*sizeof(Pof)); //初始化函数memset
if (list->data == NULL)
{
perror("use malloc fail!");
exit(0);//正常退出
}
memset(list->data, 0, CAPACITY*sizeof(Pof));
list->capacity = CAPACITY;
}
void Addcapacity(p pcon) //增容函数
{
if (pcon->sz == pcon->capacity)
{
//增容
Pof *ptr = realloc(pcon->data, (pcon->capacity + 2)*sizeof(Pof));
if (ptr == NULL)
{
perror("增容失败");
exit(0);
}
else
{
pcon->data = ptr;
pcon->capacity += 2;
}
}
}
void Destory(p pcon) //释放内存
{
free(pcon->data);
pcon->data = NULL;
}
void Add(p pcon) //录入信息函数
{
char flat = 'Y';
while(toupper(flat) == 'Y')
{
Addcapacity(pcon);
int i = 0;
i = pcon->sz;
fflush(stdin);
printf("请输入名字:");
scanf("%s", pcon->data[i].name);
printf("请输入性别:");
scanf("%s", pcon->data[i].sex);
printf("请输入年龄:");
scanf("%d", &pcon->data[i].age);
printf("请输入地址:");
scanf("%s", pcon->data[i].addr);
printf("请输入电话:");
scanf("%s", pcon->data[i].tele);
pcon->sz++;
printf("录入成功!\n");
printf("是否要继续录入信息,请选择(是y或否n):");
fflush(stdin);
scanf("%c", &flat);
if (toupper(flat) != 'Y')
{
if (toupper(flat) == 'N')
return;
else
{
printf("输入错误,请重新输入:");
fflush(stdin);
scanf("%c", &flat);
}
}
}
}
void Show(const p pcon) // 显示函数
{
int i = 0;
printf("%6s%6s%5s%15s%15s\n", "姓名", "性别", "年龄", "地址", "电话");
for (i = 0; i < pcon->sz; i++)
{
printf("%6s%6s%5d%15s%15s",
pcon->data[i].name,
pcon->data[i].sex,
pcon->data[i].age,
pcon->data[i].addr,
pcon->data[i].tele);
printf("\n");
}
}
int find(char name[],p pcon ) //寻找函数
{
int i = 0;
for (i = 0; i <pcon->sz; i++)
{
if (strcmp(name, pcon->data[i].name) == 0)
return i;
}
return -1;
}
void Delete(p pcon) // 删除函数
{
char name[NAMEMAX];
printf("请输入要删除人的姓名:");
scanf("%s", &name);
int ret = find(name,pcon);
if (ret == -1)
printf("没找到要删除的人!");
else
{
for (int i = ret; i < pcon->sz; i++)
pcon->data[i] = pcon->data[i + 1];
pcon->sz--;
printf("删除成功!");
}
}
void Search(p pcon) //查找函数
{
char name[NAMEMAX];
printf("请输入要查找人的姓名:");
scanf("%s", &name);
int ret = find(name, pcon);
if (ret == -1)
printf("没找到要查找的人!");
else
{
printf("%6s%6s%5d%15s%15s",
pcon->data[ret].name,
pcon->data[ret].sex,
pcon->data[ret].age,
pcon->data[ret].addr,
pcon->data[ret].tele);
}
}
void Modify(p pcon) //修改函数
{
char name[NAMEMAX];
printf("请输入要修改人的姓名:");
scanf("%s", &name);
int ret = find(name, pcon);
if (ret == -1)
printf("没找到要修改的人!");
else
{
printf("请输入名字:");
scanf("%s", pcon->data[ret].name);
printf("请输入性别:");
scanf("%s", pcon->data[ret].sex);
printf("请输入年龄:");
scanf("%d", &pcon->data[ret].age);
printf("请输入地址:");
scanf("%s", pcon->data[ret].addr);
printf("请输入电话:");
scanf("%s", pcon->data[ret].tele);
printf("修改成功!");
}
}
void Sort(p pcon) //排序函数
{
int i=0, j = 0;
for (i = 0; i < pcon->sz - 1;i++)
for (j = 0; j < pcon->sz - 1 - i;j++)
{
if (strcmp(pcon->data[j].name,pcon->data[j+1].name)>0)
{
Pof tcmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tcmp;
}
}
printf("完成排序!");
}
void Clear(p pcon) //清空函数
{
pcon->sz = 0;
printf("数据已清空");
}
测试函数:#test.c
#include"contact.h"
enum Choose
{
EXIT, //退出
ADD, //录入信息
SHOW, //显示信息
DELETE, //删除信息
SEARCH, //查找信息
MODIFY, //修改函数
SORT, //排序
CLEAR, //清空
DISPLAY //读入文件
};
void my_enum()
{
printf("\n\n\t\t\t【通讯录】\n");
printf("\n\t\t1.录入信息 2.显示信息\n");
printf("\t\t3.删除信息 4.查找信息\n");
printf("\t\t5.修改信息 6.信息排序\n");
printf("\t\t7.清空信息 8.读入文件\n");
printf("\t请输入数字(1--7),【0退出程序】:");
}
int main()
{
Contact list;
Init(&list);
int i = 0;
do
{
my_enum();
scanf("%d", &i);
switch (i)
{
case ADD:
Add(&list);
break;
case SHOW:
Show(&list);
break;
case DELETE:
Delete(&list);
break;
case SEARCH:
Search(&list);
break;
case MODIFY:
Modify(&list);
break;
case SORT:
Sort(&list);
break;
case CLEAR:
Clear(&list);
break;
case EXIT:
Save(&list);
Destory(&list);
printf("退出系统");
break;
case DISPLAY:
display(&list); //文件读入
break;
default:
printf("输入数字有错,请重新输入!");
break;
}
} while (i);
return 0;
}
运行:
代码里的每个功能我都运行过了,是可以运行的,图片就不放了,好奇的小伙伴可以自己运行下。