慘遭助教修理的一道程式習題
發表於2010.01.19 02:51

喜歡這篇文章嗎?

 

 
慘遭助教修理的一道程式習題
 
冼鏡光
January 19, 2010上線
 
 
起頭
           
            現在理工科學生修程式寫作或類似課程簡直是司空見慣,但是在我讀大學時能夠修這門課可是足以傲人傲己。淡江(那時叫做淡江文理學院、再往前算則是淡江英專)是第一所安裝電腦、而且要求學生(當然不是所有)修計算機概論和程式寫作的私立學校,機器(IBM 1130)就裝在科學館的地下樓(下面左邊的建築),一樓是圖書館。
 
 
 
 
淡江數學系有兩個組:(純)數學組和數理統計組,兩組都要修一年上下兩個學期的計算機概論和程式寫作(使用FORTRAN),上課地點就是有名的宮燈教室。所謂宮燈,指的是中間豎了宮燈式路燈的路,現在叫做右任路。下面是、宮燈一角,最頂端是淡江海豚雕塑,拍攝這張照片時正在整修,沒裝燈罩:
 
 
 
 
路兩旁是中國式古典建築、漆成紅色的教室。在那個時期,這些宮燈教室大多數是文學院在用,理學院學生到那兒上課是一大樂事,因為下課時正好可以欣賞頗有靈秀之氣的文學院女生。下面第一張是從宮燈路頂端(靠近海豚雕塑處)往下看的景,遠方是觀音山,教室在樹後方;第二張照片是在宮燈路向上拍的教室長廊,第三張是從長廊中央向下拍、但這間不是教室,也許淡江人才知道它的用途!
 
 
 
 
 
 
 
 
         宮燈教室前面是草地,後面是樹蔭很多而且更大的草坪(下面第一張是正在整修的教室後方,第二張是草坪一角,第三張是涼亭),連厠所都蓋得很古典(第四張)。教室外面遠眺是觀音山(第五張),天氣熱時把窗戶打開,清風除來會十分舒服,當然也很容易打瞌睡。
 
 
 
 
 
 
 
 
 
 
 
 
 
計算機概論與程式寫作
 
        言歸正傳。那時教這門課的是才回國的周道揚教授,記憶中周教授口才很好,上課前後常叼著雪茄、甚至坐在草地上和學生聊天。這門課剛開始時總不外乎是電腦結構、各種進位和運算方式、進位制之間轉換等等,大家應該都聽得津津有味,但是我卻比較喜歡愛因斯坦式的思維:研究是用鉛筆和紙做的,沒多久就失去興趣。最後,雖然周教授的課十分精采,但我如果不是溜了就是在涼風習習下猛向周教授點頭稱是。這門課後來開始教FORTRAN(這是FORTRAN IV),我幾乎都不曾在教室中,到交習題時就只好拉著好友陳瑩瑩或許金燦教我,所以我的FORTRAN啓蒙師父是陳瑩瑩、周道揚教授算是師祖了;陳與許後來程式都寫得一流,許金燦到目前還在吃這行飯。
 
            上程式設計課終究是要交習題的。我修這門課時還在用打孔卡片,做習題前要先得到助教批准領一張上機卡,再把程式在打卡室打好,連同上機卡一起交給作業員。程式做完後,作業員會把報表夾在上機卡和程式卡中還給我們,當然上機卡就會多蓋一個章,從蓋了多少個章就知道上機多少次。上機次數當然有個限制,不過已經記不起來了。
 
 
頭兩道習題
 
            我們的第一道練習題是寫一個程式讀入一個正整數n、並且印出2與n之間的所有質數。這道題目當然難不倒數學系學生,把他們困住的通常是如何正確使用FORTRAN語法寫成程式。學期中某天陳瑩瑩告訴我要交習題了,我才意識到問題的嚴重性,直拉住師父補習FORTRAN;好不容易學會FORTRAN的語法,領了上機卡就開始思考如何寫這個程式。
 
            我一向習慣紙上作業,於是在紙上先寫好程式,一直模擬檢查到沒有錯誤為止,然後到打卡室(用兩個指頭)打卡,再反覆校對,最後交給作業員上機。第二天領回報表,果然得到正確答案,於是喜孜孜地把習題送到助教那兒。沒想到這位助教十分難纏,她說沒有人一次就可以做出結果的(印象中班上就有同學一次就做出結果),所以我有抄襲的嫌疑,而且似乎不太相信我這個後段班學生的說詞(我一向有考試只求70分的性格)。我說,既然妳不相信,那再出題目好了,於是就拿到第二題,在好勝心驅使之下,還是一次就得到答案!抱歉,題目記不起來了,後來發現我可能是全班唯一做這道題目的學生,助教的意圖大概是讓我沒得抄吧!
 
 
大麻煩來了!
 
            這位助教仍然不相信學生上機一次就可以做出結果,我當然希望可以還我清白,因此要求再做一題試試,這一次她出給我的題目是:
 
 
 
            在做這道題目時,課堂上只教了IFGOTODO,完全沒講到陣列(陣列是在第二個學期討論)。不過縱使用陣列做起來也未必簡單,因為還沒學到排大小,如果不用陣列就得拿兩個數比來比去,程式會很複雜也很長。
 
            今天的Fortran 90/95有三種IF敘述,IF-THEN-ELSE-END IF邏輯IF和算術IF(算術IF很快就會從Fortran標準中出局,最好不要再用了),但我做習題時只教到算術IF。算術IF的語法是這樣的:
 
IF 運算式 xxxyyyzzz
 
如果「運算式」的值小於零、等於零、或大於零,就執行在xxxyyy、或zzz那兒的敘述,因此用算術IF寫出來的程式會比較長,而且出錯機會要比用IF-THEN-ELSE-END IF的大很多。那時我的想法是,助教在整人、想把我「當」掉。
 
            既然要了題目,助教也出了題目,為了証明自己清白也只有硬著頭皮寫程式了,雖然題目看起來不很合理。開始思考之後就愈來愈覺得題目並不難,但卻不好做(事實上是很繁雜),如果硬是靠做比較來排大小,程式一定很長,打卡出錯的機會極大。萬一上機幾次才能得到結果,前兩題一次OK的記錄就完全破功,反而)証實助教的疑慮,但是這個程式對才入門的學生而言的確不好寫。所以,我的想法是走旁門左道,寫一個較短而且只適用排十個數的程式,這樣一次OK的機會比較大。
           
            就這樣連續幾天都沒什麼進展,想出來的點子功效不大,主要是不知道那個輸入值最小、第二小、第三小等等(用陣列的話,陣列的足碼就可以用來記錄次序)。有一天在台北火車站前等公車回家時,因為車班少、得等很久,索性就站在那兒想這個問題。那時站在我兩邊的人一定會覺得我有點智障,一下擠眉弄眼、一下看著遠方而目光無神,一下似乎口中唸唸有詞、一下手不停比劃、一下又是口露微笑,最後肯定幾乎是手舞足蹈(因為做出來了,Eureka!)。坐上公車後再把想法整理複習一番,覺得是正確的,一到家立刻拿出紙筆把程式記下來,反覆啄磨,直到完全確定正確無誤為止,然後就上床睡覺。
 
            第二天到學校忙著打卡校對上機,果然又是一次OK,真的是樂翻了,急急忙忙拿報表去見助教。沒想到她一看報表就說這不是我做的,首先她懷疑程式的正確性,用她自己的輸入再驗証,程式的確沒錯。接著她說我是抄別人的,我的回答是只有我一個人做這道題,我要抄誰的程式?接著她又說我是抄書的,我要求她把那本書找出來。她又說我是找槍手做的,我問她槍手是誰?後來她實在找不出其它理由,就只好放棄、算我過關了。
 
            為什麼助教一直找麻煩?我猜是這樣的,我的不用陣列為十個正整數排大小的程式,以舊FORTRAN的寫法只有十多列敘述,而且增加一個輸入值就多一道敘述,如果容許有相同輸入值,程式就多十列。所以,我猜助教肯定對這個奇怪而且出乎意料的解法頗有意見,也許還弄不清程式在做什麼,那時自己年輕氣盛也不願意向她解釋程式的邏輯。但話又說回來,那個程式的效率非常非常差,如果助教的輸入值中有一個比較大(譬如說有5位數;IBM 1130用16-bit整數、15-bit位址,所以最大記憶體是32K個16-bit word,也就是64K byte),這個程式的毛病就原形畢露(也就是很慢,但結果正確),好在助教都只用一位或兩位數的輸入,程式在彈指之間就印出排好大小的十個數。
 
 
不敢再修、免得又出問題
 
            我想助教對我的印象十分不好,這門課到最後如果不是補考過關、就是向周道揚教授求了個60分(忘了是那一個情況了)。不論如何,我不敢再修下學期的課,免得又碰到她再被惡整一番,於是就要求陳瑩瑩和許金燦兩位好友保留他們下學期的程式卡片。第二年下學期再去補完學分,當然那個學期上課就都在胡混,交習題時就靠修修改改兩位好友留下來的程式;說起分數嘛,大概就是60多吧!慶幸的是助教換了個不整人的,整人的那位據說是到某大國際電腦公司上班了。總之,我的計算機概論和FORTRAN就是這樣混過來的,那疊十多張的程式卡片一直到出國讀博士學位之前都收得好好的,但搬了幾次家之後就消失了。
 
 
結語
 
            學生時代我老是覺得寫FORTRAN程式實在沒什麼意思,雖然時髦,但對純數學沒多大用處。畢業後當兵自然不會用FORTRAN,退伍後找到了工作,沒想到頂頭上司認為學數學的應該會寫程式(那是當時的習慣想法),於是我的第一個挑戰就是把前人留下來一個有不少bug的FORTRAN大程式整治好、並且補充缺少的部份。正因為FORTRAN沒學好,弄得常常在辦公室裡頭把兩三張椅子拼起來當床過夜。出國留學拿到學位後,陰錯陽差地又讓我去教工學院學生Fortran 90,後來還加上數值方法(當然還是用Fortran 90,請看給老師與同學:數值方法投影片下載這篇文章的說明)。不知道您有沒有發現,我寫的是Fortran 90而不是FORTRAN 90,因為標準中用前者,而不是後者;換言之,新標準建議用Fortran這個寫法而不是FORTRAN!
 
        班上有些學生常抱怨學什麼Fortran,以後都用不著,不少人(連一些教授、不少還是計算機系教授)都希望改用C/C++或Java甚至於VB教數值分析。通常我會告訴學生,許多年前老師也被當過、也覺得Fortran沒有用,但後來Fortran還是我賺錢養家的工具之一,我們手上沒有透視未來的水晶球,做學生時能多學一點就多學一點,免得事到臨頭時會後悔。所以上第一堂Fortran課時會引用知名計算機科學家Charles Anthony Richard Hoare(通常寫成C. A. R. Hoare,或稱他為Tony Hoare)說的一段話。C. A. R. Hoare是一位了不起的大師級人物,他設計了第一個ALGOL語言的編譯程式,Quicksort是他的貢獻,在作業系統中monitor這個同步機制的理論是他打下的、但他不是原創者(原創人是Per Brinch Hansen),Communicating Sequential Process – CSP是他在行程和複線作業上的經典理論(也是他一本名著),他在軟體工程上的貢獻也非常大。下面就是Hoare說的話:
 
I don’t know what the programming language of the year 2000 will look like,
but I know it will be called FORTRAN.
 
C. A. R. Hoare說得沒錯,Fortran歷久彌新,到今天已經超過一甲子,在過去60年中有太多程式語言宣稱可以取代Fortran,而且Fortran很快就會死亡被人淡忘,但是絕大多數這些語言都在Fortran出局前陣亡,Pascal、PL/I、Modula等等都是好例子。
 
 
習題
 
            您不妨試看看能否不用陣列(只用ifdofor)寫一個為十個整數(不一定是正整數,而且可能會有相同輸入值)排大小的程式,但可以執行的敘述數目以比20來得少為原則。如果是用Fortran,邏輯IF會比算術IF簡潔,在C/C++或Java之下就沒什麼差異了;當然,您不必太計較程式的效率。下個星期我會公佈答案。
 
 
後記
 
            在求學方面這一輩子有兩個難以忘懷的時期,一個是讀博士學位的五年,那是我唯一真正好好讀課本做習題的時光,主要是保住全額獎學金,另一個是在淡江的四年。高中坐我隔壁的同學一直說淡江的數學系十分好(因為他哥哥讀淡江),所以我在高二時淡江就如雷貫耳。當時住的地方向前走不遠是一間名大學、向左走不遠則是一間不那麼有名的名大學,不過走路、坐車、逛街碰到這些名大學的學生時,從他們談學問的言辭卻聽不出名大學好在那兒,再加上自己高中成績也不十分好(班導師認為我可能考不上甲組而建議我轉攻乙組),所以填志願時把那些名大學排在淡江後面(反正也考不上),結果是我可能是第一(還是第二)志願考上淡江,不過分數大約足夠上最近老是鬧新聞的那所大學或是另一間排名低一些大學的冷門系,但這些系都沒填在志願表中。
 
上了淡江對讀課本興趣還是不大,而是熱衷於旁門雜學或高年級(甚至於根本不會開)的課,成績老是在70分邊緣打轉,有個學期還得三一。但是一些淡江的師長卻沒有看不起或放棄這個後段班的學生,夏文候老師和楊國勝老師網開一面、准我越級(甚至於在沒先修課的情況下)修高年級和研究所的課,所以大致上我二年級修三年級的課(因為高等微積分在第一個學期就被當掉了)、三年級修四年級和研究所的課、然後四年級回頭補二年級的課;也感謝黄柳男老師和林義雄老師讓一個高等微積分沒過的學生馬上修複變函數論和泛函分析。最後,葉能哲老師給我一個在系圖書館工讀的機會,讓我不必為生活發愁;請台大賴東昇老師為我們少數幾個學生灌輸系中學不到的知識;又聘請了黑木哲德(Tetsunori Kurogi)老師來台,他教我非常非常多當代流行的拓樸學知識、而且從東京大學和名古屋大學弄來不少當時國內可能是唯一珍本的大師們影印講義,有些還隨我飄洋過海。黑木哲德老師已經在2009年初退休,那時他是日本福井大學副校長。沒有這些恩師們的栽培,我就無法拿到四捨五入後的70分最低門檻考預官,也無法四年準時畢業,更不用說會遇到咱家的牽手。總之,淡江四年是我思想邁入成熟的四年,也為我畢業後的就業與進修打下很穩固的基礎,所以不論走到那兒,我總不諱言我是淡江數學系的畢業生、雖然不是高材生!
 
答案在此
 
 
未經本人同意,請勿轉載轉貼本文任何片段,請尊重智慧財產(著作)權
引用方式:冼鏡光,慘遭助教修理的一道程式習題DCView.com達人部落格(http://blog.dcview.com/article.php?a=U2sGYANkBTU%3D
 
 
│本站文章分類:生活札記
│今日人氣:5 │累計人氣:104972 │回應(9)

喜歡這篇文章嗎?

回應

Sean  於2010.01.21 14:41  

啊!原來冼老師大學也是這樣混過來的啊,想當年還是讀冼老師Fortran的書學程式呢。
不過說實在的,Fortran真的是理工科最經典的語言。

版主回應︰ 於 2010.01.23 06:23

我從初中就開始混、不太讀課本,但考運都不差,申請讀博士的獎學金時更是幸運得一塌糊塗,給我錢的幾間學校都比國內的#1高出非常非常多,最後挑了一間較小的、而且生活費給得充裕的去讀博士。

無可救藥  於2010.01.24 12:39  

謠科技:
2010年,可自行設計韌體的DSLR即將發表^_^?

Ken  於2010.02.18 00:47  

洗老師不知道是幾年前的事咧
我老爸也是淡大數學低(不知道哪一組的)
也聽他說過以前寫程式是用卡打洞的故事
後來博士也在淡大拿的
搞不好是同學哩
他老人家現在還有在淡大兼課

eddie  於2010.04.28 02:31  

第三張是廁所

版主回應︰ 於 2010.04.28 05:35

哈!您一定在淡江校園待過,或是遊客去看過。

spock lee  於2010.04.29 12:40  

數學系向來就是難讀的系,我數學系的同學講他們高等微積分也是當到全班只有幾個人過...哈

hnm2738614  於2010.06.28 00:57  

學長好,我是土木系
我曾讀過冼老師的Fortran
我在宮燈教室認識內人

hnm2738614  於2010.06.28 01:10  

當年為了教內人BASIC,所以同時學FORTRAN和BASIC兩種語言。兩種語言邏輯完全相同,語法不同。考試時把兩種語言的語法搞混了,所以FORTRAN被當了一個學期。
直到唸研究所,需要寫程式解有限元素的問題,我還是偶爾會誤用BASIC語法。
FORTRAN的語法裝模作樣,BASIC比較接近使用者的想法。

版主回應︰ 於 2010.06.28 16:45

Fortran的語法是計算機界還沒弄清楚如何設計程式語言的1950早期設計的,Basic則是在1960年設計給大學生用,所以相形之下就簡單明嘹得多,但純功能來說就弱了(因為這不是原設計目的)。至於後來Microsoft的Basic就相當醜陋,有人說學會Microsoft Basic就等於學會所有程式設計的壞習慣,大哉斯言。

iverson0519  於2011.03.28 06:28  

冼老師:
你好 我是剛接觸FORTRAN的新手 所以很多地方不會 剛好在學校圖書館借閱了你出版的書 在上網求助解答時 碰巧找到了您的網站 請!我有ㄧ份資料 是之前用fortran寫的程式 我現在電腦裡面是compaq visual fortran 6 ! 請問 visual fortran 跟 fortran 輸入方法有差別嗎? 為何我照key進去卻有很多錯誤呢? 例如 program to fit calibration data of berner-impactor.
A continuous function of aerodynamic diameter is used,
which contains the parameter d50, slope and skewness
這三行開頭visual fortran 說語法錯誤 我不懂哪邊有錯 麻煩老師了!
如果方便的話 我能把檔案寄給老師看一下嗎? 謝謝老師

版主回應︰ 於 2011.03.28 13:41

(1) 很抱歉,實在太忙無法幫您看程式。

(2) 所有Fortran的輸入格式是ISO標準,不論任何operating system或compiler上都一樣。從message看來,您的問題是輸入資料格式和程式要求的格式不同造成,您應該問程式的原作者,請教輸入格式,找我是問道於盲。要不然,就自己讀該程式,了解輸入格式,這些輸入格式從READ和FORMAT中都可以找到。

FRANK CHEN  於2011.08.25 18:35  

冼老師:

有幸今年五月份聽到你關於攝影的課,對您真是心嚮往之啊!

我不是理工科學生,所以提到fortran就莫宰羊了,本來還一直以為老師是讀光學的.真是太崇拜了!

以前讀書時,跟數學系的同學同一間教室考段考,知道一門課叫"離散",那時還真好奇?怎麼取個文謅謅的名字?

而且還發現,大一上到大一下,甚至到大二時,發現數學系的同學,人怎麼越來越少?才知道不是被當就是轉走了.

本來高中時數學就很差,大學時又發現,數學真不是好讀的,所以對唸數學的人,本來就一直抱著尊崇之意!
尤其見到冼老師之後,更是佩服!

  • 驗證碼:請點選鐵絲網重換驗證

    • 9f8cab0774e3c2c6cbc0089bc39a10f0
    • cb21ed3458d915b1fffb1291a1c6777a
    • 7a8b233f1f61cde18cab6e8d2707164c


<< 2018-09 >>
1
2345678
9101112131415
16171819202122
23242526272829
30

文章列表

  1. 手機配件 (13)
  2. 老鏡叢談:拆老機、玩老鏡 (4)
  3. 老鏡叢談:反射鏡頭(6)
  4. PC級電腦古董零件 (1)
  5. 中文攝影書書評 (2)
  6. 家居瑣記(5)
  7. SLR到DSLR之路 (2)
  8. 相機短篇 (4)
  9. 鏡頭短篇 (6)
  10. 部落格公告 (4)
  11. 後院紀事 (3)
  12. 急就章--各種器材紀事(23) NEW!
  13. 瑣瑣碎碎的話題 (9)
  14. 我寫的書 (4)
  15. Nikon鏡頭筆談 (7)
  16. 寫給新手 (20)
  17. 相機鏡頭 (6)
  18. 姑妄言之集 (3)
  19. 遊記 (8)
  20. 電子計算機(電腦)科學 (4)
  21. 老機雜記 (27)
  22. 攝影思潮回顧 (1)
  23. 數位相機(DC)隨筆 (13)
  24. 大湖燈塔巡禮 (3)
  25. 書!書!書! (11)
  26. 基礎知識 (14)
  27. 閒話SLR (24)
  28. 老鏡叢談 (30)

最新文章發表

  1. KUVRD通用鏡頭蓋
  2. 仙台大觀音
  3. 手機配件:Bitplay國產鏡頭組(一):介紹和3X望遠鏡頭
  4. 談幾個便宜的1000mm反射鏡頭(Celestron C5和C90, Meade, 和Rubinar)
  5. Argus C3交換鏡頭

最新回應訊息

  1. Re:冼老師您好: 我也 by Jay(9.06)
  2. Re:你好, 謝謝你的一 by 黃群凱(8.28)
  3. Re:我是攝影新手,謝謝老 by 米高(6.20)
  4. Re:洗老師您好, by terry wu(4.16)
  5. Re:老師不好意思,最近有 by rfr(4.13)

人氣指數

  1. 今日人氣指數:12583
  2. 累積人氣指數:200604394