一、通讯录功能
实现一个可以存放100个人的信息的通讯录(这里采用静态版本),每个人的信息有姓名、性别、年龄、电话、地址等。
通讯录可以执行的操作有添加联系人信息、删除指定联系人、查找指定联系人信息、修改指定联系人信息、显示联系人信息、根据联系人的某些信息(年龄、姓名、电话等)对联系人进行排序等。
二、代码
1、测试文件(test.c)
#include "contact.h"
int main()
{int input = 0;Contact con;//创建一个通讯录对象,内部可以存放100个人的信息ConInit(&con);//初始化通讯录,一定不能放在循环内部do{int (*p[])(Contact*) = { Add, Del, Search, Modify, Show, Sort };menu();printf("请选择:");scanf("%d", &input);if (input >= 1 && input <= 6)p[input - 1](&con);else if (input == 0)printf("退出通讯录\n");elseprintf("输入错误,请重新输入0~6之间的整数\n");} while (input);return 0;
}
2、通讯录具体实现(contact.c)
#include "contact.h"
//菜单
void menu()
{printf("************************************\n");printf("***** 1. add 2. del *****\n");printf("***** 3. search 4. modify *****\n");printf("***** 5. show 6. sort *****\n");printf("***** 0. exit *****\n");printf("************************************\n");
}//初始化通讯录
void ConInit(Contact* pc)
{assert(pc);pc->count = 0;memset(pc->data, 0, sizeof(pc->data));
}//查找指定联系人
int FindByName(Contact* pc, char name[])
{for (int i = 0; i < pc->count; i++)if (0 == strcmp(name, pc->data[i].name))return i;//找到了返回下标return -1;//没找到返回-1
}//打印联系人信息
void Print(Contact* pc, int i)
{printf(" %-10s %-10s %-10s %-10s %-10s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].phone,pc->data[i].address);
}//删除、查找、修改公共信息
int PubInfor(Contact* pc, int n)
{char name[NAME] = { 0 };const char* arr[] = {"", "", "删除", "查找", "修改"};//用2个空字符串占位int pos = 0;while (1){printf("请输入要%s联系人姓名:", (DEL == n) ? arr[DEL] : ((SEARCH == n) ? arr[SEARCH] : arr[MODIFY]));scanf("%s", name);pos = FindByName(pc, name);if (-1 == pos)printf("待%s联系人的信息不存在\n", (DEL == n) ? arr[DEL] : ((SEARCH == n) ? arr[SEARCH] : arr[MODIFY]));elsebreak;}return pos;
}//录入信息
void EnterInfor(Contact* pc, int x)
{int num = -1;const char* arr[] = { "姓名", "性别", "年龄", "电话", "地址" };char* pch[] = { pc->data[x].name, pc->data[x].sex, pc->data[x].age, pc->data[x].phone, pc->data[x].address };while (1){num++;printf("请输入%s:", arr[num]);scanf("%s", pch[num]);if (4 == num)break;}
}//添加联系人信息
void Add(Contact* pc)
{assert(pc && (pc->count <= CON));//通讯录满,不能增加,空指针不能增加EnterInfor(pc, pc->count);pc->count++;printf("添加成功\n");Show(pc);
}//删除指定联系人
void Del(Contact* pc)
{assert(pc && (pc->count != 0));//空通讯录不能删int pos = PubInfor(pc, DEL);for (int i = pos; i < pc->count - 1; i++)pc->data[i] = pc->data[i + 1];pc->count--;printf("删除成功\n");Show(pc);
}//查找指定联系人信息
void Search(Contact* pc)
{assert(pc && (pc->count != 0));int pos = PubInfor(pc, SEARCH);printf("该联系人的信息如下\n");printf(" %-10s %-10s %-10s %-10s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");Print(pc, pos);
}//修改指定联系人信息
void Modify(Contact* pc)
{assert(pc && (pc->count != 0));int pos = PubInfor(pc, MODIFY);printf("该联系人的信息如下\n");printf(" %-10s %-10s %-10s %-10s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");Print(pc, pos);printf("请输入修改后的信息\n");EnterInfor(pc, pos);printf("修改成功\n");Show(pc);
}//显示联系人信息
void Show(const Contact* pc)
{assert(pc);printf(" 通讯录联系人的信息如下 \n");printf(" %-10s %-10s %-10s %-10s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");for (int i = 0; i < pc->count; i++)Print(pc, i);
}//qsort()函数姓名比较基准
int CmpByName(const void* s1, const void* s2)
{return strcmp(((People*)s1)->name, ((People*)s2)->name);
}//qsort()函数性别比较基准
int CmpBySex(const void* s1, const void* s2)
{return strcmp(((People*)s1)->sex, ((People*)s2)->sex);
}//qsort()函数年龄比较基准
int CmpByAge(const void* s1, const void* s2)
{return strcmp(((People*)s1)->age, ((People*)s2)->age);
}//qsort()函数电话比较基准
int CmpByPhone(const void* s1, const void* s2)
{return strcmp(((People*)s1)->phone, ((People*)s2)->phone);
}//qsort()函数地址比较基准
int CmpByAddress(const void* s1, const void* s2)
{return strcmp(((People*)s1)->address, ((People*)s2)->address);
}//根据联系人信息对联系人进行排序
void Sort(Contact* pc)
{assert(pc && (pc->count != 0));printf("*********************************\n");printf("***** 1. name 2. sex *****\n");printf("***** 3. age 4. phone *****\n");printf("***** 5. address 0. exit *****\n");printf("*********************************\n");int input = 0;do{int (*p[])(const void*, const void*) = { CmpByName, CmpBySex, CmpByAge, CmpByPhone, CmpByAddress };printf("请选择排序基准:");scanf("%d", &input);if (input >= 1 && input <= 5){qsort(pc->data, pc->count, sizeof(People), *(p)[input - 1]);break;}else if (0 == input)printf("退出排序\n");elseprintf("输入错误,请重新输入0~5之间的整数\n");} while (input);if (input != 0){const char* arr[] = { "姓名", "性别", "年龄", "电话", "地址" };printf("按照%s排序成功\n", arr[input - 1]);Show(pc);}
}
3、头文件(contact.h)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>#define NAME 20
#define SEX 5
#define AGE 3
#define PHONE 12
#define ADDRESS 30
#define CON 100enum CONTACT
{EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT
};typedef struct People
{char name[NAME]; //姓名char sex[SEX]; //性别char age[AGE]; //年龄char phone[PHONE]; //电话char address[ADDRESS]; //地址
}People;typedef struct Contact
{People data[CON]; //创建一个可以存储信息的结构体数组size_t count; //count记录通讯录中的人员个数
}Contact;void menu();//菜单
void ConInit(Contact* pc);//初始化通讯录
int FindByName(Contact* pc, char name[]);//查找指定联系人
void Print(Contact* pc, int i);//打印联系人信息
int PubInfor(Contact* pc, int n);//删除、查找、修改公共信息
void EnterInfor(Contact* pc, int x);//录入信息
void Add(Contact* pc);//添加联系人信息
void Del(Contact* pc);//删除指定联系人
void Search(Contact* pc);//查找指定联系人信息
void Modify(Contact* pc);//修改指定联系人信息
void Show(const Contact* pc);//显示联系人信息
int CmpByName(const void* s1, const void* s2);//qsort()函数姓名比较基准
int CmpBySex(const void* s1, const void* s2);//qsort()函数性别比较基准
int CmpByAge(const void* s1, const void* s2);//qsort()函数年龄比较基准
int CmpByPhone(const void* s1, const void* s2);//qsort()函数电话比较基准
int CmpByAddress(const void* s1, const void* s2);//qsort()函数地址比较基准
void Sort(Contact* pc);//根据联系人信息对联系人进行排序