📄 binarysearch.java
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class BinarySearch extends JFrame implements ActionListener
{
private JTextArea display = new JTextArea (7,10);
private JButton search = new JButton("二分搜索START!");
private Picture p = new Picture(); //画板
public BinarySearch () //初始化过程
{
p.setBackground(Color.gray);
p.setSize(600,400);
p.setVisible(true);
JPanel control = new JPanel();
control.setBackground(Color.darkGray);
control.setSize(600,200);
control.setVisible(true);
control.add(display);
control.add(search);
search.addActionListener(this);
getContentPane().add(p,"Center");
getContentPane().add(control,"South");
display.append("单击按钮可用动态演示二分搜索全过程,并得出图形的所有根");
display.setEditable(false);
setTitle("数值算法:二分搜索(张轶雯 软件0402 040950211)");
}
public double binarySearch(double begin,double end) //二分搜索算法
{
int HREF=300,VREF=200; //设置坐标
double d=0.000001; //精度值
double a=begin,b=end,x=(begin+end)/2,zzuobiao;
Graphics g=p.getGraphics();
g.setColor(Color.yellow); //创建蓝色的画笔
while (b-a>d)
{
x=(b+a)/2;
for(int i=0;i<=20000000;i++); //延长计算机运行时间
g.drawLine((int)(x*50)+HREF,VREF-30,(int)(x*50)+HREF,VREF); //对搜过的x画线
System.out.println(x);
if (Math.sin(x)*Math.sin(a)<0)
b=x;
else
a=x;
}
zzuobiao=2*Math.sin(x);
g.setColor(Color.green);
g.fillOval((int)(x*50)+HREF,-(int)(zzuobiao*50)+VREF,5,5);
g.drawString(String.valueOf(x),(int)(x*50)+HREF,VREF+15); //对最终结果做标记
return x; //返回二分搜索得出的根值
}
public void actionPerformed(ActionEvent e)
{
display.append('\n'+"y=2sinx的根为:");
double m=-4.6,n=5.0,x0=0.0;
for (;m<5.0 ;m+=1.0){ //逐段检验是否存在根值
if (Math.sin(m)*Math.sin(m+1)<=0){
x0=binarySearch(m,m+1); //若存在,调用二分搜索算法
display.append('\n'+"x="+x0);
}
}
}
public static void main(String args[])
{
BinarySearch f = new BinarySearch();
f.setBackground(Color.black);
f.setSize(600,600);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
}
class Picture extends JPanel //画板初始化
{
private final int HREF = 300 , VREF = 200;
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.black);
g.drawString("用二分法求y=2sinx在图中的所有根",5,15);
g.setColor(Color.white);
g.drawLine(HREF-250,VREF,HREF+250,VREF);
g.drawLine(HREF,VREF-160,HREF,VREF+160);
g.drawLine(HREF+245,VREF-5,HREF+250,VREF);
g.drawLine(HREF+245,VREF+5,HREF+250,VREF);
g.drawLine(HREF-5,VREF-155,HREF,VREF-160);
g.drawLine(HREF+5,VREF-155,HREF,VREF-160);
g.drawString("0",HREF,VREF);
g.drawString("x",HREF+255,VREF);
g.drawString("y=2sinx",HREF,VREF-165); //建坐标
int rate = 50,HBound,VBound;
double hBound,vBound;
double a= -5.0,b=5.0;
int m = (int)(rate * a),n = (int)(rate*b);
g.setColor(Color.red);
for(HBound=m; HBound<=n;HBound++)
{
hBound = (double)HBound/rate;
vBound = 2*Math.sin(hBound);
VBound = (int)(vBound*rate);
g.drawLine(HBound+HREF,-VBound+VREF,HBound+HREF,-VBound+VREF);
} //画函数 y=2sinx
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -