FFF

FB留言板

學程式設計的人不能不看的好文章

看了下面的這篇文章,深有感觸,棗子碰到的問題也是我們大多數程式設計師的通病,也許我們大多數人都只是在做一些比較小型的軟件,對軟件運行的效率不在乎,就算對速度和效率在乎的也可能是一些在資料庫操作方面的。大家看完了,也許會有很多感想,但這只是我同意棗子的個人觀點。

做為一名大四的學生,我面試過不少的單位,有成功的也有失敗的,但是對我來說所有的失敗在某種意義上都是一種成功,特別是我下面寫的這些,寫這篇文章的時候,我已經簽了南京的一家軟件公司,但是想起今年 2 月 21 日我面試蘇州台灣的IT公司的經歷聯想到我們現在學習程式設計的一些情況我真的深有感觸,這次面試使我深深的體會到了失敗但也收穫了很多。

我要說的將分成三部分:

1.是我面試的具體經過
2.是由面試想到的
3.現今我應該做的

當然這些話很大程度上是我個人的意見,不可能完全得到大家的贊同,所以在某些觀點上如果哪位朋友覺得跟我的有很大出入,請不要介意,也不要對我攻擊,就當我沒有說過,歡迎和我聯繫共同探討這些問題!

1.面試經過

大約在年前我接到了台灣瑞晟 (Realtek) 蘇州公司的面試通知,通知我 2 月 21 日到蘇州工業園區面試,接到面試後的幾天我把一些專業課溫習了一遍,特別是 C++ 和數據結構,由於大學幾年裡,我一直專研這些方面,加上通過了高級程式設計師的考試,對於一些常用的算法我差不多也達到了爛熟於胸的地步,當時的感覺是如果問了我這些方面的問題我應該是沒有問題的!

21 日那天我被安排在 4:30 面試,由一位技術人員單獨給我面試,在問了一些簡單的問題之後他給我出了一道程式設計題目,題目是這樣的(由於具體面試的題目比較煩瑣,我將其核心思想提取出來分解成了兩個獨立的簡單的問題,有可能問題分解的不當,請大家見諒,實際面試了一個的問題但比其複雜很多,而且涉及一些高等數學變換):

1) 寫一個函數計算當參數為 n(n很大) 時的值 1-2+3-4+5-6+7......+n

哼,我的心裡冷笑一聲!沒想到這麼簡單,我有點緊張的心情頓時放鬆起來!於是很快我給出我的解法:


long fn(long n) {
long temp=0;
int i,flag=1;
if(n<=0) {
printf("error: n must > 0);
exit(1);
}
for(i=1;i<=n;i++) {
temp=temp+flag*i;
flag=(-1)*flag;
}
return temp;
}


搞定!當我用期待的目光看著面試官的時候,他微笑著跟我說,執行結果肯定是沒有問題!但當 n 很大的時候我這個程式執行效率很低,在嵌入式系統的開發中,程式的運行效率很重要,能讓CPU少執行一條指令都是好的,他讓我看看這個程式還有什麼可以修改的地方,把程式優化一下!

聽了這些話,我的心情當時變的有點沉重,沒想到他的要求很嚴格,之後我對程式進行了嚴格的分析,給出了改進了的方案!

long fn(long n) {
long temp=0;
int j=1,i=1,flag=1;
if(n<=0) {
printf("error: n must > 0);
exit(1);
}
while(j<=n) {
temp=temp+i;
i=-i;
i>0?i++:i--;
j++;
}
return temp;
}


雖然我不敢保證我這個算法是最優的,但是比起上一個程式,我將所有涉及到乘法指令的語句改為執行加法指令,既達到要題目的要求而且運算時間上縮短了很多!而代價僅僅是增加了一個整型變數!

但是我現在的信心已經受了一點打擊,我將信將疑的看者面試官,他還是微笑著跟我說:「不錯,這個程式確實在效率上有的很大的提高!」我心裡一陣暗喜!

但他接著說這個程式仍然不能達到他的要求,要我給出更優的方案!天啊!還有優化!我當時真的有點崩潰了,想了一會後,我請求他給出他的方案!然後他很爽快的給出了他的程式!

long fn(long n) {
if(n<=0) {
printf("error: n must > 0);
exit(1);
}
if(0==n%2)
return (n/2)*(-1);
else
return (n/2)*(-1)+n;
}


搞笑,當時我目瞪口呆,沒想到他是這個意思,這麼簡單的代碼我真的不會寫嗎,但是我為什麼沒有往那方面上想呢!

他說的沒有錯,在 n 很大很大的時候這三個程式運行時間的差別簡直是天壤之別!

當我剛想開口說點什麼的時候,他卻先開口了:「不要認為 CPU 運算速度快就把所有的問題都推給它去做,程式設計師應該將代碼優化再優化,我們自己能做的決不要讓 CPU 做,因為 CPU 是為用戶服務的,不是為我們程式設計師服務的!」

多麼精闢的語言,我已經不想再說什麼了!

接著是第二個問題:

2) 他要求我用一種技巧性的程式設計方法來用一個函數實現兩個函數的功能 n 為如:fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6!

fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9! 現在用一個函數 fn(int n,int flag) 實現,當 flag 為 0 時,實現 fn1 功能,如果flag 為 1 時實現 fn2 功能!他的要求還是效率,效率,效率!

說實在話,如果我心情好的話我應該能給出一種比較好的算法,但我那時真的沒有什麼心思再想了,我在紙上胡亂畫了一些諸如 6!=6*5! 的公式後直截了當的跟他說要他給出他的答案!

面試官也沒有說什麼,給出了他的思路:

定義一個二維數組 float t[2][5] 存入 [2!,3!,4!,5!,6!],[5!,6!,7!,8!,9!] 然後給出一個循環:

for(i=0;i<6;i++) {
temp=temp+n/t[flag];
}
最後得到計算值!

呵呵,典型的空間換時間的算法!

這些總共花了 50 分鐘的時間,還有十分鐘我就跟他很隨意的聊聊天,聊了一些程式設計以及生活的問題,那時的我已經很放鬆了,因為我知道這次面試結果只有一個:失敗。

5:30 的時候面試官要我等通知,於是我離開了他們公司。這就是面試的整個經過!

2.由面試想到的

真的是很失敗啊!我記得那天下好大的雨,氣溫也很低,我邊走邊想,從 5:30 一直走到 7:30,全身都濕透了,又冷又餓,但是我只是一直走,腦子裡面充滿了疑惑,我也想讓雨把自己淋醒!看到這裡有些朋友可能覺得那些面試題目不算什麼如果讓自己做的話肯定能全部答對,我肯定相信你,因為我從未懷疑過中國程式設計師的能力,我認為中國有世界上最好的程式設計師,我也從未認為自己是高手,所以我做不出來不代表中國程式設計師比台灣或者別的地方的程式設計師差,所以我就從我的角度,我的所見所想來談一些感想:

不錯全世界都有優秀的程式設計師,中國也不例外,但是我疑惑的是:到底中國和台灣或者國外的優秀的程式設計師的比例到底是多少?台灣我不知道,中國 100 個程式設計師裡有幾個是優秀的呢?

我根本算不上,從上面的表現就足以說明一切了!是 1 個?5 個?10 個?50 個?這個數字我不敢亂猜,恐遭網友一頓痛罵,那麼我們國內有多少人學習計算機呢?拿我們學校來說,計算機 97 級 4 個班,98 級 5 個班,99 級 10 個班,2000 級 17 個班,人多了,老師怎麼辦?我們學校的做法是讓研究生上課,然後呢?補考一抓一大把,大把大把的補考費落入了學校的口袋,還說現在的學生素質低!

真是好笑,我都不知道學校這麼做是為了什麼,為國內培養大量的程式設計師嗎?學生們能真正學到計算機知識嗎?好了,我敢講,在我們學校學習程式設計學生和優秀程式設計師(注意我指的是優秀,只會編幾個糟爛程式的人算不上)的比例應該是 100:0.1。

在這種比例下雖然我們中國學習程式設計的人鋪天蓋地,但是想想有多少個人能真正為中國軟件業發展作出貢獻,有多少人能真正寫出優秀的程式名揚海外!

我從學習程式設計以來,不管是自學還是老師指導,從來都是解決問題就好,編出程式來就行,我的疑惑是:我們有真正的強調過程式的效率,程式的質量嗎?我們有仔細分析過我們寫的東西,看看有沒有可以改進的地方,看看有沒有簡單的方法來達到同樣的目的呢?

我捫心自問,我發現,我從來沒有對我寫出來的程式進行過優化,最多就是進行詳細的測試,然後 Debug,但是這就足夠了嗎?

這些天我偶爾發現我曾經寫過的一個遊戲,那是一年前我剛加入 www.vcroad.net 做為其中一員時候,感覺應該拿點東西出來,然後花了一個星期的時間寫出來的!

程式不算複雜,但是用到了不少數據結構的東西,也用到了一些精彩的算法,加上 windows 的界面和遊戲的可玩性,寫完後受到了不少好評,我當時真的很佩服自己!

但是現在看呢:沒有一句註釋,好多醜陋的函數名,比如:void chushihua(),好多沒有必要的變數,可以用簡單語句完成工作的我使用華麗的算法,大量使用全局變數...

說不好聽的話,六百多行的程式除了能運行之外就是一陀屎!

如果一年前我能聽到一些反面意見的話,大概我能早一點覺悟,但是自從原代碼在網站發佈以來聽到的都是讚美之詞,沒有一個人向我提出程式改進的意見,這又說明了一個什麼問題呢?很值得思考啊!

還有一個疑惑是:我們說的和做的真的一樣嗎?

我在學校的時候曾經受學院指派承辦過一個計算機大賽,請了一個老師出決賽的題目,主要是一些算法題目,這個老師可能是我上大學以來唯一敬佩的老師了,從程式調試到打分,對於每個程式都仔細分析其時間效率和空間效率,然後綜合打分,四十個人的卷子,老師從下午三點一直調試到晚上十點,在有些寫的精彩的語句後還加上批注。

我真是高興很遇到這樣的老師並且和他做深入的交流,但在事後,卻發生了一件不愉快的事,在比賽中獲得第二名的學生找到我,說他程式全部調試成功應該給他滿分,並且應該得第一,我說不過他,最後調出了他的原程式和第一名的原程式對比,不錯,兩個程式都運行的很好,這時,那個同學開口了:「我的程式寫的十分簡捷明瞭,僅僅數行就完成了題目要求,而他的卻寫了一大堆,為什麼給他的分多過給我的分。」

我當時很是氣憤,如果不是老師負責的話,那麼現在第一名和第二名的位置真的要互調了,拜託,不是程式的行數越少程式的質量就越高,我記得我跟他大談這方面的道理,最後說服他了!

哈哈,但是我,只能說說而已,我不知道還有多少人一樣,說起來頭頭是道,但心裡卻壓根就從未重視過它!

3.我打算做的

其實那天我想到的遠不止上面那麼多,但是我不想再說了,因為我猜想看這篇文章的網友大概都有一肚子的感想,一肚子的抱怨,借用這篇文章發洩可不是我想達到的目的,在上面我把自己罵的一文不值也不是妄自菲薄,但是在某些方面我真的做錯了,或者說是偏離了正確方向,現在是矯正方向和重整旗鼓的時候了,就像我前面說過的,我相信中國有世界上最好的程式設計師,我也相信我的水準不會一直保持現狀,我現在就收拾起牢騷真正的實幹起來!

真的很巧,就寫到這裡的時候我在網上偶爾發現了這篇手冊,我不知道這暗示著什麼,但是我想如果我照下面這個基本原則一直踏實做下去,我一定會實現我的理想 - 一名優秀的軟件設計師!

(下面這些文字不是我的原創,是我偶爾在網上發現的,我真的很幸運能看到這些,這篇文章也隨著下面的文字而結束,我真心的希望您能從這篇文章中得到啟發,這篇文章歡迎大家隨意轉載,您可以不寫作者是誰,但是請您寫上 ww.vcroad.net 原創,謝謝您的支持)

--------------------------------------------------------------------------------

作者:金蝶中間件公司 CTO 袁紅崗

不知不覺做軟件已經做了十年,有成功的喜悅,也有失敗的痛苦,但總不敢稱自己是高手,因為和我心目中真正的高手們比起來,還差的太遠。世界上並沒有成為高手的捷徑,但一些基本原則是可以遵循的。

1.紮實的基礎

數據結構、離散數學、編譯原理,這些是所有計算機科學的基礎,如果不掌握他們,很難寫出高水準的程式。據我的觀察,學計算機專業的人比學其他專業的人更能寫出高質量的軟件。程式人人都會寫,但當你發現寫到一定程度很難再提高的時候,就應該想想是不是要回過頭來學學這些最基本的理論。不要一開始就去學 OOP,即使你再精通 OOP,遇到一些基本算法的時候可能也會束手無策。

2.豐富的想像力

不要拘泥於固定的思維方式,遇到問題的時候要多想幾種解決問題的方案,試試別人從沒想過的方法。豐富的想像力是建立在豐富的知識的基礎上,除計算機以外,多涉獵其他的學科,比如天文、物理、數學等等。另外,多看科幻電影也是一個很好的途徑。

3.最簡單的是最好的

這也許是所有科學都遵循的一條準則,如此複雜的質能互換原理在愛因斯坦眼裡不過是一個簡單得不能再簡單的公式:E=mc2。簡單的方法更容易被人理解,更容易實現,也更容易維護。遇到問題時要優先考慮最簡單的方案,只有簡單方案不能滿足要求時再考慮複雜的方案。

4.不鑽牛角尖

當你遇到障礙的時候,不妨暫時遠離電腦,看看窗外的風景,聽聽輕音樂,和朋友聊聊天。當我遇到難題的時候會去玩遊戲,而且是那種極暴力的打鬥類遊戲,當負責遊戲的那部分大腦細胞極度亢奮的時候,負責程式設計的那部分大腦細胞就得到了充分的休息。當重新開始工作的時候,我會發現那些難題現在竟然可以迎刃而解。

5.對答案的渴求

人類自然科學的發展史就是一個渴求得到答案的過程,即使只能知道答案的一小部分也值得我們去付出。只要你堅定信念,一定要找到問題的答案,你才會付出精力去探索,即使最後沒有得到答案,在過程中你也會學到很多東西。

6.多與別人交流

三人行必有我師,也許在一次和別人不經意的談話中,就可以迸出靈感的火花。多上上網,看看別人對同一問題的看法,會給你很大的啟發。

7.良好的程式設計風格

注意養成良好的習慣,代碼的縮進編排,變數的命名規則要始終保持一致。大家都知道如何排除代碼中錯誤,卻往往忽視了對註釋的排錯。註釋是程式的一個重要組成部分,它可以使你的代碼更容易理解,而如果代碼已經清楚地表達了你的思想,就不必再加註釋了,如果註釋和代碼不一致,那就更加糟糕。

8.韌性和毅力

這也許是「高手」和一般程式設計師最大的區別。A good programming is 99 weat and 1 ffee。高手們並不是天才,他們是在無數個日日夜夜中磨練出來的。成功能給我們帶來無比的喜悅,但過程卻是無比的枯燥乏味。你不妨做個測試,找個 10000以內的素數表,把它們全都抄下來,然後再檢查三遍,如果能夠不間斷地完成這一工作,你就可以滿足這一條。

交大資科所林盈達教授__做研究要避免的21件事

I. Capacity (能力):

1. Lack of scalability (無法迅速有效地處理大量的件事)
2. Busy but little throughput (很忙但沒進度)
3. Crash under heavy load (同時做三件事就掛了)
4. ON-OFF throughput pattern (間歇性施功)
5. Brainless and muscleless (不會思考又沒行動力)
6. Blurred receiver and transmitter (聽不到也講不清重點)
7. Weak in analysis, organization, or creativity (缺乏分析力組織力創造力)

II. Attitudes (態度):

8. Little self-motivation (低度自我期許)
9. A vacation hen (不專心孵蛋的母雞)
10. Irregular life style (不規則生活型態)
11. Messy desktop (混亂的文件與桌面)
12. A slow coach (慢郎中)
13. No ideas, no comments, no nothing (腦子一片空白)
14. Unhealthy personality (不太健康快樂正向的人格)
15. Too many personal affairs (太多雜事)

III. Disciplines (訓練):

16. Lack of intensive interaction (缺乏互動腦力激盪)
17. Pointless discussion (沒有抓住重點的無效討論)
18. Random walk, no roadmap (做事沒規劃)
19. Memoryless work planning (做了新的忘了原有的規劃)
20. Ignorance of details (輕忽細節)
21. Lack of professionalism (欠缺專業或嚴謹態度)

程式設計之道

THE DAO OF PROGRAMMING Geoffrey James

程式設計之道 冼鏡光

微電腦時代96,97

第一部 寂靜虛無篇

大師如是說:"學會從程式抓蟲子之後, 就可以畢業了

1.1 節

.寂靜虛無中有奧秘, 不動不靜, 乃程式之源, 吾無以名之, 故稱之為程式設計之道.

.若道至大, 則作業系統至大; 若作業系統至大, 編譯程式亦然; 若編譯程式至大,

則應用程式亦復如是, 是故使用人大悅, 世有和諧存焉.

1.2 節

.程式設計之道無遠弗屆, 雖晨曦微風而返.

.道生機器語言, 機器語言生組譯程式.

.組譯程式生編譯程式, 於是萬餘語言存焉.

.各語言有其目的, 均表達軟體之陰陽; 其在道中亦各得其所.

.但若能避免, 就不要用COBOL 寫程式.

1.3 節

.太初有道, 道生時空, 故時空乃程式設計之陰陽.

.程式員不悟道則時空永不敷使用, 悟道者恒有充份時空完成目標.

1.4 節

.上智程式員聞道而行之, 中智程式員聞道而求之, 下智程式員聞道而笑之.

.若無笑聲則無道矣.

.至高之聲難以聽聞.

.前進就是後退之路; 大智總是晚成; 每一個完美的程式仍有BUG.

.道在所有知識之外.


第二部 古之大師篇

大師如是說:"三日不寫程式則生命無趣.

2.1 節

.古程式員神秘而深奧, 無以度量其思維, 僅能描述其表象.

.像狐狸涉水般地小心; 像戰場老兵般地警覺; 像未經琢磨的木頭般地璞拙;

像洞中深潭地不透明.

.誰能指出他們心靈中的秘密?

.答案全在道中.

2.2 節

.大師Turing曾經夢到他是一部電腦, 醒後道:

. "不知是我Turing作夢變成機器, 還是一部機器作夢變成我我Turing."

.一家大電腦公司的程式員參加軟體會議後, 向他的經理報告說:"你知道其他電腦

公司有什麼程式員嗎? 他們不修邊幅, 頭髮長而邋遢, 衣服既舊且皺, 他們破壞

了氣氛, 而且我簡報時老是製造噪音."

.經理說:"我根本就不應該派你參加會議, 這些程式員超然物外, 他們把生命看成無稽,

意外的結合. 他們往來而無藩籬, 為他們的程式而活, 為什們他們一定要受社會積習

的約束?

.他們生活在道中."

2.3 節

.生手問大師:"有一個程式員從不設計, 測試程式, 寫作文獻, 但了解他的人都認為

他是世間最好的程式員. 為什麼?"

.大師曰:"這個程式員已充份悟道, 他超越了設計的需要; 系統垮了不會生氣,

而無條件接受這個世界. 他超越了文獻的需要, 他不再計較是否有人看他的程式.

他也超越了測試的需要, 他的每一個程式都圓滿無缺, 清澈, 優雅, 目的自明.

.是的, 他已悟道, 登堂入室.

第三部 設計篇

大師說:"到測試程式時再回頭修改設計就太遲了."

3.1 節

.曾經有人在參觀電腦展每天進門時都向警衛說:"我是的妙賊, 偷東西的技巧已臻化境,

先告訴你, 我絕不會放過這次展覽."

.這段話刺激到警衛, 因為展覽場有好幾百萬元價值的儀器, 所以老是盯這他,

不過卻只看到這個人一個攤位接著一個攤位看, 哼著小曲而已.

.這個人出門的時侯, 警衛把他帶到一旁搜身, 但卻找不到什麼.

.第二天這個人又來了, 而且教訓警衛說:"昨天我收獲不錯, 不過今天會更佳."

所以警衛就更加注意他了, 但是仍然沒有結果.

.最後一天警衛終於忍不住好奇心, 問那個人:"賊大師, 我給您弄得寢食難安,

您是否以教我, 究竟偷了些什麼?"

.這個人笑笑, 說:"我偷的是概念."

3.2 節

.從前有一位大師專寫沒有結構化的程式, 一個生手模仿他, 也開始寫沒有結構化的

程式. 當這位生手要求大師評量進展時, 大師卻批評他寫作沒有結構化的程式.

.大師說:"對大師適用的不一定適合生手, 在能超越結構化之前, 必須先悟道."

3.3 節

.某長官問程式員:"設計會計系統與作業系統, 那一個比較簡單?"

.程式員說:"作業系統."

.長官發出不相信的驚呼:"很顯然的, 會計系統不如作業系統複雜",他說.

." 不!"程式員回答,"在設計會計系統時, 程式員是各種不同主意的人之間的橋樑,

這些主意不外乎: 系統要如何作業? 報表型式如何? 要如何迎合稅法?...等等.

反過來, 作業系統卻不受外界表象的限制; 在設計作業系統時, 程式員尋求人與機器

間最純的和諧, 這就是為什麼作業系統容易設計."

.長官點頭微笑稱是:"但是那一個容易偵錯?"

.程式員沒有回答.

3.4 節

.經理去見大師, 並且告訴他一套新應用程式文件的需求規格, 問道:"如果我給你五

個程式員, 要多久才能設計好這個系統?"

.大師很快回答:"一年."

." 但是我們需要馬上用這個系統! 如果我給你十個程式員, 那要多久?"經理說.

.大師皺眉說:"這要兩年."

." 如果我給你一百個程式員呢?"

.大師聳聳肩:"這個系統根本作不出來了."

第四部 寫作篇

大師如是說:"寫作良好的程式本身自成天堂, 寫得差的程式本身就是地獄.

4.1 節

.程式要輕靈, 副程式像一串珍珠. 程式的精神與意圖應始終如一, 不多不少;

沒有多餘的迴圈, 也沒有額外的變數, 既不缺少結構, 也不過份笨重.

.程式應該追隨" 最低驚訝定律",這是什麼?

.簡單得很, 使用人對程式的反應是驚訝的機會要愈低愈好.

.程式不管再複雜, 應該以一個整體來作用; 他應該用內部邏輯, 而不是外在的表

象來指導作業.

.如果程式不滿足這些要求, 就會雜亂而易生混淆, 唯一的補救就是重新寫過.

4.2 節

.生手問大師:"我有一個程式, 有時侯作得很好, 有時侯卻不行; 我一直遵行程式設

計的規律, 但是卻把我弄得很困擾, 其理安在?"

.大師答曰:"因為不悟道才會如此, 只有笨蛋才會期望他的同儕有合理的行為,

而你卻對人類生產的機器有所期望?!計算機只模擬了決定論, 只有道才十全十美.

.程式設計的準則還是暫時性的, 只有道才會進入永恒. 所以, 你在開竅前要先思索道."

." 但我要如何才能知道已經開竅了呢?"生手問.

.大師回答:"從此以後, 你的程式都能正確執行."

4.3 節

.大師對弟子說:"不論軟體之為大為小, 道在所有軟體中."

." 桌上型計算機有道嗎?"弟子問.

." 有!"大師答.

." 電動玩具程式中有道嗎?"弟子續問.

." 也有!"大師說.

." 那個人電腦的DOS 中有道嗎?"

.大師咳一下, 輕輕挪動了位置,"下課",他說.

4.4 節

.皇太子的程式員正在寫作軟體, 指尖在鍵盤上飛舞, 程式順暢無誤的編譯完成,

執行起來像陣微風輕拂而完美的結束.

." 了不起!", 太子嘆曰:"你的技巧無懈可擊."

." 技巧?"程式員從終端機上轉過頭說,"我所信從的是道, 道超越任何技巧!

我開始學寫程式時, 在我眼前所見是混成一片的程式; 三年後, 不再見到這一大片

程式了

, 我學會使用副程式; 現在, 眼前一片空靈, 什麼都沒有了, 所有東西都進入無

型式的一片靜寂; 所有感覺都不必作用.

.我的精神可以依直覺而不必依任何計劃行事, 換言之, 我的程式自己寫作自己.

當然, 有時會有困難的問題; 我看著他們到來, 我降低自已的速度, 靜靜的看,

改一列程式之後困難就會煙消雲散; 我再重新靜靜坐著欣賞工作的歡樂. 我閉上雙眼

一會兒, 然後關機."

.皇太子說:"我的所有程式員都那麼聰明睿智嗎?"

第五部 維護篇

大師如是說:"雖然程式只有三列, 但總有一天需要維護."

5.1 節

.常用的門不必上油.

.急流不會淤塞.

.聲音與思想不能在真空中傳遞.

.不用的軟體會生鏽.

.這就是至大的奧秘.

5.2 節

.經理問程式員究竟要多久才能把手上的程式寫完."明天",程式員很快的回答.

.經理說:"我想你不太踏實; 真的要多久?"

.程式員想了一會兒:"我希望在程式中加上一些東西, 這至少要兩週."程式員終於說

." 時間還是短了一些",經理堅持說:"如果你能簡單的告訴我什麼時後能寫完我才會滿意."

.程式員同意這一點.

.幾年後經理退休了, 在歡送餐會上發現那個程式員伏在終端機上睡著了, 因為他

寫程式寫了整夜.

5.3 節

.一個生手被分派去寫一個單純的財務軟體.

.這個生手狂熱地工做了幾天, 但是當大師看他的成品時, 卻發現這個程式中包

含一個螢光幕編修程式, 一組一般性的繪圖程式, 一個人工智慧界面, 但卻沒有什麼

與財務方面有關.

.大師就問他, 這個生手卻變得很激動:"不要那麼沒耐心,"他說,"我最終會把財務

部份加上去."

5.4 節

.好農夫會忽視他種的穀子嗎?

.好老師會忽略他最差的學生嗎?

.好父親會容許他的孩子挨餓嗎?

.好程式員會拒絕維護自己的程式嗎?

第六部 管理篇

大師如是說:"程式員要多, 經理要少, 生產力就會增加."

6.1 節

.經理有開不完的會的話, 程式員就會寫電玩; 主計部門想到利潤, 發展經費

就會被刪減; 高級科學家談到藍藍青天, 那麼青天一定會有浮雲飛過.

.當然, 這不是程式設計之道.

.當經理許下承諾, 程式員就不理會電玩; 當主計部門有長程規劃, 就會回復

和諧與秩序; 當高級科學家處理手上的問題, 問題很快就會解決.

.這才是程式設計之道.

6.2 節

.為什麼程式員沒有生產力? 因為他們的時間都花在開會上頭.

.為什麼程式員難以駕御? 因為管理階層干預太多.

.為什麼程式員一個接一個辭職? 因為他們精力耗光了.

.在不良管理下工作, 程式員不會覺得他的工作有價值.

6.3 節

.某個經理快被炒魷魚了, 但是他底下的一個程式員寫了一個叫好又叫座的程式;

當然, 這位經理因而保住了飯碗.

.經理打算給這位程式員一點獎勵, 但他拒絕接受, 並且說:"因為我覺得這是個有

趣的概念, 才會寫這個程式, 所以我不希望有獎勵."

.經理聽了之後說:"這個程式員雖然職位不高, 但卻充份了解做為一個職員的責任,

讓我們把他升成崇高的管理顧問吧!"

.在告訴程式員時, 他再度拒絕, 說:"我之存在是因為可以寫程式, 如果升了我,

那除了浪費每一個人的時間外而成不了事. 我可以走了嗎? 我還得寫程式."

6.4 節

.經理告訴程式員們說:"下面是你們的工作時間: 早上九點來上班, 下午五點鐘下班."

所有程式員都很生氣, 有幾個馬上辭職.

.於是經理說:"好吧! 這樣好了, 只要能夠如期完工, 工作時間由你們自定."程式員現

在滿意了, 每天中午開始工作, 直到第二天早上.

第七部 公司智慧篇

大師如是說:"你可以對主管示範一個程式, 但無法讓他通曉電腦."

7.1 節

.生手問大師:"遙遠東方有一個叫" 公司總部" 的偉大樹狀結構, 上面滿滿地標上了

些副總裁, 會計長等的圖案. 它發出大量的備忘錄, 每張上面都寫了" 收文!"

" 發文!"沒有人知道是什麼意義. 每年都會把新的名字加到新的分 枝上, 但似乎全

都徒勞無功. 為什麼這樣一個不自然的組織還能繼續存在?"

.大師回答說:"你已經體認到這個龐大的結構, 而被它不合理的目的困擾.

不過你能不從它無休止的迴旋而得到樂趣嗎? 能夠不欣賞深藏在枝葉底端毫無困難

的程式設計嗎? 為什麼要被他的無用而困擾呢."

7.2 節

.東方海上有大魚曰鯤, 鯤能變成雙翼遮天的大鵬. 當大鵬飛越陸地時帶來一道公司

總部的訊息, 這道訊息正好掉在一群程式員中央, 然後大鵬折起雙翼乘風而歸.

.生手程式員瞪眼望著大鵬, 因為他們不認得; 中智程式員憂大鵬的來臨, 因為他們

害怕它帶來的訊息; 只有大師才能繼續坐在終端機前工作, 因為他不知大鵬的來去

7.3 節

.象牙塔的魔術師帶著他的最新發明去見大師, 他推了一個大黑盒子走進大師的辦公室,

大師正在靜靜的等著.

." 這是一套整合性, 分散式, 一般用途的工作站",魔術師如是說,"還有一套專屬的

作業系統, 第六代語言, 多項最先進的使用人界面, 再加上人體工學的設計;

這花了我的助手們好幾百人年才造出來的, 不是很了不起嗎?"

.大師抬了下眼珠子,"的確了不起."大師說.

.魔術師繼續說:"公司總部已經下令每個人都要用這台工作站做發展新軟體的基石,

您同意嗎?"

." 當然."大師答道:"我馬上會把它放到資訊中心去."於是魔術師高高興興的回到

象牙塔去.

.幾天後, 一個生手在大師的辦公室裡團團轉, 說:"我找不到新程式的報表,

您知道會在那兒嗎?"

." 當然",大師答道,"報表就堆在資訊中心裡頭的基石上!"



7.4 節

.大師可以毫無憂慮的從這個程式轉入另一個程式, 管理上的改變傷不到他;

縱使計劃中止了, 也不會被炒魷魚. 為什麼? 因為他充滿了道.

第八部 硬體與軟體篇

大師如是說:"沒有風, 草不會動, 沒有軟體, 硬體就是廢物."

8.1 節

.生手問大師:"我知道一家電腦公司比其他的大得多, 高高在上就像巨人之比侏儒;

它的任一部都可以單獨成為一個企業. 為什麼會這樣?"

.大師回答:"你為什麼問這個笨問題? 這家公司就是因為它大才會這麼大. 如果它只

知道硬體, 沒有人會買它; 如果只生產軟體, 沒有人會用它; 如果只維護系統,

人家會把它看成修理員; 但是因為他把所有的合在一起,人們就把它當神一樣看待了

. 它根本無需競爭, 因為贏來不費吹灰之力."

8.2 節

.大師有一天經過一個生手旁邊, 發現生手迷上一台手掌型的電玩,"對不起",大師說,

"我可以看看它嗎?"

.生手停下來, 並且把這台機器交給大師. 大師說:"我看到這台機器玩起來有三個層次:

初級, 中級, 高級; 不過這種機器通常都有另一個層次的說法, 使機器贏不了人類,

而人類也勝不了機器."

." 啊! 大師",生手說:"這個奇妙的開關在那裡?"

.大師把機器摔到地上, 用腳把它踏爛.

.突然地, 生手開竅了.

8.3 節

.從前有一位微電腦的程式員對一位來拜訪他的大型電腦程式員說:"你看,

在我這兒多好! 我有我自己的作業系統與案儲存設備, 我不必與任何人共用任

何電腦資源;軟體本身自給自足, 而且容易使用. 為什麼你不辭掉目前的工作

來加入我們?"

.於是大型電腦的程式員就對他的朋友解釋:"大型電腦就像古之聖哲般的穩穩座落i

在資訊中心中央, 磁碟一個接一個蔚為奇觀, 軟體像鑽石般地有多種面目, 像

古森林般的濃密茂盛. 各個程式像一片急流般地湧入系統, 而這就是我在那兒工

作的樂趣 ."

.聽了這段話之後, 微電腦程式員靜默無聲; 但是這兩個人卻結為好友, 至死不渝.

8.4 節

.Hardware與Software走在路上, Software說:"你是陰我是陽, 如果我們能一條心,

一定會成大名賺大錢."所以,他們就聯合在一起而想征服世界.

.走了一段路之後, 碰到Firmware, 穿得破破爛爛, 拿著根柺杖, 並且對他們說:

"道在陰陽之外, 寂靜不動如古井之不生波瀾; 道不求名, 故無人知曉其存在;

道不逐利, 因它圓滿無缺. 道超乎時空之外."

.Hardware和Software聽了之後倍感慚愧而打道回家.

第九部 尾聲

大師如是說:"這是下課的時候了!"

SMTP_Example.java寄送郵件





import java.io.*;
import java.net.*;
public class SMTP_Example {
public static void main(String args[]) {
try {
//用學校的stmp server送信,成功傳回220 Ready
Socket cs = new Socket("stumail.nutn.edu.tw", 25);
//輸出串流
BufferedWriter outData = new BufferedWriter(
new OutputStreamWriter(cs.getOutputStream()));
//輸入串流
BufferedReader inData = new BufferedReader(
new InputStreamReader(cs.getInputStream()));
//送出HELO,成功則傳回250 OK
outData.write("HELO stumail.nutn.edu.tw \r\n");
outData.flush();
System.out.println(inData.readLine());
//送出寄件者,成功則傳回250 OK
outData.write("MAIL FROM: \r\n");
outData.flush();
System.out.println(inData.readLine());
//送出收件者,成功則傳回250 OK
outData.write("RCPT TO: \r\n");
outData.flush();
System.out.println(inData.readLine());
//開始處理郵件標題和內容,若成功則會回傳354 Start mail input之訊息
//記住需要在每行結尾加上
outData.write("DATA \r\n");
outData.flush();
System.out.println(inData.readLine());
//寄件者
outData.write("From: s09555051@stumail.nutn.edu.tw \r\n");
//收件者
outData.write("To: s09555051@stumail.nutn.edu.tw \r\n");
//郵件標題
outData.write("Subject: STMP Mail Test By Java \r\n");
//郵件內容
outData.write("This is just a simple test \r\n");
outData.write("so now...do you know how to use? \r\n");
outData.write("中文嘛a通哦!! \");
//結尾加上.
outData.write("\r\n");
outData.write("." + "\r\n");
outData.flush();
System.out.println(inData.readLine());
outData.write("QUIT \r\n");
outData.flush();
System.out.println(inData.readLine());
//關閉串流
cs.close();
outData.close();
inData.close();

}catch(UnknownHostException uhe) {
uhe.printStackTrace();
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
}

GetImage.java顯示網路上的圖片



import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GetImage extends JFrame{
Container theContainer;
JTextField theTextField;
JButton theButton;
Toolkit theToolkit;
Image theImage;
URL theURL;
public GetImage() {
super("從網路取得圖片");
theContainer = super.getContentPane();
theTextField = new JTextField(18);
theContainer.add(theTextField);
theButton = new JButton("輸入網址");
theContainer.add(theButton);
theToolkit = getToolkit();


theButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
theURL = new URL(theTextField.getText());
theImage = theToolkit.getImage(theURL);
repaint();
}catch(MalformedURLException malformedEx) {
JOptionPane.showMessageDialog(null,"不合標準的URL格式!");
}catch(IOException ioEx) {
JOptionPane.showMessageDialog(null,"發生IO例外!");
}catch(Exception Ex) {
JOptionPane.showMessageDialog(null,"發生例外!");
}
}
});





pack();
setLayout(new FlowLayout(FlowLayout.CENTER));
setVisible(true);
setBounds(100,100,400,300);

}
public void paint(Graphics g) {
super.paint(g);
if(theImage != null) {
g.drawImage(theImage,20,80,this);
}

}

public static void main(String[] args) {
GetImage demo = new GetImage();
}
}

基於Java的線上即時通訊軟體DukeIM v2.0

96上學期修習資工三-Java網路程式設計的Final Project作品
DukeIM v2.0主要是模擬MSN與Yahoo即時通的作品
大致上功能也都完備
Server端的部份我沒有用JDBC資料庫,所以可以直接架設
Client的部份可以修改host.ini修改Server相對應Port
目前來講Message的部份並沒有直接經過Server而是Client互傳
大致上寫了兩三個禮拜,功能大致上也都有把想像中的實作出來
雖然有少部份bug或者是不完善的地方,卻也都已經盡量將他減低錯誤!
因為程式碼大部份是手工自己寫出來的
所以當初在處理訊息並且做出相對應的動作的時候也蠻累的



投影簡報

專題書面報告

程式執行檔

DukeIMPopupWindow.java模仿好友上線提示窗口




import java.awt.*;
import javax.swing.*;


public class DukeIMPopupWindow extends Thread{
public static final int moveStep = 3;

JFrame popupFrame;
Container contentPane;
Dimension screenSize;
int topPosition;
int basePosition;
int leftPosition;


public DukeIMPopupWindow() {
popupFrame = new JFrame("好友上線");
contentPane = popupFrame.getContentPane();
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//上邊界
topPosition = screenSize.height - 185;
//下邊界
basePosition = screenSize.height;
//左邊界
leftPosition = screenSize.width - 250;

JLabel messageLabel = new JLabel("好友上線囉!",JLabel.CENTER);
contentPane.add(messageLabel);

popupFrame.setLocation(leftPosition , basePosition);
popupFrame.setSize(250,150);
popupFrame.setResizable(false);
popupFrame.setVisible(true);
}
public void closeWindow() {
if(popupFrame != null) {
popupFrame.dispose();
System.exit(0);
}
}
public void run() {
while(true) {
try {
Thread.sleep(10);
if(basePosition - moveStep > topPosition) {
popupFrame.setLocation(leftPosition, basePosition);
basePosition -= moveStep;
} else {
Thread.sleep(1500);
closeWindow();
}

}catch(InterruptedException inE) {
inE.printStackTrace();
}
}
}
public static void main( String args[] ) {
DukeIMPopupWindow popupWindow = new DukeIMPopupWindow();
popupWindow.start();
}

}


變數交換的三種方式

主要有三種方法:
最常見藉由第三方變數交換:byTemp(x , y)
數學式的藉由加減法:byAddSub(x , y)
效率最高的一種方法:byXor(x , y)



public class VariableExchange {

public static void main(String args[]) {
int x = 123;
int y = 321;
System.out.println("Before: x = " + x + " , " + "y = " + y);
byTemp(x , y);
byAddSub(x , y);
byXor(x , y);
}
public static void byTemp(int x , int y) {
int temp;
temp = x;
x = y;
y = temp;
System.out.println("byTemp(x,y): x = " + x + " , " + "y = " + y);
}
public static void byAddSub(int x , int y) {
x = x + y;
y = x - y;
x = x - y;
System.out.println("byAddSub(x,y): x = " + x + " , " + "y = " + y);
}
public static void byXor(int x , int y) {
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println("byXor(x,y): x = " + x + " , " + "y = " + y);
}
}

Java全螢幕顯示

讓JFrame去除標題列
frame.setUndecorated(true);
主要有兩種方式可實現全螢幕顯示



Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle bounds = new Rectangle(screenSize);
frame.setBounds(bounds);




frame.getGraphicsConfiguration().getDevice().setFullScreenWindow(f);

CopyFile.java簡單的展示如何使用JProgressBar顯示檔案複製進度




/* @description: 簡單的展示如何使用JProgressBar顯示檔案複製進度
* @source: Introduction to Java Programming Sixth Edition,Y.DANIEL LIANG
* @chapter: MultiThreading, p.832
**/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.*;

public class CopyFile extends JFrame{
private JProgressBar progressBar = new JProgressBar();
private JButton btnCopy = new JButton("Copy");
private JTextField txtFrom = new JTextField();
private JTextField txtTo = new JTextField();

public CopyFile() {
//檔案來源
JPanel panelFrom = new JPanel();
panelFrom.setLayout(new BorderLayout());
panelFrom.setBorder(new TitledBorder("From"));
panelFrom.add(txtFrom, BorderLayout.CENTER);
//檔案目的
JPanel panelTo = new JPanel();
panelTo.setLayout(new BorderLayout());
panelTo.setBorder(new TitledBorder("To"));
panelTo.add(txtTo, BorderLayout.CENTER);
//放置容器
JPanel panelContainer = new JPanel();
panelContainer.setLayout(new GridLayout(2,1));
panelContainer.add(panelFrom);
panelContainer.add(panelTo);
//複製按鈕
JPanel panelCopy = new JPanel();
panelCopy.add(btnCopy);


this.add(progressBar , BorderLayout.NORTH);
this.add(panelContainer , BorderLayout.CENTER);
this.add(panelCopy , BorderLayout.SOUTH);

//設進度表百分比
progressBar.setStringPainted(true);

btnCopy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnCopy.setEnabled(false);
new Thread(new CopyFileTask()).start();

}
});


}

public static void main(String args[]) {
CopyFile frame = new CopyFile();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Copy File");
frame.setSize(400,180);
frame.setLocation(300,180);
frame.setResizable(false);
frame.setVisible(true);
}

//inner class
class CopyFileTask implements Runnable {
private int currentValue;
public void run() {
//負責輸入Stream
BufferedInputStream in = null;
//負責輸出Stream
BufferedOutputStream out = null;
try {
File inFile = new File(txtFrom.getText().trim());
in = new BufferedInputStream(new FileInputStream(inFile));

File outFile = new File(txtTo.getText().trim());
out = new BufferedOutputStream(new FileOutputStream(outFile));
//來源檔案總共讀取多少Bytes
long totalBytes = in.available();
//設置初始值與最大值
progressBar.setValue(0);
progressBar.setMaximum(100);
//複製來源檔案到目的檔案
int r ;
long byteRead = 0;
byte[] b = new byte[1024];
while((r = in.read(b,0,b.length)) != -1) {
out.write(b, 0 , r);
//累加讀取了多少Bytes,並且顯示在JProgressBar
byteRead += r;
currentValue = (int) (byteRead * 100 / totalBytes);
progressBar.setValue(currentValue);
}

}catch(FileNotFoundException fnfE) {
fnfE.printStackTrace();
}catch(IOException ioE) {
ioE.printStackTrace();
}finally {
btnCopy.setEnabled(true);
try {
if( in != null) in.close();
if(out != null) out.close();

}catch(Exception ex) {}
}
}
}

}

FlashingText.java閃滅文字





/* @description: 閃滅文字
* @source: Introduction to Java Programming Sixth Edition,Y.DANIEL LIANG
* @chapter: MultiThreading, p.806
**/
import java.awt.*;
import javax.swing.*;

public class FlashingText extends JFrame implements Runnable {
public static final String welcomeMessage = "Welcome to WindFlyer\'s CyberSpace.";
private JLabel lblText = new JLabel(welcomeMessage);
Container contentPane;
public FlashingText() {
super("FlashingText Demo");
contentPane = getContentPane();
contentPane.add(lblText);

}
public void run() {
try {
while(true) {
if(lblText.getText() == null) {
lblText.setText(welcomeMessage);
}else {
lblText.setText(null);
}
Thread.sleep(370);
}
}catch(InterruptedException iE) {
iE.printStackTrace();
}
}
public static void main(String args[]) {
FlashingText text = new FlashingText();
text.setSize(225 , 100);
text.setLocation(300 , 300);
text.setVisible(true);
text.setResizable(false);
text.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Thread flashThread = new Thread(text);
flashThread.start();

}

}

ITE Linux通過

送來的包裹...

Linux基礎運作-90分

進階系統管理-82.5分

Linux基礎運作+進階系統管理


TQC Java術科解答_類別一



import java.io.*;
public class JVA01
{
public static void main(String args[])
{
int lotto[] = new int[7];
for (int i = 0; i
{
lotto[i] = (int)(Math.random() * 42) + 1;

for (int j = 0; j
{
if (lotto[i] == lotto[j])
{
i--;
}
}
}

for (int x = 0, i = 1; x
{
if (lotto[x] < 10)
{
System.out.println("第\" + i + "個號碼:" + "0" + lotto[x]);
}
else
{
System.out.println("第\" + i + "個號碼:" + lotto[x]);
}
}
System.out.println("特別號:" + lotto[6]);
}
}


//Code From http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/UseDate.htm
import java.text.DateFormat; import java.util.Date;

public class JVA02
{
public static void main(String[] args)
{
Date date = new Date();

DateFormat shortFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.SHORT);

DateFormat mediumFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
DateFormat.MEDIUM);

DateFormat longFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG);

DateFormat fullFormat = DateFormat.getDateTimeInstance(DateFormat.FULL,
DateFormat.FULL); System.out.println("------------------------");
System.out.println("\t當地時間"); System.out.println(
"------------------------"); System.out.println(shortFormat.format(date))
; System.out.println(mediumFormat.format(date)); System.out.println
(longFormat.format(date)); System.out.println(fullFormat.format(date));
}
}


import java.io.*; public class JVA03
{
public static void main(String args[])throws IOException
{
System.out.println("請輸入欲產生之亂數個數:"); BufferedReader br = new
BufferedReader(new InputStreamReader(System.in)); String x = br.readLine()
; int r = Integer.parseInt(x); int random[] = new int[r]; for (int i = 0;
i
{
random[i] = (int)(Math.random() * 999) + 1;
}

int swap = 0; for (int i = 1; i
{
for (int j = 0; j
{
if (random[j] > random[j + 1])
{
swap = random[j]; random[j] = random[j + 1]; random[j + 1] = swap;
}
}
}
for (int i = 0; i
{
System.out.print(random[i] + " ");
}
}
}


//decompiled file...
public class JVA04
{



public static void main(String args[])
{
int ai[] =
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
}; boolean flag = false; boolean flag1 = true; boolean flag2 = true;
do
{
for (int i = 1; i < ai.length; i++)
{
int j = (int)(Math.random() * 10D); ai[0] = ai[i]; ai[i] = ai[j]; ai[j]
= ai[0];
}

int k = ai[1] + ai[2] + ai[3]; int l = ai[4] + ai[5] + ai[6]; int i1 =
ai[7] + ai[8] + ai[9]; int j1 = ai[1] + ai[4] + ai[7]; int k1 = ai[2] +
ai[5] + ai[8]; int l1 = ai[3] + ai[6] + ai[9]; int i2 = ai[1] + ai[5] +
ai[9]; int j2 = ai[3] + ai[5] + ai[7]; if (k == l && l == i1 && i1 ==
j1 && j1 == k1 && k1 == l1 && l1 == i2 && i2 == j2)flag = true;
}
while (!flag); System.out.println("--CSF範例--"); System.out.println(
"答案為:"); System.out.println(ai[1] + " " + ai[2] + " " + ai[3]);
System.out.println(ai[4] + " " + ai[5] + " " + ai[6]); System.out.println
(ai[7] + " " + ai[8] + " " + ai[9]); System.out.println(
"不論橫向縱向及對角線加起來的和都是 15");
}
}




import java.io.*; import java.util.StringTokenizer;

public class JVA05
{



public static void main(String args[])throws IOException
{
//////////////////////////////////////////////////////////////////////////
try
{
System.out.println("------CSF範例------"); System.out.println(
"請輸入陣列列數\"); BufferedReader br = new BufferedReader(new
InputStreamReader(System.in)); int i = Integer.parseInt(br.readLine());

System.out.println("每一列陣列裡要幾個數字?"); int j = Integer.parseInt
(br.readLine());

String arrayOriginal[][] = new String[i][j];

String arrayConvert[] = new String[j];
//////////////////////////////////////////////////////////////////////////
for (int x = 0; x < i; x++)
{
System.out.println("請輸入第 " + x + " 列");

String s = br.readLine();

StringTokenizer stringtokenizer = new StringTokenizer(s);

for (int y = 0; y < j; y++)
{
arrayConvert[y] = stringtokenizer.nextToken(); arrayOriginal[x][y] =
arrayConvert[y];
}

}
//////////////////////////////////////////////////////////////////////////
System.out.println(" "); System.out.println("陣列經行、列轉換結果:");
String arrayResult[][] = new String[j][i];

for (int x = 0; x < i; x++)
{
for (int y = 0; y < j; y++)arrayResult[y][x] = arrayOriginal[x][y];

}
//////////////////////////////////////////////////////////////////////////
for (int x = 0; x < j; x++)
{
for (int y = 0; y < i; y++)System.out.print(arrayResult[x][y] + " ");

System.out.println();
}

}
catch (Exception exception)
{
System.err.print(exception);
}
}
}



import java.io.*; public class JVA05
{
public static void main(String args[])throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int m = 0; int n = 0;

System.out.println("請輸入陣列列數\"); m = Integer.parseInt(br.readLine());
System.out.println("每一列陣列裡要幾個數字?"); n = Integer.parseInt
(br.readLine());

int convert[][] = new int[m][n]; int value; for (int x = 0; x
{
System.out.println("第\" + x + "次\"); for (int y = 0; y
{
value = Integer.parseInt(br.readLine()); convert[x][y] = value;
}
}

for (int x = 0; x
{
for (int y = 0; y
{
System.out.print(convert[y][x] + " ");
}
System.out.println();
}



}
}

SCJP1.4認證


在銘傳資管大二上考的第一張資訊證照SCJP 1.4
算是Sun MicroSystems的最初階認證
同時也是我的第一張資訊證照
欲挑戰更高階的認證此認證是必備的!!
從中可以得到許多平常寫程式比較不會注意的小細節
在語法的熟練度上也能有一定的提升