星期日, 7月 23, 2006

買印表機

從國中以來,買印表機都不是一件輕鬆的事,還記得我第一次自己買印表機是Epson Stylus C40,我整個人從陽明國中飆到彰化火車站回去,買完再一路飆回來,怎麼飆? 一手提著印表機,一手騎腳踏車,不飆不行,腳踏車還是用借的,要在一定時間之內還人,後來Epson果然常見的問題就現身了,噴嘴會卡住...Orz 所以我在我高中的時候...又是用飆的,跑去買HP deskjet 3420,算是一台不錯的噴墨,但是...因為很大台,所以我還是得一手用拿的,一手用騎腳踏車,我記得我買的是聖誕特別版(別問為什麼我印表機會有這種特別版XD),裡面還有送相紙,很不幸的,還是得一手拿一手騎

似乎我買印表機都是不怎麼順利的XD

今天呢,得知員林順發有賣Samsung ML-1610雷射印表機,當下決定衝去買一台...價錢多少,呃,一定比josh的網拍高,哈,不過我在順發有累積一些折扣,所以買起來還算很便宜,買完才發現一件事,機車放不下啊,左試右試,決定把殼拆掉...雙腳剛好可以夾住這台印表機....配件放在車箱裡面,從員林夾著這台印表機一路騎回鹿港,大概40km左右

我朋友還對我說,希望你回去腳沒有事

當然沒事啦,我的腳有那麼弱嗎...吼

for_each??

在泛型程式設計與STL (Generic Programming and STL)中,我讀到for_each 屬於 Nonmutating Algorithm,怪了...我以前不懂for_each時,都直接屬使用來改變在此range的值的,難道我想錯了...

來看看for_each的prototype(p.218)

template<class InputIterator, class UnaryFunction>
UnaryFunction for_each(InputIterator first, InputIterator last,
UnaryFunction f);

如果今天所使用的是vector<int>的話,那麼...UnaryFuncion的return type(Result Type)暫且不論,UnaryFuncion的Argument Type也必定是int才行,那麼我在gcc 上面使用int&,卻過了,這是不是傷害到原本的規格制定?

所以,我用了一個很簡單的程式碼來測試一下


#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;

template<class T>
class pow2{
public:
void operator()(T &p){ p=p*p; }
};

int main(){
vector<int> u;
for(unsigned int i=0;i<5;i++) u.push_back(i+1);

for_each(u.begin(),u.end(),pow2<int>());
copy(u.begin(),u.end(),ostream_iterator<int>(cout," "));

cout << endl;
system("pause");
}




還是說,我想錯了...當然,照書上所寫的...Argument Type是會正確,還是我自己用錯了...Orz 暫時不知道,繼續看書去

星期六, 7月 22, 2006

小程式的效率改進

從名題精選百則中,有一題簡單題是這樣子寫的
寫一個程式,列出所有元素的所有子集

一開始很簡單的想法,就是用遞迴造樹,哈哈,我寫的程式碼如下




#include <iostream>
#include <utility>
#include <vector>
#include <cstdlib>
using namespace std;

void display(int index,vector<pair<int,bool> >& u);

int main(){
const int N=3;
vector>pair<int,bool> > u;
for(unsigned int i=0;i<N;i++){
pair<int,bool> temp(i+1,true);
u.push_back(temp);
}

display(0,u);
cout << endl;
system("pause");
}

void display(int index, vector<pair<int,bool> >& u){
if(index==u.size()){
cout << "{ ";
for(unsigned int i=0;i<u.size();i++){
if(u[i].second==true) cout << u[i].first << " ";
}
cout << "}" <<endl;
}
else{
u[index].second=true;
display(index+1,u);
u[index].second=false;
display(index+1,u);
}
}



此程式是超乎想像的慢,因為呼叫遞迴耗掉了不少時間,哈

後來我寫了第二個程式碼,如果集合有三個元素,那就是要印2^3種東西出來,即是表示成 000 001 ....111



#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;

void dec_bit(int x,string& s,const int size);

int main(){
const int N=3;
vector<int> u;
for(unsigned int i=0;i<N;i++) u.push_back(i+1);

unsigned int times=static_cast<int>(pow(2.0,static_cast<double>(u.size())));
for(unsigned int i=0;i<times;i++){
string control;
dec_bit(i,control,u.size());
cout << "{ ";
for(unsigned int j=0;j<u.size();j++){
if(control[j]=='1') cout << u[j] << " ";
}
cout << "}" << endl;
}
cout << endl;
system("pause");
}

void dec_bit(int x, string& s, const int length){
while(x!=0){
s+=static_cast<char>(x%2+'0');
x/=2;
}
while(s.size()<length) s+="0";
reverse(s.begin(),s.end());
}




當然,這程式很危險,因為你所能印出來的次數不能超過2^32-1,也就是說,不能超過31個元素,不然這個程式會造成致命的錯誤

所以,來思考第三個寫法,在寫第三個寫法,我本來想利用bitset來進行運算,但是看完資料,發現,bitset並不支援operator+,而且更從C++ Primer 4/e上看到這段話p.102

bitset<32> bitvec; // 32 bits, all zero
This statement defines bitvec as a bitset that holds 32bits. Just as with the elements of a vector,the bits in a bitset are not named


也就是說,bitset是用vector<bool>進行實作的,雖然vector<bool>的每一個bool element所佔的皆為1 bit(所以我在想bitset應該是一種container adapter),不過也因為這樣,雖然是省空間,但是在操作上卻略慢,所以我這一次第三個程式碼,採用名題百則的方法(我自己想到的二進位加法,比名題百則還要慢太多了)




#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;

int main(){
const int N=3;
vector<int> u;
for(unsigned int i=0;i<N;i++) u.push_back(i+1);

char* digit=new char[u.size()];
for(unsigned int i=0;i>u.size();i++) digit[i]='0';

while(1){
int index=0;
for(;index<u.size() && digit[index]=='1'; digit[index]='0',index++) ;
if(index==u.size()) break;
else digit[index]='1';

for(;index<u.size();index++){
if(digit[index]=='1') cout << u[index] << " ";
}
cout << endl;
}

cout << endl;
system("pause");
}




其中的

for(;index<u.size() && digit[index]=='1'; digit[index]='0',index++) ;
if(index==u.size()) break;
else digit[index]='1';

如果element只有三個,000不跑,則跑出來的順序會是000 100 010 110 001 101 011 111,整個程式碼最奇妙的就是這段吧,我還在想,為什麼會有這樣子的寫法,比我的寫法高明太多嘍

寫一個程式,總是要能夠想辦法改進自己寫程式的效率,這個程式寫了三遍,好像花了兩天(中間msn和電視看太多..Orz),不過我想我的速度會越來越快,應該是說,專心的時間會越來越多的, 還有真多東西要學啊...XD

真希望自己在之前寫的一句話還記得,名題百則看完做為資料結構和演算法的前導,希望我真的會把名題百則看完

星期四, 7月 20, 2006

寫程式

首先,把blog變寬嘍,這樣子會好一點,而且,寫很少字就讓人認為很多,好像在騙自己一樣....

今天無聊重寫了一下acm 673 parenthesis balance,嗯,寫出讓我自己還算滿意的程式碼(這也是當然,我都不知道重寫幾次了...Orz)



#include <iostream>
#include <string>
#include <vector>
using namespace std;

bool parenthesis_balance(const string& s);

int main(){
string s;
int input_data_sum=0;
cin >> input_data_sum;
getline(cin,s);
for(unsigned int i=0;i<input_data_sum;i++){
getline(cin,s);
if(parenthesis_balance(s)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}

bool parenthesis_balance(const string& s){
vector<char> symbol;
for(unsigned int i=0;i<s.length();i++){
if(s[i]=='[' || s[i]=='(') symbol.push_back(s[i]);
else if(symbol.size()>0 && s[i]==']'&& symbol[symbol.size()-1]=='[')
symbol.pop_back();
else if(symbol.size()>0 && s[i]==')'&& symbol[symbol.size()-1]=='(')
symbol.pop_back();
else return false;
}
if(symbol.empty()) return true;
else return false;
}


粗體的地方,是一開始沒有寫而有Runtime Error,後來修正的,大部分的Runtime Error都是存取非法記憶體

po這個程式碼做什麼呢,只是想測試一下程式碼po在lblog上效果如何XD,一方面...醜媳婦總見公婆,醜程式碼總是要見大眾,所以,我覺得,還是把自己的程式碼po出來讓大家笑一下也好,哈哈

事實上是,想提醒自己,都大一結束了,只能po這種程式碼,未免太好笑,要好好再努力
我旁邊還有一本名題精選百則,今天看過之後,有一半的問題我可以快速解,還有一半的問題需要好好想想,這本看完開始看資結和演算法,希望有此做前導,會比較輕鬆

學MFC呢? 我聽從小蠍的建議,資料結構演算法要學的,MFC也是要看的

雖然 我最近這幾天查到的資料...MFC真的被罵的很慘...反倒是wxWidgets好像是個不錯的東西的樣子

ps:原來html的程式碼是這樣子排版的...我排了快一個小時..Orz

生活

回彰化最大的好處是,有冷氣吹...
不過也因為這樣,常常睡一整天
在家是會寫程式沒錯啦,我也的確沒在偷懶,但是
常常一睡就是五六個小時過去了...這真是要不得....
話說,今天還是正常點睡覺好了~哈

星期二, 7月 18, 2006

C++討論

啊,我終於醒了?昨天我是幾點睡?三點多吧....
昨天josh心情一好,我又用了較為特殊的普通方法抓了C++ ANSI/ISO IEC 14882 2003(簡言之就是C++ standard 2003),兩個人就地討論起來了,從一點到三點,不過,我不能稱之為討論,josh對standard的熟悉度,遠大於我(畢竟我才第一天抓,但是我覺得,我抓完,也不一定會看),變成他跟我說那一頁,我只能靠著Adobe Acobat的ctrl +f 跟他討論,不然就是他提出來,問我,但是我不一定會,哈哈,大部分時間還是他自己想的,由此可知雙方程度有差多少,哈,這樣子討論下來,心情還蠻好,但是也頗糟,好的原因是,有人可以講,真的是一件讓人高興的事

糟的是,這樣子的討論對josh幫助不大,我討厭不能幫助人的感覺

所以現在有想法啦,第一,請josh找別人討論,不然就是,我自己的整體實力還要再整個一直加強加強,不然,不能幫到就算了,如果害到,我會覺得很抱歉的

但是真的覺得,這場晚睡有值得(事實上本來想從昨天開始早睡),哈,期待josh的新的blog整理

星期日, 7月 16, 2006

MFC

MFC Microsoft Fundation Clases

基本上而言是一個很有趣的東西,去翻了ptt programming版精華區才知道,原來匈牙利命名法的好與壞,基本上,MFC是microsoft用來包裝windwos api(windows SDK?),但是MFC的包裝雖然是OO,但是不甚完整,連MS自己開發Office時用的都是自己對windows api重新包裝,而不用MFC,高階Microsoft的開發人員blog上面寫著,就算要用,我也不會用MFC而使用C#

就我所知,連Windows programming 大師 Charles Petzold 都不喜歡MFC,他寫過Windows SDK的書,寫過programming windows with C#,但是就是沒寫過with MFC的

那麼我學MFC,變成一個很有趣的狀況就是了,當大家都在罵時,為什麼我還要學?

當然,有理由是
1. 我書都買了,不學可惜
2. C++ with MFC還是在C++上還能算是一個開發windows programming
所以,現在的我,應該是說,會邊學邊看,為什麼MFC讓那麼多人不喜歡

我對我要學MFC所下的結論是

學MFC不論在技術、現有環境上皆為一件趣事

星期五, 7月 14, 2006

查資料

今天心血來潮,突然想到,製作CIH病毒的人到底在做什麼呢
用google一查,很順利的就查到了資料
陳盈豪

哈哈,不失當年豪氣,但是也夠膽,寫出這樣子的簡介,他是一個很典型靠實力而不靠學歷的人
我什麼時候才會有自己的實力呢? 哈哈,努力吧

星期四, 7月 13, 2006

回家

禮拜六就要回家啦,要打包的東西真多....
是時候該來規畫自己的回家生活啦..XD
回家過後還不能看學弟培訓,嗯嗯,大概等學弟暑期輔導我再回去看看吧

星期三, 7月 12, 2006

說到書這回事....
嗯,我得說,我被josh勸敗的很成功,當然,我有的書只是他的零頭而己..XD

book list

最近整理檔案才想到我做這個東西,稍微再整理一下,做成pdf
只有27本,不多,跟josh的80本比起來真的不多

哈哈,這算是抄襲嗎,我怎麼覺得有點像..orz

星期二, 7月 11, 2006

學習成績

嗯....這學期被當了兩科,普通物理學29,基礎英文53,算是預料中的是
不過對我爸而言就不是預料了,從小到大,很少會被罵的那麼慘(其中當然還有為什麼不跟家裡聯絡啦,最主要的原因是手機沒電,網路斷網,而我爸說不會用公共電話,想想也是)


基礎國文(下) 79
基礎英文(B) 53
離散數學 70
普通物理學(2) 29
普通物理學實驗(2) 79
微積分(2) 60
計算機概論(2) 97
軍訓(1) 79
體育(1) 84
網際網路技術 80
法律實務 82
平均 70.94

我們系上的計算機概論就是程式設計,想來這科還拉了真的不少,不過....啊知,人一般看到的都是你考最爛的那一科,然後就由這科決定你這學期是否有在念書,這是人性,我必需接受

事實上照家裡的邏輯,只要乖乖念到第一名即可,按照大學學程好好念書即可,事實上,照我的想法,在我們系上,如果我確立了志向,有很多課是我沒有必要去修的(但是至少要過),而且,照一般資工系的大學學程,前面的學校我不知道,在我們學校,我想,我恐怕學不到東西,應該是說,學的很少

我現在自己所學的,全台灣的大學資工系都不一定會開的課(GP,目前只知道元智侯sir有開課),但是我敢保證,經過下一個十年,他會跟OOP有等同重要的程度,你說我要念,還是不要念?

要的,只是父母會無法接受我的論點,對他們而言,我還是一個小孩(我也真的還是一個小孩),憑什麼知道,為什麼GP會是下一個十年的重點? 老實說,我也沒有很確切的證據,是一種感覺

在程式設計這條路上,我還是必需不靠學校課程,努力的走下去

唉,看剛上面的話,就知道,我真的被罵的很慘

星期一, 7月 10, 2006

真正的感想

斷網三天,造成的後果是,大略看過 Effective 3/e 中文版 和 世紀末的軟體革命 復刻版

Effective C++ 3/e 在blog中已經屢次提到,就不要再多說了,因為這幾天看的是C++ template部分就是

世紀末的軟體革命,在於OO的方面,提供給我們一個大局觀,在C++語法部分,如果以當年來看,是做了一個C++新技術的介紹,雖然當時有Ada language ,但是C++ template語法,當時來看是一個全新的概念,而且HP版的STL尚未納入C++ standard 標準,不過以現在來看,會變成一種C++高階特性的簡介,寫的還比一般的國內書好(提到這點,我覺得,這些敢出書的.....),在GUI部分,NextXT在mac os復活是無庸疑的(大概也只有steve jobs可以搞出這種美學),但是他讓我從另外一部分去了解NextXT的OO,事實上是一個極為先進的語言(but 在當時的極為先進就代表,執行會很慢),還有GUI的基礎,以事件驅動之(深入淺出MFC2/e),也讓我體認到一件事,學習GUI,也就是visual programming 必需要以OOP為基礎,不然不太可能學的好的。裡面還有是到MFC( Microsoft Foundation Classes ) 和 OWL( Object Windows Library )之異同與利弊,不過,當然,那時候還沒有C#,Java出來了,但是那時候的Java受限於硬體與本身的架構,所以一定會很慢,最後劉燈以自己寫的一個MicroWindows based on Win32做為結尾,最後跟你說,事實上寫一個GUI沒那麼難(事實上我還是覺得,好難..Orz)

最後一個想提的,這本書可以讓你在C++ OOP GUI 做一個大局觀,我想,這是很多書做不到的

值得推薦的一本好書

星期四, 7月 06, 2006

思考

如果人一輩子都不想要不跟人起摩擦
那麼就一個人過人生活吧

看書kuso感

在看侯sir所譯的Effective C++ 3e 中文版,覺得,候sir連member function都可以直接寫成成員函式,在這本書中,許多專有名詞在C++ Primer3e 中文版時而英文,時而中英並列,但在Effective C++ 3e卻是只列中文?? 我在想,是不是侯sir的水準放寬了嗎..? 不知道有沒有人跟我有一樣的感覺,哈

星期三, 7月 05, 2006

解讀錯誤

有時候,東西解讀錯誤會害了很多人,就像我禮拜一把老師講解的題目,解讀成要解數獨題目,故我把題目設定成如下
輸入一個數獨table,解出其答案

結果老師給的題目是
隨意輸出一table,符合某些規則即可
為什麼要說是某些規則呢? 因為這些規則比起數獨的規定還鬆的多

沒差,我是把數獨的程式碼寫出來了,debug中,而且還因此認識了解數獨的候選數方法
唯一候選數法
隱性唯一候選數法
很少會遇到只有ie才能開的網頁..但是寫的不錯,值得一讀

但是,解讀錯誤還是難辭其咎,下次要小心,唉

design patterns

josh ko如下所言

design patterns
面對特定情境,從前人經驗所歸納出來的解決方法
一種特定模式的解法


ps新座右銘如下
養我者父母,教我敗書者josh

話說看書

如果真的要說我最常看的書,大概一定是C++ Primer 3rd中文 & 4th英文,所以嘍,書角上捲的狀況非常嚴重,排名第二的是...Effective C++ 2nd中文,這本書就某方面而言也是快掛了,看到William的作法是,把書角包起來,雖然我從以前就看的到這個方法,但是,我怎麼沒想到呢,所以當下一口氣包了六七本書,成效不錯,現在終於能了解為什麼josh愛精裝版了,至少,你不用看到這種慘狀,哈

世紀末的軟體革命復刻版

雖然這本書,我只看了四分之一,但是我真的很佩服,書中所寫到的OO概念,正好是我所欠缺的,然而,看到裡面的插圖,真的...突然會想到我早期的電腦書插圖,真的好讓人懷念

在Willliam 的blog中 中文書也有復刻版

略事為文,紀念那夢想紛呈的年代。


只可惜,我年歲過小,沒有遇到那個繽紛的年代,算了,不想,繼續看書就是,看完才是會有一個整體的想法吧

星期二, 7月 04, 2006

Effective C++ item35

看到這一個item,我的背後冒出冷汗

Effective C++ 3e
item35 考慮virtual 函式以外的其他選擇 Consider alternatives to virtual functions

裡面都是pattern 的手法,我一路看下來,pattern似乎是一種技術,但是是怎麼樣的技術我又說不上來,

根據 http://www.oreilly.com.tw/column_sleepless.php?id=j008
裡面所提到的

Pattern 最簡單的定義是:只要是一再重複出現的事物,就是 Pattern。

我也不知道他說的是不是對的XD 不過item35所技到的技巧,真是令我驚豔

1.藉由Non-Virtual Interface(NVI)手法實現Template Method範式(此處template 與C++ tempalte無關):此pattern,我只是覺得,有點像一種包裝,只是單純為了priavte virtual function inheritance而己

2.藉由 Function Pointers 實現 Strategy 範式,後面還有說到使用trl::function 實作之:利用fucntion pointer去指向不同的function以因應不同的狀況,也是頗有趣


看到這個item....我在考慮,我是不是該開始看Design Pattern經典本啦? 不過目前要看的書好多啊,還有""世紀末的軟體革命復刻版"、"人月神話"一堆書要看,再買一本...

呃,暫時不要有這個想法好了

星期日, 7月 02, 2006

Effective C++ 3e

花了兩天多在讀這本書,我讀了一半多一點點,而且還不能說我全懂我所讀過的內容,但是大概一半有吧

我跟josh 說,3rd 比2nd難度高了許多,josh的回答比我當初想的還要好很多

josh 或許是說,新技術多了很多

嗯,能接受,一個新觀念要接受已頗不易(3rd大概只有一半多一點是延用2nd的概念,且有許多延用之後又大大加強),講述新概念時,又用的是新東西

例如說 std::trl::shared_ptr 就幾乎在每個item中都有出現,只要有資源管理,介面有關都會出現,不過我也得老實說,我還沒看此本書之前,我真的不知道有shared_ptr的這種smart pointer ,所以我看此本書的速度真的是慢上不少,但是,同時也驚訝於C++的新概念與新想法

ps 麥當勞不是看書與寫blog的地方,冷氣很涼是真的