C/C++静态通讯录

个人主页:

仍有未知等待探索_C语言疑难,数据结构,PTA-CSDN博客

专题分栏:

小项目_仍有未知等待探索的博客-CSDN博客

目录

一、引言

 二、分析

三、功能实现 

1、通讯录类型的定义

 2、初始化函数

3、增加函数 

4、按手机号查找函数 

5、删除函数 

6、修改函数 

7、遍历 

四、总代码


一、引言

今天,通过我们到目前为止所学过的知识,可以去完成一下静态的通讯录。在没有写之前,通过想象,我们也应该大概的想到用什么方式来实现它。

 二、分析

首先,我们知道通讯录里面,以每个人为单位,有每个人的姓名,电话号码等。我们可以用一个结构体来定义一个人的类型。

姓名 电话 etc...

 然后,通讯录会有一系列的操作:初始化、增、删、改、查、遍历等操作。

三、功能实现 

1、通讯录类型的定义

typedef struct Contact
{
	char name[20];
	char phone[20];
}Con;

 2、初始化函数

当通讯录类型定义完之后,我们用这个自定义数据类型来创建数组。数组的大小设置为MAX(define定义的常量)。因为数组的大小在一开始的时候就已经确定了,所以才叫做静态的通讯录。之后我们就对前面的数组进行初始化的操作。

注意:对字符数组赋值是不能用赋值符来赋值。(要用1、字符串拷贝函数;2、scanf函数)

void Init(Con* con)//Con是自定义数据类型,con是参数名(变量名)
{
	for (int i = 0; i < MAX; i++)
	{
		strcpy(con[i].name, "0");
		strcpy(con[i].phone, "0");
	}
}

3、增加函数 

怎么往通讯录里面输入数据呢?怎么一次往通讯录里面增加多个数据呢?如果两次输入数据,怎么样才能在第一次输入的数据之后继续添加数据呢?

这些都是我们在实现这个代码的时候需要考虑到的。

在对于如何记录每次增加完数据的信息?我通过一个全局变量top来对于数据的位置的信息存储。

top初始值为-1,当输入数据的时候,top先自增,然后数组下标为top的位置进行储存数据,一次类推,当top==MAX-1的时候,数组已满,不能往里增加数据。

void类型是无返回类型,在函数体内部可以不写return;(写上了意思是返回空,一个意思)

void Add(Con* con)
{
	if (top == MAX-1)//判断数组是否已满
	{
		printf("通讯录已满\n");
		return;
	}
	else
	{
		char name[20];
		char phone[20];
		printf("请输入姓名:> ");
		scanf("%s", name);
		printf("请输入手机号:> ");
		scanf("%s", phone);
		top++;
		strcpy(con[top].name, name);
		strcpy(con[top].phone, phone);
	}
}

4、按手机号查找函数 

在通讯录里面要查找某个人的话,可以通过手机号查找,也可以通过姓名查找。(在这里我就以通过手机号查找为例)

查找函数非常的容易实现,就是把数组中的手机号都遍历一遍,看看有没有和要查找的手机号相同的,如果有就返回手机号所在数组的下标,如果没有就返回-1;

 要注意的是,循环的终止条件是i<=top,如果把top换成MAX,没必要,数据的最后一位存在top处,而在增加函数那里可以看出来,top存储的是数组中最后一个数据的下标。

int Search(Con* con, char phone[])
{
	//按手机号
	for (int i = 0; i <= top; i++)
	{
		if (strcmp(con[i].phone, phone) == 0)
		{
			return i;
		}
	}
	return -1;
}

5、删除函数 

删除函数,把要删除的数据,有后往前进行覆盖就可以实现。不要忘了,top要自减。

合理性判断,在删除之前通过查找函数进行查询,看看有没有要删除的信息。

void Delete(Con* con)
{
	//按照手机号删除
	char phone[20];
	printf("请输入手机号:> ");
	scanf("%s", phone);
	int ret = Search(con, phone);
	if (ret != -1)
	{
		for (int i = top; i > ret; i--)
		{
			con[i-1] = con[i];
		}
		top--;
	}
	else
	{
		printf("未找到要删除的手机号\n");
	}
	
}

6、修改函数 

和删除函数一样,要先进行查询。不过top不需要动。

void Change(Con* con, char phone[])
{
	int ret = Search(con, phone);
	if (ret != -1)
	{
		printf("请输入修改完的手机号:> ");
		scanf("%s", phone);
		strcpy(con[ret].phone, phone);
	}
	else
	{
		printf("未找到要修改的手机号\n");
	}
}

7、遍历 

void Pass(Con* con)
{
	printf("姓名\t电话\n");
	for (int i = 0; i <= top; i++)
	{
		printf("%-s\t%-s\n", con[i].name, con[i].phone);
	}
}

四、总代码

#include<stdio.h>
#include<string.h>
#define MAX 100
typedef struct Contact
{
	char name[20];
	char phone[20];
}Con;
int top = -1;
void menu();
void Init(Con* con);
void Add(Con* con);
int Search(Con* con,char phone[]);
void Delete(Con* con);
void Pass(Con* con);
void Change(Con* con, char phone[]);
int main()
{
	Con con[MAX];
	//初始化
	Init(con);
	menu();
	int opt;
	printf("请选择:> ");
	scanf("%d", &opt);
	int n;
	char phone[20];
	while (opt)
	{
		switch (opt)
		{
		case 1:
			//增加
			printf("增加数据的个数:> ");
			scanf("%d", &n);
			for (int i = 0; i < n; i++)
				Add(con);
			break;
		case 2:
			//手机号查找
			printf("请输入要查找的手机号:> ");
			scanf("%s", phone);
			int ret = Search(con, phone);
			if (ret != -1)
				printf("找到了\n");
			else
				printf("未找到\n");
			break;
		case 3:
			//删除
			Delete(con);
			break;
		case 4:
			//修改
			printf("请输入要修改的手机号:> ");
			scanf("%s", phone);
			Change(con, phone);
			break;
		case 5:
			//遍历
			Pass(con);
			break;
		case 0:
			printf("退出成功\n");
			break;
		default:
			printf("输入有误,请重新输入:> \n");
			break;
		}
		printf("请选择:> ");
		scanf("%d", &opt);
	}
	return 0;
}
void menu()
{
	printf("**************************************\n");
	printf("       1、增加         2、查找         \n");
	printf("       3、删除         4、修改         \n");
	printf("       5、遍历         0、退出         \n");
	printf("**************************************\n");

}
void Init(Con* con)
{
	for (int i = 0; i < MAX; i++)
	{
		strcpy(con[i].name, "0");
		strcpy(con[i].phone, "0");
	}
}
void Add(Con* con)
{
	if (top == MAX-1)
	{
		printf("通讯录已满\n");
		return;
	}
	else
	{
		char name[20];
		char phone[20];
		printf("请输入姓名:> ");
		scanf("%s", name);
		printf("请输入手机号:> ");
		scanf("%s", phone);
		top++;
		strcpy(con[top].name, name);
		strcpy(con[top].phone, phone);
	}
}
int Search(Con* con, char phone[])
{
	//按手机号
	for (int i = 0; i <= top; i++)
	{
		if (strcmp(con[i].phone, phone) == 0)
		{
			return i;
		}
	}
	return -1;
}
void Delete(Con* con)
{
	//按照手机号删除
	char phone[20];
	printf("请输入手机号:> ");
	scanf("%s", phone);
	int ret = Search(con, phone);
	if (ret != -1)
	{
		for (int i = top; i > ret; i--)
		{
			con[i-1] = con[i];
		}
		top--;
	}
	else
	{
		printf("未找到要删除的手机号\n");
	}
	
}
void Pass(Con* con)
{
	printf("姓名\t电话\n");
	for (int i = 0; i <= top; i++)
	{
		printf("%-s\t%-s\n", con[i].name, con[i].phone);
	}
}
void Change(Con* con, char phone[])
{
	int ret = Search(con, phone);
	if (ret != -1)
	{
		printf("请输入修改完的手机号:> ");
		scanf("%s", phone);
		strcpy(con[ret].phone, phone);
	}
	else
	{
		printf("未找到要修改的手机号\n");
	}
}

谢谢大家支持!

猜你喜欢

转载自blog.csdn.net/qq_73435980/article/details/133747623
今日推荐