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