目录
<1 实现通讯录的那些功能
<3 主函数的建立
<3 通讯录功能的具体实现步骤
<4 全部代码的呈现
1 实现通讯录的那些功能
实现一个通讯录;
通讯录可以用来存储个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
2 主函数的建立
先打印出菜单,选择需要执行的指令,同时利用枚举来实现指令的选择,使其更加方便;
利用老套路,do while 循环里嵌套switch case语句来实现多组循环;
3.1:创建一个通讯录,存放个人信息
创建一个结构体struct peroinfo,用来存放个人信息,再创建一个结构体struct contact,来表示通讯录内存放的多个 个人信息,同时利用#define宏定义个人信息结构体每个元素的大小,方便修改;
3.2 初始化通讯录(利用malloc,申请动态内存空间)
创建通讯录struct contact con 初始化通讯录,初始化函数initcontact(&con);
通过初始化函数initcontact实现申请动态内存空间,减少非必要的内存浪费,用多少申请多少,如果不够,可通过realloc追加内存;(在此函数中,max_size为3,可通过宏定义随时更改初始化时通讯录的大小capacity)
3.3 添加联系人信息到通讯录中
添加函数addcontact(&con) 判断是否追加内存空间函数 cheak_capacity(pc)
我初始化通讯录时只开辟三个人的个人信息空间,当通讯录成员没超过3个时,不需要追加,当超过是,利用追加内存空间函数cheak_capacity(pc) 来追加内存空间(主要利用realoc函数),所以添加联系人信息时,需要判断是否追加内存空间。
3.4 删除通讯录中指定联系人信息
删除函数delcontact(&con) 寻找指定联系人函数 fine_contact(pc,name)
想要删除指定联系人,首先需要找到指定联系人,此时通过寻找指定函数fine_contact(pc,name)(其中name表示用姓名查找,也可以换成其他,例如年龄,性别等)然后通过循环将指定删除对象的后面个人信息覆盖到前面,这样就形成了删除指定联系人
3.5 查找指定联系人信息
查找函数 seekcontact(&con) 寻找指定联系人函数 fine_contact(pc,name)
想要查找指定联系人信息,此时,可以调用寻找指定联系人函数 fine_contact(pc,name)(同样,其中name表示用姓名查找,也可以换成其他,例如年龄,性别等)找到指定联系人之后,打印出来
3.6修改指定联系人信息
修改函数 molcontact(&con) 寻找指定联系人函数 fine_contact(pc,name)
想要修改指定联系人信息,同样还是需要先指定联系人,此时可以调用寻找指定联系人函数 fine_contact(pc,name)(同样,其中name表示用姓名查找,也可以换成其他,例如年龄,性别等)找到指定联系人后,对其进行修改,重新输入姓名,性别,年龄等;
3.7 显示通讯录中所有联系人信息
显示函数 discontact(&con)
显示所有通讯录中联系人的信息,为了整齐好看,可以先打印出一个表头,来表示联系人信息的种类,主要利用 \t 水平制表符让其更整齐,然后通过循环来打印通讯录中的所有联系人的信息,
3.8 清空通讯录中的所有信息
清空函数 empcontact(&con)
通过memset函数来将其通讯录中的个人信息全部置为0;
3.9 排序通讯录中联系人的信息
排序函数sortcontact(&con)
利用qsort函数来排序通讯录中的联系人信息,在此我分别以姓名和年龄排序,也可以用号码,地址等排序,毕竟qsort可以排序各种类型的数据;
3.10 退出通讯录
退出函数 sign_outcontact(&con)
既然退出通讯录,那么需要销毁通讯录所申请的动态内存空间,通过free函数来释放通讯录中联系人的信息,同时将其他元素置为0;
4 全部代码的呈现
放在1.c中
#define _CRT_SECURE_NO_WARNINGS 1
#include "txl.h"
void menu()
{
printf("*************************************\n");
printf("**********1.add 2.del*************\n");
printf("**********3.seek 4.mod*************\n");
printf("**********5.dis 6.emp*************\n");
printf("**********7.sort 0.end*************\n");
printf("*************************************\n");
}
enum input
{
end,
add,
del,
seek,
mod,
dis,
emp,
sort,
};
int main()
{
int input = 0;
struct contact con;
//初始化通讯录
initcontact(&con);
do
{
menu();
printf("请输入要执行的指令\n");
scanf("%d", &input);
switch (input)
{
case 1:
addcontact(&con);
break;
case 2:
delcontact(&con);
break;
case 3:
seekcontact(&con);
break;
case 4:
molcontact(&con);
break;
case 5:
discontact(&con);
break;
case 6:
empcontact(&con);
break;
case 7:
sortcontact(&con);
break;
case 0:
sign_outcontact(&con);
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
放在txl.c中
#define _CRT_SECURE_NO_WARNINGS 1
#include "txl.h"
//初始化通讯录
void initcontact(struct contact* pc)
{
pc->date =( struct peroinfo* )malloc(max_size * sizeof(struct peroinfo));
if (pc->date == NULL)
{
return;
}
pc->sz = 0;
pc->capacity = max_size;
}
//添加联系人
int cheak_capacity(struct contact* pc)//判断是否需要追加内存空间
{
if (pc->sz == pc->capacity)
{
struct peroinfo* ptr =realloc(pc->date, (pc->capacity + 2) * sizeof(struct peroinfo));
if (ptr != NULL)
{
pc->date = ptr;
pc->capacity += 2;
printf("增容成功\n");
return 1;
}
else
{
return 0;
}
}
else
return 1;
}
void addcontact(struct contact* pc)
{
assert(pc);
if (0 == cheak_capacity(pc))
{
return;
}
printf("请输入姓名:");
scanf("%s", pc->date[pc->sz].name);
printf("请输入性别:");
scanf("%s", pc->date[pc->sz].sex);
printf("请输入年龄:");
scanf("%d", &pc->date[pc->sz].age);
printf("请输入号码:");
scanf("%s", pc->date[pc->sz].number);
printf("请输入地址:");
scanf("%s", pc->date[pc->sz].addre);
pc->sz++;
printf("成功添加联系人\n");
}
//删除联系人
int fine_contact(struct contact* pc, char*name)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->date[i].name, name))
{
return i;
}
}
return -1;
}
void delcontact(struct contact* pc)
{
char name[max_name];
printf("请输入要删除的联系人姓名:");
scanf("%s", &name);
int ret = fine_contact(pc,name);
if (-1 == ret)
{
printf("通讯录查无此人,无法删除\n");
}
else
{
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->date[i] = pc->date[i + 1];
}
pc->sz--;
printf("成功删除联系人\n");
}
}
//查找联系人
void seekcontact(struct contact* pc)
{
char name[max_name];
printf("请输入要查找的联系人姓名:");
scanf("%s", &name);
int ret = fine_contact(pc, name);
if (-1 == ret)
{
printf("通讯录查无此人\n");
}
else
{
printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n", "姓名", "性别", "年龄", "号码", "地址");
printf("%-10s\t%-10s\t%-10d\t%-10s\t%-10s\t\n", pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].number, pc->date[ret].addre);
}
}
//修改指定联系人
void molcontact(struct contact* pc)
{
char name[max_name];
printf("请输入要修改的联系人姓名:");
scanf("%s", &name);
int ret = fine_contact(pc, name);
if (-1 == ret)
{
printf("通讯录查无此人,无法修改\n");
}
else
{
printf("请输入姓名:");
scanf("%s", pc->date[ret].name);
printf("请输入性别:");
scanf("%s", pc->date[ret].sex);
printf("请输入年龄:");
scanf("%d", &pc->date[ret].age);
printf("请输入号码:");
scanf("%s", pc->date[ret].number);
printf("请输入地址:");
scanf("%s", pc->date[ret].addre);
printf("修改成功\n");
}
}
//打印通讯录
void discontact(struct contact* pc)
{
int i = 0;
printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n", "姓名", "性别", "年龄", "号码", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-10s\t%-10d\t%-10s\t%-10s\t\n", pc->date[i].name, pc->date[i].sex, pc->date[i].age, pc->date[i].number, pc->date[i].addre);
}
}
//清空通讯录
void empcontact(struct contact* pc)
{
pc->sz = 0;
memset(pc->date, 0, (pc->capacity) * sizeof(struct peroinfo));
pc->capacity = max_size;
}
//排序通讯录联系人
//按姓名排序;
//int cmp_name(const void* e1, const void* e2)
//{
// return ((struct peroinfo*)e1)->name - ((struct peroinfo*)e2)->name ;
//}
//void sortcontact(struct contact* pc)
//{
// qsort(pc->date, pc->sz, sizeof(struct peroinfo), cmp_name);
//}
//按年龄排序:
int cmp_age(const void* e1, const void* e2)
{
return ((struct peroinfo*)e1)->age - ((struct peroinfo*)e2)->age;
}
void sortcontact(struct contact* pc)
{
qsort(pc->date, pc->sz, sizeof(struct peroinfo), cmp_age);
}
//退出通讯录,销毁申请的动态内存空间
void sign_outcontact(struct contact* pc)
{
pc->capacity = 0;
pc->sz = 0;
free(pc->date);
pc->date = NULL;
}
放在txl.h中
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#define max_size 3
#define max_name 10
#define max_sex 5
#define max_number 10
#define max_addre 10
struct peroinfo//姓名、性别、年龄、电话、住址
{
char name[max_name];
char sex[max_sex];
int age;
char number[max_number];
char addre[max_addre];
};
struct contact
{
struct peroinfo* date;//表示指向每一个存放个人信息的结构体指针;
int sz;//表示通讯录中多少个 个人信息;
int capacity;//表示向内存申请的多大内存空间,例如,我只存一个人的信息,capaticy=1;
//则申请的空间大小为malloc(1* sizeof(struct peroinfo)
};
//初始化通讯录
void initcontact(struct contact* pc);
//添加通讯录信息
void addcontact(struct contact* pc);
//删除联系人
void delcontact(struct contact* pc);
//查找联系人
void seekcontact(struct contact* pc);
//修改指定联系人
void molcontact(struct contact* pc);
//打印通讯录
void discontact(struct contact* pc);
//清空通讯录
void empcontact(struct contact* pc);
//排序通讯录联系人
void sortcontact(struct contact* pc);
//退出通讯录,销毁申请的动态内存空间
void sign_outcontact(struct contact* pc);
至此,这是我对C语言如何实现通讯录的全部理解,如有不足之处,请各位指正!