C语言实现静态存储通讯录的示例代码
最初的构思与规划
产品在制作之前一定要进行一定的构思,把要设计和实现的功能罗列出来。
所需要的功能
我们可以打开手机通讯录发现有很多联系人都已经按照拼音顺序排列的整整齐齐,想要找名字便可以搜索他的名字,谁更换号码了可以进行修改,把谁拉黑了,就可以删除信息,认识新朋友可以添加他的号码。这就包括了 增、删、查、改、展示、排序等功能。
现在设计的通讯录是静态版本下的通讯录,之后会教大家制作动态版本和文件版本。
显示菜单以及main函数
那么我们要制作一个菜单把以上功能都加入进去。
//菜单
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");
}
有了惨淡我们当然要让他是可以用的,不能当花瓶呀。那我们就要写一下我们的主函数(main)。
头文件的声明:
//contact.h
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
//表示一个人的信息
typedef struct PeoInfo
{
char name[MAX_NAME];//20字节
char sex[MAX_SEX];//5字节
char tele[MAX_TELE];//12字节
int age;
char addr[MAX_ADDR];//30字节
}PeoInfo;
//通讯录
typedef struct Contact
{
PeoInfo data[MAX];
int sz;
}Contact;
头文件定义了一个结构体存放个人信息 PeoInfo,但是我们这个通讯录是有人数限制的,需要存一个人数进去,那于是乎又设计了一个结构体Contact 存放个人信息和已经存了多少人的统计数sz。
//主函数
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
SearchContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
SortContact(&con);
break;
case 0:
break;
default:
break;
}
} while (input);
return 0;
}
以上必须要重申一下,函数和变量的命名方式我比较推荐驼峰法,最好不要用拼音和英文的缩写,更不要都是小写或者都是大写,作为一个合格的程序员要养成良好的编码习惯。define 的变量最好全是大写,但是每个单词都要用_隔开,例如:#define MAX_SEX 5。
增加个人信息
void AddContact(Contact* pc)//这里重点说一下,一定要确定好接收的是结构体指针变量,形参和实参要多多复习。
{
if (pc->sz == MAX)//头文件中定义了 MAX是100,不要忘记结合头文件
{
printf("已经满了\n");
return;
}
else
{
printf("请输入名字;》\n");
scanf("%s", pc->data[pc->sz].name);//这里我们要剖析一下,请看下面注释
printf("请输入性别:》\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:》\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:》\n");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:》\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
}
注释:
因为我们传的是结构体指针pc 结构体指针引用数据要用剪头->,之后引用到的数据data是结构体数组需要添加下标[pc->sz]就是它的下标,其中的pc->sz也是结构体指针引用总个数sz的方式,最后已经引用过的data里面的内容要进行引用需要用 . 这个符号引用(就是 普通结构体的引用)。
提醒:
在这里还要再说一下关于 if else中大括号的注意事项,一定要缩进和对齐,这还是一个程序员的基本功。另外还要提一下,else只会和最近的if结合,如果怕迷糊,请一定要在if结束后做大括号{}。
显示所有联系人的信息
想要验证我们是不是真的添加了信息,那我们直接把他展示出来就好了,那顺便把显示所有联系人函数也做出来。
//显示所有联系人
void ShowContact(Contact* pc)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%d: 姓名:%-10s 性别:%-5s 年龄:%-5d 电话:%-12s 地址:%-30s\n",
pc->sz,
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
删除个人信息
删除个人信息之前需要先查到这个人,于是设计了一个搜索姓名函数,根据搜索到的结果找到该联系人的位置,再删除。其实是这个搜索姓名函数是至关重要的,最后的查找、修改个人信息也要用到。
//搜索姓名函数
int FindByName(Contact* pc, char name[])
{
int i = 0;
for (i=0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
//删除个人信息函数
void DelContact(Contact* pc)
{
int ret = 0;
char name[MAX_NAME];
printf("请输入要删除的名字:》");
scanf("%s", name);
//查找以下是否存在
ret=FindByName(pc, name);
if (ret ==-1)
printf("删除的人不存在\n");
else
{
//del
int j = 0;
for (j = ret; j < pc->sz-1; j++)
{
pc->data[j]=pc->data[j + 1];
}
pc->sz--;
printf("成功删除!\n");
}
}
查找个人信息
//搜索个人信息
void SearchContact(Contact* pc)
{
char name[MAX_NAME];
printf("请输入要查找的姓名:》");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("输入的是个球~\n");
}
else
{
int i = ret;
printf("姓名:%-10s 性别:%-5s 年龄:%-5d 电话:%-12s 地址:%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
更改个人信息
//修改个人信息
void ModifyContact(Contact* pc)
{
char name[MAX_NAME];
printf("请输入要修改的的名字:》");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("输入的是个球~\n");
}
else
{
printf("请输入名字;》\n");
scanf("%s", pc->data[ret].name);
printf("请输入性别:》\n");
scanf("%s", pc->data[ret].sex);
printf("请输入年龄:》\n");
scanf("%d", &(pc->data[ret].age));
printf("请输入电话:》\n");
scanf("%s", pc->data[ret].tele);
printf("请输入地址:》\n");
scanf("%s", pc->data[ret].addr);
printf("成功修改联系人\n");
}
}
这里有一个不足之处就是要更改就必须全部更改,不能只改一项信息,随后会更新升级。
对联系人信息进行排序
//按年龄排序
int CompareOld(const void* st1, const void* st2)
{
return (((PeoInfo*)st1)->age - ((PeoInfo*)st2)->age);
}
//按姓名排序
int CompareName(const void* st1, const void* st2)
{
return strcmp(((PeoInfo*)st1)->name , ((PeoInfo*)st2)->name);
}
//排序信息
void SortContact(Contact* pc)
{
qsort(pc->data,pc->sz,sizeof(PeoInfo),CompareName);//这里就按姓名排序
}
这里的排序比较简单,用到了qsort函数,如果对qsort函数有疑问,那之后会做一个针对排序的博客详细讲解。只需要记得qsort不管数组是什么类型都可以进行排序(字符串,字符,数组等)。
最后产品展示
contart.h 头文件
//contart.h 头文件
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
//表示一个人的信息
typedef struct PeoInfo
{
char name[20];
char sex[5];
char tele[12];
int age;
char addr[30];
}PeoInfo;
//通讯录
typedef struct Contact
{
PeoInfo data[100];
int sz;
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//增加人的信息
void AddContact(Contact* pc);
//打印通讯录信息
void ShowContact(Contact* pc);
//删除个人信息
void DelContact(Contact* pc);
//搜索信息
void SearchContact(Contact* pc);
//修改信息
void ModifyContact(Contact* pc);
//排序信息
void SortContact(Contact* pc);
contart. c文件
//contart.c 文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void InitContact(Contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, 100 * sizeof(PeoInfo));
}
//增加联系人
void AddContact(Contact* pc)
{
if (pc->sz == MAX)
{
printf("已经满了\n");
return;
}
else
{
printf("请输入名字;》\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别:》\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄:》\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入电话:》\n");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:》\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加联系人\n");
}
}
//显示所有联系人
void ShowContact(Contact* pc)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%d: 姓名:%-10s 性别:%-5s 年龄:%-5d 电话:%-12s 地址:%-30s\n",
pc->sz,
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
//搜索姓名函数
int FindByName(Contact* pc, char name[])
{
int i = 0;
for (i=0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
//删除个人信息
void DelContact(Contact* pc)
{
int ret = 0;
char name[MAX_NAME];
printf("请输入要删除的名字:》");
scanf("%s", name);
//查找以下是否存在
ret=FindByName(pc, name);
if (ret ==-1)
printf("删除的人不存在\n");
else
{
//del
int j = 0;
for (j = ret; j < pc->sz-1; j++)
{
pc->data[j]=pc->data[j + 1];
}
pc->sz--;
printf("成功删除!\n");
}
}
//搜索信息
void SearchContact(Contact* pc)
{
char name[MAX_NAME];
printf("请输入要查找的姓名:》");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("输入的是个球~\n");
}
else
{
int i = ret;
printf("姓名:%-10s 性别:%-5s 年龄:%-5d 电话:%-12s 地址:%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
//修改信息
void ModifyContact(Contact* pc)
{
char name[MAX_NAME];
printf("请输入要修改的的名字:》");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("输入的是个球~\n");
}
else
{
printf("请输入名字;》\n");
scanf("%s", pc->data[ret].name);
printf("请输入性别:》\n");
scanf("%s", pc->data[ret].sex);
printf("请输入年龄:》\n");
scanf("%d", &(pc->data[ret].age));
printf("请输入电话:》\n");
scanf("%s", pc->data[ret].tele);
printf("请输入地址:》\n");
scanf("%s", pc->data[ret].addr);
printf("成功修改联系人\n");
}
}
//按年龄排序
int CompareOld(const void* st1, const void* st2)
{
return (((PeoInfo*)st1)->age - ((PeoInfo*)st2)->age);
}
//按姓名排序
int CompareName(const void* st1, const void* st2)
{
return strcmp(((PeoInfo*)st1)->name , ((PeoInfo*)st2)->name);
}
//排序信息
void SortContact(Contact* pc)
{
qsort(pc->data,pc->sz,sizeof(PeoInfo),CompareName);
}
main.c文件
//main.c 主函数文件代码
#define _CRT_SECURE_NO_WARNINGS 1
#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");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
SearchContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
SortContact(&con);
break;
case 0:
break;
default:
break;
}
} while (input);
return 0;
}
以上就是C语言实现静态存储通讯录的示例代码的详细内容,更多关于C语言静态存储通讯录的资料请关注其它相关文章!
相关文章