文章目录
- 实验要求
- 思路
- 完整代码
- 结果展示
实验要求
- 判断关系 R 是否为自反关系
- 实验类型:设计性
- 实验目的
- 通过算法设计并编程实现对给定集合上的关系是否为自反关系的判断,加深学生对关系性质的理解,掌握用矩阵来判断关系性质的方法。
- 实验内容
- 已知关系 R 由关系矩阵 M 给出,要求判断由 M 表示的这个关系是否为自反关系。
- 实验原理
- 从给定的关系矩阵来断判关系 R 是否为自反是很容易的。若 M(R 的关系矩阵)的主对角线元素均为 1,则 R 是自反关系;若 M(R 的关系矩阵)的主对角线元素均为 0,则 R 是反自反关系;若 M(R 的关系矩阵)的主对角线元素既有 1 又有 0,则 R 既不是自反关系也不是反自反关系。本算法可以作为判等价关系算法的子程序给出。
- 实验仪器设备或软件环境及工具
- 软件环境与编程语言不限。
- 实验要求
- 复习关系的性质,实验由一人一组完成。所编程序能够通过编译,并能够实现对给定集合上的关系自反性质的判定。
- 实验步骤及注意事项
- 输入关系矩阵 M(M 为 n 阶方阵)。
- 判断自反性,对于 i=1,2,….,n;若存在 mii=0,则 R 不是自反的;若存在 mii=1,则 R 是自反的;否则 R 既不是自反关系也不是反自反关系。
- 输出判断结果。
思路
- 关系R的存储结构:二维矩阵
- 关系R的矩阵输入Scanner类的nextInt()方法
- 关系R主对角线的遍历:双层循环
- 关系R主对角线数据的比较:使用HashSet参看《Java集合框架【二容器[LinkedList容器类、Set接口]》】【无序集合,无重复元素】存储主对角线元素值
- 关系R的判定:通过判断HashSet的长度和包含的数值即可
条件 | 结论 |
---|---|
HashSet的长度1,并且包含1 | 自反关系 |
HashSet的长度为1 ,并且包含0 | 反自反关系 |
HashSet的长度为2,并且包含0和1 | 既非自反,也非反自反 |
完整代码
import java.util.HashSet;
import java.util.Scanner;
/**
* @author 缘友一世
* date 2022/12/27-11:01
*/
public class demo02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int width=0;
System.out.print("请输入关系R矩阵的阶数:");
if(scanner.hasNextInt()) {
width=scanner.nextInt();
}
int[][] matrix=new int[width][width];
System.out.println("请输入"+width+"阶矩阵的值[以空格隔开]:");
for(int i=0;i<matrix.length;i++) {
for(int j=0;j<matrix[i].length;j++) {
if(scanner.hasNextInt()) {
matrix[i][j]= scanner.nextInt();
}
}
}
System.out.println(">>>>>>>>>>>");
System.out.println("您输入的矩阵为:");
for(int i=0;i<matrix.length;i++) {
for(int j=0;j<matrix[i].length;j++) {
System.out.print(matrix[i][j]+" ");
}
System.out.println();
}
//无序集合不包含重复元素 如果集合中元素存在,则重复添加失败
HashSet set = new HashSet();
for(int i=0;i<matrix.length;i++) {
set.add(matrix[i][i]);
}
//通过判断集合的长度和内容,从而确定关系的性质
if(set.size()==1 && set.contains(1)) {
System.out.println("R是自反关系!");
}else if(set.size()==1 && set.contains(0)) {
System.out.println("R是反自反关系!");
}else if(set.size()==2 && set.contains(1) && set.contains(0)) {
System.out.println("R既不是自反关系也不是反自反关系!");
}
}
}
结果展示