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.定义一个数组用来存放我们要存放的信息 此处涉及到数组的初始化 注意是结构体数组 此外还引用宏 方便以后的修改 改一次就好 一劳永益逸
//3.抵达一个do while循环 进去干了再说 然后紧跟Switch语句的步伐 
//4.对自己函数进行定义和初始化 
//本篇当中 用到了一个添加的函数  这个函数里面不用重新定义一些变量 我们传过去了通讯录的地址之后就会通过这个指针依次找到我们想要修改的元素 然后我们注意在添加之后对size++ 
//之后在此处会有show的函数 这个函数可以显示我们存进去了多少个people 打印出来给我们看 里面就是采用了循环 我们循环的停止就是size的大小 因为如果还没有被修改的就不需要打印了
//此处再次体现size的作用之处
//第二个函数 就是删除的函数 这个函数我们采用的方法就是一次让后面的元素往前顶替从而达到修改的效果 (注意在删除之前我们要注意找到要删除的下标,我们通过返回的下标再进一步进行修改)
//注意循环的次数 1 2 3 4 如果把3删掉 4往前一下就行 然后把最后一个删掉 就行 在本次里面就是size-- 说明通讯录里面少了一个元素
//对于修改函数 的前提还是要查找到那个项的下标 电脑需要指引才可以继续下去 对于查找函数说一下就是注意返回值 我们通过返回值进行判断 找不到就返回-1 找到就返回姓名所在下标
//方便我们的使用下标进行打印或者修改 修改函数找到就是和添加那个模板一样的效果了

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

}
//增删查改 的前提是要有这个通讯录才行
int main()
{
	int input = 0;
	struct contact con;// 
	               创建通讯录---
	              //struct people con[max];//存放1000个人的信息  我们定义了一个数组 可以存放信息
	inintcontact(&con);//对通讯录进行初始化的函数 传地址可以改变
	do
	{
		menu();
		printf("请选择\n");
		scanf("%d", &input);
		switch (input)//进行选择的分支 
		{
		case add://这样写的话就具有了意义 我们就不用回去看是什么意思了 但是我感觉没必要 哈哈
			addcontact(&con);//这里为了改变 这个size 所以我们传址进去 这个size放进去是为了判定还有几个空间
			break;
		case del:
			deletecontact(&con);
			break;
		case search:
			searchcontact(&con);
			break;
		case modify:
			modifycontact(&con);
			break;
		case show:
			showcontact(&con);
			break;
		case sort:
			sortcontact(&con);
			break;
		case 0:
			printf("退出");
			break;
		default:
			printf("输入错误");
			break;

		}
	} while (input);
}

contact.c//用于函数的实现

#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
static int findbyname(struct contact* ps, char name[maxname])//查找借助name来实现 static 使得这个函数只能在这个contact.c这里面使用 我们不想让这个函数暴露出去 因为用户不需要知道
{
	int i = 0;
	for (i = 0; i < ps->size-1; i++)
	{
		if (0 == strcpy(ps->data[i].name, name))
		{
			return i;//返回下标
		}

	}
	return -1;//这个是找不到的情况
}
void inintcontact(struct contact* ps)
{

	memset(ps->data, 0, sizeof(ps->data));//初始化为0
	ps->size = 0;//初始化为0


}
void addcontact(struct contact* ps)
{
	//1.判断通讯录有没有满
	if (ps->size == max)
	{
		printf("通讯录已满--若想扩增--请自行操作");
	}
	else//进行增添元素
	{
		printf("请输入名字");//进行提示
		scanf("%s", ps->data[ps->size].name);//这个指向下标的意思是放到第几个元素 然后.name的意思是找到输入name
		printf("请输入年龄");
		scanf("%d", &(ps->data[ps->size].age));//age应当进行取地址操作 这个size的下标是指的数组的下标是什么 我们从下标0开始 拿到数组里面的元素
		printf("请输入性别");
		scanf("%s", ps->data[ps->size].sex);//他们都是数组 就算都吞并也没事 因为你有很多空间
		printf("请输入电话");
		scanf("%s", ps->data[ps->size].tele);
		printf("请输入地址");
		scanf("%s", ps->data[ps->size].addr);
		(ps->size)++;//当录入一个数据的时候 我们在进去看一下
		printf("添加成功");
	}

}
void showcontact(const struct contact* ps)//这个用于显示 你加进去的数据 const说明不进行修改
{
	if (ps->size == 0)
	{
		printf("通讯录为空\n");
	}
	else
	{
		int i = 0;
		printf("%-20s\t %-4s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "地址");//这里进行打印 前面的内容都是修饰打印好不好看的
		for (i = 0; i < ps->size; i++)//有几个元素就打印几个
		{
			printf("%-20s\t %-4d\t %-5s\t %-12s\t %-20s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].tele,
				ps->data[i].addr);//打印时前面添加符号代表左对齐


		}

	}

}
void deletecontact(struct contact* ps)//删除指定联系人

{
	char name[maxname];
	printf("请输入删除人的名字");
	scanf("%s", name);
	//1.查找 要删除的人的下标
	int ret = findbyname(ps,name);//找到返回名字所在元素的下标 找不到返回-1
	//int i = 0;
	//for (i = 0; i < ps->size; i++)
	//{
	//	if (0 == strcmp(ps->data[i].name, name))
	//	{
	//		break;
	//	}


	//}
	//2.删除那个
	if (ret == -1)
	{
		printf("要删除的用户不存在");
	}
	//if (i == ps->size)//这是找完之后都没有
	//{
	//	printf("要删除的用户不存在");

	//}
	else
	{
		//删除数据 停下来的那个位置就是我们要删除的位置 然后我们把i+1的位置赋给他 1 2 3 4 5 6 7 8 我们最后一次是把8放到7的位置也就是把下标为7放到下标为6的上边 假设要删4
		int j = 0;
		for (j = ret; j < (ps->size)-1; j++)//我们最后一次是把
		{
			ps->data[j] = ps->data[j + 1];///就是把后面的元素一个个往后面挪
		}
		ps->size--;//这里说明少了一个元素
		printf("删除成功");
	}
	

}

void searchcontact(struct contact* ps)//查找指定人的信息
{
	char name[maxname];
	printf("请输入要查找人的信息");
	scanf("%s", name);
	//这里需要一个查找的函数 
	int ret = findbyname(ps, name);
	if (ret == -1)
	{
		printf("没找到");

	}
	else//直接把这些值打印出来 借助刚刚的值
	{
		printf("%-20s\t %-4s\t %-5s\t %-12s\t %-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t %-4d\t %-5s\t %-12s\t %-20s\n",
			ps->data[ret].name,
			ps->data[ret].age,
			ps->data[ret].sex,
			ps->data[ret].tele,
			ps->data[ret].addr);
	}
}

void modifycontact(struct contact* ps)
{
	char name[maxname];
	printf("输入修改人名字");
	scanf("%s", name);
	int ret = findbyname(ps, name);
	if (ret == -1)
	{
		printf("要修改的人不存在");
	}
	else//这里可以拿过来添加的那个模版来实现
	{
		printf("请输入修改后名字");//进行提示
		scanf("%s", ps->data[ret].name);//就是需要改一下那个对应的数组下标
		printf("请输入年龄");
		scanf("%d", &(ps->data[ret].age));
		printf("请输入性别");
		scanf("%s", ps->data[ret].sex);
		printf("请输入电话");
		scanf("%s", ps->data[ret].tele);
		printf("请输入地址");
		scanf("%s", ps->data[ret].addr);
		printf("修改完成\n");
	}

}

//void sortcontact(struct contact* ps)
//{
//	//1.排序
//
//
//
//}

//contact.h//函数的声明

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define max 1000     //在这里定义方便以后的修改 一次更改全部OK
#define maxname 20
#define maxsex 5
#define maxtele 12
#define maxaddr 30
enum option
{
	exit,//0
	add,//1
	del,//2
	search,//3
	modify,//4
	show,//5
	sort//6

};
struct people
{
	char name[maxname];//怎么去描述人
	int age;
	char sex[maxsex];
	char tele[maxtele];
	char addr[maxaddr];
};
//通讯录类型
struct contact
{

	struct people data[max];//只要存放1000个人的信息是不够的  这俩可以被称为通讯录类型 
	int size;//还要有可以查看当前已经有的元素个数

};
//声明函数
//初始化一个通讯录
void inintcontact(struct contact* ps);
//增添一个人的信息
void addcontact(struct contact* ps);
//打印通讯录中的人
void showcontact(const struct contact* ps);//这里加const 是想说我们指向的那个对像是不会被改变的 我们只是打印一下看看
//删除指定的联系人
void deletecontact(struct contact* ps);
//查找指定的联系人
void searchcontact(struct contact* ps);
//修改指定联系人
void modifycontact(struct contact* ps);
void sortcontact(struct contact* ps);

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 23:42:00  更:2021-08-25 23:42:02 
 
开发: 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年11日历 -2024/11/23 17:02:20-

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