Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 10 years ago

fortran 萬年曆程式 哪裡有錯??

請問這樣的萬年曆哪邊有錯呢?

可以幫我改一下嗎??

謝謝! > <

主要是月曆第一行的空格數出問題,

執行出來的是依據"年"來空格,

如果是西元1年就空一格.西元2年就空兩格.....(不管月份)

要怎麼修改呢?

p.s這裡是設定西元1年的第一天是星期一,

那如果要修改為西元1900年1月1日為星期一 呢?

拜託拜託~ 謝謝!!

program Console4

implicit none

integer,dimension(12)::day_of_months=(/31,28,31,30,31,30,31,31,30,31,30,31/),sum_of_months

integer::year,month

character(len=4),dimension(31)::days

character(len=28)::title,space,bar

integer::day,leap

integer::sum_of_days,last_row

integer::i

title="Sun Mon Tue Wed Thu Fri Sat"

bar ="============================="

space=" "

days(1)="1"

days(2)="2"

days(3)="3"

days(4)="4"

days(5)="5"

days(6)="6"

days(7)="7"

days(8)="8"

days(9)="9"

days(10)="10"

days(11)="11"

days(12)="12"

days(13)="13"

days(14)="14"

days(15)="15"

days(16)="16"

days(17)="17"

days(18)="18"

days(19)="19"

days(20)="20"

days(21)="21"

days(22)="22"

days(23)="23"

days(24)="24"

days(25)="25"

days(26)="26"

days(27)="27"

days(28)="28"

days(29)="29"

days(30)="30"

days(31)="31"

write(*,'(1x,A)')"請輸入年份(西元):"

read(*,*)year

write(*,'(1x,A)')"請輸入月份(1~12):"

read(*,*)month

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

day_of_months(2)=29

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

day_of_months(2)=29

end if

sum_of_days=0

year=year-1 ! 準備計算前 Year-1 年的總天數

leap=year/4-year/100+year/400 ! 前 Year-1 年中, 閏年的年數

sum_of_days=366*leap+365*(year-leap) ! 計算前 Year-1 年的總天數

do i=1,month-1

sum_of_days=sum_of_days+sum_of_months(i) ! 加上第 Year 年的前Month-1 月天數

end do

day=mod(sum_of_days+1,7) ! 求出 Year/Month 的 1 號為星期幾

year=year+1 ! 回復至使用者輸入的年份值

write(*,*)"西元",year,"年",month,"月"

write(*,*)bar

write(*,*)title

write(*,*)space(1:day*4),days(1:7-day) ! 月曆的第一行只能再印出 7-Day 天

do i=7-day+1,day_of_months(month),7 ! 月曆第二行從 7-Day+1 日開始印,每 7 天即換行

last_row=day_of_months(month)-i

if(last_row>=7)then ! 判斷最後一行是否小於 7 天

write(*,*)days(i:i+6) ! 1. 大於等於 7 天: 全部印出

else

write(*,*)days(i:i+last_row) ! 2. 小於七天: 印出剩餘天數

end if

end do

write(*,*)bar

end program Console4

1 Answer

Rating
  • Jack
    Lv 5
    10 years ago
    Favorite Answer

    你的程式最大的問題是出在第 70 行:

    sum_of_days=sum_of_days+sum_of_months(i) ! 加上第 Year 年的前Month-1 月天數

    由於陣列 sum_of_months(12) 並無初始值,結果當然不對。把這一行改成:

    sum_of_days=sum_of_days+day_of_months(i) ! 加上第 Year 年的前Month-1 月天數

    就可以了。

    不過西曆並不能用「西元 1 年的第一天是星期一」這樣來推算,因為西曆曾經過大修正,在 1752 年 9 月那個月少掉了 11 天(指英國和美國;其他國家修正的年代各有不同),用「西元 1 年的第一天是星期一」來推算 21 世紀的月曆,能得到正確的結果只是「巧合」而已。

    但「西元 1900 年 1 月 1 日為星期一」卻是正確的,這也可以作為推算 20 或 21 世紀月曆的堅實基礎。程式可以改成這樣:

    program Console4

    implicit none

    integer,dimension(12)::day_of_months=(/31,28,31,30,31,30,31,31,30,31,30,31/)

    integer::year,month

    character(len=4),dimension(31)::days

    character(len=28)::title,space,bar

    integer::day,leap

    integer::sum_of_days,last_row

    integer::i

    title="Sun Mon Tue Wed Thu Fri Sat"

    bar ="============================="

    space=" "

    days(1)="1"

    days(2)="2"

    days(3)="3"

    days(4)="4"

    days(5)="5"

    days(6)="6"

    days(7)="7"

    days(8)="8"

    days(9)="9"

    days(10)="10"

    days(11)="11"

    days(12)="12"

    days(13)="13"

    days(14)="14"

    days(15)="15"

    days(16)="16"

    days(17)="17"

    days(18)="18"

    days(19)="19"

    days(20)="20"

    days(21)="21"

    days(22)="22"

    days(23)="23"

    days(24)="24"

    days(25)="25"

    days(26)="26"

    days(27)="27"

    days(28)="28"

    days(29)="29"

    days(30)="30"

    days(31)="31"

    1 write(*,'(1x,A)')"請輸入年份 (西元):"

    read(*,*)year

    if (year < 1900) go to 1

    write(*,'(1x,A)')"請輸入月份 (1~12):"

    read(*,*)month

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

    day_of_months(2)=29

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

    day_of_months(2)=29

    end if

    sum_of_days=0

    do i = 1900, year-1

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

    sum_of_days = sum_of_days+366

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

    sum_of_days = sum_of_days+366

    else

    sum_of_days = sum_of_days+365

    end if

    end do

    do i=1,month-1

    sum_of_days=sum_of_days+day_of_months(i)

    end do

    day=mod(sum_of_days+1,7)

    write(*,*) "西元", year, "年", month, "月"

    write(*,*) bar

    write(*,*) title

    write(*,*) space(1:day*4), days(1:7-day)

    do i = 7-day+1, day_of_months(month), 7

    last_row = day_of_months(month)-i

    if (last_row>=7) then

    write(*,*) days(i:i+6)

    else

    write(*,*) days(i:i+last_row)

    end if

    end do

    write(*,*)bar

    end program Console4

Still have questions? Get your answers by asking now.