1.(求矩阵中各列数字的和)编写一个方法,求整数矩阵中特定列的所有元素之和,使用下面的方法头:
public static double sumCliumn(double[][] m, int columnIndex)
编写一个测试程序,读取一个3x4的矩阵,然后显示每行每列元素的和。下面是一组运行示例:
import java.util.*;
class Demo05_09{
public static void main(String[] args){
/*
(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)
累加行的时候 行不动 列动
累加列的时候 列不动 行动
*/
//1.输入一个3*4的矩阵
Scanner scanner=new Scanner(System.in);
System.out.println("Enter numbers:");
double[][] matrix=new double[3][4];
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
matrix[i][j]=scanner.nextDouble();
}
}
//2.打印每列的和,行动列不动
for(int col=0;col<matrix[0].length;col++){
System.out.println(sumColumn(matrix,col));
}
}
public static double sumColumn(double[][] m,int col){
double sum=0;
for(int row=0;row<m.length;row++){ //从第一行开始遍历第一列,计算第一列的和
sum+=m[row][col];
}
return sum;
}
}
运行结果:
2. 求矩阵主对角线元素的和,编写一个方法,求n x n的double类型矩阵中主对角线上所有数字的和,使用下面的方法头:
public static double sumMajorDiagiagoal(double[][] m)
编写一个测试程序,读取一个4×4的矩阵,然后显示它的主对角线上的所有元素的和下面,是一个运行实
运行结果:
Enter a 4-by-4 matrix row by row:
1 2 3 4.0
5 6.5 7 8
9 10 11 12
13 14 15 16
Sum of the elements in the major diagonal is 34.5
3.(代数方面:两个矩阵相乘)编写两个矩阵相乘的方法。方法头如下:
public static double[ ] [ ] mutiplyMatrix(double[ ] [ ] a,double[ ] [ ] b)
为了使矩阵 a 能够和矩阵 b 相乘,矩阵 a 的列数必须与矩阵 b 的行数相同,并且两个矩阵的元素要具有相同或兼容的数据类型。例如对于两个3×3的矩阵,a,b,c就有:
编写一个测试程序,提示用户输入两个3x3的矩阵,然后显示他们的乘积。下面是一个执行用例:
class Demo05_11{
public static void main(String[] args){
//m*n n*p m*p 矩阵相乘 前者的列 必须等于 后者的行 对应行的列乘对应列的行再相加
/*
1 2 3 1 2 1*1+2*3+3*5 1*2+2*4+3*6
× 3 4 =
4 5 6 5 6 4*1+5*3+6*5 4*2+5*4+6*6
对于数学上的一些运算公式 如果直接通过看计算流程还是比较麻烦的
此时推荐使用已知公式计算!
*/
double[][] A={ //m*p
{1,2,3},
{4,5,6},
{7,8,9}
};
double[][] B={ //p*n
{0,2.0,4.0},
{1,4.5,2.2},
{1.1,4.3,5.2}
};
double[][] C=new double[A.length][B[0].length];//m*n
for(int i=0;i<C.length;i++){
for(int j=0;j<C[i].length;j++){
double sum=0;
for(int k=0;k<B.length;k++){
sum+=A[i][k]*B[k][j];
}
C[i][j]=sum;
System.out.print(C[i][j]+" ");
}
System.out.println();
}
}
}
4.编写程序提示用户输入一个方形的长度,随机的在矩阵中填入0和1打印,这个矩阵,然后找出整行整列或者对角线都是0或1的行、列和对角线,下面是这个程序的一个运行实例:
import java.util.*;
class Demo05_12{
public static void main(String[] args){
//1.输入方针的尺寸 创建方阵
Scanner scanner=new Scanner(System.in);
System.out.print("Enter size:"); //输入一个15x15的方阵
int size=scanner.nextInt();
int[][] m=new int[size][size];
//2.随机的给方阵中填入0或1
Random random=new Random();
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
m[i][j]=random.nextInt(2); //随机的产生0和1
System.out.print(m[i][j]+" "); //打印0和1
}
System.out.println(); //一行打印完了要换行
}
//3.让行,列,对角线累加 sum==0 sum==size 表示全相等
checkRow(m); //判断某一行是否全相等的函数
checkCol(m); //判断某一列是否全相等的函数
checkDiagonal(m); //判断正对角线是否全相等的函数
checkSubDiagonal(m); //判断副对角线是否全相等的函数
}
public static void checkSubDiagonal(int[][] m){//判断副对角线是否全相等的函数
int sum=0;
for(int i=0;i<m.length;i++){ //从第一行最后一列开始比
sum+=m[i][m.length-1-i];
}
if(sum==m.length||sum==0){ //某一行或某一列加起来是0还是该行或列的长度
System.out.printf("副主对角线全相等且是%d\n",sum==0?0:1);
}
}
public static void checkDiagonal(int[][] m){//判断正对角线是否全相等的函数
int sum=0;
for(int i=0;i<m.length;i++){
sum+=m[i][i];
}
if(sum==m.length||sum==0){ //某一行或某一列加起来是0还是该行或列的长度
System.out.printf("主对角线全相等且是%d\n",sum==0?0:1);
}
}
public static void checkRow(int[][] m){ //判断某一行是否全相等的函数
for(int i=0;i<m.length;i++){
int sum=0;
for(int j=0;j<m[i].length;j++){
sum+=m[i][j];
}
if(sum==m.length||sum==0){ //某一行或某一列加起来是0还是该行或列的长度
System.out.printf("第%d行全相等且是%d\n",i+1,sum==0?0:1);
}
}
}
public static void checkCol(int[][] m){ //判断某一列是否全相等的函数
for(int j=0;j<m.length;j++){
int sum=0;
for(int i=0;i<m.length;i++){
sum+=m[i][j];
}
if(sum==m.length||sum==0){ //某一行或某一列加起来是0还是该行或列的长度
System.out.printf("第%d列全相等且是%d\n",j+1,sum==0?0:1);
}
}
}
}
运行结果:
5.(模式识别)连续的四个相等的数编写下面的方法测试一个二维数组是否有四个连续的数字,具有相同的值,这四个数可以是水平方向的,垂直方向的,或者对角线方向的。
public static boolean isConsecutiveFour(int[ ] [ ] values)
编写一个测试程序,提示用户输入一个二维数组的行数、列数,以及数组中的值,如果这个数组有四个连续的数字具有相同的值就显示true,否则显示false ,下面是结果为true的一些例子:
import java.util.*;
class Demo05_13{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("Enter row ,col:");
int row=scanner.nextInt(); //输入行数
int col=scanner.nextInt(); //输入列数
int[][] m=new int[row][col]; //建立一个二维数组
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
m[i][j]=scanner.nextInt(); //输入数组数据
}
}
System.out.println(isConsecutiveFour(m)); //调用isConsecutiveFour()函数
}
public static boolean isConsecutiveFour(int[][] m){//判断是否符合题目要求
for(int i=0;i<m.length;i++){
for(int j=0;j<m[i].length;j++){
//向右是否有连续四个数相等
if(j<=m[i].length-4){ //最多判断到该行长度-4,再往后没有四个数了
boolean flag=true; //默认能找到连续四个数相等
for(int c=j+1;c<=j+3;c++){ //若有一个数不行等,循环结束,即该数向右连续四个数不相等
if(m[i][j]!=m[i][c]){
flag=false;
break;
}
}
if(flag){ //如果循环正常结束,说明该数向右连续四个数相等
return true;
}
}
//向下是否有连续四个数相等
if(i<=m.length-4){ //最多判断到该列长度-4,再往下没有四个数了
boolean flag=true;
for(int r=i+1;r<=i+3;r++){
if(m[i][j]!=m[r][j]){ //若有一个数不行等,循环结束,即该数向右连续四个数不相等
flag=false;
break;
}
}
if(flag){
return true;
}
}
//向右下是否有连续四个数相等
if(i<=m.length-4&&j<=m[0].length-4){
boolean flag=true;
for(int r=i+1,c=j+1;r<=i+3;r++,c++){
if(m[i][j]!=m[r][c]){
flag=false;
break;
}
}
if(flag){
return true;
}
}
//向右上是否有连续四个数相等
if(i>=3&&j<=m[0].length-4){
boolean flag=true;
for(int r=i-1,c=j+1;c<=j+3;r--,c++){
if(m[i][j]!=m[r][c]){
flag=false;
break;
}
}
if(flag){
return true;
}
}
}
}
return false;//四个方向都没有连续的
}
}