当前位置: 首页 > news >正文

c语言小项目(静态通讯录)

文章目录

  • 1. 前言
  • 2. 框架
  • 3. 具体实现
    • 3.1 初始化通讯录
    • 3.2 打印菜单
    • 3.3 添加联系人信息
    • 3.4 展示通讯录
    • 3.5 删除通讯录
    • 3.6 查找联系人
    • 3.7 修改联系人信息
    • 3.8 按照年龄进行排序
    • 3.9 删除所有联系人信息
  • 4. 代码展示
    • 4.1 main.c文件
    • 4.2 Adress_list.h文件
    • 4.3 Adress_list.c文件
    • 4.4 HiddenFunction.c文件

1. 前言

虽然自己当前不咋滴,但把这句话送给自己和你们!

成功=一个习惯(做好开头做好结尾)+三个能力(学会反省+学会独立+总结收获)+伟大理想

2. 框架

这里采用多文件实现,文件包括:main.c(整体逻辑)、Adress_list.c(功能实现)、Adress_list.h(包含函数声明以及类型声明)、HiddenFunction.c(函数中的嵌套函数功能),下面来看看各功能的实现操作。


3. 具体实现

3.1 初始化通讯录

初始化通讯录就是对整体通讯录实现初始化以及对通讯录中每个人的信息进行初始化。

3.2 打印菜单

让用户知道怎么完成操作

3.3 添加联系人信息

将相应的内容添加到通讯录中,在此过程中,通讯录的大小也随之增大。

3.4 展示通讯录

就是相应的展示出你的通讯录的每个人的信息情况

3.5 删除通讯录

具体实现是通过遍历找到你想要删除的练习人的姓名来进行删除,删除的实现是让后面的依次对前面一个联系人进行覆盖

3.6 查找联系人

通过名字比较遍历来找到联系人是否存在,存在就显示个人信息,不存在就说明

3.7 修改联系人信息

通过比较名字来遍历找到该联系人,对其信息进行覆盖

3.8 按照年龄进行排序

这里使用库函数qsort来对年龄进行排序

3.9 删除所有联系人信息

我的具体实现是通过创建另外一个个人信息的数组,把通讯录中所有人的信息放进这个数组进行存储。(缺点:空间占用太多)
另外的方法:是把第二个联系人及之后的联系人的信息先对其覆盖,全部覆盖到第一个联系人的内容上,覆盖完后再把第一个联系人的信息放进一个创建了一个大小的个人信息数组中(优化了空间),(当然还有更多的方法,这里我只想出来这两个比较简单的方法)

介绍完毕!


4. 代码展示

4.1 main.c文件

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Adress_list.h"
//主逻辑

int main()
{
	//创建通讯录
	struct Adress_List List;
	//初始化通讯录
	Init_Adress_List(&List);//传地址节省了空间同时也对其原变量进行修改

	int input = 0;
	//选择并操作
	//增加联系人信息,删除联系人信息,查找联系人信息,修改联系人信息,对通讯录进行按年龄排序,展示通讯录
	do
	{
		menu();
		printf("请输出操作前的提示数字,可完成此操作:>");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			//添加联系人信息
			Add_Linkman(&List);
			system("cls");
			break;
		case 2:
			//删除联系人信息
			Delete_Linkman(&List);
			system("cls");
			break;
		case 3:
			//查找联系人
			Find_Linkman(&List);
			system("cls");
			break;
		case 4:
			//修改联系人信息
			Modify_Linkman_Information(&List);
			system("cls");
			break;
		case 5:
			//按照年龄进行排序
			SortList_By_age(&List);
			system("cls");
			break;
		case 6:
			//展示通讯录
	    	Show_Adress_List(&List);
			system("cls");
			break;
		case 7:
			//删除所有联系人信息
			Delete_AllLinkman(&List);
			system("cls");
			break;
		case 0:
			printf("------------------退出程序!------------------\n");
			break;
		default:
			printf("------------------输入错误!------------------\n");
			break;
		}
	} while (input);

	system("pause");
	return 0;
}

4.2 Adress_list.h文件

#pragma once
//包含头文件、函数声明、变量定义
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>

#define MAX 100
#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_PONE 15
#define MAX_ADRESS 20

//个人信息
struct Person_Information
{
	//名字、性别、电话、年龄、家庭住址
	//名字一般都是最长的就是5个字
	char name[MAX_NAME];
	//男,女,保密
	char sex[MAX_SEX];
	//电话号码有11位
	char phone[MAX_PONE];
	int age;
	char adress[MAX_ADRESS];
};

//通讯录
struct Adress_List
{
	//包含个人信息
	struct Person_Information data[MAX];
	//记录通讯录大小
	int size;
};

//初始化通讯录
void Init_Adress_List(struct Adress_List* List);

//打印菜单
void menu();

//添加联系人信息
void Add_Linkman(struct Adress_List* List);

//展示通讯录
void Show_Adress_List(const struct Adress_List* List);

//删除联系人信息
void Delete_Linkman(struct Adress_List* List);

//通过名字找到联系人存储的位置
int Find_By_Name(const struct Adress_List* List, char name[]);

//展示个人信息
void Show_Person_Information(struct Adress_List* List, int ret);

//查找联系人
void Find_Linkman(struct Adress_List* List);

//修改联系人信息
void Modify_Linkman_Information(struct Adress_List* List);

//按照年龄对通讯录进行排序
void SortList_By_age(const struct Adress_List* List);

//qsort库函数中比较函数
int compare(const void* e1, const void* e2);

//删除所有联系人信息
void Delete_AllLinkman(struct Adress_List* List);

4.3 Adress_list.c文件

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Adress_list.h"
//封装通讯录函数

//初始化通讯录
void Init_Adress_List(struct Adress_List* List)
{
	assert(List);
	//对所有人的信息初始化
	memset(List->data, 0, MAX * sizeof(struct Person_Information));
	//对通讯录大小初始化
	List->size = 0;
}

//打印菜单
void menu()
{
	printf("\n");
	printf("************************************************\n");
	printf("*****    1.AddLinkman    2.DeleteLinkman  ******\n");
	printf("*****    3.FindLinkman   4.ModifyLinkman  ******\n");
	printf("*****    5.SortByAge     6.ShowList       ******\n");
	printf("*****    7.DeleteAll     0.exit           ******\n");
	printf("************************************************\n");
	printf("\n");
}

//添加联系人信息
void Add_Linkman(struct Adress_List* List)
{
	assert(List);

	//一直添加的话这个顺序存储的通讯录会满
	if (List->size == MAX)
	{
		printf("通讯录已满,无法继续添加\n");
		return;
	}

	//直接添加
	//名字、性别、电话、年龄、家庭住址
	printf("请输入名字:>");
	scanf("%s", List->data[List->size].name);
	printf("请输入性别:>");
	scanf("%s", List->data[List->size].sex);
	printf("请输入电话:>");
	scanf("%s", List->data[List->size].phone);
	printf("请输入年龄:>");
	scanf("%d", &List->data[List->size].age);
	printf("请输入家庭住址:>");
	scanf("%s", List->data[List->size].adress);

	List->size++;
	printf("添加联系人成功!\n");
	Sleep(800);
}

//展示通讯录
void Show_Adress_List(const struct Adress_List* List)
{
	printf("\n");
	printf("-------------------------------------------------------------------------------\n");
	printf("暂时的通讯录的所有信息:>\n");
	printf("%-5s\t%-5s\t%-15s\t%-20s\t%-20s\n", "姓名", "性别", "电话", "年龄", "家庭住址");
	int i = 0;
	for (i = 0; i < List->size; i++)
	{
		printf("%-5s\t%-5s\t%-15s\t%-20d\t%-20s\n",
			List->data[i].name,
			List->data[i].sex, 
			List->data[i].phone,
			List->data[i].age,
			List->data[i].adress);
	}
	printf("-------------------------------------------------------------------------------\n");
	printf("\n");
	printf("请等上5秒,再次操作!\n");
	Sleep(5000);
}

//删除联系人
void Delete_Linkman(struct Adress_List* List)
{
	char name[MAX_NAME];
	printf("请输入你想删除的联系人的姓名:>");
	scanf("%s", name);
	//删除操作,若找到删除的联系人返回下标进行删除,没有找到进行标注
	int ret = Find_By_Name(List,name);
	if (-1 == ret)
	{
		printf("该联系人不存在!\n");
		Sleep(800);
	}
	else
	{
		//进行删除操作(这里是使用覆盖的的方式)
		int i = 0;
		for (i = ret; i < List->size; i++)
		{
			List->data[i] = List->data[i + 1];
		}
		//通讯录大小改变
		List->size--;

		printf("成功删除该联系人!\n");
		Sleep(800);
	}
}

//查找联系人
void Find_Linkman(struct Adress_List* List)
{
	printf("请输入你想查找的联系人的姓名:>");
	char name[MAX_NAME];
	scanf("%s", name);
	int ret = Find_By_Name(List, name);
	if (ret == -1)
	{
		printf("此联系人不存在!\n");
		Sleep(800);
	}
	else
	{
		printf("\n");
		printf("你的通讯录里面有此联系人,它的信息是:>\n");
		Show_Person_Information(List,ret);
		Sleep(800);
	}
}

//修改联系人信息
void Modify_Linkman_Information(struct Adress_List* List)
{
	//找到联系人,如果有此联系人就对其进行修改
	printf("请输入你想修改信息的联系人的姓名:>");
	char name[MAX_NAME];
	scanf("%s", name);
	int ret = Find_By_Name(List, name);
	if (-1 == ret)
	{
		printf("此联系人不存在!\n");
		Sleep(800);
	}
	else
	{
		//拿到下标
		printf("请输入名字:>");
		scanf("%s", List->data[ret].name);
		printf("请输入性别:>");
		scanf("%s", List->data[ret].sex);
		printf("请输入电话:>");
		scanf("%s", List->data[ret].phone);
		printf("请输入年龄:>");
		scanf("%d", &List->data[ret].age);
		printf("请输入家庭住址:>");
		scanf("%s", List->data[ret].adress);

		printf("修改成功!\n");
		printf("\n");
		Sleep(800);
	}
}

//按照年龄进行排序
void SortList_By_age(const struct Adress_List* List)
{
	assert(List);

	//通讯录里面没有信息或者只有一个信息排序也是没必要的
	if (List->size <= 1)
	{
		printf("\n");
		printf("通讯录里面联系人个数小于两个没有必要对其进行排序!\n");
		Sleep(800);
		return;
	}

	//排序用到qsort库函数
	qsort(List->data, List->size, sizeof(struct Person_Information), compare);
	printf("排序完成!\n");
	Sleep(800);
}

//删除通讯录所有联系人信息
void Delete_AllLinkman(struct Adress_List* List)
{
	//拿到的一个通讯录里面没有信息就标注
	if (List->size == 0)
	{
		printf("通讯录为空,无法操作!\n");
		Sleep(800);
	}
	else
	{	
		//动态的内存用free释放空间(这里没有用到动态存储)
		//删除的方法:用一个临时的空间去保存
		struct Person_Information Delete[MAX];
		int i = 0;
		//删除一次通讯录空间变小一次
		//Lisr->size会改变,所有把初值保存下来
		int k = List->size;
		for (i = 0; i < k; i++)
		{
			Delete[i] = List->data[i];
			List->size--;
		}

		printf("删除成功!\n");
		Sleep(800);
	}
}

4.4 HiddenFunction.c文件

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Adress_list.h"

//通过名字找到联系人存储的位置
int Find_By_Name(const struct Adress_List* List, char name[])
{
	int i = 0;
	for (i = 0; i < List->size; i++)
	{
		if (0 == strcmp(List->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

//qsort库函数中比较函数
int compare(const void* e1, const void* e2)
{
	return ((struct Person_Information*)e1)->age - ((struct Person_Information*)e2)->age;
}

//展示个人信息
void Show_Person_Information(struct Adress_List* List, int ret)
{
	printf("-------------------------------------------------------------------------------\n");
	printf("%-5s\t%-5s\t%-15s\t%-20s\t%-20s\n", "姓名", "性别", "电话", "年龄", "家庭住址");

	printf("%-5s\t%-5s\t%-15s\t%-20d\t%-20s\n",
		List->data[ret].name,
		List->data[ret].sex,
		List->data[ret].phone,
		List->data[ret].age,
		List->data[ret].adress);
	printf("-------------------------------------------------------------------------------\n");
	printf("\n");
}

缺点:
1.因为使用的是数组所以大小是固定的,不能存储太多。
2.读取信息不够准确(没有对信息录入进行优化)
3.查找和排序太单调,没有优化查找,暂时只能对名字进行查找和排序(需求没有完善,初步认识够用)

介绍完毕,感谢浏览,继续加油!

相关文章:

  • 数据结构与算法——左程云09
  • C++异常
  • 【ASM】字节码操作 如何使用 visitFrame
  • 【Spring Boot 集成应用】 OAUTH2统一认证单点登录中的各种模式说明
  • 数据链路层的检错技术——循环冗余校验CRC(Cyclic Redundancy Check)
  • 【C++】IO流
  • Pytorch理解
  • 区块链中的隐私保护技术
  • postgres 源码解析 元组插入流程 Heap_Insert
  • 什么是数字化转型? 怎样算是转型?
  • js单行代码------日期和时间
  • 公众号网课查题接口
  • 科莱瑞迪IPO被终止:曾拟募资3.4亿 詹德仁夫妇控制63%股权
  • OpenCV入门(十三):常用图形绘制
  • 项目实战:QuickHit
  • 2017年终总结、随想
  • IndexedDB
  • JAVA_NIO系列——Channel和Buffer详解
  • node学习系列之简单文件上传
  • Python语法速览与机器学习开发环境搭建
  • Vue学习第二天
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 力扣(LeetCode)56
  • 前端临床手札——文件上传
  • 区块链分支循环
  • 让你的分享飞起来——极光推出社会化分享组件
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (0)Nginx 功能特性
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET CORE Aws S3 使用
  • .net 按比例显示图片的缩略图
  • .net 设置默认首页
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .Net程序帮助文档制作
  • .net快速开发框架源码分享
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @Mapper作用
  • @SuppressWarnings(unchecked)代码的作用
  • @test注解_Spring 自定义注解你了解过吗?
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C#]猫叫人醒老鼠跑 C#的委托及事件
  • [C/C++]数据结构 栈和队列()
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.
  • [hdu 2826] The troubles of lmy [简单计算几何 - 相似]
  • [HJ56 完全数计算]
  • [IE编程] 多页面基于IE内核浏览器的代码示例
  • [Kubernetes]2. k8s集群中部署基于nodejs golang的项目以及Pod、Deployment详解
  • [leetcode]56. Merge Intervals归并区间