用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();

}

}

測試結果:

0b9a682b9802e1ef92c55e925c2e5700.jpe

1b944314c04d8776f3c5690b8ae2144a.jpe

心得經驗:

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

二、在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);}

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页