1 packageorg.java.dao;2
3 importjava.util.ArrayList;4 importjava.util.Scanner;5
6 importorg.java.pojo.Matrix;7
8 public classCaculate {9 /**
10 * 从输入到创建一个矩阵11 *@return
12 */
13 publicMatrix inputMatrix(){14 @SuppressWarnings("resource")15 Scanner scan = newScanner(System.in);16 ArrayList list=new ArrayList();//用来存放用户的输入
17 String firstString=scan.nextLine();18 while(!firstString.equals("quit")){19 if(!"".equals(firstString))20 list.add(firstString);21 firstString=scan.nextLine();22 }23 int row=list.size();//获得矩阵的行数
24 int line=list.get(0).split(",").length;//获得矩阵列数
25 for(int i=1;i
38 String tempString[]=string.split(",");39 for(String str : tempString) {40 matrixString[i][j]=str.trim();//删除空格
41 ++j;42 }43 if(j==line)44 j=0;45 ++i;46 }47 matrix.setMatrix(matrixString);48 returnmatrix;49 }50
51 /**
52 * 输出矩阵53 *@parammatrix54 */
55 public voidprintMatrix(Matrix matrix){56 String matrixString[][]=matrix.getMatrix();57 for(int i=0;i
65 /**
66 * 矩阵加法67 *@parammatrix168 *@parammatrix269 *@return
70 *@throwsException71 */
72 @SuppressWarnings("null")73 public Matrix addOperation(Matrix matrix1,Matrix matrix2) throwsException{74 //如果输入有误,则停止运算
75 if(matrix1==null){76 throw newException();77 }78 //如果输入有误,则停止运算
79 if(matrix2==null){80 throw newException();81 }82 //计算---首先判断一下两个矩阵行和列的关系是否可以计算
83 if(matrix1.getRow()!=matrix2.getRow()||matrix1.getLine()!=matrix2.getLine()){84 System.out.println("两个矩阵行不满足运算要求");85 throw newException();86 }87 Matrix matrix=newMatrix();88 matrix.setRow(matrix1.getRow());89 matrix.setLine(matrix1.getLine());90 //执行运算
91 String[][]matString1=matrix1.getMatrix();92 String[][]matString2=matrix2.getMatrix();93 String[][]matString=new String[matrix.getRow()][matrix.getLine()];//结果矩阵的数组
94 for(int i=0;i
101 float result=Float.parseFloat(matString1[i][j])+Float.parseFloat(matString2[i][j]);102 matString[i][j]=String.valueOf(result);103 }104 }105
106 }107 matrix.setMatrix(matString);108 returnmatrix;109 }110 /**
111 *112 * 减113 *@parammatrix1114 *@parammatrix2115 *@return
116 *@throwsException117 */
118 public Matrix reduceOperation(Matrix matrix1,Matrix matrix2)throwsException{119 //如果输入有误,则停止运算
120 if(matrix1==null){121 throw newException();122 }123 //如果输入有误,则停止运算
124 if(matrix2==null){125 throw newException();126 }127 //计算---首先判断一下两个矩阵行和列的关系是否可以计算
128 if(matrix1.getRow()!=matrix2.getRow()||matrix1.getLine()!=matrix2.getLine()){129 System.out.println("两个矩阵行不满足运算要求");130 throw newException();131 }132 Matrix matrix=newMatrix();133 matrix.setRow(matrix1.getRow());134 matrix.setLine(matrix1.getLine());135 //执行运算
136 String[][]matString1=matrix1.getMatrix();137 String[][]matString2=matrix2.getMatrix();138 String[][]matString=new String[matrix.getRow()][matrix.getLine()];//结果矩阵的数组
139 for(int i=0;i
146 float result=Float.parseFloat(matString1[i][j])-Float.parseFloat(matString2[i][j]);147 matString[i][j]=String.valueOf(result);148 }149 }150
151 }152 matrix.setMatrix(matString);153 returnmatrix;154 }155
156 /**
157 * 乘158 *@parammatrix1159 *@parammatrix2160 *@return
161 *@throwsException162 */
163 public Matrix multiplyOperation(Matrix matrix1,Matrix matrix2)throwsException{164 //如果输入有误,则停止运算
165 if(matrix1==null){166 throw newException();167 }168 //如果输入有误,则停止运算
169 if(matrix2==null){170 throw newException();171 }172 //计算---首先判断一下两个矩阵行和列的关系是否可以计算
173 if(matrix1.getLine()!=matrix2.getRow()){174 System.out.println("两个矩阵行不满足运算要求");175 throw newException();176 }177 Matrix matrix=newMatrix();178 matrix.setRow(matrix1.getRow());//结果矩阵行数等于第一个矩阵行数,列数等于第二个矩阵列数
179 matrix.setLine(matrix2.getLine());180 //执行运算
181 String[][]matString1=matrix1.getMatrix();182 String[][]matString2=matrix2.getMatrix();183 String[][]matString=new String[matrix.getRow()][matrix.getLine()];//结果矩阵的数组
184 int sameNum=matrix1.getLine();//=matrix2.getRow()
185 for(int i=0;i
192 }193 }194 matrix.setMatrix(matString);195 returnmatrix;196 }197
198 /**
199 * 把形如“1*1+2*1+3*1+”的式子进行分析计算200 * 返回处理结果201 *@paramtoAnalizeString202 *@return
203 */
204 publicString doAnalyze(String toAnalizeString){205 String disAdd[]=toAnalizeString.split("\\+");//“+”是转义字符
206 int addLength=disAdd.length;//获取有几项相加
207 String disMul[][]=new String[addLength][2];//所有项都在这一个二维数组里面了
208 for (int i = 0; i < disAdd.length; i++) {209 disMul[i]=disAdd[i].split("\\*");210 }211 //移项,先不考虑系数为0的情况
212 for(int i = 0; i < disMul.length; i++){213
214 if(isNumber(disMul[i][0])){215 if(isNumber(disMul[i][1])){216 //都是数字,让第一项等于两数运算结果,第二项等于0
217 float result=Float.parseFloat(disMul[i][0])*Float.parseFloat(disMul[i][1]);218 disMul[i][0]=String.valueOf(result);219 disMul[i][1]="0";220 }else{221 //一是二不是,不用做什么
222 }223 }else{224 if(isNumber(disMul[i][1])){225 //一不是二是,互换
226 String tempString=disMul[i][0];227 disMul[i][0]=disMul[i][1];228 disMul[i][1]=tempString;229 }else{230 //都不是数字,让第一项等于1,第二项等于两数运算结果
231 if(disMul[i][0].equals(disMul[i][1])){232 disMul[i][1]=disMul[i][1]+"^2";233 }else{//按abc顺序写
234 if(disMul[i][0].compareTo(disMul[i][1])>0){235 disMul[i][1]=disMul[i][1]+""+disMul[i][0];236 }else{237 disMul[i][1]=disMul[i][0]+""+disMul[i][1];238 }239 }240 disMul[i][0]="1";241 }242 }243 }//移项完成244
245 //合并同类项,算法会处理系数为0的情况
246 for(int i = 0; i < disMul.length-1; i++){247 for(int j=i+1;j
250 disMul[i][0]=String.valueOf(Float.parseFloat(disMul[i][0])+Float.parseFloat(disMul[j][0]));251 disMul[j][0]="0";252 }253 }254 }255 }//合并同类项完成256
257 //写成多项式的形式,用result拼接
258 String result="";259 for(int i = 0; i < disMul.length; i++){260 if(!disMul[i][0].equals("0")){//忽略为0的项
261 if(disMul[i][1].equals("0")){//如果是常数项
262 result+=disMul[i][0]+"+";263 }else{264 result+=disMul[i][0]+disMul[i][1]+"+";265 }266 }267 }268 result=result.substring(0, result.length()-1);//删除最后一个“+”号
269 returnresult;270 }271
272 /**
273 * 判断矩阵的一个元素是字母还是数字274 *@paramstr275 *@return
276 */
277 public booleanisNumber(String str){278 for (int i = 0; i < str.length(); i++){279 if (!Character.isDigit(str.charAt(i))){280 return false;281 }282 }283 return true;284 }285 }