Java计算行列式(Swing)

上一篇文章,我用的是控制台实现的计算行列式,这一次,我决定搞一个有界面的程序。 代码附上:

package swing;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.*;
import javax.swing.JTextField;

import 行列式.*;
import java.awt.event.*;
import java.math.BigDecimal;
import java.awt.Dimension;

class ArithUtil{  
    private static final int DEF_DIV_SCALE=10;  
      
    private ArithUtil(){}  
    //精确的加法算法
    public static double add(double d1,double d2){  
        BigDecimal b1=new BigDecimal(Double.toString(d1));  
        BigDecimal b2=new BigDecimal(Double.toString(d2));  
        return b1.add(b2).doubleValue();  
          
    }  
    //精确的减法算法  
    public static double sub(double d1,double d2){  
        BigDecimal b1=new BigDecimal(Double.toString(d1));  
        BigDecimal b2=new BigDecimal(Double.toString(d2));  
        return b1.subtract(b2).doubleValue();  
          
    }  
    //精确的乘法算法  
    public static double mul(double d1,double d2){  
        BigDecimal b1=new BigDecimal(Double.toString(d1));  
        BigDecimal b2=new BigDecimal(Double.toString(d2));  
        return b1.multiply(b2).doubleValue();  
          
    }  
    //相对精确的除法运算,当发生除不尽的情况时,精确到小数点以后10位  
    public static double div(double d1,double d2){  
  
        return div(d1,d2,DEF_DIV_SCALE);  
          
    }  
    //相对精确的除法运算,当发生除不尽的情况时,精确到小数点以后指定精度(scale),再往后的数字四舍五入
    public static double div(double d1,double d2,int scale){  
        if(scale<0){  
            throw new IllegalArgumentException("The scale must be a positive integer or zero");  
        }  
        BigDecimal b1=new BigDecimal(Double.toString(d1));  
        BigDecimal b2=new BigDecimal(Double.toString(d2));  
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  
          
    }  
      
}  

public class JPanelDemo {

    static int Num;
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
        JFrame map=new JFrame("计算矩阵");    //创建一个JFrame对象
        
        map.setBounds(300, 100, 400, 600);    //设置窗口大小和位置
        
        map.setResizable(false);			//窗体固定大小
        
        JPanel user=new JPanel();    //创建一个JPanel对象
        JPanel south=new JPanel();    //创建一个JPanel对象
        JPanel left=new JPanel();    //创建一个JPanel对象
        JPanel right=new JPanel();    //创建一个JPanel对象
        JPanel network=new JPanel();    //创建一个JPanel对象
        JLabel label=new JLabel("行列式阶数:");    //创建一个标签
        JButton okbutton=new JButton("确定");    //创建一个按钮
        JTextField text=new JTextField("",2);  //创建一个输入框
        JLabel Asum=new JLabel("");
        JButton count=new JButton("计算");
        
        map.add(user,BorderLayout.NORTH);
        map.add(network,BorderLayout.CENTER);
        map.add(south,BorderLayout.SOUTH);
        map.add(right,BorderLayout.WEST);
        map.add(left,BorderLayout.EAST);
        
        user.setPreferredSize(new Dimension(0,50));
        right.setPreferredSize(new Dimension(50,0));
        left.setPreferredSize(new Dimension(50,0));
        south.setPreferredSize(new Dimension(0,250));
        south.add(Asum);
        south.add(count);
        network.setBackground(Color.white);    //设置背景色
        user.add(label);    //将标签添加到面板
        user.add(text);
        user.add(okbutton);
        
        okbutton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
        		network.removeAll();
				String str;
				str=text.getText(); 
				Num=Integer.parseInt(str);
        		network.setLayout(new GridLayout(Num,Num));
        		JTextField[][] A=new JTextField[Num][Num];
        		for(int i=0;i<Num;i++)
        		{
        			for(int j=0;j<Num;j++)
        			{
        				A[i][j]=new JTextField(2);
        				network.add(A[i][j]);
        			}
        		}
		        count.addActionListener(new ActionListener() {
		        	public void actionPerformed(ActionEvent b)
		        	{
		        		Asum.setText(Double.toString(Array(A,Num)));
		        	}
		        });
                map.setVisible(true);
            }
            
        });


        map.setVisible(true);    //设置窗口可见
	}
	public static double Array(JTextField A[][],int num)
	{
		double[][] a=new double[num][num];
		for(int i=0;i<Math.pow(num,2);i++)
		{
			double d;
			if(A[i/num][i%num].getText().contains("/"))
				a[i/num][i%num]=ArrayCount.eval(A[i/num][i%num].getText());
			else
			{
				d=Double.parseDouble(A[i/num][i%num].getText());
				a[i/num][i%num]=d;
			}
		}
		int t=1;
		while(num>2)
		{
			double p;
			double temp;
			int k;
			for(int i=0;i<num-1;i++)   ///此循环用于把矩阵降阶,直到阶数为二
			{
				if(a[num-1][num-1]==0)		///判断a[n-1][n-1]元素是否为零
				{
					for(k=0;k<num-1;k++)   ///如果a[n-1][n-1]等于0,那么就用最底下元素不为零的那一列的替换现在的最后一列,而且t乘-1
					{
						if(a[num-1][k]!=0)
						{ 
							for(int j=0;j<num;j++)
							{
								temp=a[j][k];
								a[j][k]=a[j][num-1];
								a[j][num-1]=temp;
							}
							t*=-1;
							break;		///替换完跳出循环
						}
					} ///
				}
				p=-1*ArithUtil.div(a[num-1][i],a[num-1][num-1]);
				for(int j=0;j<num;j++)
				{
					a[j][i]=ArithUtil.add(a[j][i],ArithUtil.mul(a[j][num-1],p));
				}
			}
			t*=a[num-1][num-1];
			num--;
		}
			return a[0][0]*a[1][1]-a[0][1]*a[1][0]==0?a[0][0]*a[1][1]-a[0][1]*a[1][0]:t*(a[0][0]*a[1][1]-a[0][1]*a[1][0]);
	}
}

界面:
Java计算行列式(Swing)_第1张图片Java计算行列式(Swing)_第2张图片Java计算行列式(Swing)_第3张图片

一定要建立一个包,放我上一篇文章里的类,因为这个代码会调用上一篇代码里面的一些函数。

你可能感兴趣的:(Java计算行列式(Swing))