思路:
将代码分成三个模块,头文件contact.h:声明函数,定义结构体
test.c测试类,contact.c用来实现通讯录中的函数功能
1.打印菜单,让用户进行选择
2.定义一个结构体PeoInfo,其中包含联系人的信息,如姓名等。将PeoInfo定义一个100大小的数组data,与count封装再同一结构体Contact中,可以这个count来记录data数组的增删查改,因为初始化为0后可以作为数组data的下标
3.用Contact创建一个con成员,并初始化。但结构体数组,要想全部成员都进行初始化,需要用到
void * memset ( void * ptr, int value, size_t num ) 函数。
4.功能实现:添加成员后count++,删除成员后count--,访问成员时则以下循环就行for i in range(0,pc->count),当然,查找,删除,修改都需要用到查找函数。排序可以用库函数qsort来实现。
5.代码如下:
头文件:contact.h
#pragma once
#include
#include
#include
#include
#define MAX_CONTACTS 100
//定义联系人
typedef struct PenInfo {
char name[20];
int age;
char sex[10];
char tele[12];
char addr[30];
}PenInfo;
//通讯录所包含内容
typedef struct Contact {
PenInfo data[MAX_CONTACTS];
int count;
}Contact;
//初始化联系人列表
void Initcontact(Contact *pc);
//添加联系人
void Addcontact(Contact *pc);
//删除练习人
void Delcontact(Contact* pc);
//显示联系人
void Showcontact(const Contact* pc);
//查找联系人
void Searchcontact(Contact* pc);
//修改联系人
void Modifycontact(Contact* pc);
//排序
void Sortcontact(Contact* pc);
contact.c:
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void Initcontact(Contact* pc) {
memset(pc->data, 0, sizeof(pc->data));
pc->count = 0;
}
void Addcontact(Contact* pc){
assert(pc);
if (pc->count == 100) {
printf("联系人已满,无法添加\n");
return;
}
printf("请输入联系人名字:>");
scanf("%s", pc->data[pc->count].name);
printf("请输入联系人年龄:>");
scanf("%d", &(pc->data[pc->count].age));
printf("请输入联系人性别:>");
scanf("%s", pc->data[pc->count].sex);
printf("请输入联系人电话:>");
scanf("%s", pc->data[pc->count].tele);
printf("请输入联系人地址:>");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("添加成功\n");
}
void Showcontact(const Contact* pc) {
assert(pc);
if (pc->count == 0) {
printf("还没添加联系人\n");
return;
}
printf("%-20s\t%-3s\t%-10s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
printf("-----------------------------------------------------------------------------\n");
for (int i = 0; i < pc->count; i++) {
printf("%-20s\t%-5d\t%-10s\t%-12s\t%-30s", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
printf("\n");
printf("-----------------------------------------------------------------------------\n");
}
}
//查找联系人
static int Findcontact(Contact* pc, char* name) {
assert(pc);
for (int i = 0; i < pc->count; i++) {
if (strcmp(name, pc->data[i].name) == 0) {
return i;
}
}
return -1;
}
void Delcontact(Contact* pc) {
assert(pc);
char name[20] = { 0 };
printf("请输入要删除的联系人名字:>");
scanf("%s", name);
//查找
int pos = Findcontact(pc, name);
//删除
if (pos == -1) {
printf("没有该联系人\n");
return;
}
for (int i = pos; i < pc->count + 1; i++) {
pc->data[i] = pc->data[i + 1];
}
pc->count--;
printf("删除成功\n");
}
void Searchcontact(Contact* pc) {
assert(pc);
char name[20] = { 0 };
printf("请输入要查找的联系人名字:>");
scanf("%s", name);
//查找
int pos = Findcontact(pc, name);
//删除
if (pos == -1) {
printf("没有该联系人\n");
return;
}
else {
printf("找到了\n");
printf("%-20s\t%-3s\t%-10s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
printf("-----------------------------------------------------------------------------\n");
printf("%-20s\t%-5d\t%-10s\t%-12s\t%-30s", pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
printf("\n");
printf("-----------------------------------------------------------------------------\n");
}
}
void Modifycontact(Contact* pc) {
assert(pc);
char name[20] = { 0 };
printf("请输入要修改的联系人的名字:>");
scanf("%s", name);
//查找
int pos = Findcontact(pc, name);
//删除
if (pos == -1) {
printf("没有该联系人\n");
return;
}else {
printf("修改后联系人名字:>");
scanf("%s", pc->data[pos].name);
printf("修改后联系人年龄:>");
scanf("%d", &(pc->data[pos].age));
printf("修改后联系人性别:>");
scanf("%s", pc->data[pos].sex);
printf("修改后联系人电话:>");
scanf("%s", pc->data[pos].tele);
printf("修改后联系人地址:>");
scanf("%s", pc->data[pos].addr);
printf("\n");
printf("修改成功\n");
}
}
//按姓名排序函数
int Sort_by_name(const void* e1, const void* e2) {
return strcmp(((PenInfo*)e1)->name, ((PenInfo*)e2)->name);
}
//按年龄排序
int Sort_by_age(const void* e1, const void* e2) {
if (((PenInfo*)e1)->age< ((PenInfo*)e2)->age){
return -1;
}
if (((PenInfo*)e1)->age > ((PenInfo*)e2)->age) {
return 1;
}
if (((PenInfo*)e1)->age == ((PenInfo*)e2)->age) {
return 0;
}
}
void Sortcontact(Contact* pc) {
assert(pc);
int chiose;
printf("(1.按姓名排序 2.按年龄排序):>");
scanf("%d", &chiose);
if (chiose == 1) {
qsort(pc->data,pc->count,sizeof(PenInfo), Sort_by_name);
printf("排序成功\n");
}
else if (chiose == 2) {
qsort(pc->data, pc->count, sizeof(PenInfo), Sort_by_age);
printf("排序成功\n");
}
else {
printf("无效输入\n");
return;
}
}
test.c:
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
//创建菜单
void menu() {
printf("------------My ContactBook------------\n");
printf("-----------1.Add linkman ------------\n");
printf("-----------2.Del linkman ------------\n");
printf("-----------3.Show linkman ------------\n");
printf("-----------4.Search linkman ----------\n");
printf("-----------5.Modify linkman ----------\n");
printf("-----------6.Sort linkman -----------\n");
printf("-----------0.Exit menu -------------\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:
Showcontact(&con);
break;
case 4:
Searchcontact(&con);
break;
case 5:
Modifycontact(&con);
break;
case 6:
Sortcontact(&con);
break;
case 0:
printf("退出成功\n");
break;
default :
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
这是一个静态版本,还有许多功能尚未完善,等待后续开发。