今天来和大家分享一个简易通讯录(c语言实现)
首先要介绍一下通讯录的基本功能
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
功能:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
1.文件的创建
首先是文件的创建,我们这里创建了三个文件,一个头文件,一个测试源文件,一个实现功能的源文件,这样写代码的目的是可以更清晰的了解代码的结构层次以及功能。我们实现每一个函数的功能时要在头文件中声明该函数
菜单循环功能实现
了解了功能后,我们要进行分析具体如何实现,首先需要写出这个通讯录菜单的循环选择功能,这里很容易想到,我们就直接上代码
`void menu()
{
printf("**************************\n");
printf("***********1.add *****\n");
printf("***********2.delete *****\n");
printf("***********3.search *****\n");
printf("***********4.modify *****\n");
printf("***********5.show *****\n");
printf("***********0.exit *****\n");
}`
enum Option
{
exit,
add,
delete,
search,
modify,
show,
};
int main()
{
int input=0;
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case exit:
printf("退出通讯录\n");
break;
case add:
ADDContact(&con);
break;
case delete:
Delete(&con);
break;
case search:
Search(&con);
break;
case modify:
Modify(&con);
break;
case show:
Show(&con);
break;
default:
printf("选择错误请重新选择:\n");
break;
}
} while (input);
return 0;
}
写完这个功能后,我们可以进行测试。
2.创建通讯录
之后我们要完成联系人的增删查找的功能,首先是联系人的存储问题,由于一个人有很多信息,是个复杂类型,我们用结构体来解决,那么存储这么多的人的信息,用一个结构体数组即可。
struct People
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char number[NUMBER_MAX];
char address[ADDRESS_MAX];
};
struct Contact
{
struct People data[MAX];
int sz;
};
这个通讯录结构体Contact中包含了一个结构体数组和记录此时通讯录中的人数。这样我们对这个通讯录结构体进行操作即可。
初始化通讯录
创建好这个通讯录我们就要对它进行初始化,写一个初始化函数void InitContact(struct Contact* pc);
void InitContact(struct Contact* pc)
{
pc->sz = 0;
memset(pc->data,0,sizeof(pc->data));
}
这里我们使用了c的库函数直接初始化通讯录信息为0,我们要操作这个通讯录,所以这里我们直接将创建好的通讯录的地址传到函数中使用即可。
添加联系人实现
添加联系人,同样是直接对通讯录进行操作,一样要传通讯录的地址。
void ADDContact(struct Contact* pc)
{
if (pc->sz == MAX)
{
printf("通讯录已满\n");
}
else
{
printf("请输入名字:\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄:\n");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入性别:\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话:\n");
scanf("%s", pc->data[pc->sz].number);
printf("请输入地址:\n");
scanf("%s", pc->data[pc->sz].address);
printf("添加成功!\n");
pc->sz++;
}
}
显示联系人实现
这里我们先来实现这个功能是为了可以验证我们其他功能有没有实现。
void Show(struct Contact* pc)
{
printf("%15s\t%5s\t%8s\t%15s\t%30s\n", "name","age","sex","number","address");
for (int i = 0; i < pc->sz; i++)
{
printf("%15s\t%5d\t%8s\t%15s\t%30s\n",
pc->data[i].name,
pc->data[i].age, pc->data[i].sex,
pc->data[i].number,
pc->data[i].address);
}
}
查找联系人
int FIND(struct Contact* pc, char name[])
{
for (int i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void Search(struct Contact* pc)
{
printf("请输入要查找联系人的姓名:\n");
char name[NAME_MAX] = { 0 };
scanf("%s", &name);
int flag = FIND(pc, name);
if (flag != -1)
{
printf("%15s\t%5s\t%8s\t%15s\t%30s\n", "name", "age", "sex", "number", "address");
printf("%15s\t%5d\t%8s\t%15s\t%30s\n",
pc->data[flag].name,
pc->data[flag].age, pc->data[flag].sex,
pc->data[flag].number,
pc->data[flag].address);
}
else
{
printf("查无此人\n");
}
}
删除联系人实现
删除联系人我们只需要先找到这个人,在将后面的人全都向前移动一个位置将这个要删除人覆盖即可。
void Delete(struct Contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录已空,无法删除联系人\n");
return;
}
printf("请输入要删除联系人的姓名:\n");
char name[NAME_MAX] = { 0 };
scanf("%s", &name);
int flag = FIND(pc, name);
if (flag == -1)
{
printf("查无此人\n");
}
else
{
for (int j = flag; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("删除成功!\n");
}
}
修改功能实现
void Modify(struct Contact* pc)
{
printf("请输入要修改联系人的名字:\n");
char name[NAME_MAX] = { 0 };
scanf("%s", &name);
int flag = FIND(pc, name);
if (flag == -1)
{
printf("查无此人\n");
}
else
{
printf("请输入姓名:\n");
scanf("%s", pc->data[flag].name);
printf("请输入年龄:\n");
scanf("%d", &pc->data[flag].age);
printf("请输入性别:\n");
scanf("%s", pc->data[flag].sex);
printf("请输入电话:\n");
scanf("%s", pc->data[flag].number);
printf("请输入地址:\n");
scanf("%s", pc->data[flag].address);
printf("修改成功!\n");
}
}
结果展示
头文件
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<string.h>
#define NAME_MAX 20
#define SEX_MAX 5
#define NUMBER_MAX 12
#define ADDRESS_MAX 30
#define MAX 1000
struct People
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char number[NUMBER_MAX];
char address[ADDRESS_MAX];
};
struct Contact
{
struct People data[MAX];
int sz;
};
void InitContact(struct Contact* pc);
void ADDContact(struct Contact* pc);
void Show(struct Contact* pc);
void Search(struct Contact* pc);
void Delete(struct Contact* pc);
void Modify(struct Contact* pc);
功能实现源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"contach.h"
void InitContact(struct Contact* pc)
{
pc->sz = 0;
memset(pc->data,0,sizeof(pc->data));
}
void ADDContact(struct Contact* pc)
{
if (pc->sz == MAX)
{
printf("通讯录已满\n");
}
else
{
printf("请输入名字:\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄:\n");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入性别:\n");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话:\n");
scanf("%s", pc->data[pc->sz].number);
printf("请输入地址:\n");
scanf("%s", pc->data[pc->sz].address);
printf("添加成功!\n");
pc->sz++;
}
}
void Show(struct Contact* pc)
{
printf("%15s\t%5s\t%8s\t%15s\t%30s\n", "name","age","sex","number","address");
for (int i = 0; i < pc->sz; i++)
{
printf("%15s\t%5d\t%8s\t%15s\t%30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].number, pc->data[i].address);
}
}
int FIND(struct Contact* pc, char name[])
{
for (int i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void Search(struct Contact* pc)
{
printf("请输入要查找联系人的姓名:\n");
char name[NAME_MAX] = { 0 };
scanf("%s", &name);
int flag = FIND(pc, name);
if (flag != -1)
{
printf("%15s\t%5s\t%8s\t%15s\t%30s\n", "name", "age", "sex", "number", "address");
printf("%15s\t%5d\t%8s\t%15s\t%30s\n", pc->data[flag].name, pc->data[flag].age, pc->data[flag].sex, pc->data[flag].number, pc->data[flag].address);
}
else
{
printf("查无此人\n");
}
}
void Delete(struct Contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录已空,无法删除联系人\n");
return;
}
printf("请输入要删除联系人的姓名:\n");
char name[NAME_MAX] = { 0 };
scanf("%s", &name);
int flag = FIND(pc, name);
if (flag == -1)
{
printf("查无此人\n");
}
else
{
for (int j = flag; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
printf("删除成功!\n");
}
}
void Modify(struct Contact* pc)
{
printf("请输入要修改联系人的名字:\n");
char name[NAME_MAX] = { 0 };
scanf("%s", &name);
int flag = FIND(pc, name);
if (flag == -1)
{
printf("查无此人\n");
}
else
{
printf("请输入姓名:\n");
scanf("%s", pc->data[flag].name);
printf("请输入年龄:\n");
scanf("%d", &pc->data[flag].age);
printf("请输入性别:\n");
scanf("%s", pc->data[flag].sex);
printf("请输入电话:\n");
scanf("%s", pc->data[flag].number);
printf("请输入地址:\n");
scanf("%s", pc->data[flag].address);
printf("修改成功!\n");
}
}
测试源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"contach.h"
void menu()
{
printf("**************************\n");
printf("***********1.add *****\n");
printf("***********2.delete *****\n");
printf("***********3.search *****\n");
printf("***********4.modify *****\n");
printf("***********5.show *****\n");
printf("***********0.exit *****\n");
}
enum Option
{
exit,
add,
delete,
search,
modify,
show,
};
int main()
{
int input = 0;
struct Contact con;
InitContact(&con);
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case exit:
printf("退出通讯录\n");
break;
case add:
ADDContact(&con);
break;
case delete:
Delete(&con);
break;
case search:
Search(&con);
break;
case modify:
Modify(&con);
break;
case show:
Show(&con);
break;
default:
printf("选择错误请重新选择:\n");
break;
}
} while (input);
return 0;
}
初学,如果哪里写的不对希望大家帮忙指正,我也会更努力向其他人学习,会陆续更新文章。
|