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

news2024/11/28 19:34:35

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

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

编程语言: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;
        //自反矩阵主对角线元素全为1
        for (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;
        //反自反矩阵主对角线元素全为0
        for (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]不同时为1
        for (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]也为1
        for (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.coloradmin.cn/o/1168559.html

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

相关文章

VM虚拟机逆向 --- [NCTF 2018]wcyvm 复现

文章目录 前言题目分析 前言 第四题了&#xff0c;搞定&#xff0c;算是独立完成比较多的一题&#xff0c;虽然在还原汇编的时候还是很多问题。 题目分析 代码很简单&#xff0c;就是指令很多。 opcode在unk_6021C0处&#xff0c;解密的数据在dword_6020A0处 opcode [0x08, …

谈一谈SQLite、MySQL、PostgreSQL三大数据库

每一份付出&#xff0c;必将有一份收货&#xff0c;就像这个小小的果实&#xff0c;时间到了&#xff0c;也就会开花结果… 三大数据库概述 SQLite、MySQL 和 PostgreSQL 都是流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;但它们在功能、适用场景和性…

【UE】从UI拖拽生成物体 —— 更改位置与定点销毁

本篇在上一篇博客&#xff08;【UE】从UI中拖拽生成物体-CSDN博客&#xff09;基础上继续增加更改生成的Actor的位置与定点销毁Actor的功能。 目录 效果 步骤 一、修改生成好的Actor位置 解决问题一&#xff1a;从UI拖出多个actor后&#xff0c;只能对第一个拖出的actor的…

传智杯-21算法赛初赛B组题目详细解法解析-AB题(C/C++、Python、Java)

🚀 欢迎来到 ACM 算法题库专栏 🚀 在ACM算法题库专栏,热情推崇算法之美,精心整理了各类比赛题目的详细解法,包括但不限于ICPC、CCPC、蓝桥杯、LeetCode周赛、传智杯等等。无论您是刚刚踏入算法领域,还是经验丰富的竞赛选手,这里都是提升技能和知识的理想之地。 ✨ 经典…

UG\NX二次开发 先设置默认颜色再创建对象

文章作者:里海 来源网站:里海NX二次开发3000例专栏 感谢粉丝订阅 感谢 qq_42461973 订阅本专栏,非常感谢。 简介 有粉丝问,可不可以先设置默认颜色再创建对象?这个是可以的,下面是例子: 效果 代码 #include "me.hpp" using namespace std;

java/springboot服务第三方接口安全签名(Signature)实现方案

前言 有的时候&#xff0c;我们需要把我们系统里的接口开放给第三方应用或企业使用&#xff0c;那第三方的系统并不在我们自己的认证授权用户体系内&#xff0c;此时&#xff0c;要如何保证我们接口的数据安全和身份识别呢&#xff1f; 在为第三方系统提供接口的时候&#xf…

筑基新一代数据底座,中国科大让智慧科研更有数

著名科学哲学家库恩在《科学革命的结构》中认为&#xff0c;范式是科研的一种理论体系&#xff0c;范式的突破会带来一系列科学革命。 如今在科研领域&#xff0c; 人工智能不断打破科研边界&#xff0c;AI for Science被视为下一个科研新范式&#xff0c;不仅为科学研究带来了…

Cesium:为地图添加指北针、缩放按钮和比例尺

作者&#xff1a;CSDN _乐多_ 网上找的很多代码用不了。本文记录了Cesium中为地图添加指北针、缩放按钮和比例尺的可用代码。 文章目录 一、代码 一、代码 const viewer new Cesium.Viewer(cesiumContainer, {// ...navigationHelpButton: false,sceneModePicker: false,sc…

校验验证码是否过期(定时刷新验证码)

需求&#xff1a; 我们在登录的时候会遇到通过接口请求验证码的操作&#xff0c;这里的验证码会有过期的时间&#xff0c;当我们验证码过期了&#xff0c;我们要进行重新刷新验证码。 我们这里根据后端返回的当前时间和过期时间判断&#xff0c;过期的时间超过了当前时间的时候…

Java面向对象 下(六)

Java面向对象 ( 下) 观看b站尚硅谷视频做的笔记 文章目录 Java面向对象 ( 下)1、 关键字&#xff1a;static1.1、static 的使用1.1.1、static 修饰属性1.1.2、 static 修饰方法1.1.3、 static 修饰代码块1.1.4、 static 修饰内部类1.1.5、类变量 vs 实例变量内存解析 1.2、 自…

关于msvcp120.dll丢失的解决方法详解,快速解决dll丢失问题

在计算机使用过程中&#xff0c;经常会遇到“msvcp120.dll丢失”的错误提示。这个错误提示通常出现在运行某些程序或游戏时&#xff0c;造成相关应用程序可能无法正常启动或运行。那么&#xff0c;究竟是什么原因导致了msvcp120.dll文件的丢失呢&#xff1f;本文将详细解析msvc…

【QT】文件读写

新建项目 加入控件 整体做一个布局 功能&#xff1a;选择文件路径&#xff0c;打开文件&#xff08;两种文件格式&#xff1a;utf-8、GBK&#xff09; #include "widget.h" #include "ui_widget.h" #include <QPushButton> #include <QFileDial…

云产品ECS免费试用获取奖励步骤

文章目录 1、获取活动链接2、报名参加3、试用产品领取产品试用权限配置安全组访问应用提交作品 4、提交任务获取奖励 1、获取活动链接 活动时间2023.11.1&#xff5e;2023.11.30 名额有限&#xff0c;先到先得 进群群主获取活动链接 2、报名参加 直接点击链接进入小程序进行…

【带头学C++】----- 三、指针章* ---- 3.1指针变量的定义

指针在C语言是核心&#xff0c;在C中更是核心。所以本章节将详细讲解指针的使用方法以及指针的一些特殊用法&#xff0c;和引用的区别&#xff0c;以及指针涉及到一些算法基础。通过案例引导&#xff0c;使得能更清楚命明白。在C中的指针是一种数据类型&#xff0c;其使用方法和…

【Java 进阶篇】Java ServletContext功能详解:域对象的使用

Java ServletContext是Java Web应用程序中的一个关键组件&#xff0c;它提供了一种在不同Servlet之间共享数据的机制。这种共享通过域对象来实现&#xff0c;包括ServletContext域、Session域和Request域。在本篇博客中&#xff0c;我们将重点关注ServletContext域&#xff0c;…

批处理写定时关机和开机自动运行老化视频

扬创科技出品的X86平板电脑&#xff08;7寸-21.5寸 6代7代10代酷睿系列 、J4125 、J1900&#xff0c;承接客户各种尺寸定制&#xff09;视频方式老化测试。 需求&#xff1a;1、开机启动自动运行老化视频。 2、下午5点25正式关机。 1、开机启动自动运行老化视频。 start &quo…

ERP系统物料管理

一、ERP系统物料管理的概述 ERP系统物料管理是企业资源计划系统中的一个关键模块&#xff0c;用于管理企业的物料信息、库存和供应链活动。通过集成各个部门的信息和流程&#xff0c;物料管理模块提供了全面的物料控制和管理能力&#xff0c;包括物料采购、入库、出库、库存调…

js 根据word文档模板导出内容

一、创建word导出模板 1、本地创建一个test.docx 2、将最终需要的文档内容及样式编辑完成(图1) 3、将所需动态值的位置,替换为变量参数(图2) 注: 动态值书写 图1 图2 模板值的书写要求 二、项目中使用 1、安装依赖 npm install docxtemplater-image-module-free --save n…

一个查看医保通讯日志的工具

一个查看医保通讯日志的工具&#xff0c;启动是可以选择不同地区。当时是负责实施的同事说&#xff0c;医保出问题时&#xff0c;核对日志文件比方便&#xff0c;所以俺写了这个工具。用于查看东软的通讯日志。这个就是个绿色的小工具。因为不同地区的通讯协议有差别&#xff0…

“第五十九天”

这是昨天那道题&#xff0c;这个后面自己的处理思路还是差了点&#xff0c;这道题关键感觉就是对进位的处理的&#xff0c;由于进位的存在&#xff0c;所以处理数据的时候只能从最低位开始&#xff0c;我一开始是从高位处理的&#xff0c;而且后面越来越迷&#xff0c;这个点一…