1. 程式人生 > >Java程式設計(十四)----一個求一元二次方程根

Java程式設計(十四)----一個求一元二次方程根

* 程式的版權和版本宣告部分
* Copyright (c) 2012, 煙臺大學計算機學院學生
* All rights reserved.

* 作 者: 劉鎮
* 完成日期: 2012 年 11 月 23 日
* 版 本 號: 2.014

* 對任務及求解方法的描述部分

* 問題描述:編寫一個FontFamily類,該類物件獲取當前機器可用的全部字型名稱。編寫一個對話方塊FontDialog,該對話方塊是模式對話方塊,採用BorderLayout佈局,包含一個JComboBox放在北面顯示全部字型的名稱,包含一個JLabel放在中間,顯示字型的效果,包含兩個按鈕放在南面,點選YES,在對話方塊所依賴的視窗中設定字型的效果,點選Cancle取消。編寫一個視窗FrameHaveDialog,該視窗有一個按鈕和一個文字區,當單擊該按鈕時,彈出對話方塊FontDialog,然後根據使用者在對話方塊下拉列表中選擇的為顯示文字區中的文字。最後編寫一個程式執行入口進行測試。

*程式碼部分:

MyPanel:

package lz_13w;

import java.awt.FlowLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.nio.DoubleBuffer;

import javax.swing.*;
/*
 * 定義Panel實現係數的輸人和button按鈕:
 * 值得一提的是:通過初始化SetLayout()指定佈局;通過SetSize()和 SetPreferredSize()改變指定了佈局後元件大小如何改變;
 */
public class MyPanel extends Panel{
	JLabel label1, label2, label3;
	JTextField text1, text2, text3;
	JButton button;
	
	MyPanel()
	{
		this.setLayout(new FlowLayout(FlowLayout.CENTER));
		text1 = new JTextField();
		text1.setSize(65, 20);
		text1.setPreferredSize(text1.getSize());
		text2 = new JTextField();
		text2.setSize(65, 20);
		text2.setPreferredSize(text1.getSize());
		text3 = new JTextField();
		text3.setSize(65, 20);
		text3.setPreferredSize(text1.getSize());
		label1 = new JLabel("二次項係數");
		label2 = new JLabel("一次項係數");
		label3 = new JLabel("常數項");
		button = new JButton("確定");
		add(label1);
		add(text1);
		add(label2);
		add(text2);
		add(label3);
		add(text3);
		add(button);
	}
}

SquareEquation:

package lz_13w;
/*
 * 自定義異常:用於無實根情況;
 */
class NoSolveException extends Exception
{
	public String message;

	public NoSolveException() {
		message = "輸入結果無實根!";
	}
	
	public String toString()
	{
		return message;
	}
}
/*
 * A是二次方係數;B是一次放係數;C是常數項係數;x1,x2用於儲存兩個根;m返回資訊;
 */

public class SquareEquation {

	private double A;
	private double B;
	private double C;
	private double x1;
	private double x2;
	public static String m;
	
	public SquareEquation() {
		A = 0;
		B = 0;
		C = 0;
	}
	
	public SquareEquation(double A, double B, double C){
		this.A = A;
		this.B = B;
		this.C = C;
	}
	
	public double getA() {
		return A;
	}

	public void setA(double A) {
		A = A;
	}

	public double getB() {
		return B;
	}

	public void setB(double B) {
		B = B;
	}

	public double getC() {
		return C;
	}

	public void setC(double c) {
		C = c;
	}
	/*
	 * Solve用於用數學公式呢求解兩根:flag是(b^2 - 4 * a * c);
	 *  if語句是用於丟擲無實根異常;而如果有實根則執行相關求解;用m返回求解資訊。
	 */
	public void Solve() throws NoSolveException
	{
		double flag = this.B * this.B - 4 * this.A * this.C;
		
		if(flag < 0)
		{
			NoSolveException exception = new NoSolveException();
			throw exception;
		}
		else
		{
			this.x1 = ((- this.B) + Math.sqrt(flag)) / 2 * this.A;
			if(flag == 0)
			{
				this.x2 = this.x1;
			}
			this.x2 = ((- this.B) - Math.sqrt(flag)) / 2 * this.A;
			m = "根: " + this.x1 + "根: " + this.x2;
		}
	}
}

EquationFrame:

package lz_13w;

import java.awt.BorderLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JTextArea;
/*
 * 對窗體的編寫:用MyPanel、JTestArea和求解類SquarEquation將視窗實現。
 * 
 */
public class EquationFrame extends JFrame implements ActionListener{
	MyPanel panel;
	JTextArea textArea;
	SquareEquation s1;
	
	public EquationFrame() {
		this.setLayout(new BorderLayout());
		panel = new MyPanel();
		panel.button.addActionListener(this);
		textArea = new JTextArea();
		textArea.setBounds(getX(), getY(), 100, 100);
		add(panel, BorderLayout.NORTH);
		add(textArea, BorderLayout.CENTER);
		setBounds(450, 300, 600, 125);
		setVisible(true);
		validate();
	}
	
	/*
	 * 
	 * (non-Javadoc)
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 * 下面定義了事件actionPerformed,實現的思想是:初始化EquationFrame,初始引數通過三個TextArea元件獲得,並將有可能的兩種異常捕獲,一個是資料輸入錯誤異常;一個是無實根異常;
	 * 通過一個自定義異常和預設的NumberFormatException列印到TextArea中顯示;否則無異常直接顯示結果。
	 */
	
	public void actionPerformed(ActionEvent e) {
		try {
			s1 = new SquareEquation(Double.valueOf(panel.text1.getText()), Double.valueOf(panel.text2.getText()), Double.valueOf(panel.text3.getText()));
			s1.Solve();
		}catch(NumberFormatException e1){
			s1.m = "輸入有誤,發生異常:" + e1.getMessage();
			this.textArea.setText(s1.m);
		}catch (NoSolveException e2) {
			s1.m = e2.toString();
			this.textArea.setText(s1.m);
		}
		this.textArea.setText(s1.m);
	}
}

 TestEquation:

package lz_13w;

public class TestEquation {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new EquationFrame();

	}

}

 測試結果:

 心得經驗:

一、以前沒寫過註釋,最近接觸了幾個同學,他們參賽的體會是註釋雖然不是對程式本身有什麼改進,但對於後面維護,或是說善後工作有幫助,儘管現在由於程式碼量不大體現不明顯;但好習慣還是早養成的好;

二、在MyPanel中:以前總是覺得為什麼SetSize()不能改變組建的大小啊,鬱悶之後,發現:每當我設定畫布或是視窗的佈局,就將setSize()遮蔽了(也許不太貼切),但確實setLayout()優先順序高於SetSize(),從網上查找了倆解決辦法,從而使組建能按自己意願調整大小:1、通過setLayout(null);總覺得這樣是不太好的方法;到哪也能解決。2、通過加:SetSize(12, 33);和SetPreferredSize(getSize());設定指定大小的組建;

三、在解決佈局時以前總是用:“SetLayout(new FlowLayout());”,總是覺得組建不能固定大小位置,按照輸入自己在調整大小位置;現在:SetLayout(new FlowLayout(FlowLayout.Center));將組建固定在佈局中,居中顯示;

 四、一個半解決的問題:在自定義異常中:SquationFrame中捕獲的異常不能通過:e1.getMessage()或是 e1.toString()直接通過JTextArea中的SetText()顯示,必須通過先賦值給一個String變數,再顯示;不知問題出在哪,有待解決。具體程式碼:

catch(NumberFormatException e1){

s1.m = "輸入有誤,發生異常:" + e1.getMessage();

this.textArea.setText(s1.m);}

catch (NoSolveException e2) {

s1.m = e2.toString();

this.textArea.setText(s1.m);}