最近更新: 2006-02-14

乙級電腦軟體設計技術士應考記

上週六,我為了乙級電腦軟體設計技術士的術科測驗,跑了一趟台中,到勤益技術學院應考。

說起來,這次應檢經驗非常不愉快啊。明明就是在高雄報名,也在高雄考學科,竟然要我跑到台中考術科,感覺非常不爽,而且基本上是砸鍋了。沒想到出了一題最優路徑選擇演算法的實作題,偏偏我最弱的就是那一點,沒做完那題,是一定不過的。寫了十年 C/C++ 程式,竟然沒考過,實在是太大意了。附帶一提,當年 (民國83年) 丙級電腦設計技術士一開辦,我就考到了,隔了十二年「終於」等到乙級檢定...

在實務上,C 語言程式還是佔大多數,純 C++ 語言的程式反而少。別懷疑,看看 Linux 上的軟體,八成都還是用 C 語言寫作。但不用 C++ 並不表示寫不出個體導向 (Object-Oriented) 的程式。早期接觸個體導向的程式人員,大都會用結構型態與函數指標進行資料封裝。像我用 C 語言同樣能實作繼承、動態連結等功能。再者我接觸 C++ 的時間算早,所以 C++ 後期發展出來的東西,如 template, STL 等,我反而不熟悉,考試時就先吃了虧。

而工具的選擇上,更是令我十分不滿。使用工具限定使用 VisualStudio .Net 跟 Borland C++Builder 這兩種,偏偏我都沒用過。我是在 Linux 環境下用 gcc/make 這些工具的。就算在 Win32 環境下,也還有 MinGW32 與 Borland C++ 5.5 command line tool 這兩套可自由取得 C/C++ 編譯工具,為何不能用?害我考試時還要先東摸西摸後,才搞清楚要如何建立專案及生成執行檔。我不清楚考 Java 的人,用的是什麼工具,或許也不是用 JDK 、 IBM VisualAge 或 eclipse。

還有一個小插曲。考試時不知為何,我無法使用 cin,cout, istream, ostream 這些東西,明明 include iostream 了,compiler 竟然說未宣告,見鬼了。偏偏題目限定要實作 >>, << 的運算子覆載作輸出入,於是我當場實作了一組最簡單的 In/Out class...

考試前,承辦單位事先寄了一份模擬試題。跟實際上的試題比對,大致可以看出術科應檢的重點。前三題都是 C++ 語言在運算子覆載以及動態連結上的應用實作。兩題實作運算子覆載及夥伴函數 (friend function) ,一題實作動態連結。但最後一題才是重點,最後一題一定是演算法,而且是冷門的演算法題型。例如模擬試題中的「最長遞增子串列」,我在 Google 上搜尋許久,才搞清楚那是 LIS ,而我手上的資料結構與演算法相關書籍中,根本沒提到這玩意。這次應檢時,則是出了「最優路徑選擇」,給你一個交通網絡圖,分 A~E 個交通系統及 1~9 個站點。試設計一個程式,可依使用者輸入的任兩站點,計算出最省交通費用的路線。

題目一跟題目三類似。我就說一下第三題吧。實作一 fraction 類別 (分子/分母) ,並提供四則運算與大於、小於及等於的運算子。最後再以夥伴函數的功能,實作 >> 及 << 的輸出入動作。我前面說到不能用 cout/cin 而被迫自己當場實作一組 In/Out class 的事,就是指這題。當然,題目本身並沒有要求考生實作一組 In/Out 。

class Fraction {
private:
  int fc; /*分子*/
  int fm; /*分母,分母不得為0 */
public:
  Fraction(int c=0, int m = 1) {
    if(m <= 0)
      throw "分母不得為0";
    this->fc = c;
    this->fm = m;
  }
  Fraction& operator+ (Fraction& lv) {
    int cc,cm;
    if( this->fm != lv.fm) {
      this->fm *= lv.fm;
      this->fc = this->fc * lv.fm + lv.fc * this->fm;
    }
    else {
      this->fc += lv.fc;
    }
    return *this;
  }
  int operator== (Fraction& lv) {
    int cc,cm;
    if( this->fm != lv.fm) {
      return ((this->fc * lv.fm) == (lv.fc * this->fm));
    }
    else {
      return (this->fc == lv.fc);
    }
  }
}

題目二,給你一個 publication 類別,衍生 book 及 type 類別,以動態連結實作 getdata() 及 putdata() 兩個方法。

class Publication {
  char *title; /*用 STL 的 string 也行,但我是用慣 C 語言方式的*/
  float price;
public:
  Publication() {
    this->title = NULL;
    price = 0;
  }
  virtual void getdata() {
    char buf[2048];
    printf("Enter title: ");
    scanf("%s", buf);
    if(this->title != NULL) {
      free(this->title);
    }
    this->title = (char*) malloc(strlen(buf));
    memcpy(this->title, buf, strlen(buf)+1);
    printf("Enter price: ");
    scanf("%f", &this->price);
  }
  virtual void putdata() {
    printf(" Title: %s, Price: %.1f ", this->title, this->price);
  }
};

class Book : public Publication {
  int pages;
public:
  virtual getdata() {
    this->Publication::getdata();
    printf("Enter pages: ");
    scanf("%d", &this->pages);
  }
  virtual putdata() {
    this->Publication::putdata();
    printf("Pages: %d ", this->pages);
  }
}
相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/1122912.html

樂多舊回應
未留名 (#comment-3268885)
Mon, 09 Oct 2006 14:49:23 +0800
這次好像沒有人有過!?(我考的是Java)
未留名 (#comment-3457278)
Tue, 31 Oct 2006 11:13:37 +0800
關於無法用cin/cout...我猜可能你沒有使用 std 這個namespace ...
未留名 (#comment-17620077)
Tue, 07 Oct 2008 02:21:35 +0800
你忘了 using namespace std;
未留名 (#comment-17644055)
Sun, 12 Oct 2008 09:05:54 +0800
謝謝BEN在隔了兩年之後又提了一次。

是的。因為我當初學 C++ 時(1995年),沒有 namespace std 這種東西。而且我個人用的編譯器設定也是比較寬鬆的設定,並不要求這點。所以我常常忘記 namespace std 這一行。

請大家不要再針對 namespace std 這一點回應,謝謝。
未留名 (#comment-18900833)
Fri, 10 Apr 2009 21:27:02 +0800
感覺不是那麼簡單考!
難怪市面好像沒看到乙級電腦軟體設計
antno.1@yahoo.com.tw(hank) (#comment-19991741)
Sun, 25 Oct 2009 18:51:41 +0800
今年小弟有去考軟體設計乙級(Java).考題己有改變.
原本是考三題debug一題寫程式.但今年是改成
二題填空(就是要自己把不足的程式碼補進去),
一題寫程式.
填空的考題大概如下.
1.利用即有的程式對以下二個整數作加減
-123456789123456789
9876543210987654321
程式中所缺的是加法和減的函式,要應試者自己補.
2.虛擬販賣機的操作流程,
蠻像以下網址的程式,但是考試時會把記算退錢的函
式拿掉要應試者填寫. http://en.literateprograms.org/Vending_Machine_(java)#chunk%20def:test%20vending%20machine
第三題則是給一個實作題,有10組學生,和10名老師.每一組學生可以填志願去作老師的選擇,而老師也是要填寫志願選擇學生.
1.某位老師只有一組學生選,那就會被配對在一起.
2.某A老師有多組學生選,那就看那一組學生在填志願時
是把某A老師填在比較前面的志願.那就配對在一起.
2009年Java的題目大概就如上.提供給大家作參考.
paulliu@debian.org(PaulLiu) (#comment-20604527)
Sun, 04 Apr 2010 18:57:37 +0800
我覺得去考 Java 的比較簡單..
尤其是 Linux 陣營的...

我是 2006 年 July 23 拿到乙級 Java.
(所以 2006 年應該是有人過..我是那個非常早交卷被評審誤當放棄的人, 我很早就離開試場, 不知道後面狀況怎樣)

我是直接用 DOS prompt 下的 edit 寫, 然後去 javac 產生我的 binary.
我想對於只會 Linux 程式設計的..這樣子會比較容易..
他也是有甚麼其他的選擇, 但不管如何, JDK 一定會被安裝到系統裡面. 所以就用 JDK 吧.

我個人是會寫 Java 但是不常寫, 比較常寫 C/C++ (gtk+/QT). 但是看到乙級 C++ 那個要用啥 Visual/Borland, 就不屑去考了.

演算法部份. 我覺得只要有參加過程式設計比賽得獎 (IOI/ACM) 這種那就不需要去特別準備.
所以如果要練演算法, 首先還是要去準備好兩本書: Data Structure in XXXX (Horowitz) 跟 Introduction to Algorithms (CLR)
然後把 http://uva.onlinejudge.org/
100~199 號題 (Volume I, 只有100題) 不跳號的全部寫過一次..乙級題目對於一般的參賽者, 應該是可以在 15 分鐘內寫完

我個人的感想是還蠻容易的.. 只是 Windows 環境下沒有好的編輯器.. edit 很難用, 沒變色也不會縮排. 所以害我寫得不是很順. 但這不是很大的問題, 反正 javac 會告訴哪邊有打錯.

不過印象中還是有時間玩一場難度中等的踩地雷就是了...因為他規定一定要超過某個時間才能交卷..印象中 Windows 有彈珠台, 太空軍校生什麼的, 但是試場的好像被移掉了