简易通讯录——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;
}这就完成了简易通讯录的程序实现,以后要多学习要思考,争取能把自己手边所用的东西,都能模拟实现出来,感觉有趣不少呢!
通讯录可以用来存储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;
}这就完成了简易通讯录的程序实现,以后要多学习要思考,争取能把自己手边所用的东西,都能模拟实现出来,感觉有趣不少呢!
相关文章推荐
- C语言实现一个简易通讯录(附图验证)
- 一个简易的c语言病毒源码
- 帮同学写的一个c语言的期末作业(班级通讯录)
- C语言利用结构体实现一个通讯录
- 用C语言做一个通讯录
- 实现一个简易通讯录
- C语言设计一个实用的小型通讯录
- 设计实现一个简易通讯录,要求使用结构体
- C语言制作一个简易的计算器(加、减、乘、除、取模)
- C函数指针妙用,用c语言写一个简易类
- C语言用结构体写一个通讯录
- 用C语言写的一个控制台界面的通讯录管理系统
- 【c语言】实现一个通讯录
- 通过简单的C语言编程实现一个简易…
- C语言用结构体写一个通讯录
- C语言写了一个简单的通讯录
- 【C语言疯狂讲义】(十六)C语言简易通讯录(未优化版)
- 用c语言实现 一个通讯录(实现 增加、删除、查找、修改、显示、清空功能)
- 设计实现一个简易通讯录,要求使用结构体
- C语言利用结构体实现一个通讯录