基于C语言 --- 自己写一个通讯录

C语言程序设计笔记---039

  • C语言之实现通讯录
    • 1、介绍C/C++程序的内存开辟
    • 2、C语言实现通讯录
      • 2.1、ContactMain.c程序大纲
      • 2.2、Contact2.h
      • 2.3、Contact2.c
        • 2.3.1 InitContact( )初始化通讯录函数
        • 2.3.2 AddContact( )添加联系人和CheckCapaticy( )检查容量函数
        • 2.3.3、ShowContact( )显示联系人函数
        • 2.3.4、DelContact( )删除联系人和FindByName( )函数
        • 2.3.5、SearchContact( )查找联系人
        • 2.3.6、ModifyContact( )修改联系人
        • 2.3.7、CleanContact( )清空联系人
        • 2.3.8、SortContact( )排序联系人
    • 4、结语

C语言之实现通讯录

前言:
通过C语言自定义类型的知识,这篇将对动态内存的管理知识,接下来进行应用学习写一个简易的通讯录。

/知识点汇总/

1、介绍C/C++程序的内存开辟

大致整体空间的分配
内核空间:用户代码…(不能读写)
栈区:局部变量、形式参数…
内存映射段:文件映射、动态库、匿名映射…
堆区:动态内存、malloc/calloc/free…
数据段(数据段):全局数据、静态数据、static常变量…
代码段:可执行代码、只读常量
具体如下图所示
在这里插入图片描述

2、C语言实现通讯录

实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.清空所有联系人
7.以名字排序所有联系人

2.1、ContactMain.c程序大纲

首先,从生活实际使用的角度出发,我们需要一个显示的菜单,显示我们需要的功能集。
这里可以前面篇章所学的menu( )自定义函数,设计一个简易的菜单。

//菜单
void menu()
{printf("*************************************\n");printf("******** 1.add          2.del   *****\n");printf("******** 3.sreach       4.modify*****\n");printf("******** 5.show         6.sort  *****\n");printf("******** 7.clean        0.exit  *****\n");printf("*************************************\n");
}

为了让选项贴合实际,数字0~7可以使用一个自定义类型所学的枚举类型来列举引用即可。

//枚举常量
enum Option
{EXIT,//0ADD,//1DEL,//2SEARCH,//3MODIFY,//4SHOW,//5SORT,//6CLEAN//7
};

其中可以看见,我把EXIT写在第一个,这样是为了利用枚举成员变量未初始化是默认从0开始的特点,从而与选项一致对应。
那么接下来,主函数中就是利用do while和 switch 搭建一个程序执行框架。

int main()
{int input = 0;//创建通讯录Contact con;//初始化通讯录InitContatc(&con);do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case ADD:printf("\n添加联系人\n\n");AddContact(&con);break;case DEL:printf("\n删除联系人\n\n");DelContact(&con);break;case SEARCH:printf("\n搜索联系人\n\n");SearchContact(&con);break;case MODIFY:printf("\n修改联系人\n\n");ModifyContact(&con);break;case SHOW:printf("\n显示联系人\n\n");ShowContact(&con);break;case SORT:printf("\n排序联系人\n\n");SortContact(&con);break;case CLEAN:printf("\n清空联系人\n\n");CleanContact(&con);break;case EXIT:printf("\n退出通讯录\n\n");break;default:printf("\n输入错误请重新输入\n\n");break;}} while (input);return 0;
}

主函数首先定义一个input由玩家输入的变量,然后同步switch语句,根据选项进入不同的入口,分别执行添加联系人、删除联系人、搜索联系人、修改联系人、显示联系人、排序联系人、清空联系人、退出通讯录以及输入数值不对做出一个反馈,输入错误的提示信息。

2.2、Contact2.h

主要用于存放所自定义的函数和头文件等声明的程序
由于涉及多种类型的数据,所以最好的方法就是定义一个结构体类型。
然后,这里同时提供通讯录初始化的静态数组的版本,也提供动态内存的写法,利用前篇动态内存空间管理的知识,申请动态开辟空间和管理。
其它的声明,通俗易懂,就不多赘述,详见代码注释的说明。

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 20
#define ADDR_MAX 20//#define MAX 100
#define DEFAULT_SZ 3   //默认容量
#define DEFAULT_INC 2  //增容量
//结构体类型申明
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;//创建通讯录 --- 静态版本
//typedef struct Contact
//{
//	PeoInfo data[MAX];//通讯录容量
//	int sz;//当前通讯录的信息个数
//}Contact;//创建通讯录 --- 动态版本
typedef struct Contact
{PeoInfo* data;//指向通讯录的数据int sz;//当前通讯录的信息个数int capacity;//记录当前通讯录的容量
}Contact;//初始化通讯录
void InitContact(Contact* pc);//增加联系人
void AddContact(Contact* pc);//销毁通讯录
void DestoryContact(Contact* pc);//显示通讯录
void ShowContact(Contact* pc);//删除联系人
void DelContact(Contact* pc);//查找联系人
void SearchContact(Contact* pc);//修改联系人
void ModifyContact(Contact* pc);//清空通讯录
void CleanContact(Contact* pc);//排序通讯录
void SortContact(Contact* pc);

2.3、Contact2.c

主要用于存放对 ContactMain.c 程序大纲做提到的函数进行封装,实现具体的功能的程序
说明:基于ContactMain.c 程序大纲逻辑对代码进行讲解

2.3.1 InitContact( )初始化通讯录函数

首先在头文件中,定义了结构体成员和创建好后,根据主函数逻辑对通讯录进行初始化.
初始化可以理解为将通讯录的数据赋予一个初始值,方便我们后续对其进行操作。
sz清零就是使得当前存放的长度为0;capacity清零就是让容量为默认的3个容量;
接下来就是将数据初始化,这里为了直接方便的初始化所以选择使用calloc而不是malloc函数来初始化,因为它们的区别就在于calloc会直接将每个字节初始化为0,而malloc不会初始化。
然后结合参数的意思就是将申请开辟默认容量乘以结构体得的大小的空间。
为了代码的规范性、健壮性需要做开辟空间失败的反馈。

//初始化通讯录 -- 静态版本
//void InitContact(Contact* pc)
//{
//	assert(pc);
//	pc->sz = 0;
//	memset(pc->data, 0, sizeof(pc->data));//将数据以每个字节设置或初始化为0
//}//初始化通讯录 -- 动态版本
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;pc->capacity = DEFAULT_SZ;pc->data = calloc(pc->capacity , sizeof(PeoInfo));if (pc->data == NULL){perror("InitContact->calloc\n");return;}
}
2.3.2 AddContact( )添加联系人和CheckCapaticy( )检查容量函数

同样,提供了静态版本和动态版本,简单说明一下静态和动态的区别,当我们不清楚需要多大的空间时,比如需要存放1000个数据,静态给10太小,给10000太大,所以存在空间资源的浪费甚至是溢出等情况,那么就引用动态的方式存储,就可以实现灵活的开辟空间和释放空间,既满足需求,也能合理使用空间资源。那么接下来,都是以动态进行分享思路。
回到添加联系人的函数体,我们每次存入数据前,肯定需要检查是否能够存放得下,那么就需要对当前空间的剩余量与数据的大小,进行判断,如果放不下那么就执行扩容,反之就是放得下。
那么就可以继续执行添加联系人得信息,利用的是按照逻辑访问结构体成员依次添加,最后完成一个数据添加后,sz当前通讯录的信息个数随着加1。
对于,增容函数,主要是依靠realloc函数实现增容。参数是开辟空间的首地址和增容的大小。
另外,对于realloc还有一种特殊情况,就不展开了,详见前篇动态内存空间管理的知识。

//增加联系人 --- 静态版本
//void AddContact(Contact* pc)
//{
//	assert(pc);
//	if (pc->sz == MAX)
//	{
//		printf("\n通讯录已满,无法增加\n\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增加成功\n\n");
//}//增容函数
static void CheckCapaticy(Contact* pc)
{if (pc->sz == pc->capacity){PeoInfo* ptr = realloc(pc->data, (pc->capacity + DEFAULT_INC) * sizeof(PeoInfo));if (ptr != NULL){pc->data = ptr;pc->capacity += DEFAULT_INC;printf("\n增容成功\n\n");}else{perror("AddContact->realloc\n");return;}}
}
//增加联系人 --- 动态版本
void AddContact(Contact* pc)
{assert(pc);//如果容量与信息相等,自动增加容量CheckCapaticy(pc);//增加信息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增加成功\n\n");
}

在这里插入图片描述

2.3.3、ShowContact( )显示联系人函数

这个函数的逻辑就比较简单了,就是遍历数据成员依次打印出来就行,重点在于对界面符合一定的审美,包括占位符、缩进。标题行的重要性等比较灵活,这里仅提供参考一种打印效果如下所示:
在这里插入图片描述

//显示通讯录
void ShowContact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("\n无法显示,通讯录为空\n\n");return;}//显示联系人//打印标题 -- 美化printf("%-10s%-5s%-5s%-20s%-20s\n", "姓名", "年龄", "性别", "电话", "地址");//打印联系人信息int i = 0;for (i = 0; i < pc->sz; i++){printf("%-10s%-5d%-5s%-20s%-20s\n",pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
}

在这里插入图片描述

2.3.4、DelContact( )删除联系人和FindByName( )函数

对于删除函数,我们需要先判断是否为空,当数据为空,没有删除的对象了,顾名思义就不能删除了;其次,我们需要删除某个联系人对象,与后面的查找联系人和修改联系人都需要去遍历查找所以,为了方便调用就封装了一个匹配联系人的函数FindByName,并且是根据联系人姓名来进行匹配的。直接使用strcmp即可。在删除目标联系人后,后面的数据就得向前移动。使用for语句移动,最后sz也需要随着减1。

//匹配联系人函数
static int FindByName(Contact* pc, char* name)
{assert(pc);int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}
//删除联系人
void DelContact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("\n无法删除,通讯录为空\n\n");return;}//输入要删除的联系人姓名char name[NAME_MAX];printf("请输入要删除联系人的姓名:>");scanf("%s", name);//查找匹配联系人int ret = FindByName(pc, name);if (ret == -1){printf("\n无此联系人\n\n");return;}//删除联系人int i = 0;for (i = ret; i < pc->sz; i++){pc->data[i] = pc->data[ i + 1];}//处理最后一个联系人pc->sz--;printf("\n删除成功\n\n");
}

在这里插入图片描述
在这里插入图片描述

2.3.5、SearchContact( )查找联系人

查找联系人的套路都大相径庭了,结合匹配函数找到对应的联系人,然后单独打印输出即可。

//查找联系人
void SearchContact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("\n无法查找,通讯录为空\n\n");return;}//输入要查找的联系人姓名char name[NAME_MAX];printf("请输入要查找联系人的姓名:>");scanf("%s", name);//查找匹配联系人int ret = FindByName(pc, name);if (ret == -1){printf("\n无此联系人\n\n");return;}//显示对应联系人//打印标题 -- 美化printf("%-10s%-5s%-5s%-20s%-20s\n", "姓名", "年龄", "性别", "电话", "地址");//打印联系人信息printf("%-10s%-5d%-5s%-20s%-20s\n",pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].tele,pc->data[ret].addr);
}

在这里插入图片描述

2.3.6、ModifyContact( )修改联系人

修改联系人,在理解了前面的内容,也不难理解,结合匹配联系人的函数找到需要修改的联系人,然后,输入修改后的信息即可。但是,这里比较冗余,不难发现会修改联系人的所有属性。可以增加一个switch选择只需要更改的属性即可。值得注意的是,在以上结合匹配函数的条件下,使用的是返回值ret才能正确符合逻辑运行哦,不能盲目复制粘贴前面的添加联系人的输入信息部分的代码。

//修改联系人
void ModifyContact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("\n无法修改,通讯录为空\n\n");return;}//输入要修改的联系人姓名char name[NAME_MAX];printf("请输入要修改联系人的姓名:>");scanf("%s", name);//查找匹配联系人int ret = FindByName(pc, name);if (ret == -1){printf("\n无此联系人\n\n");return;}//找到了,则修改printf("请输入新的姓名:>");scanf("%s", pc->data[ret].name);printf("请输入年龄:>");scanf("%d", &pc->data[ret].age);printf("请输入性别:>");scanf("%s", pc->data[ret].sex);printf("请输入电话:>");scanf("%s", pc->data[ret].tele);printf("请输入地址:>");scanf("%s", pc->data[ret].addr);printf("\n修改成功\n\n");
}

在这里插入图片描述
在这里插入图片描述

2.3.7、CleanContact( )清空联系人

清空通讯录,跟初始化通讯录类似,信息重新清零或者复位即可。

//清空通讯录
void CleanContact(Contact* pc)
{assert(pc);pc->sz = 0;pc->capacity = 0;free(pc->data);pc->data = NULL;//pc->data = 0;printf("\n已清空通讯录\n\n");
}

在这里插入图片描述
在这里插入图片描述

2.3.8、SortContact( )排序联系人

排序联系人主要结合了前面篇章的qsort函数的功能,这里完成的是以姓名排序。

//排序通讯录
//void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
static cmp_by_name(const void* e1,const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}void SortContact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("\n无法排序,通讯录为空\n\n");return;}//排序联系人qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_by_name);printf("\n排序成功\n\n");
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、结语

相信通过这样一个简易通讯录的实现,更具掌握了对数组、动态内存管理的操作以及对自定义函数的深刻认识;
如果觉着文章对您有所帮助,请不要吝啬的一赞三连哦,谢谢阅读,不足之处还请多多指教。

半亩方糖一鉴开,天光云影共徘徊。
问渠哪得清如许?为有源头活水来。–朱熹(观书有感)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用Web安全扫描工具汇整

漏洞扫描是一种安全检测行为&#xff0c;更是一类重要的网络安全技术&#xff0c;它能够有效提高网络的安全性&#xff0c;而且漏洞扫描属于主动的防范措施&#xff0c;可以很好地避免黑客攻击行为&#xff0c;做到防患于未然。 1、AWVS Acunetix Web Vulnerability Scanner&a…

图书推荐管理系统Python+Django网页界面+协同过滤推荐算法

一、介绍 图书管理与推荐系统。使用Python作为主要开发语言。前端采用HTML、CSS、BootStrap等技术搭建界面结构&#xff0c;后端采用Django作为逻辑处理&#xff0c;通过Ajax等技术实现数据交互通信。在图书推荐方面使用经典的协同过滤算法作为推荐算法模块。主要功能有&#…

安全、高效远程访问大数据分析平台解决方法:Splunk Enterprise+Cpolar

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 Splunk Enterprise是一个强大的机器数据管理平台&#xff0c;可帮助客户分析和搜索数据&#xff0c;以及可视化数据…

iPhone开发--Xcode15下载iOS 17.0.1 Simulator Runtime失败解决方案

爆句粗口&#xff0c;升级后公司网络下载iOS 17.0.1 Simulator Runtime一直出错&#xff0c;每次出错后都得重新开始下载&#xff0c;oh&#xff0c;f**k。上一次在在家里的网络升级成功。 解决办法一&#xff1a; 进入网址&#xff1a;https://developer.apple.com/download…

税务某局 webpack 登录接口逆向分析

持续创作文章&#xff0c;只是为了更好的思考 这里不多介绍了&#xff0c;我放一张图大家就明白是什么接口了。这里只介绍整体加密逻辑&#xff0c;有些细的地方大家自行调整。 本次逆向的网址是 aHR0cHM6Ly90cGFzcy5qaWxpbi5jaGluYXRheC5nb3YuY246ODQ0My8jL2xvZ2luP3JlZGly…

FPGA的256点FFT调用Quartus IP核实现VHDL傅里叶变换

名称&#xff1a;256点FFT调用Quartus IP核实现傅里叶变换 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a;使用VHDL实现256点FFT&#xff0c;调用Quartus IP核实现傅里叶变换 演示视频&#xff1a;http://www.hdlcode.com/index.php?mhome&cView…

笔记39:在Pycharm中为项目添加新解释器

很久不用pycharm都生疏了 a a a 第一步&#xff1a;创建虚拟环境 略 a a a 第二步&#xff1a;将虚拟环境应用到项目中去 【File】----【Settings】----【Project:~~~】-----【Project Interpreter】----【选择合适的解释器】 ​​​​​​​ 因为我们要用新的解释…

【API篇】七、Flink窗口

文章目录 1、窗口2、分类3、窗口API概览4、窗口分配器 在批处理统计中&#xff0c;可以等待一批数据都到齐后&#xff0c;统一处理。但是在无界流的实时处理统计中&#xff0c;是来一条就得处理一条&#xff0c;那么如何统计最近一段时间内的数据呢&#xff1f; ⇒ 窗口的概念&…

虚幻引擎:代理

一、代理类型 1.单薄代理 特点&#xff1a;允许有返回值&#xff0c;允许有参数&#xff0c;只可以一对一的传递消息就算绑定多个&#xff0c;但是总会被最后一个覆盖 2.多播代理 特点&#xff1a;不允许有返回值&#xff0c;允许有参数允许一对多传递消息 3.动态代理 …

js关于深度克隆问题

js的克隆是一个老生常谈的内容了,今天没啥好写的,就写这个了 要搞清楚js的克隆,就需要先搞清楚js中的数据类型,js中数据类型分为两大类 类型说明原始类型-string字符串类型&#xff0c;用于表示文本数据。number数字类型&#xff0c;包括整数和浮点数&#xff0c;用于表示数值…

app拉新渠道整合 一手地推、网推拉新平台整理

1.聚量推客 聚量推客自己本身是服务商&#xff0c;自己直营的平台&#xff0c;相对来说数据更好&#xff0c;我们也拿到了平台首码&#xff1a;000000 填这个就行&#xff0c;属于官方渠道 2.蓝猫推客 蓝猫推客我认为是比较又潜力的平台&#xff0c;经过几天测试数据和结算都…

网络规划设计

文章目录 一、网络架构设计1.1 单核心双核心1.1.1 单核心1.1.2 双核心端口聚合 链路聚合网关冗余VRRP堆叠技术生成树STPPOE以太网供电服务器冗余&负载均衡服务器双机热备 1.2 环网架构设计1.3 层次化架构设计1.3.2 三层网络架构设计1.3.3 园区大二层网络架构1.3.4 数据中心…

最详细STM32,cubeMX串口发送,接收数据

这篇文章将详细介绍 串口 发送数据&#xff0c;接受数据。 文章目录 前言一、串口的基础知识二、cubeMX 配置三、自动生成代码解析四、串口发送数据函数五、使用串口收发数据点亮 led重定向函数&#xff1a; 总结 前言 实验开发板&#xff1a;STM32F103C8T6。所需软件&#xf…

【TES605】基于Virtex-7 FPGA的高性能实时信号处理平台

板卡概述 TES605是一款基于Virtex-7 FPGA的高性能实时信号处理平台&#xff0c;该平台采用1片TI的KeyStone系列多核DSP TMS320C6678作为主处理单元&#xff0c;采用1片Xilinx的Virtex-7系列FPGA XC7VX690T作为协处理单元&#xff0c;具有2个FMC子卡接口&#xff0c;各个处理节…

景联文科技:针对敏感数据的安全转录服务,护航信息安全

针对数据的安全转录服务&#xff0c;主要是为了确保数据在转录过程中的安全性和隐私保护。这些服务通常会采用一系列严格的安全措施&#xff0c;如数据加密、访问控制、数据脱敏等&#xff0c;以确保敏感数据不会被泄露或滥用。 景联文科技提供特定的数据转录服务&#xff0c;以…

CentOS7.9+Kubernetes1.28.3+Docker24.0.6高可用集群二进制部署

CentOS7.9Kubernetes1.28.3Docker24.0.6高可用集群二进制部署 查看版本关系 ## 从kubernetes-server-linux-amd64.tar.gz解压后有kubeadm ]# ./kubeadm config images list W1022 20:06:05.647976 29233 version.go:104] could not fetch a Kubernetes version from the in…

WPF Material Design UI框架

前言 Material Design in xaml 是开源免费的ui框架&#xff0c;工控软件主打的就是简单界面。 以下简称MD 相关资源 MaterialDesignInXamlToolkit Github 地址 MD 快速启动 MD 案例压缩包 MD 框架使用 启动环境配置 安装Nuget包 App.xaml 配置 <Application x:Class&qu…

leetcode:面试题 17.04. 消失的数字(找单身狗/排序/公式)

一、题目&#xff1a; 函数原型&#xff1a;int missingNumber(int* nums, int numsSize) 二、思路&#xff1a; 思路1 利用“找单身狗”的思路&#xff08;n^n0&#xff1b;0^nn&#xff09;&#xff0c;数组中有0-n的数字&#xff0c;但缺失了一个数字x。将这些数字按位异或0…

zookeeper源码(02)源码编译启动及idea导入

本文介绍一下zookeeper-3.9.0源码下载、编译及本地启动。 下载源码 git clone https://gitee.com/apache/zookeeper.gitcd zookeeper git checkout release-3.9.0 git checkout -b release-3.9.0源码编译 README_packaging.md文件 该文件介绍了编译zookeeper需要的环境和命…

PKU 概率论+数理统计+建模 期中考复习总结

目录 计算条件概率计算概率&#xff08;放回与不放回&#xff09;生成随机数算法Linear Congruential Method判断是否是full period Uniformity (test of frequency)1.Chi-Square testmethodreminderexample 2.Kolmogorov-Sminov testmethodexample Independence (test of auto…