(这是我初学时候第一个亲手敲的第一个面向对象的题目)
前言:
(各位Java学习者门好,相信大家刚开始学Java的时候对于面向对象这个思想都或多或少有些还不怎么理解,相信大家在看完我的讲解题目后会有较大些帮助)
题目:
1.定义一个矩阵类,2.成员变量有row、column 3.类中定义一个二维数组用于存放元素 4.分别定义出 (五个方法)初始化矩阵的方法、矩阵加法、矩阵乘法、矩阵转置的方法,以及最后输出矩阵的方法,最后在测试类中完成测试。
解题思路:
1:先弄清楚矩阵该有的属性,以各个题目要求的方法需要满足的条件:
毫无疑问的是矩阵有最基本的 行(row),列(column)两个属性,这是每当我们new出一个矩阵(Matrix)对象时候,就带有的属性,:毫无疑问这时候我们就要对Matrix类的new对象的构造方法进行作出操作了
2.对初始化矩阵:对二维数组数组进行操作了
3.剩下的方法,首先判断需要满足的条件,再对矩阵具体对象作出操作
代码分块顺序讲解(一看就会!!!)
(截取部分代码讲解)
1.矩阵类的定义
//定义矩阵类
public class Matrix{
int row;
int column;
int [][]A; //定义一个二维数组用于存放矩阵的元素
//无参构造
public Matrix() {
}
//有参构造
public Matrix(int h,int l){
row=h;
column=l;
A=new int[h][l]; // 对数组进行new对象,数组对象初始化的时候必须要有对象不能为null
}
这部分便是对矩阵类的基本属性的定义,有参构造可对矩阵的一些基本属性初始化。(无参构造加上比较好)
(注:数组只是给了空间,其元素并未由我们赋予,系统默认元素为0)
2.定义矩阵初始化方法
(思路:1.矩阵初始化即为对矩阵对象内的二维数组赋值
2.for循环输入二维数组的每一行)
代码如下:(内有详细的注释)
//定义初始化矩阵方法
public void AssigmentMatrix(){
Scanner scanner=new Scanner(System.in);
int sum=this.row*this.column; //矩阵的总元素等于row X column
System.out.println("您的矩阵为:"+this.row+"行"+this.column+"列的矩阵,请按第一行顺序输入"+sum+"个元素");
// for循环遍历输入每一个元素
for (int i=0;i<this.row;i++){
System.out.println("请输入第"+(i+1)+"行"+"的"+column+"个元素");
for (int j=0;j<this.column;j++)
this.A[i][j]=scanner.nextInt(); // 为每个元素输入值
}
}
3.定义矩阵相加方法
(思路:1.判断是否满足矩阵加法的前提条件(行列相等的矩阵)2.矩阵对应位置元素相加)
代码如下:(内有详细的注释)
//定义矩阵相加的方法
public Matrix MatrixJF(Matrix m){
if (this.row!=m.row||this.column!=m.column){ // 先判断是否满足矩阵的加法
System.out.println("两矩阵行列不相等不能相加");
return null;
}
Matrix matrix=new Matrix(); // 定义一个返回的对象
matrix.row=this.row; //行列赋值
matrix.column=this.column;
matrix.A=new int[row][column]; //成员变量数组A也要进行new 对象 ,不然会出现null 异常
for (int i=0;i<this.row;i++){ // 对应元素相加赋值给要返回对象的元素
for (int j=0;j<this.column;j++){
matrix.A[i][j]=this.A[i][j]+m.A[i][j];
}
}
return matrix; //返回矩阵对象
}
注:(传入的参数为一个(矩阵类型)Matrix,这是我们自己定义的类,看做int,float基本数据类型这样去使用,但实际是个引用数据类型,该方法不加static,需要用Matrix 对象去调用该类的方法,最后的返回值为Matrix类型的对象)
4.矩阵乘法
(思路:1.判断是否满足条件 2.矩阵乘法的方法为:第一个矩阵第一行第一个元素 分别乘以 第二个矩阵的第一列的每一个元素,相加,作为新矩阵的第一行第一个元素,以此类推)
代码如下:(内有详细的注释)
//定义矩阵的乘法方法:
//注:矩阵乘法: 3x2 2x3 第一个矩阵的列是 第二个矩阵的行 ,要求相等才能相乘
public Matrix MatrixCF(Matrix m){
if (this.column!=m.row){ //判断是否满足矩阵乘法的条件
System.out.println("第一个矩阵的列不等于第二个矩阵的行,不能进行相乘");
return null;
}
Matrix m2=new Matrix(); // new 一个返回的对象
m2.row=this.row; //返回对象的行就是第一个调用该方法矩阵对象的行
m2.column=m.column; //返回对象的列就是参数矩阵对象的列
m2.A=new int[m2.row][m2.column]; // 返回对象的矩阵需要new 对象才能进行元素赋值
for (int i=0;i<this.row;i++){ // 调用矩阵的行
for (int j=0;j<m.column;j++){ //参数对象的列
for (int k=0;k<m.row;k++){ //参数对象的行
m2.A[i][k]+=this.A[i][k]*m.A[k][i]; //调用方法对象this.A[i][k]:表达的是 调用方法的第 某行的第几个元素
// A[k][j] 乘以该矩阵的第一列的所有元素相加
}
}
}
return m2;
}
5.定义矩阵的转置
思路:(1.行元素变成列元素,列元素变行元素)
// 矩阵转至
public void ZhuanZ(){
for (int i=0;i<this.row;i++)
for (int j=i;j<this.column;j++){
int temp=A[i][j];
A[i][j]=A[j][i];
A[j][i]=temp;
}
}
6.定义矩阵输出方法
(思路:简单的遍历数组换行输出)
//定义输出矩阵的方法
public void ptMatrix(){
for (int i=0;i<this.row;i++){
for (int j=0;j<this.column;j++)
System.out.print(this.A[i][j]+" ");
System.out.println();//输出一行换行
}
}
定义矩阵类(Matrix)完整代码:
import java.util.Scanner;
//定义矩阵类
public class Matrix{
int row;
int column;
int [][]A; //定义一个二维数组用于存放矩阵的元素
//无参构造
public Matrix() {
}
//有参构造
public Matrix(int h,int l){
row=h;
column=l;
A=new int[h][l]; // 对数组进行new对象,数组对象初始化的时候必须要有对象不能为null
}
//定义初始化矩阵方法
public void AssigmentMatrix(){
Scanner scanner=new Scanner(System.in);
int sum=this.row*this.column; //矩阵的总元素等于row X column
System.out.println("您的矩阵为:"+this.row+"行"+this.column+"列的矩阵,请按第一行顺序输入"+sum+"个元素");
// for循环遍历输入每一个元素
for (int i=0;i<this.row;i++){
System.out.println("请输入第"+(i+1)+"行"+"的"+column+"个元素");
for (int j=0;j<this.column;j++)
this.A[i][j]=scanner.nextInt(); // 为每个元素输入值
}
}
//定义矩阵相加的方法
public Matrix MatrixJF(Matrix m){
if (this.row!=m.row||this.column!=m.column){ // 先判断是否满足矩阵的加法
System.out.println("两矩阵行列不相等不能相加");
return null;
}
Matrix matrix=new Matrix(); // 定义一个返回的对象
matrix.row=this.row; //行列赋值
matrix.column=this.column;
matrix.A=new int[row][column]; //成员变量数组A也要进行new 对象 ,不然会出现null 异常
for (int i=0;i<this.row;i++){ // 对应元素相加赋值给要返回对象的元素
for (int j=0;j<this.column;j++){
matrix.A[i][j]=this.A[i][j]+m.A[i][j];
}
}
return matrix; //返回矩阵对象
}
//定义矩阵的乘法方法:
//注:矩阵乘法: 3x2 2x3 第一个矩阵的列是 第二个矩阵的行 ,要求相等才能相乘
public Matrix MatrixCF(Matrix m){
if (this.column!=m.row){ //判断是否满足矩阵乘法的条件
System.out.println("第一个矩阵的列不等于第二个矩阵的行,不能进行相乘");
return null;
}
Matrix m2=new Matrix(); // new 一个返回的对象
m2.row=this.row; //返回对象的行就是第一个调用该方法矩阵对象的行
m2.column=m.column; //返回对象的列就是参数矩阵对象的列
m2.A=new int[m2.row][m2.column]; // 返回对象的矩阵需要new 对象才能进行元素赋值
for (int i=0;i<this.row;i++){ // 调用矩阵的行
for (int j=0;j<m.column;j++){ //参数对象的列
for (int k=0;k<m.row;k++){ //参数对象的行
m2.A[i][k]+=this.A[i][k]*m.A[k][i]; //调用方法对象this.A[i][k]:表达的是 调用方法的第 某行的第几个元素
// A[k][j] 乘以该矩阵的第一列的所有元素相加
}
}
}
return m2;
}
// 矩阵转至
public void ZhuanZ(){
for (int i=0;i<this.row;i++)
for (int j=i;j<this.column;j++){
int temp=A[i][j];
A[i][j]=A[j][i];
A[j][i]=temp;
}
}
//定义输出矩阵的方法
public void ptMatrix(){
for (int i=0;i<this.row;i++){
for (int j=0;j<this.column;j++)
System.out.print(this.A[i][j]+" ");
System.out.println();//输出一行换行
}
}
}
测试类代码:
1.(不包含转至的测试类)
import java.util.Scanner;
public class TestMatrix {
//main方法实践人
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int h1,l1;
System.out.print("请输入第一个矩阵的row和column:");
h1=scanner.nextInt();
l1=scanner.nextInt();
Matrix m1 =new Matrix(h1,l1);
System.out.println("为第一个矩阵赋值");
m1.AssigmentMatrix(); //为第一个矩阵赋值
System.out.println("第一个矩阵如下:");
m1.ptMatrix();
int h2,l2;
System.out.print("请输入第二个矩阵的row和column:");
h2=scanner.nextInt();
l2=scanner.nextInt();
System.out.println("为第二个矩阵赋值");
Matrix m2 =new Matrix(h2,l2);
m2.AssigmentMatrix();// 为第二个矩阵赋值
System.out.println("第二个矩阵如下:");
m2.ptMatrix();
Matrix m3 =m1.MatrixJF(m2); //矩阵 m1 + m2 返回矩阵赋予 m3
System.out.println("相加后的矩阵为:");
if (m3!=null)
m3.ptMatrix(); // 输出矩阵
Matrix m4 =new Matrix();
m4 =m1.MatrixCF(m2);// 矩阵乘法
if (m4!=null){
System.out.println("m1xm2矩阵的乘法结果如下:");
m4.ptMatrix(); // 输出矩阵乘法后的对象
}
}
}
结果如下图:
输入第一个矩阵
输入第二个矩阵:
调用乘法,加法结果:
矩阵转置单独测试类
public class TestMatrix02 {
public static void main(String[] args) {
Matrix matrix2=new Matrix(3,3);
matrix2.AssigmentMatrix();
matrix2.ptMatrix();
matrix2.ZhuanZ();
System.out.println("转至之后");
matrix2.ptMatrix();
}
}
结果如下:
自我总结:
1.分析类所具有的属性,以及属性,的用处,根据题目要求分别实现各个功能方法即可
(制作不易,希望大家一键三连支持一下,我会持续更新多的新内容,一起与大家学习,让我们加油敲代,总会有所收获的!!!)