通讯录分为三个文件:
test.c -- 测试通讯录
contact.h -- 函数和类型的声明
contact.c -- 函数的实现
1. test.c
test.c中主要写的是界面函数和测试函数。
界面函数 :
//界面 void menu() { printf("*********************************\n"); printf("*******1.add 2.del ******\n"); printf("*******3.search 4.modif ******\n"); printf("*******5.show 6.sort ******\n"); printf("*******0.exit ******\n"); }
测试函数:
//测试通讯录 void test() { int input = 0; contact con; InitContact(&con); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case ADD: //增加 AddContact(&con); break; case DEL: //删除 DelContact(&con); break; case SEARCH: //查找 SearchContact(&con); break; case MODIF: //修改 ModifContact(&con); break; case SHOW: //显示 ShowContact(&con); break; case SORT: //排序 //...... break; case 0: printf("退出通讯录\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input); }
完整的test.c:
#include"contact.h" //界面 void menu() { printf("*********************************\n"); printf("*******1.add 2.del ******\n"); printf("*******3.search 4.modif ******\n"); printf("*******5.show 6.sort ******\n"); printf("*******0.exit ******\n"); } //测试通讯录 void test() { int input = 0; contact con; InitContact(&con); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case ADD: //增加 AddContact(&con); break; case DEL: //删除 DelContact(&con); break; case SEARCH: //查找 SearchContact(&con); break; case MODIF: //修改 ModifContact(&con); break; case SHOW: //显示 ShowContact(&con); break; case SORT: //排序 //...... break; case 0: printf("退出通讯录\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input); } int main() { test(); return 0; }
2. contact.h
contact.h中主要写的是函数和类型的声明
类型声明:
注意contact.h是我们自定义的文件名,在test.c和contact.c中要包含一下:
包含自定义的头文件时,用双引号。
要实现一个通讯录,首先要有人的信息:姓名、年龄、性别、电话、住址等。
那我们就可以创建一个包含人的所有信息的结构体类型,并对其重命名为PeoInfo:
//人物信息 typedef struct PeoInfo { char name[NAME]; int age; char sex[SEX]; char phone[PHONE]; char addr[ADDR]; }PeoInfo;
以上只是一个人的信息,但是我们要录入的不止一个人,此时就可以再创建一个通讯录的结构体类型并重命名为contact:
//通讯录 typedef struct contact { PeoInfo data[MAX]; int sz; }contact;
其中data是存放通讯录中所有人的信息的数组,sz用来计数。
上述出现的所有数组的大小,我们可以对它们用#define定义:
#define NAME 20 #define SEX 5 #define PHONE 15 #define ADDR 30 #define MAX 100
函数声明:
要实现一个通讯录,需要具有以下功能:
1. 增加联系人
2. 删除联系人
3. 修改联系人
4. 查找联系人
5. 显示所有联系人的信息
6. 排序功能
不同的功能,可以封装为不同的函数,函数声明在contact.h,函数实现在contact.c
//函数声明 //初始化通讯录 void InitContact(contact* pc); //增加联系人 void AddContact(contact* pc); //显示所有联系人 void ShowContact(const contact* pc); //删除指定联系人 void DelContact(contact* pc); //查找指定联系人 void SearchContact(contact* pc); //修改指定联系人 void ModifContact(contact* pc);
函数功能我们也可以使用枚举类型:
enum OPTION { EXIT, ADD, DEL, SEARCH, MODIF, SHOW, SORT };
完整的contact.h:
#pragma once #include<stdio.h> #include<string.h> #include<assert.h> #define NAME 20 #define SEX 5 #define PHONE 15 #define ADDR 30 #define MAX 100 enum OPTION { EXIT, ADD, DEL, SEARCH, MODIF, SHOW, SORT }; //人物信息 typedef struct PeoInfo { char name[NAME]; int age; char sex[SEX]; char phone[PHONE]; char addr[ADDR]; }PeoInfo; //通讯录 typedef struct contact { PeoInfo data[MAX]; int sz; }contact; //函数声明 //初始化通讯录 void InitContact(contact* pc); //增加联系人 void AddContact(contact* pc); //显示所有联系人 void ShowContact(const contact* pc); //删除指定联系人 void DelContact(contact* pc); //查找指定联系人 void SearchContact(contact* pc); //修改指定联系人 void ModifContact(contact* pc);
3. contact.c
做好了以上准备,下面我们就可以在test.c中的test()函数中,定义结构体变量:
contact con;//定义结构体变量 InitContact(&con);//初始化通讯录
初始化通讯录:
//初始化通讯录 void InitContact(contact* pc) { memset(pc->data, 0, sizeof(pc->data)); pc->sz = 0; }
增加联系人:
//增加联系人 void AddContact(contact* pc) { assert(pc); if (pc->sz == MAX) { printf("通讯录已满,无法添加\n"); return; } printf("请输入姓名:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].phone); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("成功增加联系人\n"); }
显示联系人:
//显示联系人 void ShowContact(const contact*pc) { assert(pc); //打印列标题 printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址"); //打印数据 int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].phone, pc->data[i].addr); } }
由于不论是删除、查找,还是修改联系人,首先要做的都是先找到联系人,所以我们不妨写个查找函数,后面要用的时候直接调用它就行。
查找函数:
//查找函数 static int Find_by_name(const contact* pc, char del_name[]) { int i = 0; int del = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(del_name, pc->data[i].name) == 0) { return i; } } return -1; }
删除联系人:
//删除联系人 void DelContact(contact* pc) { if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } assert(pc); char del_name[NAME] = { 0 }; printf("请输入姓名:>"); scanf("%s", &del_name); //找到要删除的人 int del = Find_by_name(pc, del_name); if (del == -1) { printf("要删除的人不存在\n"); return; } //删除 int i = 0; for (i = del; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("成功删除联系人\n"); }
查找联系人:
//查找联系人 void SearchContact(contact* pc) { char find_name[NAME] = { 0 }; printf("请输入要查找人的姓名:>"); scanf("%s", &find_name); int pos = Find_by_name(pc, find_name); if (pos == -1) { printf("要查找的人不存在\n"); } else { //打印列标题 printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址"); //打印数据 int i = 0; printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].phone, pc->data[pos].addr); } }
修改联系人:
//修改联系人 void ModifContact(contact* pc) { char mod_name[NAME]; printf("请输入要修改的人的姓名:>"); scanf("%s", &mod_name); int pos = Find_by_name(pc, mod_name); if (pos == -1) { printf("要修改的联系人不存在\n"); } 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].phone); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); } }
排序功能我们之前的章节讲过,这里不再赘述。下面附上contact.c的完整代码:
完整的contact.c:
#include"contact.h" //初始化通讯录 void InitContact(contact* pc) { memset(pc->data, 0, sizeof(pc->data)); pc->sz = 0; } //增加联系人 void AddContact(contact* pc) { assert(pc); if (pc->sz == MAX) { printf("通讯录已满,无法添加\n"); return; } printf("请输入姓名:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].phone); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("成功增加联系人\n"); } //显示联系人 void ShowContact(const contact*pc) { assert(pc); //打印列标题 printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址"); //打印数据 int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].phone, pc->data[i].addr); } } //查找函数 static int Find_by_name(const contact* pc, char del_name[]) { int i = 0; int del = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(del_name, pc->data[i].name) == 0) { return i; } } return -1; } //删除联系人 void DelContact(contact* pc) { if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } assert(pc); char del_name[NAME] = { 0 }; printf("请输入姓名:>"); scanf("%s", &del_name); //找到要删除的人 int del = Find_by_name(pc, del_name); if (del == -1) { printf("要删除的人不存在\n"); return; } //删除 int i = 0; for (i = del; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("成功删除联系人\n"); } //查找联系人 void SearchContact(contact* pc) { char find_name[NAME] = { 0 }; printf("请输入要查找人的姓名:>"); scanf("%s", &find_name); int pos = Find_by_name(pc, find_name); if (pos == -1) { printf("要查找的人不存在\n"); } else { //打印列标题 printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "姓名", "年龄", "性别", "电话", "地址"); //打印数据 int i = 0; printf("%-10s\t%-10d\t%-10s\t%-10s\t%-10s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].phone, pc->data[pos].addr); } } //修改联系人 void ModifContact(contact* pc) { char mod_name[NAME]; printf("请输入要修改的人的姓名:>"); scanf("%s", &mod_name); int pos = Find_by_name(pc, mod_name); if (pos == -1) { printf("要修改的联系人不存在\n"); } 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].phone); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); } }
4. 运行示例