呀呀呀,今天的博客来了哦!十分的干货,有关于一个简单的小通讯录的实现代码以及解析,欢迎大家来帮忙掌掌眼,有错误也还请大家斧正哦,十分的感谢!
目录
一,项目结构分析
二,项目文件划分
2.1,头文件(contact.h)
#pragma once
#include<string.h>
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<Windows.h>
//头文件包含函数的声明 与 类型的声明
//宏定义将后面的一些具体数字进行替换,是代码后期便于更改维护
#define MAX 1000
#define name_max 20
#define sex_max 3
#define phone_max 12
#define address_max 30
//联系人具体信息结构体的声明
typedef struct perinfo {
char name[name_max];
int age;
char sex[sex_max];
char phone[phone_max];
char address[address_max];
}perinfo;
//通信录结构体的声明
typedef struct contact {
perinfo date[MAX];//定义了一个结构体数组,数组的每一个元素都是一个结构体类型,包含很多的成员属性,也就是具体的一个联系人的所有信息
int sz;//用来记录通信录里面的人数
}contact;
//枚举类型的声明,因为case后面的数字不能很好的直接与功能挂上钩,所以对于我们的选择可以定义一个枚举类型,然后将case后的数字换成具体的功能的名字
//增加代码的可读性
enum option {
EXIT,
ADD,
DEL,
SER,
MOD,
SORT,
PRINT,
};
//函数声明
//初始化函数
void init(contact* pc);
//添加函数
void ADDinfo(contact* pc);
//查找函数(此查找函数只是单纯找到人返回下标)
int ser_byname(const contact* pc);//只是查找,不会对指针指向的内容进行修改,用const修饰一下
//删除函数
void DELinfo(contact* pc);
//打印函数
void PRINTinfo(const contact* pc);
//查找函数
void SERinfo(const contact* pc);
//修改函数
void MODinfo(contact* pc);
//排序函数
void SORTinfo(contact* pc);
//比较函数
int comparestu(const void* e1, const void* e2);
2.2,源文件
三,前期准备
3.1,创建通信录类
typedef struct contact {
perinfo date[MAX];//定义了一个结构体数组,数组的每一个元素都是一个结构体类型,包含很多的成员属性,也就是具体的一个联系人的所有信息
int sz;//用来记录通信录里面的人数
}contac
3.2,创建联系人类
//联系人具体信息结构体的声明
typedef struct perinfo {
char name[name_max];
int age;
char sex[sex_max];
char phone[phone_max];
char address[address_max];
}perinfo;
四,基本功能实现
4.1,初始化通信录
//初始化函数实现
void init(contact *pc) {
assert(pc);
memset(pc->date, 0, sizeof(pc->date));//date是结构体数组的数组名,求出整个数组的大小,按字节初始化为0
pc->sz = 0;
}
4.2,添加功能
//添加函数
void ADDinfo(contact* pc) {
assert(pc);
if (pc->sz == MAX) {
printf("通信录已满,无法添加!\n");
return;
}
printf("请输入联系人姓名>>\n");
scanf("%s", pc->date[pc->sz].name);
printf("请输入联系人年龄>>\n");
scanf("%d", &(pc->date[pc->sz].age));//这里要注意,因为其他属性都是用数组存储的,所以数组名就是地址,而age是需要取地址才行的
printf("请输入联系人性别>>\n");
scanf("%s", pc->date[pc->sz].sex);
printf("请输入联系人电话>>\n");
scanf("%s", pc->date[pc->sz].phone);
printf("请输入联系人地址>>\n");
scanf("%s", pc->date[pc->sz].address);
pc->sz++;
printf("添加成功!\n");
return;
}
4.3,删除功能
//删除函数
void DELinfo(contact* pc) {
assert(pc);
if (pc->sz == 0) {
printf("通信录已经为空,无法删除!");
return;
}
//1,先找到
char delname[name_max] = { 0 };
printf("请输入你要删除的联系人的名字>>\n");
scanf("%s", &delname);
int ret = ser_byname(pc,delname);
//2,删除
for (int j = ret;j < (pc->sz - 1);j++) {
pc->date[j] = pc->date[j + 1];
}
pc->sz--;
printf("删除成功!\n");
}
//查找函数
int ser_byname(const contact* pc,char* sername) {
assert(pc);
for (int i = 0;i < pc->sz;i++) {
if (0 == strcmp(pc->date[i].name, sername)) {
return i;//找到了就返回下标
}
}
return -1;//最终找不到就返回-1
}
4.4,查找功能
//查找函数
void SERinfo(const contact* pc) {
assert(pc);
//1,先找到
char sername[name_max] = { 0 };
printf("请输入你要查找的联系人的名字>>\n");
scanf("%s", &sername);
int ret = ser_byname(pc, sername);//利用之前的查找函数拿到下标
//2,输出
if (-1 == ret) {
printf("对不起,查无此人!\n");
return;
}
else {
printf("已找到如下相关信息>>\n");
printf("%-10s %-10s %-10s %-12s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-10s %-10d %-10s %-12s %-20s\n", pc->date[ret].name, pc->date[ret].age, pc->date[ret].sex, pc->date[ret].phone, pc->date[ret].address);
}
return;
}
4.5,修改功能
void MODinfo(contact* pc) {
assert(pc);
//1,先找到
char modname[name_max] = { 0 };
printf("请输入你要修改的联系人的人的名字>>\n");
scanf("%s", &modname);
int ret = ser_byname(pc, modname);//利用之前的查找函数拿到下标
//2,修改
if (-1 == ret) {
printf("对不起,无法修改,此通信录下无此人!\n");
return;
}
else {
printf("请输入修改后的联系人姓名>>\n");
scanf("%s", pc->date[ret].name);
printf("请输入修改后的联系人年龄>>\n");
scanf("%d", &(pc->date[ret].age));
printf("请输入修改后的联系人性别>>\n");
scanf("%s", pc->date[ret].sex);
printf("请输入修改后的联系人电话>>\n");
scanf("%s", pc->date[ret].phone);
printf("请输入修改后的联系人地址>>\n");
scanf("%s", pc->date[ret].address);
printf("修改成功!\n");
}
return;
}
4.6,排序功能
//自定义比较函数
int comparestu(const void* e1,const void* e2) {
return ((struct perinfo*)e1)->age - ((struct perinfo*)e2)->age;//以年龄作为比较对象
}
//排序函数
void SORTinfo(contact* pc) {
//这里的排序我们可以用qsort来实现
qsort(pc->date, pc->sz, sizeof(pc->date[0]), comparestu);
printf("排序完毕,可使用打印查看!\n");
}
4.7,打印输出功能
//打印函数
void PRINTinfo(const contact* pc) {
assert(pc);
printf("%-10s %-10s %-10s %-12s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0;i < pc->sz;i++) {
printf("%-10s %-10d %-10s %-12s %-20s\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].phone, pc->date[i].address);
}
}
五,主函数框架
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu() {
printf("**** 通信录系统 ****\n");
printf("****1,ADD 2,DEL ****\n");
printf("****3,SER 4,MOD ****\n");
printf("****5,SORT 6,PRINT****\n");
printf("****0,EXIT ****\n");
printf("************************\n");
}
void test() {
int input = 0;
contact con;//创建通信录对象
init(&con);//初始化这个通信录
do {
menu();
printf("请进行选择>>");
scanf("%d", &input);
switch (input) {
case ADD:
ADDinfo(&con);
Sleep(3000);
system("cls");
break;
case DEL:
//要删除,得先找到你想删除的人,所以删除函数里面得有一个查找函数
DELinfo(&con);
Sleep(3000);//控制3秒会清屏一次,让屏幕输出看起来不冗杂
system("cls");
break;
case SER:
SERinfo(&con);
Sleep(3000);
system("cls");
break;
case MOD:
MODinfo(&con);
Sleep(3000);
system("cls");
break;
case SORT:
SORTinfo(&con);//这里排序我们就按照年龄大小来排序
Sleep(3000);
system("cls");
break;
case PRINT:
PRINTinfo(&con);
Sleep(3000);
system("cls");
break;
case EXIT:
printf("退出通信录!\n");
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
} while (input);
}
int main() {
test();
return 0;
}
六,项目源码
6.1,contact.h文件
#pragma once
#include<string.h>
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<Windows.h>
//头文件包含函数的声明 与 类型的声明
//宏定义将后面的一些具体数字进行替换,是代码后期便于更改维护
#define MAX 1000
#define name_max 20
#define sex_max 3
#define phone_max 12
#define address_max 30
//联系人具体信息结构体的声明
typedef struct perinfo {
char name[name_max];
int age;
char sex[sex_max];
char phone[phone_max];
char address[address_max];
}perinfo;
//通信录结构体的声明
typedef struct contact {
perinfo date[MAX];//定义了一个结构体数组,数组的每一个元素都是一个结构体类型,包含很多的成员属性,也就是具体的一个联系人的所有信息
int sz;//用来记录通信录里面的人数
}contact;
//枚举类型的声明,因为case后面的数字不能很好的直接与功能挂上钩,所以对于我们的选择可以定义一个枚举类型,然后将case后的数字换成具体的功能的名字
//增加代码的可读性
enum option {
EXIT,
ADD,
DEL,
SER,
MOD,
SORT,
PRINT,
};
//函数声明
//初始化函数
void init(contact* pc);
//添加函数
void ADDinfo(contact* pc);
//查找函数(此查找函数只是单纯找到人返回下标)
int ser_byname(const contact* pc);//只是查找,不会对指针指向的内容进行修改,用const修饰一下
//删除函数
void DELinfo(contact* pc);
//打印函数
void PRINTinfo(const contact* pc);
//查找函数
void SERinfo(const contact* pc);
//修改函数
void MODinfo(contact* pc);
//排序函数
void SORTinfo(contact* pc);
//比较函数
int comparestu(const void* e1, const void* e2);
6.2,contact.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//函数实现
//初始化函数实现
void init(contact *pc) {
assert(pc);
memset(pc->date, 0, sizeof(pc->date));//date是结构体数组的数组名,求出整个数组的大小,按字节初始化为0
pc->sz = 0;
}
//添加函数
void ADDinfo(contact* pc) {
assert(pc);
if (pc->sz == MAX) {
printf("通信录已满,无法添加!\n");
return;
}
printf("请输入联系人姓名>>\n");
scanf("%s", pc->date[pc->sz].name);
printf("请输入联系人年龄>>\n");
scanf("%d", &(pc->date[pc->sz].age));//这里要注意,因为其他属性都是用数组存储的,所以数组名就是地址,而age是需要取地址才行的
printf("请输入联系人性别>>\n");
scanf("%s", pc->date[pc->sz].sex);
printf("请输入联系人电话>>\n");
scanf("%s", pc->date[pc->sz].phone);
printf("请输入联系人地址>>\n");
scanf("%s", pc->date[pc->sz].address);
pc->sz++;
printf("添加成功!\n");
return;
}
//查找函数
int ser_byname(const contact* pc,char* sername) {
assert(pc);
for (int i = 0;i < pc->sz;i++) {
if (0 == strcmp(pc->date[i].name, sername)) {
return i;//找到了就返回下标
}
}
return -1;//最终找不到就返回0
}
//删除函数
void DELinfo(contact* pc) {
assert(pc);
if (pc->sz == 0) {
printf("通信录已经为空,无法删除!");
return;
}
//1,先找到
char delname[name_max] = { 0 };
printf("请输入你要删除的联系人的名字>>\n");
scanf("%s", &delname);
int ret = ser_byname(pc,delname);
//2,删除
for (int j = ret;j < (pc->sz - 1);j++) {
pc->date[j] = pc->date[j + 1];
}
pc->sz--;
printf("删除成功!\n");
}
//打印函数
void PRINTinfo(const contact* pc) {
assert(pc);
printf("%-10s %-10s %-10s %-12s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0;i < pc->sz;i++) {
printf("%-10s %-10d %-10s %-12s %-20s\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].phone, pc->date[i].address);
}
}
//查找函数
void SERinfo(const contact* pc) {
assert(pc);
//1,先找到
char sername[name_max] = { 0 };
printf("请输入你要查找的联系人的名字>>\n");
scanf("%s", &sername);
int ret = ser_byname(pc, sername);//利用之前的查找函数拿到下标
//2,输出
if (-1 == ret) {
printf("对不起,查无此人!\n");
return;
}
else {
printf("已找到如下相关信息>>\n");
printf("%-10s %-10s %-10s %-12s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-10s %-10d %-10s %-12s %-20s\n", pc->date[ret].name, pc->date[ret].age, pc->date[ret].sex, pc->date[ret].phone, pc->date[ret].address);
}
return;
}
//修改函数
void MODinfo(contact* pc) {
assert(pc);
//1,先找到
char modname[name_max] = { 0 };
printf("请输入你要修改的联系人的人的名字>>\n");
scanf("%s", &modname);
int ret = ser_byname(pc, modname);//利用之前的查找函数拿到下标
//2,修改
if (-1 == ret) {
printf("对不起,无法修改,此通信录下无此人!\n");
return;
}
else {
printf("请输入修改后的联系人姓名>>\n");
scanf("%s", pc->date[ret].name);
printf("请输入修改后的联系人年龄>>\n");
scanf("%d", &(pc->date[ret].age));
printf("请输入修改后的联系人性别>>\n");
scanf("%s", pc->date[ret].sex);
printf("请输入修改后的联系人电话>>\n");
scanf("%s", pc->date[ret].phone);
printf("请输入修改后的联系人地址>>\n");
scanf("%s", pc->date[ret].address);
printf("修改成功!\n");
}
return;
}
//自定义比较函数
int comparestu(const void* e1,const void* e2) {
return ((struct perinfo*)e1)->age - ((struct perinfo*)e2)->age;//以年龄作为比较对象
}
//排序函数
void SORTinfo(contact* pc) {
//这里的排序我们可以用qsort来实现
qsort(pc->date, pc->sz, sizeof(pc->date[0]), comparestu);
printf("排序完毕,可使用打印查看!\n");
}
6.3,test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu() {
printf("**** 通信录系统 ****\n");
printf("****1,ADD 2,DEL ****\n");
printf("****3,SER 4,MOD ****\n");
printf("****5,SORT 6,PRINT****\n");
printf("****0,EXIT ****\n");
printf("************************\n");
}
void test() {
int input = 0;
contact con;//创建通信录对象
init(&con);//初始化这个通信录
do {
menu();
printf("请进行选择>>");
scanf("%d", &input);
switch (input) {
case ADD:
ADDinfo(&con);
Sleep(3000);
system("cls");
break;
case DEL:
//要删除,得先找到你想删除的人,所以删除函数里面得有一个查找函数
DELinfo(&con);
Sleep(3000);//控制3秒会清屏一次,让屏幕输出看起来不冗杂
system("cls");
break;
case SER:
SERinfo(&con);
Sleep(3000);
system("cls");
break;
case MOD:
MODinfo(&con);
Sleep(3000);
system("cls");
break;
case SORT:
SORTinfo(&con);//这里排序我们就按照年龄大小来排序
Sleep(3000);
system("cls");
break;
case PRINT:
PRINTinfo(&con);
Sleep(3000);
system("cls");
break;
case EXIT:
printf("退出通信录!\n");
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
} while (input);
}
int main() {
test();
return 0;
}
最后最后,终于将这篇博客写完了,篇幅较长,也是感谢大家能够看完,十分感谢!当然也希望大家能够帮忙多多三连,你们的支持将是我最大的动力!