离散数学实践(2)-编程实现关系性质的判断

*本文为博主本人校内的离散数学专业课的实践作业。由于实验步骤已经比较详细,故不再对该实验额外提供详解,本文仅提供填写的实验报告内容与代码部分,以供有需要的同学学习、参考。

--------------------------------------

编程语言:Java SE

编译环境:jdk 8

相关文章:离散数学实践(1)-编程实现利用真值表法求主析取范式以及主合取范式

目录

 一、实验目的

二、实验内容

三、实验步骤及实验结果

1、Java类与接口的设计

(1)设计六个Java类。

(2)类Matrix

(3)类IsReflexive

(4)类IsSymmetry

(5)类IsTransitivity

(6)类Test

2、设计步骤和思路(类TestMain)

3、运行结果

四、总结


 一、实验目的

1、理解二元关系的矩阵表示

2、理解二元关系的自反性、反自反性、对称性、反对称性及传递性


二、实验内容

1、用矩阵表示二元关系

2、通过矩阵的特征判断二元关系所具有的性质

3、运用二维数组实现矩阵的输入,然后判断自反性,反自反性,对称性,反对称性,传递性


三、实验步骤及实验结果

1、Java类与接口的设计

(1)设计六个Java类。

包括用于实现四个关系性质判断功能类(类IsReflexive,类IsSymmetry,类IsTransitivity,类Matrix),一个辅助类Test和一个测试类TestMain。

TestMain类中设计main方法,在main方法中搭建程序的主体框架,包括多组输入,实例化Matrix类以访问关系矩阵对象,实例化自反性、传递性与对称性对象。

(2)类Matrix

定义成员变量:关系矩阵的阶数n,关系矩阵二维数组array,并设置访问限定修饰符private和protected将n和array封装。构造方法接收main方法传入的矩阵阶数n,并创建数组对象,以存储用户输入的矩阵值。

定义成员方法:出于封装的考虑,设计public的方法接口getN()和getArray(),以及矩阵的输出方法,用于在用户输入完毕矩阵后,将矩阵展现出来。输出二维数组也可以调用Arrays.deepToString()完成。

package com.lisan;import java.util.Arrays;public class Matrix {private int n;      //阶数protected int[][] array;  //矩阵二维数组public int getN() {return n;}public Matrix(int n) {this.n = n;this.array = new int[n][n];}public int[][] getArray() {return array;}//输出矩阵public void printMatrix() {System.out.println("关系矩阵为:");for (int[] ret : array) {for (int x : ret) {System.out.print(x + " ");}System.out.println();}}
}

(3)类IsReflexive

该类为继承类,继承父类Matrix,以复用Matrix类中的成员。可以理解为:一个自反关系类,可以实例化出一个自反关系对象。

定义成员变量: reflexive(自反),antiReFlexive(反自反)。初始值均为false。

定义成员方法:

public boolean isRef():用于判断关系是否为自反性。根据输入只能为0或1两个值,因此自反矩阵的主对角线元素值均为1。遍历二维数组,用flag标记该关系的主对角线值是否均为1.若均为1,则更改reflexive属性为true,意为该关系是自反性的;否则reflexive仍为false。最终将属性reflexive值返回。

public boolean isAntiRef():用于判断关系是否为反自反性。思路同上,反自反矩阵的主对角线元素值均为0.遍历二维数组,用flag标记该关系的主对角线值是否均为0.若均为0,则更改antiReFlexive属性为true,意为该关系是反自反性的;否则antiReFlexive仍为false。最终将属性antiReFlexive值返回。

package com.lisan;public class IsReflexive extends Matrix {boolean reflexive;  //自反性boolean antiReflexive;  //反自反性public IsReflexive(int n,int[][] array) {super(n);super.array = array;}public boolean isRef() {boolean flag = true;//自反矩阵主对角线元素全为1for (int i = 0; i < array.length; i++) {if (array[i][i] != 1) {flag = false;break;}}if (flag) {this.reflexive = true; //是自反的}return this.reflexive;}public boolean isAntiRef() {boolean flag = true;//反自反矩阵主对角线元素全为0for (int i = 0; i < array.length; i++) {if (array[i][i] != 0) {flag = false;break;}}if (flag) {this.antiReflexive = true; //是反自反的}return this.antiReflexive;}
}

(4)类IsSymmetry

该类同样继承父类Matrix。可以理解为:一个对称关系类。

定义成员变量:symmetry(对称),skewSymmetry(反对称)。初始值均为false。

定义成员方法:

public boolean isSymmetry() :用于判断关系是否为对称性。遍历二维数组,用flag标记该关系对称矩阵array[i][j] == array[j][i].若成立,则更改symmetry属性为true,意为该关系是对称性的;否则symmetry仍为false。最终将属性this.symmetry值返回。

public boolean isAntiSymmetry():用于判断关系是否为反对称性。在反对称矩阵中,i != j时,array[i][j]和array[j][i]不同时为1。遍历二维数组,用flag标记反对称条件是否成立。若成立,则更改this.skewSymmetry属性为true,意为该关系是反对称性的;否则仍为false。最终将this.skewSymmetry值返回。

package com.lisan;public class IsSymmetry extends Matrix {boolean symmetry;   //对称性boolean skewSymmetry;  //反对称性public IsSymmetry(int n,int[][] array) {super(n);super.array = array;}public boolean isSymmetry() {boolean flag = true;//对称矩阵array[i][j] == array[j][i]for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {if(array[i][j] != array[j][i]) {flag = false;break;}}}if(flag) {this.symmetry = true;}return this.symmetry;}public boolean isAntiSymmetry() {boolean flag = true;//反对称矩阵中i != j时,array[i][j]和array[j][i]不同时为1for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {if(i != j) {if (array[i][j] == 1 && array[j][i] == 1) {flag = false;break;}}if(!flag) {break;}}}if(flag) {this.skewSymmetry = true;}return this.skewSymmetry;}
}

(5)类IsTransitivity

该类同样继承父类Matrix。可以理解为:一个对传递关系类。

定义成员变量:transitivity(传递)。初始值均为false。

定义成员方法:

public boolean isTransitivity() :用于判断关系是否为传递性。已知在传递矩阵中,若array[i][j]==1且array[j][k]==1,则a[i][k]也为1。遍历二维数组,用flag标记该关系对称矩阵是否满足传递性的条件。若成立,则更改transitivity属性为true,意为该关系是传递的;否则transitivity仍为false。最终将属性this.transitivity值返回。

package com.lisan;public class IsTransitivity extends Matrix{boolean transitivity;   //传递性public IsTransitivity(int n,int[][] array) {super(n);super.array = array;}public boolean isTransitivity() {int n = getN();boolean flag = true;//传递矩阵若array[i][j]==1且array[j][k]==1,则a[i][k]也为1for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int l = 0; l < n; l++) {if (array[i][j] == 1 && array[j][l] == 1) {if(array[i][l] != 1) {flag = false;break;}}}if(!flag) {break;}}if(!flag) {break;}}if(flag) {this.transitivity = true;}return transitivity;}
}

 (6)类Test

该类用于依次测试各个类功能与接口是否能正常运行,不作为最终的实验功能实现。

2、设计步骤和思路(类TestMain)

(1)输入矩阵真值

在main方法中进行输入。首先输入关系矩阵阶数n,再实例化Matrix对象,构造一个n阶的二维数组。调用matrix.getArray()方法接收创建的数组对象的引用。

然后用户输入关系中的真值。规定:只能输入0或1.检查用户输入是否有误,若有则提示用户重新输入正确的值。

(2)输出用户输入的数组值。

(3)实例化自反关系对象:IsReflexive ref = new IsReflexive(n,array);传入阶数n与引用array,调用ref的成员方法,依次判断ref是否为自反关系、反自反关系。若ref.reflexive和ref.antiReflexive均为false,则说明它既不是自反关系也不是反自反关系。输出结果。

(4)实例化对称关系对象与传递关系对象。同理,分别调用对象的成员方法,依次判断它是否为对称关系、反对称关系、传递关系。若对称关系判断中symmetry和skewSymmetry均为false,则说明它既不是对称关系也不是反对称关系。输出结果。

package com.lisan;
import java.util.Scanner;public class TestMain {public static void main(String[] args) {Scanner reader = new Scanner(System.in);//输入关系矩阵System.out.println("请输入关系矩阵阶数:");int n = reader.nextInt();Matrix matrix = new Matrix(n);int[][] array = matrix.getArray();System.out.println("请输入关系矩阵R (0或1):");for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {array[i][j] = reader.nextInt();while(array[i][j] != 0 && array[i][j] != 1) {System.out.println("输入有误!重新输入!");array[i][j] = reader.nextInt();}}}//System.out.println(matrix);matrix.printMatrix();//System.out.println(Arrays.deepToString(array));System.out.print("是否自反:");IsReflexive ref = new IsReflexive(n,array);if(ref.isRef()) {System.out.println("自反关系!");} else if(ref.isAntiRef()) {System.out.println("反自反关系!");} else {System.out.println("既不自反也不反自反!");}System.out.print("是否对称:");IsSymmetry sym = new IsSymmetry(n,array);if(sym.isSymmetry()) {System.out.println("对称关系!");} else if (sym.isAntiSymmetry()) {System.out.println("反对称关系!");} else {System.out.println("既不对称也不反对称!");}System.out.print("是否传递:");IsTransitivity tran = new IsTransitivity(n,array);if(tran.isTransitivity()) {System.out.println("传递关系!");} else {System.out.println("不是传递关系!");}}
}

3、运行结果

四、总结

  1. 经过编程,从代码的角度考虑离散数学问题,更熟练地掌握了关系性质判断的原理。
  2. Java类面向对象的思维得到了很好的体现。
  3. 自反:主对角线元素全是1
  4. 反自反:主对角线元素全是0
  5. 对称:矩阵是对称矩阵(R的逆等于R)
  6. 反对称:若rij=1, 且i≠j, 则rji=0
  7. 传递:对M2中1所在位置,M中相应位置都是1

经过实践作业,对以上离散数学知识点的理解更为深入了。可以与对书本上的书面作业融会贯通。

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

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

相关文章

Hive On Spark 概述、安装配置、计算引擎更换、应用、异常解决

文章目录 Hadoop 安装Hive 安装Hive On Spark 与 Spark On Hive 区别Hive On SparkSpark On Hive 部署 Hive On Spark查询 Hive 对应的 Spark 版本号下载 Spark解压 Spark配置环境变量指定 Hadoop 路径在 Hive 配置 Spark 参数上传 Jar 包并更换引擎 测试 Hive On SparkYarn 资…

Windows Server 2016使用MBR2GPT.EXE教程!

什么是MBR2GPT.exe&#xff1f; MBR2GPT.exe是微软提供的专业工具&#xff0c;可在命令提示符下运行。使用该工具可以将引导磁盘从MBR转换为GPT分区样式&#xff0c;而无需修改或删除所选磁盘上的任何内容。 在Windows Server 2019和Windows 10&#xff08;1703…

【软著写作】软著写作过程记录

文章目录 整体流程图&#xff1a;写在前面&#xff1a;一、准备材料1 准备材料2 申请盖章 二、软件登记1 注册账号2 填报软著 整体流程图&#xff1a; 写在前面&#xff1a; 这两天填报了一篇软著&#xff0c;正好将以前第一次填报时&#xff0c;踩的一些坑和过程记录了一下&am…

IDEA远程调试代码

IDEA->RUN->Edit Configurations 端口随便选一个&#xff0c;选择调试模块&#xff0c;然后用IDEA生成的命令调试 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:8081 -jar backend-1.18.11.jar &

【教3妹学编程-算法题】2914. 使二进制字符串变美丽的最少修改次数

3妹&#xff1a;呜呜&#xff0c;烦死了&#xff0c; 脸上长了一个痘 2哥 : 不要在意这些细节嘛&#xff0c;不用管它&#xff0c;过两天自然不就好了。 3妹&#xff1a;切&#xff0c;你不懂&#xff0c;影响这两天的心情哇。 2哥 : 我看你是不急着找工作了啊&#xff0c; 工作…

面试算法47:二叉树剪枝

题目 一棵二叉树的所有节点的值要么是0要么是1&#xff0c;请剪除该二叉树中所有节点的值全都是0的子树。例如&#xff0c;在剪除图8.2&#xff08;a&#xff09;中二叉树中所有节点值都为0的子树之后的结果如图8.2&#xff08;b&#xff09;所示。 分析 下面总结什么样的节…

AI智能语音识别模块(二)——基于Arduino的语音控制MP3播放器

文章目录 简介离线语音控制模块Mini MP3模块0.96寸 OLED模块实验准备安装库接线定义主要程序实验效果注意事项总结 简介 在前面一篇文章里我们对AI智能语音识别模块进行了介绍&#xff0c;并对离线语音模组下载固件的过程进行了一个简单描述&#xff0c;不知道大家还记不记得&…

日本it培训学费 想去日本做IT,需要具备哪些技术?

日本的IT行业历史比较悠久&#xff0c;业务以上层前端业务为主&#xff0c;如设计和构建软件。日本IT公司组织庞大&#xff0c;行业内部有着严格的分工和部署&#xff0c;工作会被细分化&#xff0c;分配给个人的工作量不会太大&#xff0c;难度也不会很高&#xff0c;所以日本…

Restful风格与Wesocket之间的关联

RESTful 风格和 WebSocket 本质上是两种不同的通信机制&#xff0c;它们在设计理念和用途上有明显的区别。 RESTful 是一种基于 HTTP 协议的架构风格&#xff0c;它使用标准的 HTTP 方法&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;来进行资源的操作&#xff0c;并倾…

1015. 摘花生

题目&#xff1a; 1015. 摘花生 - AcWing题库 思路&#xff1a;dp 代码&#xff1a; #include<iostream> #include<cstdio> #include<cmath> using namespace std; const int N 110; typedef long long ll; int T, r, c; int num[N][N]; ll dp[N][N];//dp…

直播界很火的无线领夹麦克风快充方案 Type-C接口 PD快充+无线麦克风可同时进行

当前市场上流行一款很火的直播神器&#xff0c;无线领夹麦克风&#xff08;MIC&#xff09;&#xff0c;应用于网红直播&#xff0c;网课教学&#xff0c;采访录音&#xff0c;视频录制&#xff0c;视频会议等等场景。 麦克风对我们来说并不陌生&#xff0c;而且品类有很多。随…

GEE——提取制定多波段影像的属性值(按照制定属性名称和属性值)输出格式为矢量格式

简介: 这里我们很多时候,需要提取制定影像,或者多波段影像制定区域的值,这里有一个问题是我们一般输出的结果仅仅是一个字典类型的对象,而我们不知道如何按照一个矢量输入,这里我们首先要做的就是进行多波段值在制定区域的提取,随后就是分别对其新的字典的键、值的设定…

docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)

GitLab介绍 GitLab是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务&#xff0c;可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。…

强大日志查看器,助力数据联动分析

前言 我们曾讨论过观测云查看器强大的查询筛选和搜索功能&#xff0c;能够帮助用户快速、精准地检索数据&#xff0c;定位故障问题&#xff08;参见《如何使用查看器筛选、搜索功能进行数据定位&#xff1f;》&#xff09;。除此之外&#xff0c;日志查看器不仅可以帮助我们收…

VMware打开centos黑屏解决方法汇总以及解决出现的bug(Centos7系统网络异常等)

VMware打开centos黑屏解决方法汇总 前言&#xff1a;一. VMware打开centos黑屏解决方法汇总一 .情况情况一&#xff1a;情况二情况三 二. 解决方法最简单的方法&#xff1a;一. 以管理员权限在命令行执行1. 管理员身份运行cmd2. 输入“netsh winsock reset”,回车3. 重启电脑即…

大数据毕业设计选题推荐-热门旅游景点数据分析-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

go微信开发sdk-简单使用_已设置图床

go微信开发sdk-简单使用 GitHub - silenceper/wechat: WeChat SDK for Go &#xff08;微信SDK&#xff1a;简单、易用&#xff09; 使用的sdk为上述的&#xff0c;这边给出快速的项目实例 git clone https://github.com/gowechat/example.git简单的项目结构 这边简单用dock…

Redis集群

目录 一, 集群及分片算法 1.1 什么是集群 1.2 数据分片算法 1. 哈希求余 2. 一致性哈希算 3. 哈希槽分区算法(Redis使用) 二, 集群的故障处理 2.1 故障判定 2.2 故障迁移 三, 集群扩容 四, 集群缩容 一, 集群及分片算法 1.1 什么是集群 我们在Redis哨兵中学习了,哨…

并发编程(线程基础)

线程和进程的区别并发与并行的区别线程创建方式runnable和callable的区别run()和start()的区别线程包括哪些状态&#xff0c;状态之间如何变化新建三个线程&#xff0c;如何按顺序执行notify()和notifyAll()的区别wait和sleep方法的区别如何停止一个正在运行的线程 一、线程和进…

linux远程桌面管理工具xrdp

一、概述 我们知道&#xff0c;我们日常通过vnc来远程管理linux图形界面&#xff0c;今天分享一工具Xrdp&#xff0c;它是一个开源工具&#xff0c;允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP之外&#xff0c;xrdp工具还接受来自其他RDP客户端的连接&#xf…