彙整

Posts Tagged ‘程式設計’

ISO C++ Committee Approves C++0x Final Draft

四月 1, 2011 發表迴響
類別:程式設計 標籤:,

[C/C++] Read configuration file

三月 26, 2011 發表迴響

說來也趣味,這篇文章的起因是因為我在改寫 Apriori code時,由於看不懂其中某段configure_file的操作,就上網找一些資訊。
繼續閱讀…

類別:程式設計 標籤:,

Java 教學

三月 19, 2011 發表迴響

上網找了一些Java 教學資源,發現了幾個不錯的網站。

  1. 暨南大學資管系商業自動化研究室的Java Programming
  2. 良葛格的Java (上)
  3. 良葛格的Java (下)
類別:程式設計 標籤:,

[C/C++] try … catch(…) 用法

三月 14, 2011 發表迴響

因為寫的程式都是自己用,所以很少在寫Exception。
今天看到某個在職畢業學長的Codes 有下面的東西。

try {
}catch(…){
}
當時猜說該不會是for any exception的意思吧?
去google了一下,果然八九不離十。
http://se.csai.cn/ExpertEyes/No138.htm
建議有興趣的人可以看上面的連結。
主要是在講說當你有很多個exceptions 要處理時,為了避免漏抓exception或是為了
一次抓取所有丟出來的的exception,便使用C++中的catch(…)的特殊用法。

類別:程式設計 標籤:,

C/C++ Thread Issue

三月 14, 2011 發表迴響

Hadoop setup and map/reduce programming

三月 9, 2011 發表迴響

雲端運算基礎課程 (Hadoop簡介、安裝與範例實作)

Hadoop single setup

Hadoop map/reduce programming
注意!它的javadoc解說部分有些錯誤!下載後,解壓縮到/usr/lib/jvm/sun-java6-jdk底下

[PHP] 根目錄的路徑

二月 27, 2011 發表迴響

感謝PTT網友appleboy46提供以下做法:

在根目錄放置 config.php 檔案,裡面定義:

define('Document_root',dirname(__FILE__));

之後每個檔案請寫入:

$root_path = "./";
include($root_path . 'config.php');

之後要 include 任何檔案,都可以直接用 Document_root 來定義

echo Document_root . "/template.php";

推薦的軟體設計的書籍

二月 27, 2011 發表迴響

軟體設計推薦書籍書單:
1. 深入淺出物件導向分析與設計
2. 大話設計模式

3. 深入淺出設計模式

入門推薦書籍!

4. Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition)

PTT網友lovemage: 這一本對軟體開發人員學習物件導向知識,我覺得是相當好的起點,也提供了很多延申閱讀的資料,如果是自修可以安排兩三個月的時間先將前17章讀個兩遍,並試著在專案中用出來

5. Agile Software Development, Principles, Patterns, and Practices

PTT網友lovemage:這本有C#為範例的版本。比第4本難讀不少,但是在設計面講的相當深入,感覺底子越好的人越能透過書本跟作者對話

6. Refactring:Improving the Design of Existing Code

PTT網友lovemage:實務上很好用的書,但是容易產生知其然不知其所以然的狀況,建議跟第4本搭配可以同時從理論與實務兩個方向學習物件導向的精神

類別:程式設計 標籤:

【轉載】C 及 C++ 常犯錯誤 – EOF 測試的錯誤用法

一月 4, 2011 1 comment

摘要
大家常用到的一些C/C++ 讀取檔案程式碼,大多的長相如下:

while ( !infile.eof() )
{
  // 讀檔 ...
  // 資料處理 ...
}

然而,這樣寫可能會造成錯誤!因為C/C++ 的feof() 或是eof()的運作方式,是當上一個檔案讀取到結尾時,才回傳true,並非該次讀取到EOF才回傳true。也就是說,此一方法可能會造成當次讀取到EOF時,直接通過while迴圈,造成程式錯誤!

詳細解說請至
〔教學〕C 及 C++ 常犯錯誤 – EOF 測試的錯誤用法

類別:程式設計 標籤:

[C/C++] 陣列當作參數傳遞的函式實做方法

一月 4, 2011 發表迴響

在網路上無意間看到(原創) 如何使用function template傳遞array? (C/C++) (template)的幾篇文章後,我翻開我那塵封已久的C++ Primer 4/e,將有關陣列當做參數傳遞到函數的實作方法,整個初階到較為高階的做法,整理過後如下:
一般來說,我們若要讓函數傳遞陣列時,會寫以下:

/*
*  @Function: void fnPrintArray(int arr[10])
*  @Brief: Print the array content.
*  @Input: int arr[10]
*  @Output: array content.
*/
void fnPrintArray(int arr[10])
{
    for(size_t i=0;i<10;++i)
    {
        std::cout << i << " " << std::endl;
    }
}

但是此函式主要有兩個問題:
1. 若傳入的陣列只有包含3個元素時,會有out of range的問題。
2. 若傳入的陣列長度超過10,則無法完整印出該陣列內容。
針對上述問題的解法,C++ 在訂出reference這個概念後,array也可以用以下來代替:

/*
*  @Function: void fnPrintArray(int arr[10])
*  @Brief: Print the array content , and the input is by reference.
*  @Input: int arr[10]
*  @Output: array content.
*/
void fnPrintArray(int (&arr)[10])
{
    for(size_t i=0;i<10;++i)
    {
        std::cout << i << " " << std::endl;
    } 
}

此一reference的技巧,在於限定傳入的陣列大小只有10,降低了使用上的風險。
其中,傳入的參數int (&arr)[10] 表示傳入一個reference,其reference到具有10個int元素的陣列
若不加入括號的話:int &arr[10]表示傳入一個長度為10的陣列,每一個元素型態皆為int &
不過,如此作法卻大大降低了可用性。

因此,如何管理好陣列大小,便成為一個令人頭痛的問題!根據C/C++ Primer 4/e 提出常用的解法有三:
1. 函式另外傳入兩個指標,分別指向陣列開頭以及陣列結尾。
2. 如1.所述,不同的是,將原本指到陣列結尾的指標轉而指向陣列結尾的下一個。
3. 函式須指明給定陣列的明確長度。
但是,此方法在實用性上略顯不足,難道沒有一個更有效的方法嗎?

我們可以利用C++的template來幫我們實現這個方案。

#include <iostream>
using namespace std;
/*
* @Function:
        template<typename T,size_t N>
        void fnChange(T (&arr)[N])
* @Brief: Let each element of array increase by one.
* @Input: 1D array
* @Output: The array whose elements all increase by 1
*/
template<typename T,size_t N>
void fnChange(T (&arr)[N])
{
    for(size_t i=0;i<N;++i)
        arr[i]+=1;
}
int main(int argc, char * argv[])
{
    int arr1D[3]={1,2,3};  // Create 1D array.
    int arr2D[3][2] = { {1,2},{3,4},{5,6}}; // Create 2D array.
    // Show the initialized result.
    for(int i=0;i<3;++i)
    {
        cout << arr1D[i] << endl;
    }
    fnChange(arr1D);
    // Show the result.
    for(int i=0;i<3;++i)
    {
        cout << arr1D[i] << endl;
    }
    return 0;
}

上述程式碼,利用樣板特化的技巧,讓函式不用帶入陣列大小,便可透過樣板參數幫我們自動得知陣列大小,以利函式功能的撰寫。
因此,舉一反三,我們可以藉此程式碼推廣至二維陣列,範例程式碼如下:

#include <iostream>
using namespace std;
/*
* @Function:
        template<typename T,size_t M,size_t N>
        void fnPrint2DArray(T (&arr)[M][N])
* @Brief: Print the  content of 2D Array.
* @Input: 2D array.
* @Output: None.
*/
template<typename T,size_t M,size_t N>
void fnPrint2DArray(T (&arr)[M][N])
{
    for(size_t i=0;i<M;++i)
    {
        for(size_t j=0; j<N; ++j)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}
int main(int argc, char * argv[])
{
    int arr2D[3][2] = { {1,2},{3,4},{5,6}}; // Create 2D array.
    // Print 2D array.
    fnPrint2DArray(arr2D);
    return 0;
}

因此,對於陣列的參數傳遞,我們可以利用樣板的功能來幫我順利達成。似乎一切在這邊有了完整的解答。:)
Reference
C++ Primer 中文版 4/e page. 110 , 240~241, 632~633.
(原創) array傳進function該怎麼寫才好? (C/C++) (C) 推薦閱讀!

類別:程式設計 標籤:,
Follow

Get every new post delivered to your Inbox.