2005年7月22日 星期五

FORTRAN入門課程(1)解決最簡單的問題

很多人很怕學FORTRAN,記得大三的時候(1986年),航空系的同學跑來問我有關FORTRAN的問題,
陪他一起來的同學很感嘆,學習「福傳」會讓別人恥笑,還是學習像c語言這樣的東西吧!

如果,您同意他的看法,也沒錯,因為,FORTRAN不但是古老而且是很保守的語言。
但是,一但被FORTRAN拿來用的功能,就會千古流傳。

接下來,開始介紹今天的課程動機:
有一天,另外一個部門的人跑來請我幫忙,有一批資料雖然只有三個欄位x,y,z
因為資料太大,不管用什麼軟體都打不開這個資料檔。

問我有什麼方法可以很快的把正負號顛倒(資料有正有負)?
當時正好要去開會,就請一位新進的同仁小陳幫忙處理。

才剛開完會回來,小陳告訴我資料已經處理好了,我很驚訝他怎麼這麼厲害?
以下是他寫的FORTRAN程式:

program change_sign
   real(kind=8) :: x,y,z
   open(10,file='data.xyz',status='old')
   open(20,file='new_data.xyz',status='unknown')
   do while (.not.eof(10))
 read(10,*)x,y,z
 write(20,*)x,y,-z
   end do
   close(10)
   close(20)
stop
end

我一看,好漂亮(本來想說好簡短)的FORTRAN程式!!!
大家不要看這個程式很短喲,當天拿來的資料檔共有4000萬筆! 如果用Execl開啟,只能處理前65536筆資料呢。
為了教學方便,我把這個程式註解了一下:

program change_sign
   ! 宣告x,y,z變數
   real(kind=8) :: x,y,z

   ! 開啟原資料檔
   open(10,file='data.xyz',status='old')

   ! 開啟輸出資料檔
   open(20,file='new_data.xyz',status='unknown')

   ! 處理10號檔案裡面所有的資料,直到eof(end of file)
   do while (.not.eof(10))
 read(10,*)x,y,z
 write(20,*)x,y,-z
   end do

   ! 關閉資料檔
   close(10)
   close(20)
stop
end

這個程式的作業流程,請參考 如何用程式解決問題-2