您的位置:首页 > 编程语言 > C语言/C++

简易通讯录——C语言的一个小成果

2016-07-30 17:17 323 查看
最近一段时间在学习C语言的知识,然后就有想法,实现一个什么东西,然后就试着做了这个简易的通讯录!

通讯录可以用来存储1000个人的信息。

每个人的信息包括:

姓名、性别、年龄、电话、住址。

提供的方法:

1、添加联系人的信息

2、删除联系人的信息

3、查找指定联系人的信息

4、修改指定联系人的信息

5、显示所有联系人的信息

6、清空所有人联系人

7、以姓名排序所有联系人

我在这里实现了两个版本:

1、静态版的通讯录——(容量有限)

2、动态版的通讯录——(可以动态开辟容量,增加联系人的数量)

首先——静态通讯录

头文件 contact.h:

#define _CRT_SECURE_NO_WARNINGS 1//申明头文件
#include<stdio.h>
#include<string.h>

#define MAX_NAME 20
#define MAX_SEX 3
#define MAX_TELE 13
#define MAX_ADDR 30
#define MAX 1000

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 con[MAX];
int sz;//记录当前的有效信息个数
}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);//分类

实现文件contact.c:

#define _CRT_SECURE_NO_WARNINGS 1//函数实现部分

#include<stdio.h>
#include<string.h>
#include"contact.h"

void init_contact(pCon _con)
{
_con->sz = 0;
memset(_con->con, 0, MAX*sizeof(Peo));
//_pcon->con = (peo*)malloc(DEFAULT_SZ*sizeof());
}

void _add(pCon _con)
{
if (_con->sz>=MAX)
{
printf("电话本已满\n");
return;
}
printf("请输入姓名:>\n");
scanf("%s", _con->con[_con->sz].name);
printf("请输入性别:>\n");
scanf("%s", _con->con[_con->sz].sex);
printf("请输入年龄:>\n");
scanf("%d", &_con->con[_con->sz].age);
printf("请输入电话:>\n");
scanf("%s", _con->con[_con->sz].tele);
printf("请输入地址:>\n");
scanf("%s", _con->con[_con->sz].addr);
_con->sz++;
printf("添加成功!\n");
}
void _dis(const pCon _con)
{
int i = 0;
printf("%10s\t%5s\t%3s\t%13s\t%30s\n","name","sex","age","tel","addr");//设置表头,右对齐
for (i = 0; i < _con->sz; i++)
{
printf("%10s\t%5s\t%d\t%13s\t%30s\n",
_con->con[i].name,
_con->con[i].sex,
_con->con[i].age,
_con->con[i].tele,
_con->con[i].addr);

}

}

int find_entry(pCon _con, char *find_name)
{
int i = 0;
for (; i < _con->sz; i++)
{
if (strcmp(find_name, _con->con[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("电话本为空");
return;
}
printf("输入要删除人的名字: ");
scanf("%s", name);

pos = find_entry(_con, name);
if (pos == -1)
{
printf("不存在");
return;
}
for (i = pos; i < _con->sz - 1; i++)
//最后一个不需要移动
{
_con->con[i] = _con->con[i + 1];
}

_con->sz--;
printf("删除成功\n");
}

void _search(pCon _con)//找到指定的人
{
int pos = 0;

char name[MAX_NAME];
printf("输入名字:");
scanf("%s", name);
pos = find_entry(_con, name);
if (pos == -1)
{
printf("没有这个联系人!\n");
return;
}
else
{
printf("%10s\t%5s\t%d\t%13s\t%30s\n",
_con->con[pos].name,
_con->con[pos].sex,
_con->con[pos].age,
_con->con[pos].tele,
_con->con[pos].addr);
}

}

void _mod(pCon _con)//修改指定人的信息
{
int pos = 0;
char name[MAX_NAME];
printf("请输入修改人的姓名:");
scanf("%s",name);
pos = find_entry(_con, name);

if (pos == -1)
{
printf("没有这个联系人!\n");
return;
}

else
{
printf("编辑联系人\n");
printf("输入名字:");
scanf("%s", _con->con[pos].name);
printf("输入性别:");
scanf("%s", _con->con[pos].sex);
printf("输入年龄:");
scanf("%d", &_con->con[pos].age);
printf("输入电话:");
scanf("%s", _con->con[pos].tele);
printf("输入地址: ");
scanf("%s", _con->con[pos].addr);
printf("编辑成功!\n");
}

}
//清空所有联系人
void _clr(pCon _con)
{
_con->sz = 0;
//memset(_con->con, NULL, MAX*sizeof(Peo));
}
//排序联系人
void _sort(pCon _con)//冒泡排序法
{
int i = 0;
int j = 0;
//冒泡排序
if (_con->sz == 0)
{
printf("通讯录为空!\n");
return;
}
else
{
for (i = 0; i < _con->sz-1; i++)//排序次数
{
for (j = 0; j < _con->sz - 1 - i; j++)//一趟冒泡排序
{//按名字排序

if (strcmp(_con->con[j].name, _con->con[j + 1].name)>0)
{
Peo tmp = _con->con[j];
_con->con[j]=_con->con[j + 1];
_con->con[j + 1]= tmp;

}

}
}
}

}


测试文件 test.c:

#define _CRT_SECURE_NO_WARNINGS 1//测试部分,放主函数,检测电话本能不能用
#include<stdio.h>
#include"contact.h"//引用头文件
enum op
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
DISPLAY,
CLEAR,
SORT,
};
void menu(input)
{
printf("**************************************\n");
printf("********1.adder 2.delete*************\n");
printf("********3.search 4.modify*************\n");
printf("********5.display 6.clear*************\n");
printf("********7.sort 0.exit*************\n");
printf("**************************************\n");
printf("**************************************\n");
}
int main()
{
Con my_con;//我的电话本
int input = 1;
init_contact(&my_con);//初始化我的电话本
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 MODIFY:
_mod(&my_con);
break;
case DISPLAY:
_dis(&my_con);
break;
case SORT:
_sort(&my_con);
break;
case CLEAR:
_clr(&my_con);
break;
case EXIT:
break;
default:
printf("选择错误!\n");
break;
}
}
return 0;
}
然后——动态通讯录

头文件 contact.h:

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_NAME 20
#define MAX_SEX 3
#define MAX_TELE 13
#define MAX_ADDR 3
typedef unsigned int size_t;

#define FILENAME "contact.dat"
#define DEFAULT_SZ 2//内存默认值
#define DEFAULT_INC 1 //默认每次自增量

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* con;
int sz;//记录当前的有效信息个数
int capacity;
}Con, *pCon;//结构体类型,指向结构体的指针

void check_capacity(pCon _con);//类型名(指针类型),变量名
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 load_contact(pCon _con);//加载文件
void save_contact(pCon _con);//保存文件
void _add_contact(pCon _con, Peo* p);
实现文件contact.c:

#define _CRT_SECURE_NO_WARNINGS 1//函数实现部分
#include"contact.h"

static void _add_contact(pCon _con, Peo* p)//只能访问当前文本
{
check_capacity(_con);
_con->con[_con->sz] = *p;
_con->sz++;
}

void load_contact(pCon _con)
{

FILE*Read = fopen(FILENAME, "r");//只读
size_t ret = 1;
if (Read == NULL)
{
perror("open file contact.dat file for read");
exit(EXIT_FAILURE);
}
while (ret)
{
check_capacity(_con);
ret = fread(&(_con->con[_con->sz]), sizeof(Peo), 1, Read);
if (ret == 1)
{
_con->sz++;
}

}
fclose(Read);
}

void save_contact(pCon _con)
{
int i = 0;
FILE* Write = fopen(FILENAME, "w");//只写
if (Write== NULL)
{
perror("open file contact.dat file for write");
exit(EXIT_FAILURE);
}

for (i = 0; i < _con->sz; i++)
{
fwrite(&(_con->con[i]), sizeof(Peo), 1, Write);
}
fclose(Write);
free(_con->con);
}

void init_contact(pCon _con)
{
_con->sz = 0;
_con->con = (Peo*)malloc(sizeof(Peo)*DEFAULT_SZ);//动态开辟内存
if (_con->con == NULL)
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
_con->capacity = DEFAULT_SZ;
memset(_con->con, 0, _con->capacity*sizeof(Peo));//把数组内容全部设置为零

load_contact(_con);
}

void check_capacity(pCon _con)
{
Peo* tmp =NULL;
if (_con->sz == _con->capacity)//需要扩容
{
tmp = (Peo*)realloc(_con->con, (_con->capacity + DEFAULT_INC)*sizeof(Peo));//扩容后的新的大小
if (tmp != NULL)
{
_con->con = tmp;
_con->capacity += DEFAULT_INC;
//_con->capacity = _con->con + DEFAULT_INC;
}
}

}

void _add(pCon _con)
{
check_capacity(_con);
if (_con->sz >= _con->capacity)
{
printf("电话本已满\n");
return;
}
printf("请输入姓名:>\n");
scanf("%s", _con->con[_con->sz].name);
printf("请输入性别:>\n");
scanf("%s", _con->con[_con->sz].sex);
printf("请输入年龄:>\n");
scanf("%d", &_con->con[_con->sz].age);
printf("请输入电话:>\n");
scanf("%s", _con->con[_con->sz].tele);
printf("请输入地址:>\n");
scanf("%s", _con->con[_con->sz].addr);
_con->sz++;
printf("添加成功!\n");
}
void _dis(const pCon _con)
{
int i = 0;
printf("%10s\t%5s\t%3s\t%13s\t%30s\n", "name", "sex", "age", "tel", "addr");//设置表头,右对齐
for (i = 0; i < _con->sz; i++)
{
printf("%10s\t%5s\t%d\t%13s\t%30s\n",
_con->con[i].name,
_con->con[i].sex,
_con->con[i].age,
_con->con[i].tele,
_con->con[i].addr);

}

}

int find_entry(pCon _con, char *find_name)
{
int i = 0;
for (; i < _con->sz; i++)
{
if (strcmp(find_name, _con->con[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("电话本为空");
return;
}
printf("输入要删除人的名字: ");
scanf("%s", name);

pos = find_entry(_con, name);
if (pos == -1)
{
printf("不存在");
return;
}
for (i = pos; i < _con->sz - 1; i++)
//最后一个不需要移动
{
_con->con[i] = _con->con[i + 1];
}

_con->sz--;
printf("删除成功\n");
}

void _search(pCon _con)//找到指定的人
{
int pos = 0;

char name[MAX_NAME];
printf("输入名字:");
scanf("%s", name);
pos = find_entry(_con, name);
if (pos == -1)
{
printf("没有这个联系人!\n");
return;
}
else
{
printf("%10s\t%5s\t%d\t%13s\t%30s\n",
_con->con[pos].name,
_con->con[pos].sex,
_con->con[pos].age,
_con->con[pos].tele,
_con->con[pos].addr);
}

}

void _mod(pCon _con)//修改指定人的信息
{
int pos = 0;
char name[MAX_NAME];
printf("请输入修改人的姓名:");
scanf("%s", name);
pos = find_entry(_con, name);

if (pos == -1)
{
printf("没有这个联系人!\n");
return;
}

else
{
printf("编辑联系人\n");
printf("输入名字:");
scanf("%s", _con->con[pos].name);
printf("输入性别:");
scanf("%s", _con->con[pos].sex);
printf("输入年龄:");
scanf("%d", &_con->con[pos].age);
printf("输入电话:");
scanf("%s", _con->con[pos].tele);
printf("输入地址: ");
scanf("%s", _con->con[pos].addr);
printf("编辑成功!\n");
}

}
//清空所有联系人
void _clr(pCon _con)
{
_con->sz = 0;
//memset(_con->con, NULL, MAX*sizeof(Peo));
}
//排序联系人
void _sort(pCon _con)//冒泡排序法
{
int i = 0;
int j = 0;
//冒泡排序
if (_con->sz == 0)
{
printf("通讯录为空!\n");
return;
}
else
{
for (i = 0; i < _con->sz - 1; i++)//排序次数
{
for (j = 0; j < _con->sz - 1 - i; j++)//一趟冒泡排序
{//按名字排序

if (strcmp(_con->con[j].name, _con->con[j + 1].name)>0)
{
Peo tmp = _con->con[j];
_con->con[j] = _con->con[j + 1];
_con->con[j + 1] = tmp;

}

}
}
}

}


测试文件 test.c:

#define _CRT_SECURE_NO_WARNINGS 1//测试部分,放主函数,检测电话本能不能用

#include"contact.h"//引用头文件
enum op
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
DISPLAY,
CLEAR,
SORT
};
void menu(input)
{
printf("**************************************\n");
printf("********1.adder 2.delete*************\n");
printf("********3.search 4.modify*************\n");
printf("********5.display 6.clear*************\n");
printf("********7.sort 0.exit*************\n");
printf("**************************************\n");
printf("**************************************\n");
}
int main()
{
Con my_con;//我的电话本
int input = 1;
init_contact(&my_con);//初始化我的电话本
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 MODIFY:
_mod(&my_con);
break;
case DISPLAY:
_dis(&my_con);
break;
case SORT:
_sort(&my_con);
break;
case CLEAR:
_clr(&my_con);
break;
case EXIT:
save_contact(&my_con);
break;
default:
printf("选择错误!\n");
break;
}
}
return 0;
}这就完成了简易通讯录的程序实现,以后要多学习要思考,争取能把自己手边所用的东西,都能模拟实现出来,感觉有趣不少呢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: