离散数学实践(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.hqwc.cn/news/160234.html

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

相关文章

selenium自动化测试入门 —— 下拉框元素定位

选择获取反选下拉框元素首先要实例化select元素 from selenium.webdriver.support.ui import Select # 引入包 select_elementSelect(element) # 实例化select 三种常用选择方法 select_element. select_by_index(index) 根据index定位&#xff0c;从0开始 select_element. …

数码3C零售门店运营,智慧显示有何优势?以清远电信为例。

随着时代和科技的发展&#xff0c;线下实体零售门店运营方式也逐步进化&#xff0c;面对有大体量线门店&#xff0c;需要花费更多心思和资源管理的品牌&#xff0c;在全球经济缓慢增长的当下&#xff0c;开始走向去冗余、提效率的阶段&#xff0c;俗称降本增效。 在此阶段&…

Daily neaty和希亦内衣洗衣机哪款好,高性价比内衣洗衣机测评

现在市面最火的小家电莫过于是内衣洗衣机&#xff0c;那么它是否真的好用还是只是智商税呢&#xff1f;但关于内衣洗衣机&#xff0c;很多小伙伴都会选入手来释放自己的双手的&#xff0c;现在内衣洗衣机品牌众多&#xff0c;而且Daily neaty和希亦CEYEE-ACE这两个大品牌会被许…

有效的括号

给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有…

架构风格-架构师(六十六)

管道-过滤器和仓库 数据处理方式&#xff1a; 管道过滤器是 数据驱动机制&#xff0c;处理流程事前确定&#xff0c;交互差。 仓库是通过仓库中间件交互&#xff0c;交互性强&#xff0c;灵活组装 系统可扩展性&#xff1a; 管道过滤器是数和处理在一起&#xff0c;需要新增…

任务1 部署ChatGLM3-6B大模型并进行对话测试

部署ChatGLM3-6B大模型并进行对话测试 0 介绍&#xff1a;1 趋动云项目创建与环境配置1.1 创建项目&#xff1a;1.2 配置环境1.2.1 进入终端1.2.2 设置镜像源1.2.3 克隆项目,并安装依赖 2 修改代码&#xff0c;改路径以及启动代码3 运行代码3.1 运行gradio界面&#xff1a;3.2 …

USB PD v1.0快速充电通信原理

1 原理 本篇文章讲的快速充电是指USB论坛所发布的USB Power Delivery快速充电规范&#xff08;通过VBUS直流电平上耦合FSK信号来请求充电器调整输出电压和电流的过程&#xff09;&#xff0c;不同于本人发布的另一篇文章所讲的高通Quick Charger 2.0规范&#xff0c;因为高通QC…

若依分离版——配置多数据源(mysql和oracle),实现一个方法操作多个数据源

目录 一、若依平台配置 二、编写oracle数据库访问的各类文件 三. 一个方法操作多个数据源 一、若依平台配置 1、在ruoyi-admin的pom.xml添加依赖 <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version…

[创业之路-85]:创业公司如何办理云服务器(PaaS)

目录 一、云服务 1.1 云服务器类型 1.2 云服务案例 二、搭建云服务器的基本步骤 二、云服务的架构&#xff08;架构&#xff09; 2.1 层次架构 2.2 云平台统一管理功能 2.3 管理工具 一、云服务 1.1 云服务器类型 云服务&#xff08;Cloud Services&#xff09;是一种…

12.JavaScript(WebAPI) - JS api文献精解

文章目录 1.WebAPI 背景知识1.1什么是 WebAPI1.2什么是 API1.3API 参考文档 2.DOM 基本概念2.1什么是 DOM2.2DOM 树 3.获取元素3.1querySelector3.2querySelectorAll 4.事件初识4.1基本概念4.2事件三要素4.3简单示例 5.操作元素5.1获取/修改元素内容5.1.1innerText5.1.2innerHT…

无需使用jadx-gui和mac电脑获取app备案公钥的方法

由于2023年&#xff0c;国家要求上架的app必须备案&#xff0c;因此app备案成为了很多公司迫切的需求。 备案的时候&#xff0c;需要填写app公钥&#xff0c;MD5值等参数&#xff0c;这些参数对于不熟悉加密技术的人来说&#xff0c;简直是无从下手&#xff0c;因为目前的开发…

Compose-Multiplatform在Android和iOS上的实践

本文字数&#xff1a;4680字 预计阅读时间&#xff1a;30分钟 01 简介 之前我们探讨过KMM&#xff0c;即Kotlin Multiplatform Mobile&#xff0c;是Kotlin发布的移动端跨平台框架。当时的结论是KMM提倡将共有的逻辑部分抽出&#xff0c;由KMM封装成Android(Kotlin/JVM)的aar和…