Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 1 decade ago

請教fortran 90達人 小弟要跟你求救!!!!!

寫出一fortran 語言 輸入年份 月分 日期 推算輸出 當日 是星期幾!!!!

比如 輸入

year:2009

month:12

day:8

推算出 今天 星期2

這裡有可以參考的地方!!!!!!

http://zh.wikipedia.org/wiki/%E6%98%9F%E6%9C%9F%E7...

這個網址 說真的 很多地方我也不是看的很懂!!!!!!!

我目前寫的程式如下!!!!

請大大們不吝幫我修改!!!!!拜託!!!!並且幫小弟完成 剩下未完成的部分!!!!

小弟感激不盡!!!!!

program calendar.f90

implicit none

integer :: year,month,day

write(*,*) 'input year'

select case (year)

case(1752:1799)

yy=4

case(1800:1899)

yy=2

case(1900:1999)

yy=0

case(2000:2099)

yy=6

case(2100:2199)

yy=4

read(*,*)year

end select

a=year-(100*(year/100))

a/4=b

write(*,*) 'input month'

select case (month)

case (1,10)

mm=0

case(2,3,11)

mm=3

case(4,7)

mm=6

case(5)

mm=1

case(6)

mm=4

case(8)

mm=2

case(9,12)

mm=5

read(*,*)month

end select

我目前寫到這邊!!!!!!!!!請問接下來要怎麼改!!!!!!! 還有幫我修改錯誤 我目前應該完成3/4了!!!!可是剩下的閏年問題 還有day 跟星期幾的問題 腦袋卡住 想不出來!!!!!

閏年問題(非程式語言 未修改版......) 我想很久 沒有想出來!!!!!

if ('year' is multiple of 4 but not amultiple of 100)

or 'year' is a multiple of 400)

then 'year' is a leap year

ex.1916 is leap year.

1900 is not leap year.

2000 is leap year.

中文涵義 就只有一句話 年份是4的倍數 但是不能是100的倍數 即是閏年!!!!但是400的倍數 也是閏年!!!!!!!只有100的倍數除外!!!!

1 Answer

Rating
  • Jack
    Lv 5
    1 decade ago
    Favorite Answer

    你的方法雖然可行,但太繁瑣了,而且很難除錯(Debug),十幾個 case 中只要有一個出錯就不行了,而且尚未處理閏年的情形。

    比較簡明的方法是以「1752/9/14 是星期四」作為基準,求出輸入的年、月、日是由 1752/9/14 算起的第幾天(1752/9/15 算第 1 天,1752/9/16 算第 2 天‥‥‥ 依此類推),再將此天數加 4(因為 1752/9/14 是星期四),取其除以 7 的餘數就是星期幾了(餘數等於 0 是星期日)。

    程式如下:

    program main

    integer*4 nd, nfeb, iy, im, id, nm(12)

    character*6 weekd(0:6)

    data nm/31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/

    data weekd /'星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'/

    1 write (*, '(/"Enter year: (1753 and up) ", $)')

    read *, iy

    if (iy < 1753) stop

    3 write (*, '("Enter month: ", $)')

    read *, im

    if (im <1 .or. im>12) go to 3

    nm(2) = nfeb(iy)

    5 write (*, '("Enter day: ", $)')

    read *, id

    if (id <1 .or. id>nm(im)) go to 5

    nd = nm(9)-14 + nm(10) + nm(11) + nm(12)

    do i = 1753, iy-1

    nd = nd + 337+nfeb(i)

    enddo

    do i = 1, im-1

    nd = nd + nm(i)

    enddo

    nd = nd + id

    nd = mod (nd+4, 7)

    write (*, *) weekd(nd)

    go to 1

    end

    integer*4 function nfeb (iyear)

    integer*4 iyear

    if (mod(iyear, 400) == 0) then

    nfeb = 29

    else

    if (mod(iyear, 4) == 0 .and. mod(iyear, 100) /= 0) then

    nfeb = 29

    else

    nfeb = 28

    endif

    endif

    return end

    這個程式扣除詢問年、月、日的部份和判別閏年的副程式(nfeb)之後,主要的演算部份只有大約 10 行而已。

Still have questions? Get your answers by asking now.