-
java+mysql圖形界面開發 ---- ----圖文并茂酒店預訂系統
圖形用戶界面(Graphics User Interface,GUI)是用戶與程式互動的視窗,比命令列的界面更加直觀并且更好操作
這是本人第一篇博客,希望和各位一起進步,這是本人在java學習程序中一步步實作的酒店預訂系統,功能較完全,錯誤之處還望各位大神指正,另外在代碼中加入了使界面外觀更加美觀的代碼段,
1.步驟一:登錄界面的實作
代碼如下:
class into extends JFrame implements ActionListener{
public static String driver="com.mysql.cj.jdbc.Driver";
public static String URL="jdbc:mysql://localhost:3306/hotel?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
public static String username="root";
public static String password="828924";
JFrame R1;
JPanel P1,P2;
JLabel L1,L2;
JTextField F1,F2;
JButton B1,B2,B3;
public into()
{
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}//此處使界面外觀更加美觀,可以作為常用代碼提高界面可觀性
}catch(Exception e) {
System.out.println(e);
}
R1=new JFrame();
R1.setLayout(new BorderLayout());
P1=new JPanel();
P1.setLayout(new GridLayout(2,2,-10,5));
P2=new JPanel();
L1=new JLabel("用戶名");
L2=new JLabel("密碼");
F1=new JTextField(10);
F2=new JTextField(10);
B1=new JButton("登錄");
B1.addActionListener(this);
B2=new JButton("注冊");
B2.addActionListener(this);
B3=new JButton("退出");
B3.addActionListener(this);
P1.add(L1);
P1.add(F1);
P1.add(L2);
P1.add(F2);
P2.add(B1);
P2.add(B2);
P2.add(B3);
R1.add(P1,BorderLayout.CENTER);
R1.add(P2,BorderLayout.SOUTH);
R1.pack();
R1.setVisible(true);
R1.setLocationRelativeTo(null);
R1.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
@Override
}
運行界面如圖所示:

1.1登錄按鈕實作:
代碼實作:
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
Class.forName(driver);
Connection con1=DriverManager.getConnection(URL,username,password);
//System.out.println("連接成功");
Statement stat1=con1.createStatement();
String sql2="select * from room_customer";
ResultSet set1=stat1.executeQuery(sql2);
if(e.getActionCommand()=="登錄")
{
// R1.dispose();
// new P2();
if(F1.getText()==null || F1.getText().equals(""))
{
JOptionPane.showMessageDialog(null, "請輸入正確的用戶名","標題",JOptionPane.ERROR_MESSAGE);
}
else
{
while(set1.next())
{
if(F1.getText().equals(set1.getString(1)))
{
//System.out.println(set1.getString(1));
if(F2.getText().equals(set1.getString(2)))
{
//System.out.println(set1.getString(2));
String stri=set1.getString(1);
R1.dispose();
new P2(stri);
}
else
JOptionPane.showMessageDialog(null, "密碼錯誤","標題",JOptionPane.ERROR_MESSAGE);
}
}
}
}
if(e.getActionCommand()=="注冊")
{
R1.dispose();
new zhuce();
}
if(e.getActionCommand()=="退出")
{
System.exit(0);
}
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
這里是參考 實作監聽登錄按鈕時通過與資料庫hotel中的表room_customer連接實作資料互通,通過輸入行F1,F2與表中對應資料作比較來顯示下一界面
成功進入界面:

進入失敗界面:


以下為登錄后相關功能的實作及資料庫的相關操作
1.1.1功能一:查詢全部房間資訊
if(e.getActionCommand()=="查詢全部房間資訊")
{
JFrame Y1=new JFrame();
JScrollPane S1=new JScrollPane();
JTable T1;
Object a1[]= {"房間號","房間型別","房間價格","房間狀態"};
Object a2[][]=new Object[17][4];
try {
Class.forName(driver);
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
Connection con=DriverManager.getConnection(URL,username,password);
Statement stat=con.createStatement();
String sql1="select * from room";
ResultSet set=stat.executeQuery(sql1);
int i=0;
while(set.next())
{
for(int j=0;j<4;j++)
{
a2[i][j]=set.getString(j+1);
}
i++;
}
set.close();
stat.close();
con.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
T1=new JTable(a2,a1);
//S1.setBounds(200, 100, 550, 650);
S1.setViewportView(T1);
T1.setRowHeight(35);
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
T1.setDefaultRenderer(Object.class,r);
Y1.add(S1);
Y1.pack();
Y1.setLocationRelativeTo(null);
Y1.setDefaultCloseOperation(EXIT_ON_CLOSE);
Y1.setVisible(true);
}
由于博主在撰寫代碼時將其代碼全部歸與一個主類,所以有的代碼前面并沒有匯入包,相關全部代碼在下面將給出鏈接,
運行界面:
通過JTable將資料庫中的資料以表格形式顯示清晰明了
1.1.2功能二:按房間號查詢
if(e.getActionCommand()=="按房間號查詢房間")
{
String number=JOptionPane.showInputDialog(null,"請輸入房間號:\n","title",JOptionPane.PLAIN_MESSAGE);
//System.out.println(number);//檢測輸入
if(number.length()==0)
{
JOptionPane.showMessageDialog(null, "請正確輸入房間號!╮(╯▽╰)╭", "標題",JOptionPane.ERROR_MESSAGE);
}
else
{
int n = JOptionPane.showConfirmDialog(null, "是否確定?", "標題",JOptionPane.YES_NO_OPTION); //回傳值為0或1
if(n==0)
{
//System.out.println("是");
try {
int num=Integer.parseInt(number);
System.out.println(num);
getClass().forName(driver);
Connection con1=DriverManager.getConnection(URL,username,password);
Statement stat1=con1.createStatement();
String sql2="select * from room where id="+num;
ResultSet set1=stat1.executeQuery(sql2);
JFrame X1=new JFrame();
JScrollPane X2=new JScrollPane();
JTable X3;
Object x1[]= {"房間號","房間型別","房間價格","房間狀態"};
Object x2[][]=new Object[2][4];
int i=0;
while(set1.next())
{
for(int j=0;j<4;j++)
{
x2[i][j]=set1.getString(j+1);
}
i++;
}
X3=new JTable(x2,x1);
X2.setViewportView(X3);
X3.setRowHeight(35);
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
X3.setDefaultRenderer(Object.class,r);
X1.add(X2);
X1.pack();
X1.setLocationRelativeTo(null);
X1.setDefaultCloseOperation(EXIT_ON_CLOSE);
X1.setVisible(true);
set1.close();
stat1.close();
con1.close();
} catch (ClassNotFoundException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
else
{
System.out.println(1);
}
}
}
運行界面:


1.1.3功能三:按房間型別查詢
if(e.getActionCommand()=="按房間型別以查詢")
{
Object[] obj2 ={ "大床房", "雙人間", "商務房","家庭房" };
String s = (String) JOptionPane.showInputDialog(null,"請選擇房間型別:\n", "身份", JOptionPane.PLAIN_MESSAGE, new ImageIcon("icon.png"), obj2, "足球");
System.out.println(s);
//System.out.println("是");
try {
getClass().forName(driver);
Connection con1=DriverManager.getConnection(URL,username,password);
PreparedStatement stat1=con1.prepareStatement(" select * from room where type_room =?");
stat1.setString(1, s);
ResultSet stat=stat1.executeQuery();
JFrame X1=new JFrame();
JScrollPane X2=new JScrollPane();
JTable X3;
Object x1[]= {"房間號","房間型別","房間價格","房間狀態"};
Object x2[][]=new Object[5][4];
int i=0;
while(stat.next())
{
for(int j=0;j<4;j++)
{
x2[i][j]=stat.getString(j+1);
}
i++;
}
X3=new JTable(x2,x1);
X2.setViewportView(X3);
X3.setRowHeight(35);
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
X3.setDefaultRenderer(Object.class,r);
X1.add(X2);
X1.pack();
X1.setLocationRelativeTo(null);
X1.setDefaultCloseOperation(EXIT_ON_CLOSE);
X1.setVisible(true);
stat.close();
stat1.close();
} catch (ClassNotFoundException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
運行界面:


房間型別有四個選項
1.1.4功能四:按房間價格查詢
if(e.getActionCommand()=="按房間價格查詢")
{
price x1=new price();
}
實作單一價格查詢
class price extends JFrame implements ActionListener{
public static String driver="com.mysql.cj.jdbc.Driver";
public static String URL="jdbc:mysql://localhost:3306/hotel?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
public static String username="root";
public static String password="828924";
JFrame M1;
JPanel M2,M3;
JLabel M4,M5;
JTextField M6,M7;
JButton B1,B2,B3;
public price()
{
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}catch(Exception e) {
System.out.println(e);
}
Object x1[]= {"房間號","房間型別","房間價格","房間狀態"};
Object x2[][]=new Object[17][4];
M1=new JFrame();
M1.setLayout(new BorderLayout());
M2=new JPanel();
M2.setLayout(new GridLayout(2,2));
M3=new JPanel();
M4=new JLabel("最低價");
M5=new JLabel("最高價");
M6=new JTextField(10);
M7=new JTextField(10);
B1=new JButton("確定");
B1.addActionListener(this);
B2=new JButton("回傳");
B2.addActionListener(this);
B3=new JButton("退出");
B3.addActionListener(this);
M2.add(M4);M2.add(M6);
M2.add(M5);M2.add(M7);
M3.add(B1);M3.add(B2);M3.add(B3);
M1.add(M2,BorderLayout.CENTER);
M1.add(M3,BorderLayout.SOUTH);
M1.pack();
M1.setLocationRelativeTo(null);
M1.setDefaultCloseOperation(EXIT_ON_CLOSE);
M1.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getActionCommand()=="確定")
{
try {
getClass().forName(driver);
Connection con1=DriverManager.getConnection(URL,username,password);
PreparedStatement stat1=con1.prepareStatement(" select * from room where price between ? and ?");
M1.dispose();
//System.out.println(M6.getText());
if((M6.getText()==null||M6.getText().equals(""))||(M7.getText()==null||M7.getText().equals("")))
{
JOptionPane.showMessageDialog(null, "請重新輸入","標題",JOptionPane.ERROR_MESSAGE);
}
else
{
String t1=M6.getText();
String t2=M7.getText();
// int a1=Integer.parseInt(M6.getText());
// int a2=Integer.parseInt(M7.getText());
stat1.setString(1, t1);
stat1.setString(2, t2);
try {
ResultSet set1=stat1.executeQuery();
JFrame X1=new JFrame();
JScrollPane X2=new JScrollPane();
JTable X3;
Object x1[]= {"房間號","房間型別","房間價格","房間狀態"};
Object x2[][]=new Object[17][4];
int i=0;
while(set1.next())
{
for(int j=0;j<4;j++)
{
x2[i][j]=set1.getString(j+1);
}
i++;
}
X3=new JTable(x2,x1);
X2.setViewportView(X3);
X3.setRowHeight(35);
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
X3.setDefaultRenderer(Object.class,r);
X1.add(X2);
X1.pack();
X1.setLocationRelativeTo(null);
X1.setDefaultCloseOperation(EXIT_ON_CLOSE);
X1.setVisible(true);
set1.close();
stat1.close();
con1.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
} catch (ClassNotFoundException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
} catch (SQLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
}
}
實作單一價格查詢
運行界面:


1.1.5功能五:按房間狀態查詢
if(e.getActionCommand()=="按房間狀態查詢")
{
Object[] obj2 ={"空閑","非空閑"};
String s = (String) JOptionPane.showInputDialog(null,"請選擇房間狀態:\n", "身份", JOptionPane.PLAIN_MESSAGE, null, obj2, "空閑");
//System.out.println(s);
//System.out.println("是");
try {
getClass().forName(driver);
Connection con1=DriverManager.getConnection(URL,username,password);
PreparedStatement stat1=con1.prepareStatement(" select * from room where status_room =?");
stat1.setString(1, s);
ResultSet stat=stat1.executeQuery();
JFrame X1=new JFrame();
JScrollPane X2=new JScrollPane();
JTable X3;
Object x1[]= {"房間號","房間型別","房間價格","房間狀態"};
Object x2[][]=new Object[17][4];
int i=0;
while(stat.next())
{
for(int j=0;j<4;j++)
{
x2[i][j]=stat.getString(j+1);
}
i++;
}
X3=new JTable(x2,x1);
X2.setViewportView(X3);
X3.setRowHeight(35);
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
X3.setDefaultRenderer(Object.class,r);
X1.add(X2);
X1.pack();
X1.setLocationRelativeTo(null);
X1.setDefaultCloseOperation(EXIT_ON_CLOSE);
X1.setVisible(true);
stat.close();
stat1.close();
} catch (ClassNotFoundException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
運行界面:


1.1.6功能六:訂房
class ding extends JFrame implements ActionListener{
public static String driver="com.mysql.cj.jdbc.Driver";
public static String URL="jdbc:mysql://localhost:3306/hotel?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
public static String username="root";
public static String password="828924";
public static String rr;
JFrame W1;
JPanel X1,G1;
JLabel S1;
JButton B1,B2;
JScrollPane X2;
public ding(String ee) throws Exception
{
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}catch(Exception e) {
System.out.println(e);
}
String s=JOptionPane.showInputDialog(null,"請輸入預訂房間號","標題",JOptionPane.PLAIN_MESSAGE);
if(s==null || s.equals(""))
{
JOptionPane.showMessageDialog(null,"請重新輸入","標題",JOptionPane.ERROR_MESSAGE);
}
else
{
Class.forName(driver);
Connection cor=DriverManager.getConnection(URL,username,password);
PreparedStatement ssr=cor.prepareStatement("select status_room from room where id=?");
ssr.setString(1, s);
ResultSet ddl=ssr.executeQuery();
String ssy=null;
while(ddl.next())
{
ssy=ddl.getString(1);
}
if(ssy==null || ssy.equals("非空閑"))
{
JOptionPane.showMessageDialog(null,"房間不存在或他人預訂","標題",JOptionPane.ERROR_MESSAGE);
}
else
{
Class.forName(driver);
Connection con=DriverManager.getConnection(URL,username,password);
PreparedStatement pre=con.prepareStatement("update room set status_room =? where id=?");
pre.setString(1,"非空閑");
pre.setString(2, s);
pre.executeUpdate();
pre.close();
///將房間狀態改為非空閑
PreparedStatement pre1=con.prepareStatement("select * from room where id=?");
pre1.setString(1,s);
ResultSet set1=pre1.executeQuery();
Object a2[][]=new Object[1][4];
while(set1.next())
{
for(int i=0;i<4;i++)
{
a2[0][i]=set1.getString(i+1);
}
}
set1.close(); pre1.close();
//將陣列中內容添加到新表中,判斷存在與否,操作后將表洗掉,達到查看客戶已訂房訂單
rr=ee; //將登陸用戶名傳入
//System.out.println(rr);
String sss=rr;
PreparedStatement st=con.prepareStatement("create table if not exists "+sss+"(id int,type_r varchar(20),price_r int,status_r varchar(20))");
//st.setString(1, sss);
st.execute();
st.close();
/創建名為用戶名的訂單生成表
mysql不支持表名引數傳入
PreparedStatement stt=con.prepareStatement("insert into "+sss+" values(?,?,?,?)");
String a1=(String) a2[0][0];
String a3=(String) a2[0][1];
String a4=(String) a2[0][2];
String a5=(String) a2[0][3];
stt.setString(1, a1);
stt.setString(2, a3);
stt.setString(3, a4);
stt.setString(4, a5);
stt.execute();
stt.close();
//將選擇訂單存入特定表中//成功
int cc=JOptionPane.showConfirmDialog(null,"是否查看你的訂單","標題",JOptionPane.YES_NO_OPTION);
//是為0,否為1
if(cc==1)
System.exit(0);
else
{
PreparedStatement sst=con.prepareStatement("select * from "+sss);
ResultSet ssw=sst.executeQuery();
W1=new JFrame();
W1.setLayout(new BorderLayout());
X1=new JPanel();
G1=new JPanel();
S1=new JLabel("你的訂單:");
X2=new JScrollPane();
JTable X3;
B1=new JButton("回傳");
B1.addActionListener(this);
B2=new JButton("退出");
B2.addActionListener(this);
G1.add(B1);
G1.add(B2);
Object x1[]= {"房間號","房間型別","房間價格","房間狀態"};
Object x2[][]=new Object[17][4]; //一個人只能訂一間房,可改進
int i=0;
while(ssw.next())
{
for(int j=0;j<4;j++)
{
x2[i][j]=ssw.getString(j+1);
}
i++;
}
X3=new JTable(x2,x1);
X2.setViewportView(X3);
X3.setRowHeight(35);
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
X3.setDefaultRenderer(Object.class,r);
X1.add(S1);
X1.add(X2);
W1.add(X1,BorderLayout.CENTER);
W1.add(G1,BorderLayout.SOUTH);
W1.pack();
W1.setLocationRelativeTo(null);
W1.setDefaultCloseOperation(EXIT_ON_CLOSE);
W1.setVisible(true);
}
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getActionCommand()=="退出")
{
System.exit(0);
}
if(e.getActionCommand()=="回傳")
{
W1.setVisible(false);
new P2(null); //傳入引數為null
}
}
}
if(e.getActionCommand()=="訂房")
{
///
try {
new ding(ww);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
訂房類實作細節(資料庫相關表列中值的改變等相關增刪改查操作)這里就不作過多解釋,有問題的小伙伴可以評論出來我一一解答,
1.1.7功能七:退房
if(e.getActionCommand()=="退房")
{
///
try {
new tuichu(ww);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
class tuichu extends JFrame implements ActionListener{
public static String driver="com.mysql.cj.jdbc.Driver";
public static String URL="jdbc:mysql://localhost:3306/hotel?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
public static String username="root";
public static String password="828924";
public static String names;
JFrame W1;
JPanel X1,G1;
JLabel S1,S2;
JButton B1,B2;
JScrollPane X2;
JTextField T1;
public tuichu(String gg) throws Exception
{
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}catch(Exception e) {
System.out.println(e);}
names=gg;
Class.forName(driver);
Connection con=DriverManager.getConnection(URL,username,password);
PreparedStatement sst=con.prepareStatement("select * from "+gg);
ResultSet ssw=sst.executeQuery();
W1=new JFrame();
W1.setLayout(new BorderLayout());
X1=new JPanel();
G1=new JPanel();
S1=new JLabel("你的訂單:");
S2=new JLabel("輸入房號退房:");
T1=new JTextField(7);
X2=new JScrollPane();
JTable X3;
B1=new JButton("確定");
B1.addActionListener(this);
B2=new JButton("退出");
B2.addActionListener(this);
G1.add(S2);
G1.add(T1);
G1.add(B1);
G1.add(B2);
Object x1[]= {"房間號","房間型別","房間價格","房間狀態"};
Object x2[][]=new Object[17][4];
int i=0;
while(ssw.next())
{
for(int j=0;j<4;j++)
{
x2[i][j]=ssw.getString(j+1);
}
i++;
}
X3=new JTable(x2,x1);
X2.setViewportView(X3);
X3.setRowHeight(35);
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
X3.setDefaultRenderer(Object.class,r);
X1.add(S1);
X1.add(X2);
W1.add(X1,BorderLayout.CENTER);
W1.add(G1,BorderLayout.SOUTH);
W1.pack();
W1.setLocationRelativeTo(null);
W1.setDefaultCloseOperation(EXIT_ON_CLOSE);
W1.setVisible(true);
ssw.close();
sst.close();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
Class.forName(driver);
Connection con=DriverManager.getConnection(URL,username,password);
String SSG=T1.getText();
if(e.getActionCommand()=="退出")
System.exit(0);
if(e.getActionCommand()=="確定")
{
if(T1.getText()==null || T1.getText().equals(""))
{
JOptionPane.showMessageDialog(null, "請正確輸入房間號","標題",JOptionPane.ERROR_MESSAGE);
}
else
{
Statement st=con.createStatement();
String STR="delete from "+names+" where id="+SSG;
st.executeUpdate(STR);
st.close();
///洗掉個人訂單表中的房間資訊
Statement stt=con.createStatement();
String sqla="update room set status_room='空閑' where id="+SSG;
stt.executeUpdate(sqla);
stt.close();
con.close();
JOptionPane.showMessageDialog(null, "退房成功!", "哈哈",JOptionPane.INFORMATION_MESSAGE);
}
}
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
運行界面:

關于退房細節中,通過將登錄界面中輸入的用戶名作為引數不斷傳入為每個人創作一張表
總結:
有關本系統中表的建立和相關sql語言實作細節見下一篇博客,
歡迎小伙伴們積極評論,本期將會隨機從評論中的小伙伴抽
取一位幸運小伙伴送出本系統的全部原始碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/267163.html
標籤:其他
上一篇:遞回與分治[資料結構與演算法]

