Yahoo奇摩知識+ 將於 2021 年 5 月 4 日 (美國東部時間) 終止服務。自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+ 網站將會轉為唯讀模式。其他 Yahoo奇摩產品與服務或您的 Yahoo奇摩帳號都不會受影響。如需關於 Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。

宏道
Lv 6
宏道 發問時間: 電腦與網際網路程式設計 · 1 0 年前

利用Fortran 90 寫一個數字遊戲

  有一個數字遊戲它的運作是:程式一開始會產生一組0可以在首位,但沒有任何數字重複的4位數亂數(螢幕上不顯示),螢幕會上秀出"請輸入一個四位數字",若你輸入的數字多餘四位,他會顯示"你輸入的數字太多",輸入的數字少餘四位,則會出現"你輸入的數字太少",若有輸入重複的數字,顯示"你輸入的數字有重複",輸入正確時,螢幕上會顯示"幾A幾B"來表示你輸入的數字與它產生的亂數差異,A表示數字、位置皆對,B表示數字對但位置錯,就這樣一直猜下去,猜對時螢幕上會顯示正確解答,這時程式才會結束。

  因為產生亂數還有一些迴圈的觀念我還不是很懂,希望大大們可以再程式上加些註解,讓我更了解程式的運作邏輯並學習,謝謝!

已更新項目:

我使用的是Essential LF90 Download Edition(ELF90),謝謝!

2 個已更新項目:

您好!編出來他發現17個錯誤、0個警告,謝謝!

3 個已更新項目:

我提供我們老師"輸入四位數"程式的部分:

program test_one

implicit none

integer :: guess, answer, i, j, k, m

integer :: stopflag, answerstop,n,p

real(8) :: ran_answer

integer :: index_1

character(20) :: cguess,canswer

write (*,500) "請輸入一個四位數字"

4 個已更新項目:

read (*,*) guess

if (guess > 9999) then

write (*,700) "你輸入的數字超過四位數"

stop

else if (guess < 1000 .and. guess > 99) then

write (*,*) "你輸入三個數字,程式將自動增設 0 於你的數字前面"

write (cguess,'(i4)') guess

cguess(1:1) = "0"

5 個已更新項目:

else if (guess < 100) then

write (*,*) "你輸入的數字小於100,不符合本遊戲規則"

stop

else

write (cguess,'(i4)') guess

end if

500 format (A19,/)

700 format (A23,/)

Stop

end program test_one

很多觀念真的是暈了我>

7 個已更新項目:

ELF90使用方式:

http://elearning.ntust.edu.tw/@@053F36006E4729FD6A...

抱歉那麼麻煩你,四位數部分老師提供這樣,剩下就要想辦法自己寫嚕!

8 個已更新項目:

不好意思,上述兩個網址重貼

ELF90編譯器:http://kpv8qw.bay.livefilestore.com/y1pKlDUbpOiSBL...

9 個已更新項目:

1 個解答

評分
  • Jack
    Lv 5
    1 0 年前
    最佳解答

    程式如下:

    (註:各家 Fortran Compiler 呼叫 Random number 的方式都不太一樣,這裡用的是 GNU 的 G95 Fortran Compiler)

    program main

    integer(kind=2):: i, j, ng, lg, na, nb, ma(4), mg(4), mx(4)

    real(kind=4):: ran

    character(len=1):: again

    character(len=10):: g

    !---Randomize

    call random_seed()

    !---Generate a 4-digit number

    1 do i = 1, 4

    call random_number(ran)

    ma(i) = int(ran*10.)

    end do

    !---Check for repeated numbers

    do i = 1, 3

    do j = i+1, 4

    if (ma(i) == ma(j)) go to 1

    end do

    end do

    !---Ask user to input the guess

    ng = 0

    3 ng = ng + 1

    write (*, "(/'請輸入一個四位數字 (第', i3, ' 次): ', $)") ng

    read *, g

    !---Check for number of input digits

    lg = len_trim(g)

    if (lg > 4) then

    print *, '你輸入的數字太多'

    go to 3

    else if (lg < 4) then

    print *, '你輸入的數字太少'

    go to 3

    end if

    !---Convert every character to digit

    do i = 1, 4

    mg(i) = ichar(g(i:i)) - 48

    end do

    !---Check for repeated input numbers

    do i = 1, 3

    do j = i+1, 4

    if (mg(i) == mg(j)) then

    print *, '你輸入的數字有重複'

    go to 3

    end if

    end do

    end do

    !---Count value of A

    do i = 1, 4

    mx(i) = ma(i)

    end do

    na = 0

    do i = 1, 4

    if (mg(i) == mx(i)) then

    na = na+1

    mx(i) = -1

    end if

    end do

    !---Got it?

    if (na == 4) then

    write (*, "('正確數字為:', 4i2, ' 你猜對了!!!'/'再玩一次? <Y/N> ', $)") ma

    read *, again

    if (again == 'Y' .or. again == 'y') go to 1

    stop

    end if

    !---Count value of B

    nb = 0

    do i = 1, 4

    do j = 1, 4

    if (mg(i) == mx(j)) then

    nb = nb+1

    mx(j) = -1

    end if

    end do

    end do

    !---Display A and B, ask for next guess

    write (*, "(i1, ' A', i3, ' B')") na, nb

    go to 3

    end

    2009-11-17 00:15:30 補充:

    ELF90 呼叫 Random number 的方式應該和 GNU G95 相同,請用 ELF90 實際將此程式編譯(Compile)一次看看有無問題。

    2009-11-29 09:56:37 補充:

    我的程式是標準 Fortran 95 的寫法(除了呼叫 Random number 的方式以外,呼叫 Random number 的方式並沒有統一的標準),我試過幾種 Fortran compiler 都沒問題。不過我手邊並沒有 ELF90 可試,可否將錯誤訊息貼上來,我看看差異性在哪裡。

    2009-11-29 09:59:55 補充:

    其實 貴老師「輸入四位數」程式的部份比較繁瑣,已超出了題目要求的範圍,而且它並沒有檢查「輸入重複的數字」。不過它的「字串處理」部份倒是提供了一個很好的範例,就是這兩行:

    write (cguess,'(i4)') guess

    cguess(1:1) = "0"

    2009-11-29 10:00:59 補充:

    第一行是把 guess 這個整數以 '(i4)' 的格式輸出到 cguess 這個字串中。例如:guess = 567,則 cguess 會成為 " 567"(5 的前面有一個空格)。第二行是把 cguess 的第一個字設為 "0"。

    這裡 write 指令被巧妙的用來將數字轉為文字(字串),如要將文字(字串)轉為數字則是用 read 指令,這種「字串處理」方式是 Fortran 進階必備的技巧。

    2009-11-29 10:04:16 補充:

    ※ 不知何故,「補充」內容老是莫名其妙的消失掉,只好在這裡補充:

    我的程式是標準 Fortran 95 的寫法(除了呼叫 Random number 的方式以外,呼叫 Random number 的方式並沒有統一的標準),我試過幾種 Fortran compiler 都沒問題。不過我手邊並沒有 ELF90 可試,可否將錯誤訊息貼上來,我看看差異性在哪裡。

    2009-11-29 10:04:42 補充:

    其實 貴老師「輸入四位數」程式的部份比較繁瑣,已超出了題目要求的範圍,而且它並沒有檢查「輸入重複的數字」。不過它的「字串處理」部份倒是提供了一個很好的範例,就是這兩行:

    write (cguess,'(i4)') guess

    cguess(1:1) = "0"

    2009-11-29 10:05:09 補充:

    第一行是把 guess 這個整數以 '(i4)' 的格式輸出到 cguess 這個字串中。例如:guess = 567,則 cguess 會成為 " 567"(5 的前面有一個空格)。第二行是把 cguess 的第一個字設為 "0"。

    這裡 write 指令被巧妙的用來將數字轉為文字(字串),如要將文字(字串)轉為數字則是用 read 指令,這種「字串處理」方式是 Fortran 進階必備的技巧。

    2009-11-29 10:15:04 補充:

    ※ 更正:我的程式是用 Fortran 90 寫的,並沒有用到 Fortran 95 的新增功能。

    2009-11-29 10:15:45 補充:

    ※ 更正:我的程式是用 Fortran 90 寫的,並沒有用到 Fortran 95 的新增功能。

還有問題?馬上發問,尋求解答。