通讯录管理系统 (c语言版本)
一:通讯录基本功能
实现一个通讯录:
通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
1:添加联系人信息
2:删除指定联系人信息
3:查找指定联系人信息
4:修改指定联系人信息
5:显示所有联系人信息
6:按指定格式排序(例:以名字排序所有联系人)
0:清空所有联系人
二:实现代码分析
1:建立文件
首先建立三个文件分别存储不同的代码需求
test.c//用于测试代码
contact.c//用于实现通讯录功能代码
contact.h//用于管理头文件和声明函数、实现通用功能、数据
2:test.c
(1):需要一个菜单提供给用户提示通讯录的功能
void menu()
{
printf("***************************************\n");
printf("***** 1:add 2:del *****\n");
printf("***** 3:search 4:modify *****\n");
printf("***** 5:show 6:sort *****\n");
printf("***** 0:exit *****\n");
printf("***************************************\n");
}
(2):使用枚举定义选择数字,可将数据隐藏代码保密效果比较好
enum Option
{
EXIT,//0
ADD,//1
DEL,//2
SEARCH,//3
MODIFY,//4
SHOW,//5
SORT,//6
};
(3):初始化通讯录函数
struct Contact con;//建一个能够存储100人信息的结构体数组
InitContact(&con);//初始化数组函数
}
(3):添加联系人信息(add)
AddContact(&con);
(4):删除指定联系人信息(del)
DelContact(&con);
(5):查找指定联系人信息(search)
SearchContact(&con);
(6):修改指定联系人信息(modify)
ModifyContact(&con);
(7):显示所有联系人信息(show)
ShowContact(&con);
(8):按指定格式排序(例:以名字排序所有联系人)(sort)
SortContact(&con);
test.c完整代码
#include"contact.h"//contact.h头文件引用
void menu()
{
printf("***************************************\n");
printf("***** 1:add 2:del *****\n");
printf("***** 3:search 4:modify *****\n");
printf("***** 5:show 6:sort *****\n");
printf("***** 0:exit *****\n");
printf("***************************************\n");
}
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT,
};
int main()
{
struct Contact con;//建一个能够存储100人信息的结构体数组
//初始化数组
InitContact(&con);
int input = 0;
do{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
SortContact(&con);
break;
case EXIT:
printf("清空所有联系人");
break;
default :
printf("输入错误请重新输入>:\n");
break;
}
} while (input);
}
3:contact.c
(1)初始化通讯录函数
//InitContact(&con);
//初始化结构体数组函数实现
void InitContact(struct Contact* pc)
{
pc->sz = 0;//将人数初始化为0
memset(pc->data, 0, Max*sizeof(struct PeoInfor));
}
(2)添加联系人信息(add)函数实现
//AddContact(&con);
void AddContact( struct Contact* pc)
{
assert(pc);
if (pc->sz == Max)
{
printf("通讯录已满,无法添加数据\n");
return;
}
else
{
printf("请输入姓名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话号码:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->sz].age);//整型输入注意&不要漏
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
}
(3):删除指定联系人信息(del)函数实现
//DelContact(&con);
void DelContact(struct Contact*pc)
{
char name[MAX_NAME];
printf("输入查找人名:>");
scanf("%s", name);
//创建一个查找函数
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("未找到该联系人信息\n");
}
else
{
//删除
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功删除指定联系人\n");
}
}
调用FindByName()函数完成查找信息完成删除操作
(4):查找指定联系人信息(search)函数实现
//SearchContact(&con);
//查找函数实现
static int FindByName(const struct Contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;//找到就返回下标i
}
}
return -1;//找不到返回-1
}
//3:查找指定联系人函数实现
void SearchContact(const struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入查找人姓名:>");
scanf("%s", name);
int ret = FindByName(pc, name);//查找人名函数
if (ret == -1)
{
printf("未找到该联系人信息\n");
}
else
{
printf("%-20s\t%-5s\t%-12s\t%-2s\t%-30s\t\n",
"姓名", "性别", "电话号码", "年龄", "地址");
printf("%-20s\t%-5s\t%-12s\t%-2d\t%-30s\t\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].tele,
pc->data[ret].age,
pc->data[ret].addr);
}
}
FindByName()可用于查找和修改、删除中
(5):修改指定联系人信息(modify)函数实现
//ModifyContact(&con);
//4:修改指定联系人信息函数实现
void ModifyContact(struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入修改人姓名:>");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("未找到该联系人信息\n");
}
else
{
printf("请输入姓名:>");
scanf("%s", pc->data[ret].name);
printf("请输入性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入年龄:>");
scanf("%d", &pc->data[ret].age);//注意&不要漏了取地址符
printf("请输入地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
}
调用 FindByName()函数查找信息才能修改
(6):显示所有联系人信息(show)函数实现
//ShowContact(&con);
void ShowContact(const struct Contact* pc)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-5s\t%-12s\t%-2s\t%-30s\t\n",
"姓名", "性别", "电话号码", "年龄", "地址");
printf("%-20s\t%-5s\t%-12s\t%-2d\t%-30s\t\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].age,
pc->data[i].addr);
}
}
(7):按指定格式排序(例:以名字排序所有联系人)(sort)
//SortContact(&con);
int cmpByName(const void* e1, const void* e2)
{
return strcmp(((struct PeoInfor*)e1)->name, ((struct PeoInfor*)e2)->name);
}
//6:以名字排序所有联系人
void SortContact(const struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct PeoInfor), cmpByName);
printf("按姓名排序成功\n");
}
使用qsort函数排序
contact.c完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化结构体数组函数实现
void InitContact(struct Contact* pc)
{
pc->sz = 0;//将人数初始化为0
memset(pc->data, 0, Max*sizeof(struct PeoInfor));
}
//1:添加联系人函数实现
void AddContact( struct Contact* pc)
{
assert(pc);
if (pc->sz == Max)
{
printf("通讯录已满,无法添加数据\n");
return;
}
else
{
printf("请输入姓名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话号码:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->sz].age);//整型输入注意&不要漏
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
}
//查找函数实现
static int FindByName(const struct Contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;//找到就返回下标i
}
}
return -1;//找不到返回-1
}
//2:删除指定联系人
void DelContact(struct Contact*pc)
{
char name[MAX_NAME];
printf("输入查找人名:>");
scanf("%s", name);
//创建一个查找函数
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("未找到该联系人信息\n");
}
else
{
//删除
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功删除指定联系人\n");
}
}
//3:查找指定联系人函数实现
void SearchContact(const struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入查找人姓名:>");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("未找到该联系人信息\n");
}
else
{
printf("%-20s\t%-5s\t%-12s\t%-2s\t%-30s\t\n",
"姓名", "性别", "电话号码", "年龄", "地址");
printf("%-20s\t%-5s\t%-12s\t%-2d\t%-30s\t\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].tele,
pc->data[ret].age,
pc->data[ret].addr);
}
}
//4:修改指定联系人信息函数实现
void ModifyContact(struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入修改人姓名:>");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("未找到该联系人信息\n");
}
else
{
printf("请输入姓名:>");
scanf("%s", pc->data[ret].name);
printf("请输入性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入年龄:>");
scanf("%d", &pc->data[ret].age);//注意&不要漏了取地址符
printf("请输入地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
}
//5:显示通讯录信息函数实现
void ShowContact(const struct Contact* pc)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-5s\t%-12s\t%-2s\t%-30s\t\n",
"姓名", "性别", "电话号码", "年龄", "地址");
printf("%-20s\t%-5s\t%-12s\t%-2d\t%-30s\t\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].age,
pc->data[i].addr);
}
}
int cmpByName(const void* e1, const void* e2)
{
return strcmp(((struct PeoInfor*)e1)->name, ((struct PeoInfor*)e2)->name);
}
//6:以名字排序所有联系人
void SortContact(const struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct PeoInfor), cmpByName);
printf("按姓名排序成功\n");
}
3:contact.h
(1):函数引用头文件声明
#include<stdio.h>
#include<string.h>
#include<assert.h>
(2):声明定义数据
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_addr 30
#define Max 100
(3):存储联系人信息结构体和通讯录结构体定义
struct PeoInfor
{
char name[MAX_NAME];
char sex[MAX_SEX];
char tele[MAX_TELE];
int age;
char addr[MAX_addr];
};
struct Contact
{
struct PeoInfor data[Max];
int sz;
};
(4)函数声明
//初始化数组
void InitContact(struct Contact* pc);
//1:添加联系人
void AddContact( struct Contact* pc);
//2:删除联系人
void DelContact(struct Contact*pc);
//3:查找指定联系人
void SearchContact(const struct Contact* pc);
//4:修改指定联系人信息
void ModifyContact(struct Contact* pc);
//5:显示通讯录信息
void ShowContact(const struct Contact* pc);
//6:按照姓名排序
void SortContact(const struct Contact* pc);
contact.h完整代码
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_addr 30
#define Max 100
struct PeoInfor
{
char name[MAX_NAME];
char sex[MAX_SEX];
char tele[MAX_TELE];
int age;
char addr[MAX_addr];
};
struct Contact
{
struct PeoInfor data[Max];
int sz;
};
//初始化数组
void InitContact(struct Contact* pc);
//1:添加联系人
void AddContact( struct Contact* pc);
//2:删除联系人
void DelContact(struct Contact*pc);
//3:查找指定联系人
void SearchContact(const struct Contact* pc);
//4:修改指定联系人信息
void ModifyContact(struct Contact* pc);
//5:显示通讯录信息
void ShowContact(const struct Contact* pc);
//6:按照姓名排序
void SortContact(const struct Contact* pc);
3:通讯录完整代码
(1):test.c
#define _CRT_SECURE_NO_WARNINGS 1
//实现一个通讯录;
//
//通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
//
//提供方法:
//
//1:添加联系人信息
//2:删除指定联系人信息
//3:查找指定联系人信息
//4:修改指定联系人信息
//5:显示所有联系人信息
//6:以名字排序所有联系人
//0:清空所有联系人
#include"contact.h"`
void menu()
{
printf("***************************************\n");
printf("***** 1:add 2:del *****\n");
printf("***** 3:search 4:modify *****\n");
printf("***** 5:show 6:sort *****\n");
printf("***** 0:exit *****\n");
printf("***************************************\n");
}
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT,
};
int main()
{
struct Contact con;//建一个能够存储100人信息的结构体数组
//初始化数组
InitContact(&con);
int input = 0;
do{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
SortContact(&con);
break;
case EXIT:
printf("清空所有联系人");
break;
default :
printf("输入错误请重新输入>:\n");
break;
}
} while (input);
}
(2):contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化结构体数组函数实现
void InitContact(struct Contact* pc)
{
pc->sz = 0;//将人数初始化为0
memset(pc->data, 0, Max*sizeof(struct PeoInfor));
}
//1:添加联系人函数实现
void AddContact( struct Contact* pc)
{
assert(pc);
if (pc->sz == Max)
{
printf("通讯录已满,无法添加数据\n");
return;
}
else
{
printf("请输入姓名:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话号码:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入年龄:>");
scanf("%d", &pc->data[pc->sz].age);//整型输入注意&不要漏
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
}
//查找函数实现
static int FindByName(const struct Contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;//找到就返回下标i
}
}
return -1;//找不到返回-1
}
//2:删除指定联系人
void DelContact(struct Contact*pc)
{
char name[MAX_NAME];
printf("输入查找人名:>");
scanf("%s", name);
//创建一个查找函数
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("未找到该联系人信息\n");
}
else
{
//删除
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功删除指定联系人\n");
}
}
//3:查找指定联系人函数实现
void SearchContact(const struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入查找人姓名:>");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("未找到该联系人信息\n");
}
else
{
printf("%-20s\t%-5s\t%-12s\t%-2s\t%-30s\t\n",
"姓名", "性别", "电话号码", "年龄", "地址");
printf("%-20s\t%-5s\t%-12s\t%-2d\t%-30s\t\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].tele,
pc->data[ret].age,
pc->data[ret].addr);
}
}
//4:修改指定联系人信息函数实现
void ModifyContact(struct Contact* pc)
{
char name[MAX_NAME];
printf("请输入修改人姓名:>");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("未找到该联系人信息\n");
}
else
{
printf("请输入姓名:>");
scanf("%s", pc->data[ret].name);
printf("请输入性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入电话:>");
scanf("%s", pc->data[ret].tele);
printf("请输入年龄:>");
scanf("%d", &pc->data[ret].age);//注意&不要漏了取地址符
printf("请输入地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功\n");
}
}
//5:显示通讯录信息函数实现
void ShowContact(const struct Contact* pc)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-5s\t%-12s\t%-2s\t%-30s\t\n",
"姓名", "性别", "电话号码", "年龄", "地址");
printf("%-20s\t%-5s\t%-12s\t%-2d\t%-30s\t\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].age,
pc->data[i].addr);
}
}
int cmpByName(const void* e1, const void* e2)
{
return strcmp(((struct PeoInfor*)e1)->name, ((struct PeoInfor*)e2)->name);
}
//6:以名字排序所有联系人
void SortContact(const struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct PeoInfor), cmpByName);
printf("按姓名排序成功\n");
}
(3):contact.h
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_addr 30
#define Max 100
struct PeoInfor
{
char name[MAX_NAME];
char sex[MAX_SEX];
char tele[MAX_TELE];
int age;
char addr[MAX_addr];
};
struct Contact
{
struct PeoInfor data[Max];
int sz;
};
//初始化数组
void InitContact(struct Contact* pc);
//1:添加联系人
void AddContact( struct Contact* pc);
//2:删除联系人
void DelContact(struct Contact*pc);
//3:查找指定联系人
void SearchContact(const struct Contact* pc);
//4:修改指定联系人信息
void ModifyContact(struct Contact* pc);
//5:显示通讯录信息
void ShowContact(const struct Contact* pc);
//6:按照姓名排序
void SortContact(const struct Contact* pc);
希望分享的知识能对大家编程有帮助和理解学习,如果分享的内容有错误欢迎指出,有错误我将会进行修改,大家共同努力学习编程!!!