1.通讯录主逻辑
1.1框架思路
1.我们定义一个结构体用来存放联系人信息,再定义一个结构体用来存放联系人信息(结构体嵌套)和记录通讯录大小
2.再来打印一个菜单,让用户选择功能,用do while循环实现主逻辑保证可以反复操作
3.功能包括:初始化通讯录,添加联系人,展示通讯录,删除联系人,查找联系人,修改联系人,排序联系人,我们将其一一实现,并加入清屏效果使用户使用时更美观
4.采用多文件实现,分别是头文件contact.h用来存放函数声明和库函数,test.c用来编写通讯录主逻辑,contact.c用来编写是实现整个通讯录的函数
1.2通讯录功能代码实现
1.2.1创建通讯录
定义一个结构体用来存放联系人信息,再定义一个结构体用来存放联系人信息(结构体嵌套)和记录通讯录大小
#define MAX 100 #define MAX_NAME 15 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 20 //联系人信息 struct PeoInfo { char name[MAX_NAME]; char sex[MAX_SEX]; char tele[MAX_TELE]; int age; char addr[MAX_ADDR]; }; //创建通讯录 struct Contact { //联系人信息 struct PeoInfo data[MAX]; //记录通讯录大小 int sz; };
1.2.2初始化通讯录
对整体通讯录实现初始化以及对通讯录中每个人的信息进行初始化
//初始化通讯录 void InitContact(struct Contact* pc) { assert(pc); //全部初始化为0 pc->sz = 0; memset(pc->data, 0, MAX * sizeof(struct PeoInfo)); }
1.2.3创建菜单
打印菜单让用户进行功能选择,使用枚举来定义方便我们函数编写
//打印菜单 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"); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT };
1.2.4添加联系人
将联系人的信息添加到通讯录中,同时通讯录大小加一
//添加联系人 void AddContact(struct Contact* pc) { assert(pc); if (pc->sz == MAX) { printf("通讯录已满,无法添加数据\n"); return; } //输入联系人信息 //姓名、性别、电话、年龄、家庭住址 printf("请输入姓名:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); //通讯录大小+1 pc->sz++; printf("成功添加联系人\n"); Sleep(800); }
1.2.5展示通讯录
将通讯录中的信息打印展示出来
//展示通讯录 void ShowContact(const struct Contact* pc) { int i = 0; printf("%-15s\t%-5s\t%-12s\t%-5s\t%-20s\n", "姓名","性别","电话","年龄","地址"); for (i = 0; i < pc->sz; i++) { printf("%-15s\t%-5s\t%-12s\t%-5d\t%-20s\n",pc->data[i].name, pc->data[i].sex, pc->data[i].tele, pc->data[i].age, pc->data[i].addr); } Sleep(2000); }
1.2.6遍历查找联系人
为了实现删除和查找联系人的功能,我们需要写一个遍历通讯录的函数(通过姓名)
//遍历查找 static int FindByName(const struct Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (0 == strcmp(pc->data[i].name, name)) { return i; } } return -1; }
1.2.7删除联系人
输入名字遍历查找到指定联系人,存在的话就从此人开始让后面的联系人信息依次向前覆盖一个,同时通讯录大小减一
//删除联系人 void DelContact(struct Contact* pc) { char name[MAX_NAME]; printf("请输入要删除的联系人的姓名:>"); scanf("%s", name); //检查指定的联系人是否存在 int ret = FindByName(pc, name); if (-1 == ret) { printf("要删除的联系人不存在\n"); } else { //删除 int j = 0; for (j = ret; j < pc->sz-1; j++) { pc->data[j] = pc->data[j + 1]; } //通讯录大小-1 pc->sz--; printf("成功删除指定联系人\n"); } Sleep(800); }
1.2.8查找联系人
输入名字遍历查找到指定联系人,存在的话将其信息打印出来
//查找联系人 void SearchContact(const struct Contact* pc) { char name[MAX_NAME]; printf("请输入要查找的联系人的姓名:>"); scanf("%s", name); //检查指定联系人是否存在 int ret = FindByName(pc, name); if (-1 == ret) { printf("要查找的联系人不存在\n"); } else { printf("%-15s\t%-5s\t%-12s\t%-5s\t%-20s\n", "姓名", "性别", "电话", "年龄", "地址"); printf("%-15s\t%-5s\t%-12s\t%-5d\t%-20s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].age, pc->data[ret].addr); } Sleep(2000); }
1.2.9修改联系人
通过名字遍历查找到指定联系人,存在的话就将其信息重新输入一遍对原信息进行覆盖
//修改联系人 void ModifyContact(struct Contact* pc) { printf("请输入要修改的联系人的姓名:>"); char name[MAX_NAME]; scanf("%s", name); //检查指定联系人是否存在 int ret = FindByName(pc, name); if (-1 == ret) { printf("要修改的联系人不存在\n"); } else { printf("请输入姓名:>"); scanf("%s", pc->data[ret].name); printf("请输入性别:>"); scanf("%s", pc->data[ret].sex); printf("请输入电话:>"); scanf("%s", pc->data[ret].tele); printf("请输入年龄:>"); scanf("%d", &(pc->data[ret].age)); printf("请输入地址:>"); scanf("%s", pc->data[ret].addr); printf("成功修改联系人\n"); } Sleep(800); }
1.2.10排序联系人
我们可以使用qsort库函数来对联系人进行按名字或者按年龄的排序
int CmpByAge(const void* e1, const void* e2) { return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age; } //排序联系人 void SortContact(struct Contact* pc) { //按照年龄排序 qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByAge); printf("成功按年龄排序联系人\n"); Sleep(800); } //int CmpByName(const void* e1, const void* e2) //{ // return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name); //} 排序联系人 //void SortContact(struct Contact* pc) //{ // //按姓名排序 // qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName); // printf("成功按姓名排序联系人\n"); //}
好了到这儿通讯录所有的内容就介绍完毕了,下面奉上源代码
2.通讯录整体代码
2.1 contact.h函数声明和库函数
#pragma once //包含头文件,函数声明,变量定义 #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> #include<Windows.h> #define MAX 100 #define MAX_NAME 15 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 20 //联系人信息 struct PeoInfo { char name[MAX_NAME]; char sex[MAX_SEX]; char tele[MAX_TELE]; int age; char addr[MAX_ADDR]; }; //创建通讯录 struct Contact { //联系人信息 struct PeoInfo data[MAX]; //记录通讯录大小 int sz; }; //初始化通讯录 void InitContact(struct Contact* pc); //添加联系人 void AddContact(struct Contact* pc); //展示通讯录 void ShowContact(const struct Contact* pc); //删除联系人 void DelContact(struct Contact* pc); //查找联系人 void SearchContact(const struct Contact* pc); //修改联系人 void ModifyContact(struct Contact* pc); //排序联系人 void SortContact(struct Contact* pc);
2.2 test.c通讯录主逻辑
#define _CRT_SECURE_NO_WARNINGS #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"); } enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT }; int main() { int input = 0; //创建通讯录 struct Contact con;//通讯录 //初始化通讯录 InitContact(&con); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case ADD: //添加联系人 AddContact(&con); system("cls"); break; case DEL: //删除联系人 DelContact(&con); system("cls"); break; case SEARCH: //查找联系人 SearchContact(&con); system("cls"); break; case MODIFY: //修改联系人信息 ModifyContact(&con); system("cls"); break; case SHOW: //展示通讯录 ShowContact(&con); system("cls"); break; case SORT: //排序联系人 SortContact(&con); system("cls"); break; case EXIT: printf("退出通讯录\n"); break; default: printf("输入错误,请重新输入:>\n"); break; } } while (input); system("pause"); return 0; }
2.3 contact.c通讯录函数实现
#define _CRT_SECURE_NO_WARNINGS #include"contact.h" //初始化通讯录 void InitContact(struct Contact* pc) { assert(pc); //全部初始化为0 pc->sz = 0; memset(pc->data, 0, MAX * sizeof(struct PeoInfo)); } //添加联系人 void AddContact(struct Contact* pc) { assert(pc); if (pc->sz == MAX) { printf("通讯录已满,无法添加数据\n"); return; } //输入联系人信息 //姓名、性别、电话、年龄、家庭住址 printf("请输入姓名:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); //通讯录大小+1 pc->sz++; printf("成功添加联系人\n"); Sleep(800); } //展示通讯录 void ShowContact(const struct Contact* pc) { int i = 0; printf("%-15s\t%-5s\t%-12s\t%-5s\t%-20s\n", "姓名","性别","电话","年龄","地址"); for (i = 0; i < pc->sz; i++) { printf("%-15s\t%-5s\t%-12s\t%-5d\t%-20s\n",pc->data[i].name, pc->data[i].sex, pc->data[i].tele, pc->data[i].age, pc->data[i].addr); } Sleep(2000); } //遍历查找 static int FindByName(const struct Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (0 == strcmp(pc->data[i].name, name)) { return i; } } return -1; } //删除联系人 void DelContact(struct Contact* pc) { char name[MAX_NAME]; printf("请输入要删除的联系人的姓名:>"); scanf("%s", name); //检查指定的联系人是否存在 int ret = FindByName(pc, name); if (-1 == ret) { printf("要删除的联系人不存在\n"); } else { //删除 int j = 0; for (j = ret; j < pc->sz-1; j++) { pc->data[j] = pc->data[j + 1]; } //通讯录大小-1 pc->sz--; printf("成功删除指定联系人\n"); } Sleep(800); } //查找联系人 void SearchContact(const struct Contact* pc) { char name[MAX_NAME]; printf("请输入要查找的联系人的姓名:>"); scanf("%s", name); //检查指定联系人是否存在 int ret = FindByName(pc, name); if (-1 == ret) { printf("要查找的联系人不存在\n"); } else { printf("%-15s\t%-5s\t%-12s\t%-5s\t%-20s\n", "姓名", "性别", "电话", "年龄", "地址"); printf("%-15s\t%-5s\t%-12s\t%-5d\t%-20s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].age, pc->data[ret].addr); } Sleep(2000); } //修改联系人 void ModifyContact(struct Contact* pc) { printf("请输入要修改的联系人的姓名:>"); char name[MAX_NAME]; scanf("%s", name); //检查指定联系人是否存在 int ret = FindByName(pc, name); if (-1 == ret) { printf("要修改的联系人不存在\n"); } else { printf("请输入姓名:>"); scanf("%s", pc->data[ret].name); printf("请输入性别:>"); scanf("%s", pc->data[ret].sex); printf("请输入电话:>"); scanf("%s", pc->data[ret].tele); printf("请输入年龄:>"); scanf("%d", &(pc->data[ret].age)); printf("请输入地址:>"); scanf("%s", pc->data[ret].addr); printf("成功修改联系人\n"); } Sleep(800); } int CmpByAge(const void* e1, const void* e2) { return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age; } //排序联系人 void SortContact(struct Contact* pc) { //按照年龄排序 qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByAge); printf("成功按年龄排序联系人\n"); Sleep(800); } //int CmpByName(const void* e1, const void* e2) //{ // return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name); //} 排序联系人 //void SortContact(struct Contact* pc) //{ // //按姓名排序 // qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName); // printf("成功按姓名排序联系人\n"); //}
好了以上就是静态通讯录的实现过程了,对友友们有帮助的话不妨来个三连加关注支持一下,后期会持续更新C语言干货!