? ? ? ? 通讯录操作系统
目录
? ? ? ? 通讯录操作系统
一.通讯录的简介? ? ??
三.各部分代码实现:
1.首先在主函数中编写项目的整体框架
3.封装属性
4.创建通讯录的结构变量(在main函数中)
5.函数声明(头文件中实现)
?6.函数实现——在Contact.c中
A.初始化通讯录
B.增加成员功能
C.显示成员功能
D.查找功能——仅用于删、改、查询功能的函数实现
? ? ? ? E.删除人员功能
F.修改人员属性功能
?G.查询人员功能
H.排序功能
I.统计目前通讯录中人员的总量功能
四.完整代码实现:
1.test.c:
2.Contact.h头文件代码:
3.Contact.c函数功能实现:
一.通讯录的简介? ? ??
??通讯录管理系统是一个将内部数据信息有机地组织起来,确切地记录人们地相关信息,操作方便,灵活查询。
? ? ? ? 二.该项目的实现要求:
? ? ? ?1. 该项目使用C语言设计了一个简单类型的通讯录管理系统,记录通讯录内的人员姓名,年龄,电话,地址等信息属性。
? ? ? ? 2.该项目拥有增、删、查、改、显示、排序、及统计人员等功能。
? ? ? ? 3.删除,查询,修改三种功能需要输入联系人的姓名作为系统关键字进行处理。
? ? ? ? 4.排序也可以实现多种方式的排序,我这里采用了姓名与年龄两种方式进行。
? ? ? ? 5.在项目中,可以一直进行循环操作,输入0则会跳出循环,结束该程序的执行。
? ? ? ? 6.该项目只是小型程序,只能在调试代码时记录操作后的人员信息,结束程序后就会自动销毁所有信息,之后我会优化通讯录项目,使其实现更加高效的执行效率。
三.各部分代码实现:
1.首先在主函数中编写项目的整体框架
????????写程序时,一般都会用do...while语句作为循环结构进行操作。之后使用多分支switch语句,通过输入数字进行各项目功能的实现。
int main() {
int input = 0;
do {
menu();
printf("请输入你的选择:\n");
scanf("%d", &input);
switch (input) {
case 1:
AddContact();
break;
case 2:
DelContact();
break;
case 3:
ModifyContact();
break;
case 4:
SearchContact();
break;
case 5:
ShowContact();
break;
case 6:
qsortContact();
break;
case 7:
TotalContact();
break;
case 0:
printf("即将退出程序\n");
break;
default:
printf("输入错误!请重新输入\n");
break;
}
} while (input);
return 0;
}
void menu() {
printf("************通讯录管理界面**************\n");
printf("****************1.Add.*****************\n");
printf("****************2.Del.*****************\n");
printf("****************3.Mod.*****************\n");
printf("****************4.Search.**************\n");
printf("****************5.Show.****************\n");
printf("****************6.Qsort.***************\n");
printf("****************7.Total.***************\n");
printf("****************0.Exit.****************\n");
}
?????????通过多个*号美化菜单界面,给用户一种舒适感觉。
3.封装属性
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TALE 12
#define MAX_ADDR 20
//人的结构体
typedef struct PeoInf {
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tale[MAX_TALE];
char addr[MAX_ADDR];
}PeoInf;
//通讯录的结构体(嵌套)
typedef struct Contact {
PeoInf peo[MAX];
int count;
}Contact;
? ? ? ? 创建项目头文件Contact.h,在头文件中使用两个结构体类型,封装成员的各个属性,另一个结构体采用嵌套形式再封装通讯录的属性。 使用typedef可以重命名结构体的名字(重命名只是嫌结构体类型名字太长)。
? ? ? ? 使用宏定义去限制各属性的信息长度,方便修改、
4.创建通讯录的结构变量(在main函数中)
Contact con;
//初始化通讯录
InitContact(&con);//结构体传参——传址
? ? ? ? 这里需要在test.c中引入与头文件Contact.h的操作:#include"Contact.h"?
? ? ? ? 这样可以将通讯录结构体变量作为参数执行函数操作。
? ? ? ? 注:这里采用传址调用,可以修改结构体对象,访问时需要用到" -> "
5.函数声明(头文件中实现)
//函数声明
void InitContact(Contact* pc);
void AddContact(Contact* pc);
void ShowContact(Contact* pc);
void DelContact(Contact* pc);
void ModifyContact(Contact* pc);
void SearchContact(Contact* pc);
void qsortContact(Contact* pc);
void TotalContact(Contact* pc);
? ? ? ? 以上都是项目各个功能函数的声明!
? ? ? ? 函数的实现需要再创建一个.c文件在其中编写代码,这是为了分类main函数的代码量。
A.初始化通讯录
void InitContact(Contact* pc) {
memset(pc->peo, 0, sizeof(pc->peo));//初始化所有信息为0
pc->count = 0;
}
使用memset函数可以让通讯录的peo数组成员全初始化为0。count用来统计成员个数。
?????????
B.增加成员功能
void AddContact(Contact* pc) {
assert(pc);
if (pc->count == 100) {
printf("抱歉,通讯录已满,无法再进行添加\n");
return;
}
printf("正在准备添加认证:\n");
printf("请输入添加人的姓名:\n");
scanf("%s", pc->peo[pc->count].name);
printf("请输入添加人的年龄:\n");
scanf("%d", &(pc->peo[pc->count].age));
printf("请输入添加人的性别:\n");
scanf("%s", pc->peo[pc->count].sex);
printf("请输入添加人的电话:\n");
scanf("%s", pc->peo[pc->count].tale);
printf("请输入添加人的住址:\n");
scanf("%s", pc->peo[pc->count].addr);
pc->count++;
printf("增加成功\n");
}
每增加一个成员就要使count++一次。
C.显示成员功能
//显示函数
void ShowContact(Contact* pc) {
assert(pc);
if (pc->count == 0) {
printf("抱歉,通讯录为空,无法查看\n");
return;
}
int i = 0;
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i <pc->count; i++) {
printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n", pc->peo[i].name,
pc->peo[i].age,
pc->peo[i].sex,
pc->peo[i].tale,
pc->peo[i].addr);
}
}
? ? ? ? '\t'字符为间隔符,数字前加-号表示左对齐,这是为了整齐规范的显示成员信息。
D.查找功能——仅用于删、改、查询功能的函数实现
static Find(Contact* pc, char name[]) {//查找函数
int i = 0;
for (i = 0; i < pc->count; i++) {
if (strcmp(pc->peo[i].name, name) == 0) {
return i;
}
}
return -1;
}
? ? ? ? E.删除人员功能
void DelContact(Contact* pc){
assert(pc);
char name[MAX_NAME] = { 0 };
if (pc->count == 0) {
printf("抱歉,通讯录为空,无法删除\n");
return;
}
printf("请输入删除人的名字:\n");
scanf("%s", name);
int ret = Find(pc, name);
if (ret == -1) {
printf("抱歉,查找的人不存在\n");
return;
}
int i = 0;
for (i = ret; i < pc->count - 1; i++) {
pc->peo[i] = pc->peo[i + 1];
printf("已删除该成员\n");
}
pc->count--;
printf("删除成功\n");
}
?使用成员姓名作为删除关键字,进入查找函数,先找出来,再进行删除。
F.修改人员属性功能
void ModifyContact(Contact* pc) {
assert(pc);
char name[MAX_NAME] = { 0 };
if (pc->count == 0) {
printf("抱歉,通讯录为空,无法修改\n");
return;
}
printf("请输入要修改的人员名字:\n");
scanf("%s", name);
int ret = Find(pc, name);
if (ret == -1) {
printf("要查找的人不存在,无法进行修改\n");
return;
}
printf("正在执行修改验证:\n");
printf("请输入修改人的姓名:\n");
scanf("%s", pc->peo[ret].name);
printf("请输入修改人的年龄:\n");
scanf("%d", &(pc->peo[ret].age));
printf("请输入修改人的性别:\n");
scanf("%s", pc->peo[ret].sex);
printf("请输入修改人的电话:\n");
scanf("%s", pc->peo[ret].tale);
printf("请输入修改人的住址:\n");
scanf("%s", pc->peo[ret].addr);
printf("修改成功\n");
}
??使用成员姓名作为查找关键字,进入查找函数,先找出来,再进行整体修改。
?G.查询人员功能
? ? ? ??
void SearchContact(Contact* pc) {
char name[MAX_NAME] = { 0 };
assert(pc);
if (pc->count == 0) {
printf("通讯录为空,无法查找\n");
return;
}
printf("请输入要查找的人的姓名:\n");
scanf("%s", name);
int ret = Find(pc, name);
if (ret == -1) {
printf("该成员不存在,查找失败\n");
}
else {
printf("查找成功,请查看以下信息\n");
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n", pc->peo[ret].name,
pc->peo[ret].age,
pc->peo[ret].sex,
pc->peo[ret].tale,
pc->peo[ret].addr);
}
}
? ? ? ? 此功能与显示功能相似。
H.排序功能
//按姓名排序
int cmp_by_name(const void* e1, const void* e2) {
return strcmp(((PeoInf*)e1)->name, ((PeoInf*)e2)->name);
}
//按年龄排序
int cmp_by_age(const void* e1, const void* e2) {
return ((PeoInf*)e1)->age-((PeoInf*)e2)->age;
}
void qsortContact(Contact* pc) {
assert(pc);
int i = 0;
printf("该程序有两种排序方式:\n");
printf("1.按年龄排序 2.按姓名排序\n");
printf("请输入你想进行排序标准的序号:\n");
scanf("%d", &i);
if (i == 1) {
qsort(pc->peo, pc->count, sizeof(PeoInf), cmp_by_age);
printf("通讯录已按年龄排序成功");
}
if (i == 2) {
qsort(pc->peo, pc->count, sizeof(PeoInf), cmp_by_name);
printf("通讯录已按姓名排序成功\n");
}
}
? ? ? ? ?使用qsort排序函数进行。
I.统计目前通讯录中人员的总量功能
void TotalContact(Contact* pc) {
assert(pc);
if (pc->count == 0) {
printf("通讯录为空,人员为空\n");
return;
}
else {
int total = pc->count;
printf("目前通讯录中共有%d名联系人\n", total);
}
}
四.完整代码实现:
1.test.c:
#define _CRT_SECURE_NO_WARNINGS 1
# include<stdio.h>
#include"Contact.h"
void menu() {
printf("***********通讯录管理界面**************\n");
printf("****************1.Add.*****************\n");
printf("****************2.Del.*****************\n");
printf("****************3.XIU.*****************\n");
printf("****************4.Search.**************\n");
printf("***************5.Show.*****************\n");
printf("****************6.Qsort.***************\n");
printf("***************5.Total.****************\n");
printf("***************0.Exit.*****************\n");
}
int main() {
int input = 0;
Contact con;
//初始化通讯录
InitContact(&con);//结构体传参——传址
do {
menu();
printf("请输入你的选择:\n");
scanf("%d", &input);
switch (input) {
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
ModifyContact(&con);
break;
case 4:
SearchContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
qsortContact(&con);
break;
case 7:
TotalContact(&con);
break;
case 0:
printf("即将退出程序\n");
break;
default:
printf("输入错误!请重新输入\n");
break;
}
} while (input);
return 0;
}
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TALE 12
#define MAX_ADDR 20
//人的结构体
typedef struct PeoInf {
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tale[MAX_TALE];
char addr[MAX_ADDR];
}PeoInf;
//通讯录的结构体(嵌套)
typedef struct Contact {
PeoInf peo[MAX];
int count;
}Contact;
//函数声明
void InitContact(Contact* pc);
void AddContact(Contact* pc);
void ShowContact(Contact* pc);
void DelContact(Contact* pc);
void ModifyContact(Contact* pc);
void SearchContact(Contact* pc);
void qsortContact(Contact* pc);
void TotalContact(Contact* pc);
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//初始化
void InitContact(Contact* pc) {
memset(pc->peo, 0, sizeof(pc->peo));//初始化所有信息为0
pc->count = 0;
}
void AddContact(Contact* pc) {
assert(pc);
if (pc->count == 100) {
printf("抱歉,通讯录已满,无法再进行添加\n");
return;
}
printf("正在准备添加认证:\n");
printf("请输入添加人的姓名:\n");
scanf("%s", pc->peo[pc->count].name);
printf("请输入添加人的年龄:\n");
scanf("%d", &(pc->peo[pc->count].age));
printf("请输入添加人的性别:\n");
scanf("%s", pc->peo[pc->count].sex);
printf("请输入添加人的电话:\n");
scanf("%s", pc->peo[pc->count].tale);
printf("请输入添加人的住址:\n");
scanf("%s", pc->peo[pc->count].addr);
pc->count++;
printf("增加成功\n");
}
//显示函数
void ShowContact(Contact* pc) {
assert(pc);
if (pc->count == 0) {
printf("抱歉,通讯录为空,无法查看\n");
return;
}
int i = 0;
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i <pc->count; i++) {
printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n", pc->peo[i].name,
pc->peo[i].age,
pc->peo[i].sex,
pc->peo[i].tale,
pc->peo[i].addr);
}
}
static Find(Contact* pc, char name[]) {//查找函数
int i = 0;
for (i = 0; i < pc->count; i++) {
if (strcmp(pc->peo[i].name, name) == 0) {
return i;
}
}
return -1;
}
//删除
void DelContact(Contact* pc){
assert(pc);
char name[MAX_NAME] = { 0 };
if (pc->count == 0) {
printf("抱歉,通讯录为空,无法删除\n");
return;
}
printf("请输入删除人的名字:\n");
scanf("%s", name);
int ret = Find(pc, name);
if (ret == -1) {
printf("抱歉,查找的人不存在\n");
return;
}
int i = 0;
for (i = ret; i < pc->count - 1; i++) {
pc->peo[i] = pc->peo[i + 1];
printf("已删除该成员\n");
}
pc->count--;
printf("删除成功\n");
}
void ModifyContact(Contact* pc) {
assert(pc);
char name[MAX_NAME] = { 0 };
if (pc->count == 0) {
printf("抱歉,通讯录为空,无法修改\n");
return;
}
printf("请输入要修改的人员名字:\n");
scanf("%s", name);
int ret = Find(pc, name);
if (ret == -1) {
printf("要查找的人不存在,无法进行修改\n");
return;
}
printf("正在执行修改验证:\n");
printf("请输入修改人的姓名:\n");
scanf("%s", pc->peo[ret].name);
printf("请输入修改人的年龄:\n");
scanf("%d", &(pc->peo[ret].age));
printf("请输入修改人的性别:\n");
scanf("%s", pc->peo[ret].sex);
printf("请输入修改人的电话:\n");
scanf("%s", pc->peo[ret].tale);
printf("请输入修改人的住址:\n");
scanf("%s", pc->peo[ret].addr);
printf("修改成功\n");
}
void SearchContact(Contact* pc) {
char name[MAX_NAME] = { 0 };
assert(pc);
if (pc->count == 0) {
printf("通讯录为空,无法查找\n");
return;
}
printf("请输入要查找的人的姓名:\n");
scanf("%s", name);
int ret = Find(pc, name);
if (ret == -1) {
printf("该成员不存在,查找失败\n");
}
else {
printf("查找成功,请查看以下信息\n");
printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n", pc->peo[ret].name,
pc->peo[ret].age,
pc->peo[ret].sex,
pc->peo[ret].tale,
pc->peo[ret].addr);
}
}
int cmp_by_name(const void* e1, const void* e2) {
return strcmp(((PeoInf*)e1)->name, ((PeoInf*)e2)->name);
}
int cmp_by_age(const void* e1, const void* e2) {
return ((PeoInf*)e1)->age-((PeoInf*)e2)->age;
}
void qsortContact(Contact* pc) {
assert(pc);
int i = 0;
printf("该程序有两种排序方式:\n");
printf("1.按年龄排序 2.按姓名排序\n");
printf("请输入你想进行排序标准的序号:\n");
scanf("%d", &i);
if (i == 1) {
qsort(pc->peo, pc->count, sizeof(PeoInf), cmp_by_age);
printf("通讯录已按年龄排序成功");
}
if (i == 2) {
qsort(pc->peo, pc->count, sizeof(PeoInf), cmp_by_name);
printf("通讯录已按姓名排序成功\n");
}
}
void TotalContact(Contact* pc) {
assert(pc);
if (pc->count == 0) {
printf("通讯录为空,人员为空\n");
return;
}
else {
int total = pc->count;
printf("目前通讯录中共有%d名联系人\n", total);
}
}
好了。以上就是通讯录操作系统完整代码,下期见!? ? ? ? 记得点一键三连哟~?
|