个人主页:
仍有未知等待探索_C语言疑难,数据结构,PTA-CSDN博客
专题分栏:
小项目_仍有未知等待探索的博客-CSDN博客
目录
一、引言
二、分析
三、功能实现
1、通讯录类型的定义
2、初始化函数
3、增加函数
4、按手机号查找函数
5、删除函数
6、修改函数
7、遍历
四、总代码
今天,通过我们到目前为止所学过的知识,可以去完成一下静态的通讯录。在没有写之前,通过想象,我们也应该大概的想到用什么方式来实现它。
首先,我们知道通讯录里面,以每个人为单位,有每个人的姓名,电话号码等。我们可以用一个结构体来定义一个人的类型。
姓名 | 电话 | etc... |
然后,通讯录会有一系列的操作:初始化、增、删、改、查、遍历等操作。
typedef struct Contact
{
char name[20];
char phone[20];
}Con;
当通讯录类型定义完之后,我们用这个自定义数据类型来创建数组。数组的大小设置为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");
}
}
怎么往通讯录里面输入数据呢?怎么一次往通讯录里面增加多个数据呢?如果两次输入数据,怎么样才能在第一次输入的数据之后继续添加数据呢?
这些都是我们在实现这个代码的时候需要考虑到的。
在对于如何记录每次增加完数据的信息?我通过一个全局变量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);
}
}
在通讯录里面要查找某个人的话,可以通过手机号查找,也可以通过姓名查找。(在这里我就以通过手机号查找为例)
查找函数非常的容易实现,就是把数组中的手机号都遍历一遍,看看有没有和要查找的手机号相同的,如果有就返回手机号所在数组的下标,如果没有就返回-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;
}
删除函数,把要删除的数据,有后往前进行覆盖就可以实现。不要忘了,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");
}
}
和删除函数一样,要先进行查询。不过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");
}
}
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
#include
#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");
}
}
谢谢大家支持!