思路:
将代码分成三个模块,头文件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 <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>#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;
}
这是一个静态版本,还有许多功能尚未完善,等待后续开发。