2010年12月21日 星期二

【C語言】二元搜尋樹的刪除實作

要考研究所,加上又是資結組的,所以無聊就來寫個.....二元搜尋樹的刪除吧

因為在書上都沒看過這類的實做,所以就實做一個吧

在刪除Binary Search Tree的某節點時,如果刪除的是樹葉節點 (Leaf) 就直接刪除

如果為非樹葉結點時 (non-Leaf) 時,就須以該刪除點為基準以左子數最大或是右子樹最小取代

以下程式的實作中,我統一以左子樹中最大的來取代刪除的點

在製作過程中較困難也最重要的是如果刪除該點後以左子樹最大取代

取代被刪除的點之後,左子樹最大的點及其父親節點和其而子結點該如何處理?

左圖為以下程式範例所建立的二元搜尋樹

以刪除20為例,程式會以左邊最大的節點15

去代 20。

2010年12月16日 星期四

十六進制轉八進制使用 C#

16進制轉成8進制,可以透過C# 的內建函數解決 Convert.toString()

如果想要實做的話就先了解如何轉換,首先 16 進制顧名思義就是遇到16就進位

所以可以表示的範圍為1 ~ 15, 但是10 ~ 15 以 A ~ F 取代

以下範例 先將 16 轉成 2 進制 > 針對每個16進制的數字 拆解成4個位元以表示2進制

 F > 1111 , 8 > 1000

最後再將 2 進制轉成 8 進制 > 針對二進位中從尾巴開始數每三個數字及組合成一個8進制數字
如果不足及補零

10101100 每三個分隔 > 10|101|100 > 不足則補零 > 010|101|100 > 轉8進制 > 254

以下為程式實做

2010年12月15日 星期三

2010年12月11日 星期六

Java 程式 - 螺旋矩陣

問題描述 :
螺旋矩陣是一個短陣,其中每個cell都填滿整數,且每個整數以螺旋的方式排列。

下圖為二個size = 8的螺旋矩陣。圖(a),數字由1開始,以逆時鐘的方向,螺旋狀地往中心排列。

而圖(b)則是一個順時鐘的螺旋矩陣,和圖(a)不一樣之處在於其數字的旋轉方向為順時鐘旋轉。


輸入說明:

輸入為一行字串,包含了兩個數值,每個數值以逗點隔開。
第一個數值為size,其值介於1到30間(i.e., 1 <= size <= 30)。
第二個數值為方向,1為順時鐘方向,2為逆時鐘方向。

2010年12月9日 星期四

JSP 教學 - 檔案下載

關於檔案下載,以下就直接以一個範例來下載一個檔案

當然這只是個最簡單的範例,其餘應用就靠各位自己發揮吧

首先在 JSP 或 HTML 可以用一個連結或是 form 請求後進入後台處理

以下為我以 C 槽的檔案進行下載
package fsc.regLogIdent.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class getFile extends HttpServlet
{
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        java.io.File file = new java.io.File("C:\\bike_up.jpg");  //建立需下載檔案的 File 物件
        long length = file.length();   //取出該檔案長度
        java.io.FileInputStream fi = new java.io.FileInputStream(file);   //建立該檔案的輸入串流
        //取得客戶端的輸出流, 這邊以 OutputStream 為輸入串流的物件
        java.io.OutputStream os = response.getOutputStream();   
        //設定 response 封包中的標頭
        response.setHeader("Content-Disposition", "attachment; filename=" + "bike_up.jpg"); 
        //設定欲下載檔案的 ContentType
        response.setContentType("image/jpeg");
        //設定該檔案的長度
        response.setHeader("Content_Length", Long.toString(length));
        int r = 0;
        //將檔案讀入 FileInputStream  並寫入 OutputStream
        while((r =  fi.read()) != -1)
        {
            os.write(r);
        }
        os.close();
        fi.close();
    } 
}

2010年12月4日 星期六

JSP 教學 - 多檔上傳

前一篇介紹了檔案上傳,但是只能一次上傳一個檔案

而且做法是簡單說就是邊讀傳流的資料邊判斷編寫入,過程其實不好控制,也複雜

更重要的是也很難實現多檔上傳,所以那個方法並非非常理想,但也是個選擇

而這篇介紹的多檔上傳就是一次把串流的資料讀完再去做分檔即寫入的動作

還記得上傳的本文內容吧,以下來看看如果是多檔上傳時他的本文內容是啥樣子


------WebKitFormBoundaryGq7bBR8Pb4HYPKfp
Content-Disposition: form-data; name="uploadFile"; filename="m.txt"
Content-Type: text/plain

內容一內容一內容一內容一
 ------WebKitFormBoundaryGq7bBR8Pb4HYPKfp
Content-Disposition: form-data; name="uploadFile"; filename="m1.txt"
Content-Type: text/plain

內容二內容二內容二內容二
------WebKitFormBoundaryGq7bBR8Pb4HYPKfp-- 

2010年11月28日 星期日

JSP 教學 - 檔案上傳

檔案上傳廣泛運用在網路硬碟上,提供使用者一個空間儲存資料,接下來介紹一下檔案上傳的一些關鍵點

首先是 HTML 的部份,通常都會用一個 form 來執行,而讓使用者選擇檔案的標籤則是 input type="file",看看底下的HTML片段吧
<form action="/regLogIdent/upload.do"method="post"
                                        enctype="multipart/form-data" >
            <input type="file" name="uploadFile" />
            <input type="submit" value="submit" />
</form>
以上的 form 標籤中有一個要點即是 enctype="multipart/form-data",這是上傳文件時須加載的屬性,所以 form 送出請求時的封包格式會有些差異
以下來看看上傳檔案時封包所顯示的格式,以下為程式片斷,觀察封包的標頭及值


//透過 HttpServletRequest 的 getHeaderNames() 取得所有標頭,注意型態為 Enumeration
Enumeration e = request.getHeaderNames(); 

while(e.hasMoreElements()){
    String headername = (String)e.nextElement(); //取得標頭
      out.println(headername + " : " + 
        request.getHeader(headername) + "<br />");//用 getHeader(String headerName) 取得該標頭值
}

2010年11月21日 星期日

JSP 教學 - PreparedStatement 的使用

在一般的 Java 程式裡如果要插入一筆資料到資料表中,最基本的方法都是用 java.sql.Statement 去做,譬如:
Statement state = connection.createStatement();
state.executeUpdate("SQL 語法");
通常上面的 SQL 語法會寫的太凌亂,譬如太多的單引號和雙引號交錯導致可讀性不易,例如


state.executeQuery("INSERT INTO temp(account, user, password) VALUES('" + account + "','" + username + "','" + password + "')"); //以上的三個變數都為字串
以上有個替代方法就是利用 java.sql.PreparedStatement
可以很簡單的表示成以下


String sql = "INSERT INTO temp(account, user, password) VALUES(?, ? ,?)";
PreparedStatement prestate =  connection.prepareStatement(sql); //先建立一個 SQL 語句並回傳一個 PreparedStatement 物件
prestate.setString(1, account); //對應到第一個問號
prestate.setString(2, user); //對應到第二個問號

2010年11月15日 星期一

JSP 教學 - JavaMail 電子郵件處理

我們可以透過 JavaMail API 來進行電子郵件的處理,首先必須先去下載 JavaMail 套件

可以到 http://www.oracle.com/technetwork/java/javamail-1-4-2-141075.html

下載最新的 JavaMail 1.4.2 API ,可以選擇下載壓縮檔,下載完成並解壓縮後

我們需要的是 mail.jar 即可,如果需要處理附加檔案的話則還要另外下載

JavaBeans Activation Framework(JAF)來配合 JavaMail
接下來介紹一下 JavaMail 的用途,在寫 JSP 的登入的時候如果使用者忘記密碼


那就是用到 JavaMail 的時候了,我以 NetBeans 為例實現寄送電子郵件的功能


首先將剛剛下載的 mail.jar 匯入到 project 中,在側邊欄的 Liberaries 點擊右鍵 > Add Library

接下來可以在一個 Servlet 中進行郵件處理,在這之前可能需要先讓使用者

2010年11月13日 星期六

JSP 教學 - 圖文驗証碼製作

概述:在登入或是註冊的時候加上驗證碼,可以防止有心人批量的註冊或登入或是到取別人的
帳密。

圖形驗證碼的製作以 Java 2D 為基礎,透過 Servlet 動態產生驗證碼。

這邊作法有兩種,一種是已經事先產生好大量的驗證碼再去隨機取一張,另一種是如上述的方法

動態產生一張圖形驗證碼,這樣是比較安全的狀況,如果把驗證的圖放在某目錄下又沒加以保護

很容易讓人直接以URL取得你的所有圖檔,

以 Xuite 為例就是如此,在我這製作專題的過程中就是碰到類似問題幸好.....Xuite 不是動態產生,不然專題早掛摟....

首先先配置一個 Servlet 吧,以下為 SignalPage.java