Java编程练习题:Demo96 - Demo105(多维数组)

2023-11-19

目录

Demo96. (代数方面:两个矩阵相乘)编写两个矩阵相乘的方法。

Demo97. (距离最近的两个点)程序清单8-3给出找到二维空间中距离最近的两个点的程序。 修改该程序,让程序能够找出在三维空间上距离最近的两个点。

Demo98. (最大的行和列)编写一个程序,在一个4×4的矩阵中随机填人0和1, 打印该矩阵,找到第一个具有最多1的行和列。

Demo99. (游戏:九个正面和背面) 编写一个程序,提示用户输入一个在0到511之间的数字,然后显示用字符H和T表示的对应的矩阵。

Demo100. (模式识别:连续的四个相等的数)编写下面的方法,测试一个二维数组是否有四个连续的数字具有相同的值, 这四个数可以是水平方向的、垂直方向的或者对角线方向的。

Demo101. (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏中, 玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的网格中,如下所示。 这个游戏的目的是在对手实现一行、一列或者一条对角线上有四个相同颜色的棋子之前, 你能先做到。

Demo102. (马尔科夫矩阵)一个n×n的矩阵被称为一个正马尔科夫矩阵,当且仅当每个元素都是正数, 并且每列的元素的和为1。编写下面的方法来检测一个矩阵是否是一个马尔科夫矩阵。

Demo103. (几何:三角形面积)编写一个方法,使用下面的方法头,返回一个三角形的面积

Demo104. (几何:多边形的子面积)一个具有四个顶点的凸多边形被分为四个三角形,编写一个程序,提示用户输入四个顶点的坐标,然后以升序显示四个三角形的面积。

Demo105. (拉丁正方形)拉丁正方形是一个n×n的数组,由n个不同的拉丁字母填充,每个拉丁字母恰好只在每行和每列中出现一次。编写一个程序,提示用户输人数字n以及字符数组,如示例输出所示,检测该输出数组是否是一个拉丁正方形。字符是从A开始的前面n个字符。


Demo96. (代数方面:两个矩阵相乘)编写两个矩阵相乘的方法。

方法头如下: public static double[][] multiplyMatrix(double[][] a,double[][] b) 为了使矩阵a能够和矩阵b相乘,矩阵a的列数必须与矩阵b的行数相同,并且两个矩阵的元素要具有相同或兼容的数据类型。 假设矩阵c是相乘的结果,而a的列数是n,那么每个元素cij就是ai1 x b1j + ai2 x b2j +…+ ain x bnj。 例如,对于两个3×3的矩阵a和 b,c就有: cij = ai1 x b1j + ai2 x b2j + ai3 x b3j。 编写一个测试程序,提示用户输人两个3×3的矩阵,然后显示它们的乘积。下面是一个运行示例:

package Exer2;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Scanner;

public class Demo96 {
    /*
    (代数方面:两个矩阵相乘)编写两个矩阵相乘的方法。方法头如下:
    public static double[][] multiplyMatrix(double[][] a,double[][] b)
    为了使矩阵a能够和矩阵b相乘,矩阵a的列数必须与矩阵b的行数相同,并且两个矩阵的元素要具有相同或兼容的数据类型。
    假设矩阵c是相乘的结果,而a的列数是n,那么每个元素cij就是ai1 x b1j + ai2 x b2j +…+ aim x bnj。
    例如,对于两个3×3的矩阵a和 b,c就有: cij = ai1 x b1j + ai2 x b2j + ai3 x b3j。
    编写一个测试程序,提示用户输人两个3×3的矩阵,然后显示它们的乘积。下面是一个运行示例:
    1 2 3 4 5 6 7 8 9
    0 2 4 1 4.5 2.2 1.1 4.3 5.2
     */
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("Enter matrix1:");
        double[][] a = new double[3][3];
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                a[i][j] = scan.nextDouble();
            }
        }
        double[][] b = new double[3][3];
        System.out.print("Enter matrix2:");
        for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[i].length; j++) {
                b[i][j] = scan.nextDouble();
            }
        }

        System.out.println("The multiplication of the matrices is:");
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[0].length; j++) {
                System.out.print(new DecimalFormat("#.##").format(a[i][j]) + "\t");
            }
            System.out.print(i == 1 ? "\t+\t" : "\t\t");
            for (int j = 0; j < a[0].length; j++) {
                System.out.print(new DecimalFormat("#.##").format(b[i][j]) + "\t");
            }
            System.out.print(i == 1 ? "\t=\t" : "\t\t");
            for (int j = 0; j < a[0].length; j++) {
                // new DecimalFormat("#.##").format(double d) 让小数点后为0的显示为整数,不为零的显示为double
                System.out.print(new DecimalFormat("#.##").format(multiplyMatrix(a, b)[i][j]) + "\t");
            }
            System.out.println();
        }
        scan.close();
    }

    public static double[][] multiplyMatrix(double[][] a, double[][] b){
        double[][] c = new double[3][3];
        for (int i = 0; i < c.length; i++) {
            for (int j = 0; j < c[i].length; j++) {
                c[i][j] = BigDecimal.valueOf(a[i][0]).multiply(BigDecimal.valueOf(b[0][j]))
                        .add(BigDecimal.valueOf(a[i][1]).multiply(BigDecimal.valueOf(b[1][j]))
                        .add(BigDecimal.valueOf(a[i][2]).multiply(BigDecimal.valueOf(b[2][j]))))
                        .doubleValue();
            }
        }
        return c;
    }
}

结果:

Demo97. (距离最近的两个点)程序清单8-3给出找到二维空间中距离最近的两个点的程序。 修改该程序,让程序能够找出在三维空间上距离最近的两个点。

使用一个二维数组表示这些点。使用下面的点来测试这个程序: double[][] points = {{-1,0,3},{-1,-1,-1},{4,1,1},{2,0.5,9},{3.5,2,-1},{3,1.5,3},{-1.5,4,2},{5.5,4,-0.5}}; 计算两个点(x1,y1,z1)和(x2,y2,z2)之间距离的公式是√((x2-x1)²+(y2-y1)²+(z2-z1)²)。

package Exer2;

public class Demo97 {
    /*
    (距离最近的两个点)程序清单8-3给出找到二维空间中距离最近的两个点的程序。
    修改该程序,让程序能够找出在三维空间上距离最近的两个点。使用一个二维数组表示这些点。使用下面的点来测试这个程序:
    double[][] points = {{-1,0,3},{-1,-1,-1},{4,1,1},{2,0.5,9},{3.5,2,-1},{3,1.5,3},{-1.5,4,2},{5.5,4,-0.5}};
    计算两个点(x1,y1,z1)和(x2,y2,z2)之间距离的公式是√((x2-x1)²+(y2-y1)²+(z2-z1)²)。
     */
    public static void main(String[] args) {
        double[][] points = {{-1, 0, 3}, {-1, -1, -1}, {4, 1, 1}, {2, 0.5, 9},
                {3.5, 2, -1}, {3, 1.5, 3}, {-1.5, 4, 2}, {5.5, 4, -0.5}};
        // System.out.println(Arrays.deepToString(minDistance(points)));
        System.out.printf("距离最近的两个点为:(%s, %s, %s), (%s, %s, %s)%n",
                minDistance(points)[0][0], minDistance(points)[0][1], minDistance(points)[0][2],
                minDistance(points)[1][0], minDistance(points)[1][1], minDistance(points)[1][2]);
    }

    private static double[][] minDistance(double[][] points) {
        double[][] twoPoints = new double[2][3];
        double minD = Double.MAX_VALUE;
        for (int i = 0; i < points.length - 1; i++) {
            for (int j = i + 1; j < points.length; j++) {
                double d = Math.sqrt(Math.pow(points[j][0] - points[i][0], 2)
                        + Math.pow(points[j][1] - points[i][1], 2) + Math.pow(points[j][1] - points[i][1], 2));
                if (d < minD) {
                    minD = d;
                    twoPoints[0] = points[i];
                    twoPoints[1] = points[j];
                }
            }
        }
        return twoPoints;
    }
}

结果:

Demo98. (最大的行和列)编写一个程序,在一个4×4的矩阵中随机填人0和1, 打印该矩阵,找到第一个具有最多1的行和列。

下面是一个程序的运行示例:

package Exer2;

import java.util.Random;

public class Demo98 {
    /*
    (最大的行和列)编写一个程序,在一个4×4的矩阵中随机填人0和1,
    打印该矩阵,找到第一个具有最多1的行和列。下面是一个程序的运行示例:
    0011
    0011
    1101
    1010
    The largest row index:2
    The largest column index:2
     */
    public static void main(String[] args) {
        int[][] nums = new int[4][4];
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums[i].length; j++) {
                nums[i][j] = new Random().nextInt(2);
            }
        }
        for (int[] arr : nums) {
            for (int num : arr) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
        int rowIndex = 0, columnIndex = 0;

        int largestRow = 0;
        int largestColumn = 0;
        // int[][] largest = new int[2][2];

        for (int i = 0; i < nums.length; i++) {
            int rowSum = 0, ColumnSum = 0;
            for (int  j = 0; j < nums[i].length; j++) {
                rowSum += nums[i][j];
                ColumnSum += nums[j][i];
                if (ColumnSum > largestColumn) {
                    columnIndex = j;
                    largestColumn = ColumnSum;
                }
            }
            if (rowSum > largestRow) {
                rowIndex = i;
                largestRow = rowSum;
            }
        }
        System.out.println("The largest row index:" + rowIndex);
        System.out.println("The largest column index:" + columnIndex);
    }
}

结果:

Demo99. (游戏:九个正面和背面) 编写一个程序,提示用户输入一个在0到511之间的数字,然后显示用字符H和T表示的对应的矩阵。

一个3×3的矩阵中放置了9个硬币,这些硬币有些面向上,有些面向下。 可以使用3×3的矩阵中的0(正面)或1(反面)表示硬币的状态。下面是一些例子:

每个状态都可以使用一个二进制数表示。例如,前面的矩阵对应到数字: 000010000 101001100 110100001 101110100 100111110 总共会有512种可能性。所以,可以使用十进制数0,1,2,3,...,511来表示这个矩阵的所有状态。下面是一个运行示例:

package Exer2;

import java.util.Scanner;

public class Demo99 {
    /*
    (游戏:九个正面和背面)一个3×3的矩阵中放置了9个硬币,这些硬币有些面向上,有些面向下。
    可以使用3×3的矩阵中的0(正面)或1(反面)表示硬币的状态。下面是一些例子:
    0 0 0   1 0 1   1 1 0   1 0 1   1 0 0
    0 1 0   0 0 1   1 0 0   1 1 0   1 1 1
    0 0 0   1 0 0   0 0 1   1 0 0   1 1 0
    每个状态都可以使用一个二进制数表示。例如,前面的矩阵对应到数字:
    000010000 101001100 110100001 101110100 100111110
    总共会有512种可能性。所以,可以使用十进制数0,1,2,3,...,511来表示这个矩阵的所有状态。
    编写一个程序,提示用户输入一个在0到511之间的数字,然后显示用字符H和T表示的对应的矩阵。下面是一个运行示例:
     */
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("Enter a number between 0 and 511:");
        int number = scan.nextInt();
        int[][] binaryArr = toBinaryArr(number);
        // System.out.println(Arrays.deepToString(binaryArr));
        for (int[] nums : binaryArr) {
            for (int n : nums) {
                if (n == 0) {
                    System.out.print("H ");
                } else {
                    System.out.print("T ");
                }
            }
            System.out.println();
        }
        scan.close();
    }

    private static int[][] toBinaryArr(int number) {
        int[][] arr = new int[3][3];
        for (int i = arr.length - 1; i >= 0; i--) {
            for (int j = arr[i].length - 1; j >= 0; j--) {
                if (number > 0) {
                    arr[i][j] = number % 2;
                    number /= 2;
                }
            }
        }
        return arr;
    }
}

 结果:

Demo100. (模式识别:连续的四个相等的数)编写下面的方法,测试一个二维数组是否有四个连续的数字具有相同的值, 这四个数可以是水平方向的、垂直方向的或者对角线方向的。

public static boolean isConsecutiveFour(int[][]values) 编写一个测试程序,提示用户输人一个二维数组的行数、列数以及数组中的值。 如果这个数组有四个连续的数字具有相同的值,就显示true;否则,显示false。下面是结果为true的一些例子:

这里我只做出来水平方向:

package Exer2;

import java.util.Arrays;
import java.util.Scanner;

public class Demo100 {
    /*
    (模式识别:连续的四个相等的数)编写下面的方法,测试一个二维数组是否有四个连续的数字具有相同的值,
    这四个数可以是水平方向的、垂直方向的或者对角线方向的。
    public static boolean isConsecutiveFour(int[][]values)
    编写一个测试程序,提示用户输人一个二维数组的行数、列数以及数组中的值。
    如果这个数组有四个连续的数字具有相同的值,就显示true;否则,显示false。下面是结果为true的一些例子:
     */
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个二维数组的行数、列数以及数组中的值(前两个数分别表示行、列):");
        int row = scan.nextInt();
        int column = scan.nextInt();
        int[][] values = new int[row][column];
        for (int i = 0; i < values.length; i++) {
            for (int j = 0; j < values[i].length; j++) {
                values[i][j] = scan.nextInt();
            }
        }
        // 6 7 0 1 0 3 1 6 1 0 1 6 8 6 0 1 5 6 2 1 8 2 9 6 5 6 1 1 9 1 1 3 6 1 4 0 7 3 3 3 3 4 0 7
        System.out.println(Arrays.deepToString(values));
        System.out.println(isConsecutiveFour(values));
    }
    public static boolean isConsecutiveFour(int[][] values) {
        if (values.length < 4 || values[0].length < 4) {
            return false;
        }
        int rowCount = 1, columnCount = 1, count = 1, antiCount = 1;
        for (int i = 1; i < values.length; i++) {
            for (int j = 1; j < values[i].length; j++) {
                // 判断行
                if (values[i - 1][j - 1] == values[i - 1][j] || values[i][j - 1] == values[i][j]){
                    rowCount++;
                } else {
                    rowCount = 1;
                }
                // 判断列
                if (values[i - 1][j - 1] == values[i][j - 1] || values[i - 1][j] == values[i][j]){
                    columnCount++;
                } else {
                    columnCount = 0;
                }
                // 副对角线
                if (i >= 3) {
                    // TODO
                }
                // 主对角线
                if (j <= 3) {
                    // TODO
                }
                if (rowCount >= 4 || columnCount >= 4) {
                    return true;
                }
            }
        }
        return false;
    }
}

Demo101. (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏中, 玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的网格中,如下所示。 这个游戏的目的是在对手实现一行、一列或者一条对角线上有四个相同颜色的棋子之前, 你能先做到。

程序提示两个玩家交替地下红子Red或黄子Yellow。 当放下一子时,程序在控制台重新显示这个棋盘,然后确定游戏的状态(赢、平局还是继续)。

下面是一个运行示例:

package Exer2;

import java.util.Scanner;

public class Demo101 {
    /*
    (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏中,
    玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的网格中,如下所示。
    这个游戏的目的是在对手实现一行、一列或者一条对角线上有四个相同颜色的棋子之前,
    你能先做到。程序提示两个玩家交替地下红子Red或黄子Yellow。
    当放下一子时,程序在控制台重新显示这个棋盘,然后确定游戏的状态(赢、平局还是继续)。下面是一个运行示例:
     */
    static Scanner in = new Scanner(System.in);

    public static void main(String[] args) {

        char[][] chess = new char[6][15];
        for (int i = 0; i < chess.length; i++)    //初始化棋盘
        {
            for (int j = 0; j < chess[i].length; j++) {
                if (j % 2 == 0)
                    chess[i][j] = '|';
                else
                    chess[i][j] = ' ';
            }
        }

        beginGame(chess);

        in.close();
    }


    //开始比赛
    public static void beginGame(char[][] chess) {
        char disk;
        for (int i = 0; i < 42; i++) {
            if (i % 2 == 0)
                disk = 'R';
            else
                disk = 'Y';
            printChessBoard(chess);
            System.out.println("——————————————");
            if (dropDisk(chess, disk) == 0) {
                i--;
                continue;
            }
            if (judge(chess) == 0) {
                System.out.println("The red player won");
                return;
            } else if (judge(chess) == 1) {
                System.out.println("The yellow player won");
                return;
            }
        }
        System.out.println("No winner");
    }


    //落子
    public static int dropDisk(char[][] chess, char disk) {
        if (disk == 'R')
            System.out.print("Drop a red disk at column(0-6):");
        else
            System.out.print("Drop a yellow disk at column(0-6):");
        int key = in.nextInt();
        if (key < 0 || key > 6) {
            System.out.println("Enter error!");
            return 0;
        }
        key = key * 2 + 1;
        for (int row = chess.length - 1; row >= 0; row--) {
            if (chess[row][key] == ' ') {
                chess[row][key] = disk;
                return 1;
            }
        }
        System.out.println("This colum is no more position!");
        return 0;
    }


    //打印棋盘
    public static void printChessBoard(char[][] chess) {
        for (int i = 0; i < chess.length; i++) {
            for (int j = 0; j < chess[i].length; j++)
                System.out.print(chess[i][j]);
            System.out.println();
        }
    }


    //判断输赢,返回0'R'赢,返回1'Y'赢,返回2未分出胜负
    public static int judge(char[][] chess) {
        if (judgeRow(chess) != 2)
            return judgeRow(chess);
        if (judgeCol(chess) != 2)
            return judgeCol(chess);
        if (judgeMainDiagonal(chess) != 2)
            return judgeMainDiagonal(chess);
        if (judgeSubDiagonal(chess) != 2)
            return judgeSubDiagonal(chess);
        return 2;
    }


    //判断行是否有四个相等的
    public static int judgeRow(char[][] chess) {
        for (int i = 0; i < chess.length; i++)
            for (int j = 1; j < chess[i].length - 6; j += 2) {
                if (chess[i][j] == chess[i][j + 2] && chess[i][j] == chess[i][j + 4] && chess[i][j] == chess[i][j + 6] && chess[i][j] != ' ')
                    if (chess[i][j] == 'R')
                        return 0;
                    else
                        return 1;
            }
        return 2;
    }


    //判断列是否有四个相等的
    public static int judgeCol(char[][] chess) {
        for (int i = 0; i < chess.length - 3; i++)
            for (int j = 1; j < chess[i].length; j += 2) {
                if (chess[i][j] == chess[i + 1][j] && chess[i][j] == chess[i + 2][j] && chess[i][j] == chess[i + 3][j] && chess[i][j] != ' ')
                    if (chess[i][j] == 'R')
                        return 0;
                    else
                        return 1;
            }
        return 2;
    }


    //判断主对角线是否有四个相等的
    public static int judgeMainDiagonal(char[][] chess) {
        for (int i = 0; i < chess.length - 3; i++)//主对角线
            for (int j = 1; j < chess[i].length - 6; j += 2) {
                if (chess[i][j] == chess[i + 1][j + 2] && chess[i][j] == chess[i + 2][j + 4] && chess[i][j] == chess[i + 3][j + 6] && chess[i][j] != ' ')
                    if (chess[i][j] == 'R')
                        return 0;
                    else
                        return 1;
            }
        return 2;
    }


    //判断副对角线是否有四个相等的
    public static int judgeSubDiagonal(char[][] chess) {
        for (int i = 3; i < chess.length; i++)//副对角线
            for (int j = 1; j < chess[i].length - 6; j += 2) {
                if (chess[i][j] == chess[i - 1][j + 2] && chess[i][j] == chess[i - 2][j + 4] && chess[i][j] == chess[i - 3][j + 6] && chess[i][j] != ' ')
                    if (chess[i][j] == 'R')
                        return 0;
                    else
                        return 1;
            }
        return 2;
    }
}

结果:

Demo102. (马尔科夫矩阵)一个n×n的矩阵被称为一个正马尔科夫矩阵,当且仅当每个元素都是正数, 并且每列的元素的和为1。编写下面的方法来检测一个矩阵是否是一个马尔科夫矩阵。

public static boolean isMarkovMatrix(double[][] m) 编写一个测试程序,提示用户输人一个3×3的double值的矩阵,测试它是否是一个马尔科夫矩阵。下面是一个运行示例:

package Exer2;

import java.util.Arrays;
import java.util.Scanner;

public class Demo102 {
    /*
    (马尔科夫矩阵)一个n×n的矩阵被称为一个正马尔科夫矩阵,当且仅当每个元素都是正数,
    并且每列的元素的和为1。编写下面的方法来检测一个矩阵是否是一个马尔科夫矩阵。
    public static boolean isMarkovMatrix(double[][] m)
    编写一个测试程序,提示用户输人一个3×3的double值的矩阵,测试它是否是一个马尔科夫矩阵。下面是一个运行示例:
     */
    /*
    0.15 0.875 0.375
    0.55 0.005 0.225
    0.30 0.12 0.4
     */
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        double[][] m = new double[3][3];
        System.out.println("Enter a 3-by-3 matrix row by row:");
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[i].length; j++) {
                m[i][j] = scan.nextDouble();
            }
        }
        System.out.println(Arrays.deepToString(m));
        if (isMarkovMatrix(m)) {
            System.out.println("It is a Markov matrix");
        } else {
            System.out.println("It is not a Markov matrix");
        }
    }

    public static boolean isMarkovMatrix(double[][] m) {
        double sum = 0;
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[i].length; j++) {
                sum += m[j][i];
                if (m[i][j] <= 0) {
                    return false;
                }
            }
            if (sum != 1) {
                return false;
            } else {
                sum = 0;
            }
        }
        return true;
    }
}

结果:

Demo103. (几何:三角形面积)编写一个方法,使用下面的方法头,返回一个三角形的面积

public static double getTriangleArea(double[][] points)

点保存在一个3×2的二维矩阵points中,其中 ( points[0][0],points[0][1])代表(x1, y1)。三角形面积的计算可以使用编程练习题2.19中的公式。如果三个点在一条直线上,方法返回0。编写一个程序,提示用户输入三角形的三个点,然后显示三角形的面积。下面是一个运行示例。

package Exer2;

import java.util.Scanner;

public class Demo103 {
    /*
    (几何:三角形面积)编写一个方法,使用下面的方法头,返回一个三角形的面积
    public static double getTriangleArea(double[][] points)
    点保存在一个3×2的二维矩阵points中,其中 ( points[0][0],points[0][1])代表(x1, y1)。
    三角形面积的计算可以使用编程练习题2.19中的公式。如果三个点在一条直线上,方法返回0。
    编写一个程序,提示用户输入三角形的三个点,然后显示三角形的面积。下面是一个运行示例。
    计算三角形面积的公式是:
        s = (边1 + 边2 + 边3 ) / 2
        面积 = √(s(s - 边1)(s - 边2)(s - 边3))

    2.5 2 5 -1.0 4.0 2.0
     */
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter x1, y1, x2, y2, x3, y3:");
        double[][] points = new double[3][2];
        for (int i = 0; i < points.length; i++) {
            for (int j = 0; j < points[i].length; j++) {
                points[i][j] = scan.nextDouble();
            }
        }
        scan.close();
        if (getTriangleArea(points) == 0) {
            System.out.println("The three points are on the same Line");
        } else {
            System.out.printf("The ares of the triangle is %.2f", getTriangleArea(points));
        }
    }

    public static double getTriangleArea(double[][] points) {
        double area = 0;
        double d1 = Math.pow(Math.pow(points[1][0] - points[0][0], 2) + Math.pow(points[1][1] - points[0][1], 2), 0.5);
        double d2 = Math.pow(Math.pow(points[2][0] - points[1][0], 2) + Math.pow(points[2][1] - points[1][1], 2), 0.5);
        double d3 = Math.pow(Math.pow(points[2][0] - points[0][0], 2) + Math.pow(points[2][1] - points[0][1], 2), 0.5);
        // double d1 = Math.pow(((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)), 0.5);
        // double d2 = Math.pow(((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)), 0.5);
        // double d3 = Math.pow(((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3)), 0.5);

        if (d1 <= d2 + d3 || d1 >= Math.abs(d2 - d3)) {
            double s = (d1 + d2 + d3) / 2;
            area = Math.pow(s * (s - d1) * (s - d2) * (s - d3), 0.5);
        } else {
            return 0;
        }
        return area;
    }
}

结果:注意精度问题,double运算时,失之毫厘,缪之千里

Demo104. (几何:多边形的子面积)一个具有四个顶点的凸多边形被分为四个三角形,编写一个程序,提示用户输入四个顶点的坐标,然后以升序显示四个三角形的面积。

下面是一个运行示例。

package Exer2;

import java.util.Arrays;
import java.util.Scanner;

public class Demo104 {
    public static void main(String[] args) {
        /*
        Enter x1, y1, x2, y2, x3, y3, x4, y4:
        -2.5 2 4 4 3 -2 -2 -3.5
        The areas are 6.17 7.96 8.08 10.42
         */
        //1. 获取四个点的坐标,使用数组读入
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter x1, y1, x2, y2, x3, y3, x4, y4:");
        double[][] points = new double[4][2];
        for (int i = 0; i < points.length; i++) {
            for (int j = 0; j < points[i].length; j++) {
                points[i][j] = scan.nextDouble();
            }
        }
        scan.close();

        //2. 求v1v3和v2v4线的交点坐标
        double[] crossPoint = intersection(points);

        //3. 自定义方法求三角形面积(传入数组、下标、交点坐标数组),使用数组接收
        double[] areas = new double[4];
        for (int i = 0 ; i < 4 ; i++){
            areas[i] = getTriangleArea(points, i, crossPoint);
        }
        Arrays.sort(areas);
        System.out.print("The areas are ");
        for (double area : areas) {
            System.out.printf("%.2f ", area);
        }
    }

    // 求v1v3和v2v4线的交点坐标
    public static double[] intersection(double[][] arr) {
        double[] feedback = new double[2];
        double k02 = (arr[2][1] - arr[0][1]) / (arr[2][0] - arr[0][0]);
        double k13 = (arr[3][1] - arr[1][1]) / (arr[3][0] - arr[1][0]);
        double b02 = arr[0][1] - k02 * arr[0][0];
        double b13 = arr[1][1] - k13 * arr[1][0];

        double x = (b02 - b13) / (k13 - k02);
        double y = (b02 * k13 - b13 * k02) / (k13 - k02);
        feedback[0] = x;
        feedback[1] = y;
        return feedback;
    }

    // 求三角形面积
    public static double getTriangleArea(double[][] points, int index, double[] crossPoint) {
        double area = 0;
        int index1 = (index + 1) % 4;
        double d1 = Math.pow(Math.pow(points[index1][0] - points[index][0], 2) + Math.pow(points[index1][1] - points[index][1], 2), 0.5);
        double d2 = Math.pow(Math.pow(points[index1][0] - crossPoint[0], 2) + Math.pow(points[index1][1] - crossPoint[1], 2), 0.5);
        double d3 = Math.pow(Math.pow(points[index][0] - crossPoint[0], 2) + Math.pow(points[index][1] - crossPoint[1], 2), 0.5);
        double s = (d1 + d2 + d3) / 2;
        area = Math.pow(s * (s - d1) * (s - d2) * (s - d3), 0.5);
        return area;
    }
}

结果:

Demo105. (拉丁正方形)拉丁正方形是一个n×n的数组,由n个不同的拉丁字母填充,每个拉丁字母恰好只在每行和每列中出现一次。编写一个程序,提示用户输人数字n以及字符数组,如示例输出所示,检测该输出数组是否是一个拉丁正方形。字符是从A开始的前面n个字符。

package Exer2;

import java.util.HashSet;
import java.util.Scanner;

public class Demo105 {
    /*
    (拉丁正方形)拉丁正方形是一个n×n的数组,由n个不同的拉丁字母填充,每个拉丁字母恰好只在每行和每列中出现一次。
    编写一个程序,提示用户输人数字n以及字符数组,如示例输出所示,检测该输出数组是否是一个拉丁正方形。字符是从A开始的前面n个字符。
    Enter number n:4
    Enter 4 rows of letters separated by spaces:
    A B C D
    B A D C
    C D B A
    D C A B
    The input array is a Latin square
     */
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("Enter number n:");
        int number = scan.nextInt();
        System.out.printf("Enter %s rows of letters separated by spaces:%n", number);
        char[][] latin = new char[number][number];
        for (int i = 0; i < number; i++) {
            for (int j = 0; j < number; j++) {
                latin[i][j] = scan.next().charAt(0);
                if (latin[i][j] > ('A' - 1 + number)) {
                    System.out.println("Wrong input: the letters must be from A to " + (char) ('A' - 1 + number));
                    System.exit(1);
                }
            }
        }
        if (isLatin(latin)) {
            System.out.println("The input array is a Latin square");
        } else {
            System.out.println("The input array is not a Latin square");
        }
    }

    private static boolean isLatin(char[][] latin) {
        HashSet<Character> set1 = new HashSet<>();
        HashSet<Character> set2 = new HashSet<>();
        for (int i = 0; i < latin.length; i++) {
            set1.clear();
            set2.clear();
            for (int j = 0; j < latin[i].length; j++) {
                if (!set1.add(latin[i][j]) || !set2.add(latin[j][i])) {
                    return false;
                }
            }
        }
        return true;
    }
}

结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java编程练习题:Demo96 - Demo105(多维数组) 的相关文章

  • uvm的config_db

    config db 是用于在各个uvm对象里传递参数 一般参数类型 是interface int等 据说参数必须是静态类型 这个可以在uvm config db相关代码里确认 后来知道 config db还能设置sequence和seque

随机推荐

  • C#如何从数据库SQLServer中同时读取多个结果集

    当需要从数据库中同时读取多个结果集时 比如执行如下的sql语句 select from tblClass select from tblStudent 同时从两个表格中获取结果 会获取两个结果集 此时需要使用SqlDataReader对象的
  • vue使用threejs加载模型问题整理

    1 如果出现错误 THREE WebGLRenderer Error creating WebGL context 需要开启浏览器的gpu加速 GPU acceleration 地址栏输入 chrome flags ignore gpu b
  • 国考省考申论:归纳概括多个主体身上的优秀品质,透过动词现象(怎么做的),找到名词(精神品质)本质

    国考省考申论 归纳概括多个主体身上的优秀品质 透过动词现象 怎么做的 找到名词 精神品质 本质 2022找工作是学历 能力和运气的超强结合体 公务员特招重点就是专业技能 附带行测和申论 而常规国考省考最重要的还是申论和行测 所以大家认真准备
  • dede:list分页与控制文章标题显示字数

    关于dedecms分页 百度上也有许多教程 本人记性不好所以写个博客保存下来 pagesize控制每页显示条数 在 dede list 结束标签 后边写上 dede pagelist 标签即可 如何控制文章显示字 让溢出部分用 代替呢 其实
  • IPS与防火墙旁路部署

    一 防火墙旁路部署 实现防护功能的同时 可以完全不需改变用户的网络环境 并且可以避免设备对用户网络造成中断的风险 用于把设备接在交换机的镜像口或者接在 HUB 上 保证外网用户访问服务器的数据经过此交换机 并且设置镜像口的时候需要同时镜像上
  • iview+page封装+强制刷新

    前言 iview的page封装 缺点无法固定页码按钮数量 而且current的页面恢复选中第一个实现不了 这里动态写了强制刷新的方法 下面是组件cpage vue
  • 【Spring

    上篇 Spring 事件监听概述 对 Spring 事件监听的机制有了个基本的了解 本篇来详细的解读下Spring 的 事件监听机制 事件监听详解 ApplicationEvent ApplicationListener 基于注释 异步 排
  • 多态的实现

    多态 之前介绍过多态的概念就是基类引用派生类对象且和派生类有相同的同名覆盖函数 那么现在我们就具体讲讲怎么实现多态 类方法实现多态性有两种方法 1 方法重载 可以声明多个同名但参数个数 类型 和顺序不同的方法 编译时根据参数 个数 类型和顺
  • win环境下SSH key 配置

    从Gitlab上拉取代码报错 Warning Permanently added gitlab wang cn 47 94 8 13 ECDSA to the list of known hosts Connection closed by
  • windows下使用FFmpeg生成YUV视频文件并播放(通过命令的方式)

    一 YUV的定义 YUV是一种颜色编码方法 它跟我们常见的RGB格式区分开来 常使用在各个视频处理组件中 其中 Y 代表明亮度 U 和 V 代表其色度 视频播放器把市面上流行的MP4等格式文件的视频部分解码出来 得到的一般会是YUV格式的数
  • Java方法重写注意事项

    系原创 只为需要它的人 Java方法重写的几个要求 重写的方法与父类方法签名 方法名称和参数列表 相同 子类重写的方法访问修饰符范围不能低于父类 父类的私有方法不能被重写 static修饰的方法不能被重写 返回值类型 如果父类中方法返回值类
  • 解决mybatis一对多只能获取部分数据的问题

    需求 building表和position表 Building类中含有List positionList mybatis查询方法需要查询到所有的building和building中含有所有的position 问题 sql语句和一对多方法写的
  • SQL如何进行优化

    SQL优化 前言 对于初级程序开发工程师而言 SQL是很多人的弱项 为此我给大家来做一下总结 希望能够帮到你们 课程说明 1 对MySQL SQL优化方案做讲解 学习如何排查慢查询 SQL优化 分页查询优化 一页一页的往下面翻这种查询方式
  • 针对读写操作频繁的应用系统的LINUX调优设置

    在线签约系统调优 项目类型 限制型应用 需要频繁调用 进行签章 调用的 保存在 磁盘中 项目业务设计实现 这里简要说明一下业务流程 前端业务系统过来的请求通过Nignx进行分流 通过网关DSS 将各自的请求转发到相应的老 新签章系统进行处理
  • 小白学Redis系列:Redis持久化

    Redis作为缓存数据库 区别于常规数据库的地方就在于Redis将数据存储在内存中 而不是硬盘中 因此数据的IO就十分快速 非常适合一些电商网站等数据IO频繁的场景 当然 内存中的数据在掉电之后就会被清空 而Redis的持久化功能使得内存中
  • linux后台运行之screen和nohup

    linux后台运行之screen和nohup 3 1 nohup命令 如果你正在运行一个进程 而且你觉得在退出帐户时该进程还不会结束 那么可以使用nohup命令 该命令可以在你退出帐户 关闭终端之后继续运行相应的进程 nohup就是不挂起的
  • 进制及进制转换详解。原码、反码、移码,补码区别介绍。(通俗易懂)

    目录 前言 一 十进制 n进制 进制转换详解 1 先说说什么是进制 2 二进制介绍 3 十进制 n进制 进制转换详解 重点 十进制 gt n进制 2 8 16 n进制 2 8 16 gt 十进制 非十进制间的互相转化 二 原码 反码 移码
  • Python数据可视化 - 如何自定义Matplotlib图例?

    Python数据可视化 如何自定义Matplotlib图例 Matplotlib 是一个最常用的Python数据可视化库 它允许我们创建各种类型的图形 包括直方图 折线图 散点图 饼状图等 当我们绘制多个子图或多个曲线时 我们可能需要图例来
  • SpringBoot 整合 ElasticSearch

    整合前先理解几个概念 与关键字 开始前给大家推荐一款很火的刷题 面试求职网站 https www nowcoder com link pc csdncpt xiaoying java 索引
  • Java编程练习题:Demo96 - Demo105(多维数组)

    目录 Demo96 代数方面 两个矩阵相乘 编写两个矩阵相乘的方法 Demo97 距离最近的两个点 程序清单8 3给出找到二维空间中距离最近的两个点的程序 修改该程序 让程序能够找出在三维空间上距离最近的两个点 Demo98 最大的行和列