您的位置:首页 > 其它

T001-UT001-0022

2015-04-14 19:15 239 查看


矩阵运算练习——矩阵乘法

编写一个程序,从标准输入设备上输入两个实数矩阵,并计算两个矩阵的积,输出结果中的实数保留两位小数。 若出现矩阵格式错误或违反了矩阵计算规则的情况,则输出Error Input

   合法的矩阵采用如下格式的字符串描述:

非法矩阵举例:

举例一:

输入:

输出:

举例二:

输入:

输出:

举例三:

输入:

输出:

举例四:

输入:

输出:

  代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class D0022 {
public static void main(String[] args) {
//以字符串接收
String[] s=new String[2];
InputStreamReader ir = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(ir);
try {
int n=2,i=0;
while (n-->0) {
System.out.println("matrix "+(char)(i+97)+":");
s[i++]= in.readLine();
//System.out.println("Read: " + s[i-1]);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
//处理字符串输出结果
Dispose(s);
}
public static void Dispose(String []s){//判断矩阵是否非法并且存贮矩阵
//先对字符串进行截取,以字符串判断矩阵的函数以及列数,并且放入一个二维矩阵中去
//截取成单个字符
String regex="\\[|\\]|\\;| ";
String regex1="[a-zA-Z]";
int row=1,line=1,flag=0;//行列记录
char[] str1=s[0].toCharArray();
//以字符串判断矩阵的函数以及列数
for(int i=0;i<str1.length;i++){
if(str1[i]==' '&&flag==0)line++;
if(str1[i]==';'){
flag=1;row++;
}
}
//切割字符串,提取出纯数字字符
String[] slist1= s[0].split(regex);
String[] slist2= s[1].split(regex);
//判断矩阵维数是否相等
if(slist1.length!=slist2.length){
System.out.print("Error Input");
return;
}
//判断矩阵里是否有字母
Matcher m1=Pattern.compile(regex1).matcher(s[0]);
Matcher m2=Pattern.compile(regex1).matcher(s[1]);
if(m1.find()||m2.find()){
System.out.print("Error Input");
return;
}
//创建两个二维数组存贮
double[][] nu1=new double[row][line];
double[][] nu2=new double[line][row];
//把一维数组放入矩阵(二维数组)中
int index=1;
for(int i=0;i<row;i++){
for(int j=0;j<line;j++){
nu1[i][j]=Double.parseDouble(slist1[index]);//将string转换成double
index++;
}
}
index=1;
for(int i=0;i<line;i++){
for(int j=0;j<row;j++){
//将string转换成double
nu2[i][j]=Double.parseDouble(slist2[index]);
index++;
}
}
//矩阵相乘
Count(nu1,nu2,row,line);
}
public static void Count(double [][]nu1,double [][]nu2,int row,int line){//矩阵相乘
//矩阵相乘,输出矩阵
double[][] result=new double[nu1.length][nu2[0].length];
System.out.println("a+b:");
for(int i=0;i<nu1.length;i++){
for(int j=0;j<nu2[0].length;j++){
result[i][j]=0;
if(j==0&&i==0)System.out.print("[");
for(int k=0;k<nu2.length;k++)
result[i][j]+=nu1[i][k]*nu2[k][j];
DecimalFormat dg=new DecimalFormat("0.00"); //保留两位小数
String strnum2=dg.format(result[i][j]);
System.out.print(strnum2);
if(j==nu2[0].length-1&&i!=nu1.length-1)System.out.print(";");
else if(j!=nu2[0].length-1){
System.out.print(" ");
}
if(i==nu1.length-1&&j==nu2[0].length-1)System.out.print("]");
}

}
}
}


(全文完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: