开始写通讯录已经好久了,才把通讯录的多个版本整理完,下边我来谈谈实现通讯录过程中的一些问题,以及自己的心
得,另外附加代码。
通讯录要求:
1.增加信息 2.删除信息 3.查找信息 4.修改信息
5.显示信息 6.清除信息 7.按姓名排序 0.退出
我觉得,写代码之前一定要想清楚自己要实现的功能,应该怎么实现,大致应该清楚这些。
首先,静态通讯录,给出通讯录存储元素的总大小,通讯录里最多只能存储这么多信息。而通讯录的增删改查,通常
需要找到通讯录的最后一个元素的位置,或者是元素的个数,所以我们需要再定义一个结构体,第一个成员是通讯录
的信息,是个结构体数组,第二个元素是当前通讯录的信息个数,这样,增加信息的时候,如果通讯录信息个数等于
通讯录的最大存储元素数,此时无法增加。所以,增加的结构体还是蛮有用的。关于防止头文件重复包含,在这种小
项目中也是需要注意的。
代码:
//Contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define NAME_MAX 12
#define SEX_MAX 4
#define TELE_MAX 12
#define ADDR_MAX 20
enum OP
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
DISPLAY,
CLEAR,
SORT
};
typedef struct person
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
}person;
typedef struct ConInfo
{
person data[1000];
int size;
}ConInfo,*pConInfo;
void init_con(pConInfo pcon);
void add_person(pConInfo pcon);
void dis_con(pConInfo pcon);
void del_con(pConInfo pcon);
void search_person(pConInfo pcon);
void clear_con(pConInfo pcon);
void modify_person(pConInfo pcon);
void sort_con(pConInfo pcon);
#endif
//contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//#ifndef __CONTACT_H__
//#define __CONTACT_H__
#include
#include
static int find(pConInfo pcon, char *name)
{
int i = 0;
for (i = 0;isize;i++)
{
if (strcmp(pcon->data[i].name, name) == 0)
return i;
}
return -1;
}
void init_con(pConInfo pcon)
{
pcon->size = 0;
}
void add_person(pConInfo pcon)
{
if (pcon->size == 1000)
{
printf("通讯录已经满了\n");
return;
}
int num = 0;//插入人数
printf("请输入插入的人数:>");
scanf("%d",&num);
while (num--)
{
printf("请输入联系人姓名:>");
scanf("%s",pcon->data [pcon->size].name);
printf("请输入联系人年龄:>");
scanf("%d", &(pcon->data[pcon->size].age));
printf("请输入联系人性别:>");
scanf("%s", pcon->data[pcon->size].sex);
printf("请输入联系人电话:>");
scanf("%s", pcon->data[pcon->size].tele);
printf("请输入联系人地址:>");
scanf("%s", pcon->data[pcon->size].addr);
pcon->size++;
printf("插入成功\n");
}
}
void dis_con(pConInfo pcon)
{
int i = 0;
printf("通讯录信息如下:\n");
printf("%12s%4s%4s%12s%20s\n","name","age","sex","tele","addr");
for (i = 0;isize;i++)
{
printf("%12s%4d%4s%12s%20s",
pcon->data[i].name,
pcon->data[i].age,
pcon->data[i].sex, pcon->data[i].tele,
pcon->data[i].addr);
printf("\n");
}
}
void del_con(pConInfo pcon)
{
char name[NAME_MAX];
int pos = 0;//查找的位置
int index = 0;
if (pcon->size == 0)
{
printf("通讯录已经是空的\n");
}
printf("请输入删除联系人的姓名:>");
scanf("%s",name);
pos = find(pcon, name);
if (pos == -1)
{
printf("要查找的联系人不存在\n");
}
for (index = pos;indexsize;index++)
{
memcpy(&(pcon->data [index]), &(pcon->data[index+1]),sizeof(person));
}
pcon->size--;
printf("删除成功\n");
}
void search_person(pConInfo pcon)
{
char name[NAME_MAX];
int pos = 0;
printf("请输入要查找联系人的姓名:>");
scanf("%s",name);
pos = find(pcon,name);
if (pos == -1)
{
printf("要查找的联系人不存在\n");
}
printf("%12s%4d%4s%12s%20s",
pcon->data[pos].name,
pcon->data[pos].age,
pcon->data[pos].sex, pcon->data[pos].tele,
pcon->data[pos].addr);
printf("\n");
}
void clear_con(pConInfo pcon)
{
pcon->size = 0;
printf("清空成功!\n");
}
void modify_person(pConInfo pcon)
{
if (pcon->size == 0)
{
printf("通讯录为空");
}
char name[NAME_MAX];
int pos = 0;
printf("请输入要修改的联系人的姓名\n");
scanf("%s",name);
pos = find(pcon, name);
if (pos == -1)
{
printf("要修改的联系人不存在\n");
return;
}
printf("请输入修改后的信息\n");
scanf("%s%d%s%s%s",
pcon->data[pos].name,
&(pcon->data[pos].age),
pcon->data[pos].sex,
pcon->data[pos].tele,
pcon->data[pos].addr);
printf("修改成功\n");
}
void sort_con(pConInfo pcon)
{
int i = 0;
int j = 0;
int flag = 0;
person tmp ;
for (i = 0;isize - 1;i++)
{
flag = 1;
for (j = 0;jsize - 1 - i;j++)
{
if (strcmp(pcon->data[j].name, pcon->data[j + 1].name)> 0)
{
tmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tmp;
flag = 0;
}
if (flag == 1)
break;
}
}
printf("排序成功\n");
dis_con(pcon);
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include"Contact.h"
void menu()
{
printf("*****1.add 2.del ****\n");
printf("*****3.search 4.modify****\n");
printf("*****5.display 6.clear ****\n");
printf("*****7.sort 0.exit ****\n");
}
int main()
{
ConInfo pson = {0};
init_con(&pson);
int input = 1;
while (input)
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case ADD:
add_person(&pson);
break;
case DEL:
del_con(&pson);
break;
case SEARCH:
search_person(&pson);
break;
case MODIFY:
modify_person(&pson);
break;
case CLEAR:
clear_con(&pson);
break;
case DISPLAY:
dis_con(&pson);
break;
case SORT:
sort_con(&pson);
break;
case EXIT:
break;
default:
printf("输入错误");
break;
}
}
system("pause");
return 0;
}
太小,如果某人的朋友多,岂不是存不下吗??所以,动态通讯录专门用于解决这个问题。动态开辟,要多少开辟多
少,下边展示代码。
//contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//#ifndef __CONTACT_H__
//#define __CONTACT_H__
#include
#include
#include
static int find(pConInfo pcon, char *name)
{
int i = 0;
for (i = 0;isize;i++)
{
if (strcmp(pcon->data[i].name, name) == 0)
return i;
}
return -1;
}
void init_con(pConInfo pcon)
{
pcon->size = 0;
pcon->capacity = 2;
pcon->data = (person *)malloc(2*sizeof(person));
if (pcon->data == NULL)
{
printf("out of memory");
return;
}
}
void expand_capacity(pConInfo pcon)
{
person *p = NULL;
pcon ->data = (person *)realloc(pcon->data,(pcon->capacity+ INC_CAP)*sizeof(person));
if (pcon->data == NULL)
{
printf("out of memory");
exit(EXIT_FAILURE);
}
else
{
p = pcon->data;
}
pcon->capacity = pcon->capacity + INC_CAP;
}
void add_person(pConInfo pcon)
{
if (pcon->size == pcon->capacity)
{
expand_capacity(pcon);
}
/*if (pcon->size == 0)
{
init_con(pcon);
}*/
printf("请输入联系人姓名:>");
scanf("%s", pcon->data[pcon->size].name);
printf("请输入联系人年龄:>");
scanf("%d", &(pcon->data[pcon->size].age));
printf("请输入联系人性别:>");
scanf("%s", pcon->data[pcon->size].sex);
printf("请输入联系人电话:>");
scanf("%s", pcon->data[pcon->size].tele);
printf("请输入联系人地址:>");
scanf("%s", pcon->data[pcon->size].addr);
pcon->size++;
printf("插入成功\n");
}
void dis_con(pConInfo pcon)
{
int i = 0;
printf("通讯录信息如下:\n");
printf("%12s%4s%4s%12s%20s\n", "name", "age", "sex", "tele", "addr");
for (i = 0;isize;i++)
{
printf("%12s%4d%4s%12s%20s",
pcon->data[i].name,
pcon->data[i].age,
pcon->data[i].sex, pcon->data[i].tele,
pcon->data[i].addr);
printf("\n");
}
}
void del_con(pConInfo pcon)
{
char name[NAME_MAX];
int pos = 0;//查找的位置
int index = 0;
if (pcon->size == 0)
{
printf("通讯录已经是空的\n");
}
printf("请输入删除联系人的姓名:>");
scanf("%s", name);
pos = find(pcon, name);
if (pos == -1)
{
printf("要查找的联系人不存在\n");
}
else
{
for (index = pos;indexsize;index++)
{
memcpy(&(pcon->data[index]), &(pcon->data[index + 1]), sizeof(person));
}
pcon->size--;
printf("删除成功\n");
}
}
void search_person(pConInfo pcon)
{
char name[NAME_MAX];
int pos = 0;
printf("请输入要查找联系人的姓名:>");
scanf("%s", name);
pos = find(pcon, name);
if (pos == -1)
{
printf("要查找的联系人不存在\n");
}
else
printf("%12s%4d%4s%12s%20s",
pcon->data[pos].name,
pcon->data[pos].age,
pcon->data[pos].sex,
pcon->data[pos].tele,
pcon->data[pos].addr);
printf("\n");
}
void clear_con(pConInfo pcon)
{
pcon->size = 0;
printf("清空成功!\n");
}
void modify_person(pConInfo pcon)
{
if (pcon->size == 0)
{
printf("通讯录为空");
}
char name[NAME_MAX];
int pos = 0;
printf("请输入要修改的联系人的姓名\n");
scanf("%s", name);
pos = find(pcon, name);
if (pos == -1)
{
printf("要修改的联系人不存在\n");
return;
}
else
{
printf("请输入修改后的信息\n");
scanf("%s%d%s%s%s",
pcon->data[pos].name,
&(pcon->data[pos].age),
pcon->data[pos].sex,
pcon->data[pos].tele,
pcon->data[pos].addr);
printf("修改成功\n");
}
}
void free_con(pConInfo pcon)
{
free(pcon->data);
pcon->data = NULL;
}
void sort_con(pConInfo pcon)
{
int i = 0;
int j = 0;
int flag = 0;
person tmp;
for (i = 0;isize - 1;i++)
{
flag = 1;
for (j = 0;jsize - 1 - i;j++)
{
if (strcmp(pcon->data[j].name, pcon->data[j + 1].name)> 0)
{
tmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tmp;
flag = 0;
}
if (flag == 1)
break;
}
}
printf("排序成功\n");
dis_con(pcon);
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include"Contact.h"
void menu()
{
printf("*****1.add 2.del ****\n");
printf("*****3.search 4.modify****\n");
printf("*****5.display 6.clear ****\n");
printf("*****7.sort 0.exit ****\n");
}
int main()
{
ConInfo pson = { 0 };
init_con(&pson);
int input = 1;
while (input)
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
add_person(&pson);
break;
case DEL:
del_con(&pson);
break;
case SEARCH:
search_person(&pson);
break;
case MODIFY:
modify_person(&pson);
break;
case CLEAR:
clear_con(&pson);
break;
case DISPLAY:
dis_con(&pson);
break;
case SORT:
sort_con(&pson);
break;
case EXIT:
free_con(&pson);
break;
default:
printf("输入错误");
break;
}
}
system("pause");
return 0;
}
//contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define NAME_MAX 12
#define SEX_MAX 4
#define TELE_MAX 12
#define ADDR_MAX 20
#define INC_CAP 2
enum OP
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
DISPLAY,
CLEAR,
SORT
};
typedef struct person
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
}person;
typedef struct ConInfo
{
person *data;
int size;
int capacity;//当前电话本的容量
}ConInfo, *pConInfo;
void init_con(pConInfo pcon);
void add_person(pConInfo pcon);
void dis_con(pConInfo pcon);
void del_con(pConInfo pcon);
void search_person(pConInfo pcon);
void clear_con(pConInfo pcon);
void modify_person(pConInfo pcon);
void sort_con(pConInfo pcon);
void free_con(pConInfo pcon);
#endif
现在还能清晰的记得,在之前做c++课程设计(我的课题是宾馆客房管理系统),老师给的要求就是,不要给我演示
的时候就是按顺序(就是先增加信息,再删除啊显示啊之类的),我当时就是没做好,现在,我来让我的通讯录实现
这个功能----把信息保存在文件中,每次运行时,只要把文件中的信息载入内存,就不用每次都是先录入信息。
下边展示代码:
//contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define NAME_MAX 12
#define SEX_MAX 4
#define TELE_MAX 12
#define ADDR_MAX 20
#define INC_CAP 2
enum OP
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
DISPLAY,
CLEAR,
SORT
};
typedef struct person
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
}person;
typedef struct ConInfo
{
person *data;
int size;
int capacity;//当前电话本的容量
}ConInfo, *pConInfo;
void init_con(pConInfo pcon);
void add_person(pConInfo pcon);
void dis_con(pConInfo pcon);
void del_con(pConInfo pcon);
void search_person(pConInfo pcon);
void clear_con(pConInfo pcon);
void modify_person(pConInfo pcon);
void sort_con(pConInfo pcon);
void free_con(pConInfo pcon);
void save_con(pConInfo pcon);
void load_con(pConInfo pcon);
#endif
//contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//#ifndef __CONTACT_H__
//#define __CONTACT_H__
#include
#include
#include
static int find(pConInfo pcon, char *name)
{
int i = 0;
for (i = 0;isize;i++)
{
if (strcmp(pcon->data[i].name, name) == 0)
return i;
}
return -1;
}
void init_con(pConInfo pcon)
{
pcon->size = 0;
pcon->capacity = 2;
pcon->data = (person *)malloc(2 * sizeof(person));
if (pcon->data == NULL)
{
printf("out of memory");
return;
}
load_con(pcon);
}
void check_capacity(pConInfo pcon)
{
person *p = NULL;
pcon->data = (person *)realloc(pcon->data, (pcon->capacity + INC_CAP)*sizeof(person));
if (pcon->data == NULL)
{
printf("out of memory");
exit(EXIT_FAILURE);
}
else
{
p = pcon->data;
}
pcon->capacity = pcon->capacity + INC_CAP;
}
void add_person(pConInfo pcon)
{
/*if (pcon->size == pcon->capacity)
{
expand_capacity(pcon);
}*/
/*if (pcon->size == 0)
{
init_con(pcon);
}*/
check_capacity(pcon);
printf("请输入联系人姓名:>");
scanf("%s", pcon->data[pcon->size].name);
printf("请输入联系人年龄:>");
scanf("%d", &(pcon->data[pcon->size].age));
printf("请输入联系人性别:>");
scanf("%s", pcon->data[pcon->size].sex);
printf("请输入联系人电话:>");
scanf("%s", pcon->data[pcon->size].tele);
printf("请输入联系人地址:>");
scanf("%s", pcon->data[pcon->size].addr);
pcon->size++;
printf("插入成功\n");
}
void dis_con(pConInfo pcon)
{
int i = 0;
printf("通讯录信息如下:\n");
printf("%12s%4s%4s%12s%20s\n", "name", "age", "sex", "tele", "addr");
for (i = 0;isize;i++)
{
printf("%12s%4d%4s%12s%20s",
pcon->data[i].name,
pcon->data[i].age,
pcon->data[i].sex, pcon->data[i].tele,
pcon->data[i].addr);
printf("\n");
}
}
void del_con(pConInfo pcon)
{
char name[NAME_MAX];
int pos = 0;//查找的位置
int index = 0;
if (pcon->size == 0)
{
printf("通讯录已经是空的\n");
}
printf("请输入删除联系人的姓名:>");
scanf("%s", name);
pos = find(pcon, name);
if (pos == -1)
{
printf("要查找的联系人不存在\n");
}
else
{
for (index = pos;indexsize;index++)
{
memcpy(&(pcon->data[index]), &(pcon->data[index + 1]), sizeof(person));
}
pcon->size--;
printf("删除成功\n");
}
}
void search_person(pConInfo pcon)
{
char name[NAME_MAX];
int pos = 0;//存储查找到的元素的位置
printf("请输入要查找联系人的姓名:>");
scanf("%s", name);
pos = find(pcon, name);
if (pos == -1)
{
printf("要查找的联系人不存在\n");
}
else
printf("%12s%4d%4s%12s%20s",
pcon->data[pos].name,
pcon->data[pos].age,
pcon->data[pos].sex,
pcon->data[pos].tele,
pcon->data[pos].addr);
printf("\n");
}
void clear_con(pConInfo pcon)
{
pcon->size = 0;
printf("清空成功!\n");
}
void modify_person(pConInfo pcon)
{
if (pcon->size == 0)
{
printf("通讯录为空");
}
char name[NAME_MAX];
int pos = 0;
printf("请输入要修改的联系人的姓名\n");
scanf("%s", name);
pos = find(pcon, name);
if (pos == -1)
{
printf("要修改的联系人不存在\n");
return;
}
else
{
printf("请输入修改后的信息\n");
scanf("%s%d%s%s%s",
pcon->data[pos].name,
&(pcon->data[pos].age),
pcon->data[pos].sex,
pcon->data[pos].tele,
pcon->data[pos].addr);
printf("修改成功\n");
}
}
void free_con(pConInfo pcon)
{
free(pcon->data);
pcon->data = NULL;
}
void sort_con(pConInfo pcon)
{
int i = 0;
int j = 0;
int flag = 0;
person tmp;
for (i = 0;isize - 1;i++)
{
flag = 1;
for (j = 0;jsize - 1 - i;j++)
{
if (strcmp(pcon->data[j].name, pcon->data[j + 1].name)> 0)
{
tmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tmp;
flag = 0;
}
if (flag == 1)
break;
}
}
printf("排序成功\n");
dis_con(pcon);
}
void save_con(pConInfo pcon)
{
FILE *pwrite = fopen("contact.dat","w");
int i = 0;
if (pwrite == NULL)
{
perror("open the file for write");
exit(EXIT_FAILURE);
}
else
{
for (i = 0;isize;i++)
{
fwrite(&(pcon->data[i]),sizeof(person),1,pwrite);
}
}
fclose(pwrite);
}
void load_con(pConInfo pcon)
{
FILE *pread = fopen("contact.dat","r");
int i = 0;
person tmp = { 0 };
if (pread == NULL)
{
perror("open the file for read");
exit(EXIT_FAILURE);
}
else
{
while(fread(&tmp, sizeof(person), 1, pread))
{
check_capacity(pcon);
pcon->data[i] = tmp;
pcon->size++;
i++;
}
}
fclose(pread);
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include"contact.h"
void menu()
{
printf("*****1.add 2.del ****\n");
printf("*****3.search 4.modify****\n");
printf("*****5.display 6.clear ****\n");
printf("*****7.sort 0.exit ****\n");
}
int main()
{
ConInfo pson = { 0 };
init_con(&pson);
int input = 1;
while (input)
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
add_person(&pson);
break;
case DEL:
del_con(&pson);
break;
case SEARCH:
search_person(&pson);
break;
case MODIFY:
modify_person(&pson);
break;
case CLEAR:
clear_con(&pson);
break;
case DISPLAY:
dis_con(&pson);
break;
case SORT:
sort_con(&pson);
break;
case EXIT:
save_con(&pson);
free_con(&pson);
break;
default:
printf("输入错误");
break;
}
}
system("pause");
return 0;
}
也好,小事也罢,踏踏实实做好。
这次也才懂得,并不是所有的函数实现都必须在头文件中声明,只有是函数接口才在头文件中声明。
其实,我们也可以把信息保存在数据库文件,这个功能,之后再实现~~
一位学长在自己的博客中提到,学习,会遇见不同层次的人;分享,确实能获得更多~~对我希望自己从分享中学到更
多~~