【C】想练习C语言?通讯录的实现了解一下

目录

实现思路

开始实现

添加增加联系人功能

添加显示联系人信息的功能

添加删除联系人功能

添加查找指定联系人的功能

添加修改指定联系人的功能

测试

代码

Test.c

Contact.c

Contact.h


实现思路

1.通讯录中保存人的信息:名字、年龄、性别、电话、住址

2.通讯录的功能:

  • 通讯录可以存放100个人的信息
  • 增加联系人
  • 删除指定联系人
  • 修改指定联系人
  • 查找指定联系人
  • 显示所有联系人的信息
  • 排序功能

实现以上思路,我们需要创建3个文件

  • test.c - 测试通讯录
  • contact.h - 函数和类型的声明
  • contact.c - 函数的实现

我们可以以结构体的形式设计保存每个人的信息

struct PeoInfo

{

//....

}

当通讯录需要存放100个人的信息时,我们可以以数组形式存放这些结构体

开始实现

创建3个文件

在头文件Contact.h进行类型的声明

代码

cpp 复制代码
#pragma once


//类型的声明

typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char tele[12];
	char addr[30];
}PeoInfo;

写出主函数,我们需要在test()中完成我们的整个测试,

我们打印菜单,同时通过do..while()循环,完成功能的选择

(注:记得加上 **#include"Contact.h"**引用自己的头文件)

代码

cpp 复制代码
#define _CRT_SECURE_N0_WARNINGS 1
#include<stdio.h>
#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");
}
void test()
{
	int input = 0;
	//首先得有通讯录
	PeoInfo data[100];
    int sz=0;//记录通讯录的人数的增加
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			break;
		case 0:
			break;
		default:
			break;
		}

	} while (input);
}
int main()
{
	test();
	return 0;
}

我们对通讯录部分进行整合封装,并初始化

用预处理指令如#define MAX 100让类型声明中的数据可以修改,便于维护

将利用枚举代替数字,更加直观

添加增加联系人功能

添加显示联系人信息的功能

我们现在已经加了两个功能,来运行测试一下

好了,测试成功,我们继续添加功能

添加删除联系人功能

改进:将删除功能中的查询联系人部分封装为函数,后续功能需要查询就可以字节调用这个函数,提高代码复用性。(注:这个函数不需要在头文件声明,因为该函数只需要在内部使用)

添加查找指定联系人的功能

添加修改指定联系人的功能

对于排序功能,排序方式有很多种,比如按姓名排序,按年龄排序等等,可以跟据需求来设计,这里就不一一实现了。

添加退出功能,直接打印退出游戏并跳出。

当选择到非法字符时,打印重新选择,并跳出选择界面。

到这里,一个建议的通讯录就完成了。

让我们来测试一下

测试

测试成功!

下面是这个通讯录程序的实现代码

代码

Test.c

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#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");
}
void test()
{
	int input = 0;
	//首先得有通讯录
	//PeoInfo data[100];
	//int sz = 0;
	Contact con;
	InitContact(&con);//结构体传参,最好传地址

	do
	{
		menu();
		printf("请选择:>");
		scanf_s("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			//排序
			//按名字排序?
			//按年龄排序?
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;

		}

	} while (input);
}
int main()
{
	test();
	return 0;
}

Contact.c

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

void InitContact(Contact* pc)
{
	assert(pc);//检测指针是否为空指针,增强代码的健壮性
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}


void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);	
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("成功增加联系人\n");
}

void ShowContact(const Contact* pc)
{
	int i = 0;
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄","性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}




//删除联系人功能实现

//常规写法*********

//void DelContact(Contact* pc)
//{
//	if (pc->sz == 0)
//	{
//		printf("通讯录为空,无法删除\n");
//		return;
//	}
//	char name[MAX_NAME] = { 0 };
//	assert(pc);
//	//删除
//	printf("请输入要删除的人的名字:>");
//	scanf("%s", name);
//
//	//找到要删除的人//遍历
//	int i = 0;
//	int del = 0;
//	int flag = 0;
//	for (i = 0; i < pc->sz; i++)
//	{
//		if (strcmp(pc->data[i].name, name)==0)//strcmp()用于比较两个字符串是否相等,相等返回0
//		{
//			del = i;
//			flag = 1;
//			break;
//		}
//	}
//	if (flag == 0)
//	{
//		printf("要删除的联系人不存在\n");
//		return;
//	}
//
//
//	//删除坐标为del的联系人
//	for (i = del; i < pc->sz-1; i++)
//	{
//		pc->data[i] = pc->data[i + 1];
//	}
//	pc->sz--;
//	printf("成功删除联系人\n");
//}

//****************





//*******************
//封装查询函数
int FindByName(const Contact* pc, char name[])
{
	//找到要删除的人//遍历
	int i = 0;

	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)//strcmp()用于比较两个字符串是否相等,相等返回0
		{
			return i;//找到了
		}
	}
	return -2;//找不到
}
//*****************************


//删除过程中有查询步骤,查询可以单独封装为函数,其他功能也可以使用这个函数

void DelContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	assert(pc);
	//删除
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);

	//找到要删除的人//遍历
	int del = FindByName(pc, name);
	if (del == 0)
	{
		printf("要删除的联系人不存在\n");
		return;
	}
	int i = 0;
	//删除坐标为del的联系人
	for (i = del; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人\n");
}


//添加查询指定联系人的功能
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找联系人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -2)
		printf("要查找的人不存在\n");
	else
	{
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");

		//打印数据
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}


//修改指定联系人
void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
		printf("要修改的人不存在\n");
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入地址:>");
		scanf("%s", pc->data[pos].addr);
		printf("修改成功\n");
	}

}

Contact.h

cpp 复制代码
#pragma once

#include <stdio.h>
#include <string.h>
#include <assert.h>

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30

//枚举 代替数字,更加直观
enum OPTION
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	SORT//6
};

//类型的声明

typedef struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;



//通讯录

typedef struct Contact
{
	PeoInfo data[100];
	int sz;
}Contact;


//函数声明
// 
//初始化通讯录
void InitContact(Contact* pc);

//增加联系人
void AddContact(Contact* pc);

//显示所有联系人的信息
void ShowContact(const Contact* pc);//只打印,不涉及修改信息,所以加const

//删除指定联系人
void DelContact(Contact* pc);


//查找指定联系人
void SearchContact(Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);
相关推荐
珹洺3 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
.Cnn3 小时前
用邻接矩阵实现图的深度优先遍历
c语言·数据结构·算法·深度优先·图论
2401_858286113 小时前
101.【C语言】数据结构之二叉树的堆实现(顺序结构) 下
c语言·开发语言·数据结构·算法·
寻找码源4 小时前
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
c语言·数据结构·算法·字符串·kmp
带多刺的玫瑰6 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
陌小呆^O^7 小时前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
时光の尘7 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-7 小时前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
爱摸鱼的孔乙己8 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan8 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法