IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言版通讯录操作系统 -> 正文阅读

[C++知识库]C语言版通讯录操作系统

? ? ? ? 通讯录操作系统

目录

? ? ? ? 通讯录操作系统

一.通讯录的简介? ? ??

三.各部分代码实现:

1.首先在主函数中编写项目的整体框架

2. 优化菜单界面——menu函数

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;
}

2. 优化菜单界面——menu函数

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);

? ? ? ? 以上都是项目各个功能函数的声明!


?6.函数实现——在Contact.c中

? ? ? ? 函数的实现需要再创建一个.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;
}


2.Contact.h头文件代码:

#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);

3.Contact.c函数功能实现:

#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);
		}
	}

好了。以上就是通讯录操作系统完整代码,下期见!? ? ? ? 记得点一键三连哟~?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:25:04  更:2022-08-06 10:26:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 13:17:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码