想练习自己的写代码水平吗,想要在别人还在写小题目时你就完成一个完整的程序吗,快来学习这篇通讯录实现,一个可以让你的C语言水平有不小的提高;
源码在最下方
想要完成通讯录首先需要清楚通讯录需要什么:
1.需要一个菜单让使用者清楚看到它的功能
2.需要基本的增加,删除,查找,修改联系人功能
3.为了方便我们浏览通讯录我们还可以增加排序功能
这些就是我们完成一个简单通讯录需要的解决的一些问题
首先我们先创建一个菜单
void menu()
{
printf("***********************************\n");
printf("**** 操作菜单 *****\n");
printf("****1.查找 2.添加 *****\n");
printf("****3.删除 4.修改 *****\n");
printf("****5.输出 6.排序 *****\n");
printf("****0.退出 *****\n");
printf("***********************************\n");
}
enum//枚举类型定义为了增加我们代码的可阅读性
{
ex = '0',
search = '1',
add = '2',
mod = '4',
print = '5',
del = '3',
sort='6'
};
int main()
{
char input = '0';
ton con;//创建通讯录(开辟空间)
clean_con(&con);//初始化信息
do
{
menu();
scanf(" %c", &input);
system("cls");
switch (input)
{
case ex:
printf("退出通讯录\n");
break;
case search://查找
find_inf(&con);
break;
case add://增加
addinf(&con);
break;
case del://删除
del_inf(&con);
break;
case mod://修改
mod_inf(&con);
break;
case print://打印
print_inf(&con);
break;
case sort://排序
sort_inf(&con);
break;
default:
printf("输入错误请重新输入\n");
}
} while (input != '0');
return 0;
}
这样创建完菜单之后我们需要 对它的功能进行实现
这是我们所需要的头文件,和我们的类型声明
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define MAX_PEO 1000
#define NAME_ 20
#define PHONE_ 20
#define ADDR_ 20
//类型的声明
typedef struct peoinf//每个人的信息
{
char name[NAME_];//名字
int age;//年龄
char phone[PHONE_];//手机号码
char addr[ADDR_];//居住城市
}peoinf;
typedef struct ton
{
peoinf inf[MAX_PEO];
int sz;
}ton;
//函数的声明
void menu();//打印菜单
void clean_con(ton* con);//初始化信息
void addinf(ton* con);//添加信息
void print_inf(ton* con);//打印信息
void find_inf(ton* con);//查找信息
void print_byname(int i, ton* con);//通过名字查找
void del_inf(ton* con);//删除信息
void mod_inf(ton* con);//修改信息
void sort_inf(ton*con);//对通讯录中信息进行排序
void menu_sort(ton*con);//排序菜单
void sort_name(ton* con);//按名字排序
void sort_age(ton* con);//按年龄排序
这是这些功能所需要的函数大纲
我们需要定义结构体类型可以用一种文艺点的说法就是为我们的数据储存提供空间构造框架,当这个空间被开辟好了之后我们就可以向这个空间增加与改变我们的数据,先声明它再去使用它。这里我们做的就是对它的声明
下面我们一个一个实现这些函数
为了方便我们使用我们的空间我们需要先把这片空间里的数据清除就像我们搬新家需要打扫干净卫生一样,我们初始化好了空间之后接下来就是存放信息了;
void clean_con(ton* con)//初始化信息
{
memset(con->inf, 0, sizeof(con->inf));
con->sz = 0;
}
当我们打扫干净新房子之后我们要搬进去住了,我们开始往这片空间添加数据,我们如下面代码一样一个一个输入我们的信息进入空间如果我们多次输入时发现有重复的数据我们就会提示已存在联系人请重新输入这里的assert函数是断言的意思可以参考我第一篇博客,goto是跳转操作我们进入goto语句时我们会跳到goto语句的条件位置;
void addinf(ton* con)//添加信息
{
assert(con);
int i = 0;
printf("新建联系人\n");
if (con->sz >= MAX_PEO)
{
return;
}
loop:
printf("请输入名字》:\n");
scanf(" %s", con->inf[con->sz].name);
for (i = 0; i < con->sz; i++)
{
if ((strcmp(con->inf[con->sz].name, con->inf[i].name)) == 0)
{
printf("已存在联系人,请重新输入");
goto loop;
}
}
printf("请输入年龄》:\n");
scanf(" %d", &(con->inf[con->sz].age));
printf("请输入地址》:\n");
scanf(" %s", con->inf[con->sz].addr);
printf("请输入号码》:\n");
scanf(" %s", con->inf[con->sz].phone);
con->sz++;
printf("添加成功\n");
}
我们在编好了添加功能后我们可能需要检查我们的程序是否正确所以我们先编辑打印功能把我们的添加的数据打印出来:
void print_inf(ton* con)//打印信息
{
assert(con);
if (con->sz == 0)
{
printf("没有任何信息\n");
return ;
}
printf("这是你的通讯录\n");
printf(" %-20s %-10s %-20s %-20s\n", "名字", "年龄", "地址", "号码");
for (int i = 0; i < con->sz; i++)
{
printf(" %-20s %-10d %-20s %-20s\n", con->inf[i].name, con->inf[i].age, con->inf[i].addr, con->inf[i].phone);
}
}
我们通过这种方式满足了打印功能之后,我们开始完善查找功能,通过strcmp函数的比对满足条件者就输出我们的查找到的信息,这里我是通过名字来查找的,其实还可以通过年龄,地址等等来查找方法多多,我之后会慢慢实现的:
void find_inf(ton* con)//查找信息
{
assert(con);
int i = 0;
printf("请输入你要查找的人的名字\n");
char name[NAME_] = { 0 };
scanf("%s", name);
for (i = 0; i < con->sz; i++)
{
if ((strcmp(name, con->inf[i].name)) == 0)
{
print_byname(i, con);
return ;
}
}
printf("没有找到这个人\n");
}
void print_byname(int i, ton* con)//通过名字查找
{
printf("你要查找的信息\n\n");
printf(" %-20s %-10s %-20s %-20s\n", "名字", "年龄", "地址", "号码");
printf(" %-20s %-10d %-20s %-20s\n", con->inf[i].name, con->inf[i].age, con->inf[i].addr, con->inf[i].phone);
}
查找信息功能满足后我们有时候还需要删除我们不需要的数据,于是我们对删除功能进行编码,还是一样使用strcmp函数来对比数据相同就删去,不同则给予提示;
void del_inf(ton* con)//删除信息
{
int i = 0, j = 0;
printf("请输入你想删除的人的名字\n");
char name[NAME_]={0};
scanf("%s", name);
for (i = 0; i < con->sz; i++)
{
if ((strcmp(name, con->inf[i].name)) == 0)
{
for (j = i; j < con->sz - 1; j++)
{
strcpy(con->inf[j].name, con->inf[j + 1].name);
con->inf[j].age = con->inf[j + 1].age;
strcpy(con->inf[j].addr, con->inf[j + 1].addr);
strcpy(con->inf[j].phone, con->inf[j + 1].phone);
}
con->sz--;
printf("删除成功\n");
return ;
}
}
printf("没有找到这个人\n");
}
修改功能类似上述
void mod_inf(ton* con)//修改信息
{
printf("你想要修改的人的名字\n");
char name[NAME_] = { 0 };
scanf("%s", name);
int i;
for (i = 0; i < con->sz; i++)
{
if ((strcmp(name, con->inf[i].name)) == 0)
{
printf("请输入名字》:\n");
scanf(" %s", con->inf[i].name);
printf("请输入年龄》:\n");
scanf(" %d", &(con->inf[i].age));
printf("请输入地址》:\n");
scanf(" %s", con->inf[i].addr);
printf("请输入号码》:\n");
scanf(" %s", con->inf[i].phone);
printf("修改成功\n");
return;
}
}
printf("没有找到这个人\n");
}
最后我添加了排序功能,为我们的程序提供更好的观感,同时我这里为我们的排序设计了按名字排序和按年龄排序:
void sort_inf(ton* con)//对通讯录中信息进行排序
{
menu_sort(con);
char n = '9';
while (n != '0')
{
scanf(" %c", &n);
switch (n)
{
case '0':
printf("退出排序\n");
return ;
case '1':
printf("按名字排序:\n");
sort_name(con);//按名字排序
return ;
case '2':
sort_age(con);//按年龄排序
return;
default:
printf("输入错误请重新输入\n");
break;
}
}
}
void menu_sort(ton* con)//排序菜单
{
printf("**********************\n");
printf("*****1.按名字排序*****\n");
printf("*****2.按年龄排序*****\n");
printf("*****0.退出排序 *****\n");
printf("**********************\n");
}
void sort_name(ton* con)//按名字排序
{
int i, j;
for (i = 0; i < con->sz-1; i++)
{
for (j = 0; j < con->sz - 1 - i; j++)
{
if (con->inf[j].name[0] < con->inf[j + 1].name[0])
{
ton tem;
tem.inf[0] = con->inf[j];
con->inf[j] = con->inf[j+1];
con->inf[j+1] = tem.inf[0];
}
}
}
printf("排序完成\n");
print_inf(con);//打印信息
}
void sort_age(ton* con)//按年龄排序
{
int i, j;
for (i = 0; i < con->sz - 1; i++)
{
for (j = 0; j < con->sz - 1 - i; j++)
{
if (con->inf[j].age < con->inf[j + 1].age)
{
ton tem;
tem.inf[0] = con->inf[j];
con->inf[j] = con->inf[j + 1];
con->inf[j + 1] = tem.inf[0];
}
}
}
printf("排序完成\n");
print_inf(con);//打印信息
}
以上就是我实现通讯录的过程;