实现一个通讯录:
通讯录可以用来存个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供功能:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人7. 以名字排序所有联系人
8. 能本地存储联系人
9. 不限定联系人数(动态)
分析的总体过程:
通过结构体定义一个联系人所属信息,姓名、性别、年龄、电话、住址;
对联系人的各个功能进行实现(封装函数);
保存本地存储联系人(建立保存本地联系人的文件);
动态增加联系人数的最大容量(对于联系人人数的控制);
每次运行都能保证上次运行添加的联系人存在并且能显示出来(封装load函数,save函数);
测试各个功能函数,总体测试;
总体框架----头文件部分
contact.h
<span style="font-size:18px;">#define max_name 10
#define max_tele 12
#define max_addr 30
#define max_sex 3
#define contact_max 1 //电话本人数初始容量
#define DEFAULTSZ 3 //默认增长数
#define NULL_FAILURE 1
#define FILENAME "contact.dat"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Peo
{
char name[max_name];
char sex[max_sex];
int age;
char tele[max_tele];
char addr[max_addr];
}Peo; //个人信息结构
typedef struct Contact
{
Peo *contact; //指向电话本
int sz; //记录当前有多少个有效信息
int capacity; //容量
}Con, *pcon;
void init_contact(pcon _con);//初始化 //这里采用地址传递!
void _add(pcon _con); //添加人的信息
void _dis(const pcon _con); //void _del(pcon _con); //删除人的信息
void _search(pcon _con);//查找
void _mod(pcon _con);//编辑显示人的信息
void _clr(pcon _con);//清空
void _sort(pcon _con);//分类
void check(pcon _con);//检查空间是否足够,增加空间
void load(pcon _con);//下载
void save(pcon _con);//保存</span>
函数功能部分----封装的函数
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void check(pcon _con)
{
if ((_con->sz) >= (_con->capacity))
{
_con->contact = (Peo*)realloc(_con->contact, (_con->capacity + DEFAULTSZ)*sizeof(Peo));
if (_con->contact == NULL)
{
perror("开辟失败");
exit(NULL_FAILURE);
}
_con->capacity = _con->capacity + DEFAULTSZ;
}
}
void _add(pcon _con)
{
check(_con);
/*if (_con->sz >= contact_max)
{
printf("电话本满了!\n");
return;
}*/
printf("输入名字:");
scanf("%s", _con->contact[_con->sz].name);
printf("输入性别:");
scanf("%s", _con->contact[_con->sz].sex);
printf("输入年龄:");
scanf("%d", &_con->contact[_con->sz].age);//注意这里的取地址
printf("输入电话:");
scanf("%s", _con->contact[_con->sz].tele);
printf("输入地址: ");
scanf("%s", _con->contact[_con->sz].addr);
_con->sz++;
printf("添加成功\n");
}
void _dis(const pcon _con)
{
int i = 0;
if (_con->sz <= 0)
{
printf("电话本为空\n");
return;
}
//输出标题
printf("%10s\t%5s\t%3s\t%12s\t%10s\n", "名字", "性别", "年龄", "电话", "地址");
for (; i < _con->sz; i++)
{
printf("%10s\t%5s\t%3d\t%12s\t%10s\n",
_con->contact[i].name,
_con->contact[i].sex,
_con->contact[i].age,
_con->contact[i].tele,
_con->contact[i].addr);
}
}
void init_contact(pcon _con) //初始化
{
_con->sz = 0;
_con->contact = (Peo*)malloc(contact_max*sizeof(Peo));
if (NULL == _con->contact)
{
printf("out of memory");
exit(NULL_FAILURE);
}
memset(_con->contact, 0, contact_max*sizeof(Peo));
_con->capacity = contact_max;
load(_con);
}
int find_entry(pcon _con,char *find_name) //找人
{
int i = 0;
for (; i < _con->sz; i++)
{
if (strcmp(find_name, _con->contact[i].name) == 0)
{
return i;
}
}
return -1;
}
void _del(pcon _con)
{
int pos = 0;
int i = 0;
char name[max_name];
if (_con->sz <= 0)
{
printf("电话本为空!\n");
return;
}
printf("输入要删除人的名字: ");
scanf("%s", name);
pos = find_entry(_con, name);
if (pos == -1)
{
printf("不存在");
return;
}
for (i = pos; i < _con->sz - 1; i++)
//最后一个不需要移动
{
_con->contact[i] = _con->contact[i + 1];
}
_con->sz--;
printf("删除成功\n");
}
void view(pcon _con,int pos)
{
if (pos == -1)
{
printf("没有这个联系人!\n");
return ;
}
printf("%10s\t%5s\t%3s\t%12s\t%10s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%10s\t%5s\t%3d\t%12s\t%10s\n",
_con->contact[pos].name,
_con->contact[pos].sex,
_con->contact[pos].age,
_con->contact[pos].tele,
_con->contact[pos].addr);
}
void _search(pcon _con)
{
int pos = 0;
char name[max_name];
printf("输入名字:");
scanf("%s",name);
pos=find_entry(_con, name);
view(_con, pos);
}
void _mod(pcon _con)
{
int ret;
int pos = 0;
char name[max_name];
printf("编辑联系人\n");
printf("输入名字:");
scanf("%s", name);
//电话本是否有这个人
pos = find_entry(_con, name);
if (pos == -1)
{
printf("电话本没有这个联系人!\n");
return;
}
view(_con, pos);
printf("性别:\t");
scanf("%s", _con->contact[pos].sex);
printf("年龄:\t");
scanf("%d", &_con->contact[pos].age);
printf("电话:\t");
scanf("%s", _con->contact[pos].tele);
printf("地址: \t");
scanf("%s", _con->contact[pos].addr);
printf("编辑成功!\n");
}
//清空所有联系人
void _clr(pcon _con)
{
_con->sz = 0;
memset(_con->contact,NULL, contact_max*sizeof(Peo));
}
//分类联系人
void _sort(pcon _con)
{
int i = 0;
int j = 0;
//冒泡排序
if (_con->sz == 0)
{
printf("通讯录为空!\n");
return;
}
for (i = 0; i < _con->sz; i++)
{
for (j = 0; j < _con->sz - 1 - i; j++)
{
//按名字排序
if (strcmp(_con->contact[j].name, _con->contact[j+1].name)>0)
{
Peo tmp = _con->contact[j];
_con->contact[j] = _con->contact[j + 1];
_con->contact[j + 1] = tmp;
}
}
}
return;
}
void load(pcon _con)
{
int ret = 1;
FILE * read = fopen(FILENAME, "r");
if (read == NULL)
{
perror("open file contact.dat for read");
exit(EXIT_FAILURE);
}
while (ret)
{
check(_con);
ret = fread(&(_con->contact[_con->sz]), sizeof(Peo), 1, read);
if (ret ==1)
{
_con->sz++;
}
}
fclose(read);
}
void save(pcon _con)
{
int i = 0;
FILE * write = fopen(FILENAME, "w");
if (write == NULL)
{
perror("open file contact.dat for write");
exit(EXIT_FAILURE);
}
for (i = 0; i < _con->sz; i++)
{
fwrite(&(_con->contact[i]), sizeof(Peo), 1, write);
}
fclose(write);
free(_con->contact);
}
测试部分---main函数
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
enum op
{
EXIT,
ADD,
DEL,
SEARCH,
MOD,
DIS,
SORT,
CLR
};//对应switch()
void menu()
{
printf("*******************************\n");
printf("**** 1.add 2.del ****\n");
printf("**** 3.search 4. modify ****\n");
printf("**** 5.dis 6.sort ****\n");
printf("**** 7.clear 0.exit ****\n");
printf("*******************************\n");
}
int main()
{
Con My_con;//电话本
init_contact(&My_con);//初始化电话本
int input = 1;
while (input)
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case ADD:
_add(&My_con);
break;
case DEL:
_del(&My_con);
break;
case SEARCH:
_search(&My_con);
break;
case MOD:
_mod(&My_con);
break;
case DIS:
_dis(&My_con);
break;
case CLR:
_clr(&My_con);
break;
case SORT:
_sort(&My_con);
break;
case EXIT:
save(&My_con);
break;
default:
printf("选择错误");
break;
}
}
return 0;
}
如图:
对于这个 项目而言,是我学习C重要的里程碑。我觉得,我们在学习的时候总是需要不断刺激自己,让自己更加有动力,有信心去学习。对于现在普通大学生而言,(呵呵,就我了)不要让四年的青春都留给了时间,留下了浑浑噩噩的日子供将来回忆。学习过程中,总需要一些外力,一些刺激让我更加义无反顾的拼搏。当然在做通讯录的时候,遇到了诸多困难(可能水平过低了吧),我也学会一一克服,最终,我成功了!! 最后,送给每一位在路上或正准备出发的同学一句(个人名言吧):拼搏中的生命具有不可阻遏的力量,爱拼才会赢!