📄 comp11.java
字号:
import java.awt.*;
import java.awt.event.*;
class Comp11 {
public double[] b;//存储变量 b,最终结果也存在数组 bb中
public TextField rowtext,caltext,resulttext;
public TextArea textA,textb;
public double[][] array;//用于存储矩阵 A
public static void main(String args[ ]){
Comp11 t1=new Comp11();
t1.go();
}
public void go(){
Frame frame=new Frame("gauss");
Panel paneln=new Panel( );
Panel panels=new Panel( );
Panel pn1=new Panel( );
Panel pn2=new Panel( );
Label l1=new Label("输入行数");
Label l2=new Label("列数");
Label l3=new Label("输入数组A");
Label l4=new Label("向量b");
Label result=new Label("结果");
rowtext=new TextField("1",10);
caltext=new TextField("1",10);
textA=new TextArea("",10,16,TextArea.SCROLLBARS_NONE);
textb=new TextArea("",10,1,TextArea.SCROLLBARS_NONE);
resulttext=new TextField("1",20);
Button calb=new Button("运算");
calb.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent ae) {
try{
String sa=textA.getText().trim();
String sr=rowtext.getText().trim();
String sc=caltext.getText().trim();
String s5=textb.getText().trim();
int r=Integer.parseInt(sr);
int c=Integer.parseInt(sc);
array=new double[r][c];
b=new double[r];
//下面处理矩阵A的输入
while(sa.indexOf("\n")!=-1){
sa=sa.substring(0,sa.indexOf("\n"))+sa.substring(sa.indexOf("\n")+1);}
while(sa.indexOf("\r")!=-1){
sa=sa.substring(0,sa.indexOf("\r"))+"@"+sa.substring(sa.indexOf("\r")+1);}
while(sa.indexOf(" ")!=-1){
sa = sa.substring(0,sa.indexOf(" "))+"@"+sa.substring(sa.indexOf(" ")+1).trim();
}
String[] ss=sa.split("@");
int q=ss.length;
if(r<c){//当行数小于列数时方程有无穷解
resulttext.setText("有无穷");
return;
}
int row=0;
int arr=0;
for(int i=0;i<q;i++){//取出数组A的值
array[row][arr]=Double.parseDouble(ss[i]);
arr++;
if(arr%r==0){
row++;
arr=0;
}
}
//下面处理变量b的输入
while(s5.indexOf("\n")!=-1){
s5=s5.substring(0,s5.indexOf("\n"))+s5.substring(s5.indexOf("\n")+1);}
while(s5.indexOf("\r")!=-1){
s5=s5.substring(0,s5.indexOf("\r"))+"@"+s5.substring(s5.indexOf("\r")+1);}
while(s5.indexOf(" ")!=-1){
s5= s5.substring(0,s5.indexOf(" "))+"@"+s5.substring(s5.indexOf(" ")+1).trim();
}
String[] ss1=s5.split("@");
int q1=ss1.length;
int row1=0;
for(int i=0;i<q1;i++){//取出变量b的值
b[row1]=Double.parseDouble(ss1[i]);
row1++;
}
gause(array,b,r,c);
//Java中方法传递的数组的引用,可以修改数组的值,可以通过数组array判断解的情况。
if((array[c-1][c-1]==0)&&(b[c-1]!=0)){//下面依次判断各种解的情况
resulttext.setText("方程无解");
return;
}
int i1=r-1;
while(b[i1]==0){
i1--;
}
if(i1>c-1){
resulttext.setText("方程无解");
return;
}
int i2=0;
while(i2<c&&array[i2][i2]!=0){
i2++;
}
if(i2<c-1){
resulttext.setText("方程有无穷多解");
return;
}
String ss2=new String();
for(int i=0;i<n;i++){
ss2+=Double.toString(b[i]);
ss2+=" ";
}
resulttext.setText(ss2);
return;
}catch(Exception ee){
resulttext.setText("");
textA.setText("输入错误");
textb.setText("");}
}
}
);
paneln.setLayout(new BorderLayout(10,20));
pn1.setLayout(new FlowLayout(FlowLayout.CENTER,15,20));
pn1.add(l1);
pn1.add(rowtext);
pn1.add(l2);
pn1.add(caltext);
pn2.setLayout(new FlowLayout(FlowLayout.CENTER,10,20));
pn2.add(l3);
pn2.add(textA);
pn2.add(l4);
pn2.add(textb);
pn2.add(calb);
paneln.add(pn1,"North");
paneln.add(pn2,"Center");
panels.add(result);
panels.add(resulttext);
frame.setLayout(new BorderLayout(10,30));
frame.add(paneln,"North");
frame.add(panels,"Center");
frame.pack();
frame.setSize(500,500);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev)
{ System.exit(0); }
});
}
public void gause(double[][] array1,double[] b,int m,int n){
//高斯算法的实现,不判断方程解的情况。
for(int i=0;i<n;i++){//需要化简m-1次,最终把矩阵化为上三角矩阵
if(array1[i][i]==0){//如果对角线的为零,实行换行。
int a1=i+1;
while((a1<m)&&(array1[a1][i]==0)){//找到第一个对角线不为零的行
a1++;
}
System.out.println(a1);
if(a1<m){
double w=0;
for(int x=i;x<n;x++){//交换矩阵A的两行
w=array1[i][x];
array1[i][x]=array1[a1][x];
array1[a1][x]=w;
}
w=b[i];//交换b变量的两行
b[i]=b[a1];
b[a1]=w;
}else
{ System.out.println("erro");}
}
for(int j=i+1;j<m;j++){//每次需要化简m-i-1行
array1[j][i]=array1[j][i]/array1[i][i];//为了节省空间用用要被化为零的元素,存储倍数
for(int k=i+1;k<n;k++)//每行需要化简n-i-1单元
{
array1[j][k]=array1[j][k]-array1[i][k]*array1[j][i];
}
b[j]=b[j]-array1[j][i]*b[i];//化简变量b
array1[j][i]=0;
}
}
for(int t=0;t<m;t++){//在dos下显示化简后的上三角矩阵
System.out.println(" ");
for(int q=0;q<n;q++){
System.out.print(array1[t][q]);
System.out.print(" ");
}
System.out.println(b[t]);
}
for(int i=n-1;i>=0;i--){//回代求出方程的解
for(int j=n-1;j>i;j--){
b[i]=b[i]*1000-array1[i][j]*b[j]*1000;//避免像java里面的1-0.8=0.19999999999999996问题
b[i]=b[i]/1000;
}
b[i]=b[i]/array1[i][i];
if(b[i]==-0.0){//Java中如果有a=0/-1时会出现-0.0
b[i]=-b[i];
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -