12月18日(火) 課題一覧

本日の情報処理の授業で課題として出題されたプログラムのサンプル。
いつもどおり見難いと思いますが、課題提出程度であればこれでも多分OK。
FORTRAN77 なはずなのに Fortran90 の DO~END DO が含まれているのは授業の都合上の仕様です。
文番号 + CONTINUE なんてやると思考回路が停止してしまう生徒が多発したので、DO~END DO に統一してみたところ、普通に思考回路が停止する子がいなくなったという経緯ががが。

課題1
S = 1 + 1 / 2! + 1 / 3! + . . . + 1 / 10! を求めるプログラムを書きなさい。

課題1 サンプルソース

C------------------------------------------------------------------------------
C p1218n1.for
C------------------------------------------------------------------------------
C 課題1
C S = 1 + 1 / 2! + 1 / 3! + . . . + 1 / 10! を求めるプログラムを書きなさい。
C------------------------------------------------------------------------------

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-E

      IMPLICIT NONE
      
      INTEGER I, J, N
      REAL    S
      
C  *  N, J, S の初期化  *
      N = 10
      J =  1
      S =  0.
      
C  *  計算  *
      DO I = 1, N
          
          J = J * I
          S = S + 1.0 / REAL(J)
          
C        *  確認用なので必要なければ書かなくてもOK  *
          WRITE(6,200) I, J, S
          
      END DO
      
C  *  計算結果の出力  *
      WRITE(6,*)
      WRITE(6,100) S
      
C  *  FORMAT 文  200番の文は27行目を書いていない場合は必要なし  *
  100 FORMAT( 'S = ', F10.6 )
  200 FORMAT( I2,'! = ', I9, '    S = ', F10.6 )
      
      STOP
      END

==== p1218n1.for 実行結果 ====
 1! =         1    S =   1.000000
 2! =         2    S =   1.500000
 3! =         6    S =   1.666667
 4! =        24    S =   1.708333
 5! =       120    S =   1.716667
 6! =       720    S =   1.718055
 7! =      5040    S =   1.718254
 8! =     40320    S =   1.718279
 9! =    362880    S =   1.718281
10! =   3628800    S =   1.718282

S =   1.718282

課題2
S = 1 – 1 / 2! + 1 / 3! – . . . – 1 / 10! を求めるプログラムを書きなさい。

課題2 サンプルソース

C------------------------------------------------------------------------------
C p1218n2.for
C------------------------------------------------------------------------------
C 課題2
C S = 1 - 1 / 2! + 1 / 3! - . . . - 1 / 10! を求めるプログラムを書きなさい。
C------------------------------------------------------------------------------

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-E

      IMPLICIT NONE
      
      INTEGER I, J, N
      REAL    S
      
C  *  N, J, S の初期化  *
      N = 10
      J =  1
      S =  0.
      
C  *  計算  *
      DO I = 1, N
          
          J = J * I
          S = S + 1.0 / REAL(J)
          
C        *  確認用なので必要なければ書かなくてOK  *
          WRITE(6,200) I, J, S
          
C        *  符号反転  *
          J = -J
          
      END DO
      
C  *  計算結果の出力  *
      WRITE(6,*)
      WRITE(6,100) S
      
C  *  FORMAT 文  200番は27行目を書いていない場合は必要なし  *
  100 FORMAT( 'S = ', F10.6 )
  200 FORMAT( i2,'! = ', i9, '    S = ', F10.6 )
      
      STOP
      END

==== p1218n2.for 実行結果 ====
 1! =         1    S =   1.000000
 2! =        -2    S =   0.500000
 3! =         6    S =   0.666667
 4! =       -24    S =   0.625000
 5! =       120    S =   0.633333
 6! =      -720    S =   0.631944
 7! =      5040    S =   0.632143
 8! =    -40320    S =   0.632118
 9! =    362880    S =   0.632121
10! =  -3628800    S =   0.632120

S =   0.632120

課題3
3人分の4科目の点数を読み込み、その点数と各個人の平均、各教科の平均を出力するプログラムを書きなさい。
ただし、点数の格納には2次元配列を使うこと。

課題3 サンプルソース

C------------------------------------------------------------------------------
C p1218n3.for
C------------------------------------------------------------------------------
C 課題3
C 3人分の4科目の点数を読み込み、その点数と各個人の平均、各教科の平均を出力する
C プログラムを書きなさい。
C ただし、点数の格納には2次元配列を使うこと。
C------------------------------------------------------------------------------

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-E

      IMPLICIT NONE
      
      INTEGER A(3,4), I, J, S
      REAL    X_AVE(3), Y_AVE(4)
      
C  *  点数の読み込み  *
      DO I = 1, 3
          WRITE(6,10) I
          READ(5,*) ( A(I,J), J = 1, 4 )
          
      END DO
      
C  *  個人の平均を計算  *
      DO I = 1, 3
          
          S = 0
          
          DO J = 1, 4
              
              S = S + A(I,J)
              
          END DO
          
          X_AVE(I) = S / 4.0
          
      END DO
      
C  *  読み込んだ点数と個人の平均を出力  *
      WRITE(6,*) '            国語     数学     英語     社会    平均値'
      DO I = 1, 3
          
          WRITE(6,100) I, ( A(I,J), J = 1, 4 ), X_AVE(I)
          
      END DO
      
C  *  各教科の平均を計算  *
      DO J = 1, 4
          
          S = 0
          
          DO I = 1, 3
              
              S = S + A(I,J)
              
          END DO
          
          Y_AVE(J) = S / 3.0
          
      END DO
      
C  *  各教科の平均を出力  *
      WRITE(6,200) ( Y_AVE(I), I = 1, 4 )
      
C  *  FORMAT 文  *
   10 FORMAT( I2,'人目の点数を入力 (国 数 英 社)' )
  100 FORMAT( I2,'人目 ', 4I9, F10.1 )
  200 FORMAT( '教科平均', 4F9.1 )
      
      STOP
      END

==== p1218n3.for 実行結果 ====
 1人目の点数を入力 (国 数 英 社)
90 85 87 78
 2人目の点数を入力 (国 数 英 社)
81 54 68 93
 3人目の点数を入力 (国 数 英 社)
71 85 84 88
             国語     数学     英語     社会    平均値
 1人目        90       85       87       78      85.0
 2人目        81       54       68       93      74.0
 3人目        71       85       84       88      82.0
教科平均     80.7     74.7     79.7     86.3

課題4
3行4列の行列の足し算を行うプログラムを書きなさい。
データの格納には2次元配列を使用すること。

課題4 サンプルソース

C------------------------------------------------------------------------------
C p1218n4.for
C------------------------------------------------------------------------------
C 課題3
C 3行4列の行列の足し算を行うプログラムを書きなさい。
C データの格納には2次元配列を使用すること。
C------------------------------------------------------------------------------

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-E

      IMPLICIT NONE
      
      INTEGER I, J, A(3,4), B(3,4), ADD(3,4)
      
C  *  行列 A の入力  *
      WRITE(*,*) 'A行列の入力'
      DO I = 1, 3
          
          READ(5,*) ( A(I,J), J = 1, 4 )
          
      END DO
      
C  *  行列 B の入力  *
      WRITE(6,*) 'B行列の入力'
      DO I = 1, 3
          
          READ(5,*) ( B(I,J), J = 1, 4 )
          
      END DO
      
C  *  行列の足し算  *
      DO I = 1, 3
          
          DO J = 1, 4
              
               ADD(I,J) = A(I,J) + B(I,J)
              
          END DO
          
      END DO
      
C  *  計算結果出力  *
      WRITE(6,*) 'A 行列と B 行列の和'
      DO I = 1, 3
          
          WRITE(6,10) ( ADD(I,J), J = 1, 4 )
          
      END DO
      
      
C  *  FORMAT 文  *
   10 FORMAT( 4I7 )
      
      STOP
      END

==== p1218n4.for 出力結果 ====
 A行列の入力
    1    2    3    4
   10   20   30   40
  100  200  300  400
 B行列の入力
   -1   -2   -3   -4
  -10  -20  -30  -40
 -100 -200 -300 -400
 A 行列と B 行列の和
      0      0      0      0
      0      0      0      0
      0      0      0      0

特別課題 エラトステネスの篩
2 から N 間での素数を確定しその個数を数えるプログラムを書け。
できれば素数と確定した数を表示するのが望ましい。

C------------------------------------------------------------------------------
C numprmbs.for | エラトステネスの篩
C------------------------------------------------------------------------------
C 2 から N 間での素数を確定しその個数を数えるプログラムを作成しなさい。
C 2重 DO LOOP の使用
C------------------------------------------------------------------------------

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-E

      IMPLICIT NONE
      
      INTEGER J, K, N, NP, P(32000), H(16000), C
      
C  *  カウンター初期化  *
      NP = 0
      C  = 0
      
C  *  入力部  32000以上が入力された場合は終了  *
      WRITE(*,*) 'INPUT INTEGER N < 32000'
      READ(*,*) N
      IF( N .GE. 32000 ) STOP
      
C  *  素数の候補に 1 を代入  *
      DO K = 2, N
          
          P(K) = 1
          
      END DO
      
C  *  J の倍数には 0 を代入  *
      DO J = 2, N
          
          DO K = 2 * J, N, J
              
              P(K) = 0
              
          END DO
          
      END DO
      
C  *  K が素数だと P(K) = 1  *
C  *  2 から N までの素数の個数 NP を求めて書き出す  *
      DO K = 2, N
          
          IF( P(K) .EQ. 1 ) NP = NP + 1
          
      END DO
      
C  *  H 配列に素数 K を代入  *
      DO K = 2, N
           
           IF( P(K) .EQ. 1 ) THEN
               
               C = C + 1
               H(C) = K
               
           END IF
      
      END DO
      
C  *  出力  *
      WRITE(6,200) ( H(K), K = 1, NP )
      WRITE(*,*)
      WRITE(6,100) NP
      
C  *  FORMAT 文  *
  100 FORMAT( '個数 : ', I5, '個' )
  200 FORMAT( 10I7 )
      
      STOP
      END

==== numprmbs.for 実行結果 ====
 INPUT INTEGER N < 32000
1000
      2      3      5      7     11     13     17     19     23     29
     31     37     41     43     47     53     59     61     67     71
     73     79     83     89     97    101    103    107    109    113
    127    131    137    139    149    151    157    163    167    173
    179    181    191    193    197    199    211    223    227    229
    233    239    241    251    257    263    269    271    277    281
    283    293    307    311    313    317    331    337    347    349
    353    359    367    373    379    383    389    397    401    409
    419    421    431    433    439    443    449    457    461    463
    467    479    487    491    499    503    509    521    523    541
    547    557    563    569    571    577    587    593    599    601
    607    613    617    619    631    641    643    647    653    659
    661    673    677    683    691    701    709    719    727    733
    739    743    751    757    761    769    773    787    797    809
    811    821    823    827    829    839    853    857    859    863
    877    881    883    887    907    911    919    929    937    941
    947    953    967    971    977    983    991    997

個数 :   168個

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中