• 締切済み

プログラミング Fortran

以下のプログラムの空白部分が分かる方、是非力を貸して下さい!!(> <) 次の数列ai=1,…,N(1≦N≦100)                  ai=1, ai+1=2ai-3 に対して               S=Σai(※Σの上はN、下はi=1) を計算・表示するプログラムは以下のようになる。ここでは整数Nは端末から入力する。 common num,a(100),sum read(5,*) num call [ ] call pqrstu write(6,*) ‘a=’,(a(i),i=1,num) write(6,*) ‘sum=’,sum end * subroutine abcdef common num,a(100) a(1)=[ ] do 20 i=1,num a(i+1)=a(i)*2.0-3.0 20 continue end * subroutine pqrstu common [ ] sum=[ ] do 20 i=1,num sum=[ ] 20 continue end よろしくお願いします!!

みんなの回答

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.2

初歩的なプログラムですね。 2つのサブルーチンがそれぞれ何をしているのかを考えてみてください。 サブルーチンabcdefは数列各要素の値をセット サブルーチンpqrstuは数列各要素のサム(足し合わせ) ですよね。後はご自身で考えてみてください。

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.1

こんにちは。  このサイトでは、課題のマル投げはマナー違反とされます。  「call」は何のためのステートメントだか分かりますか?  自分なりに少し考えて添削してもらうようにしましょう。 では。

関連するQ&A

  • fortran errorについて

    fortranを勉強していたのですがエラーがでてしまい、何時間かけても理解できなかったので質問させてください。 以下プログラム program test !ここからメインルーチン !前準備 配列の用意 implicit none integer N integer,dimension(0:N,0:N) :: A integer :: i,j,k read * ,N !初期状態の代入 do i=0,N do j=0,N A(i,j)=0 end do end do do i=N/2,N-1 A(N/2,i)=1 end do do i=N/2,N-1 A(N/2+1,i)=-1 end do !ループ 50回ループさせる do k=0,50 !状態の表示 call visualize !サブルーチン visualize subroutine visualize do i=0,N do j=0,N if(A(i,j)== 1) write(*,'(A1)',advance='NO') "*" if(A(i,j)== 0) write(*,'(A1)',advance='NO') " " if(A(i,j)==-1) write(*,'(A1)',advance='NO') "+" end do write(*,*) end do !end subroutine visualize call insert !サブルーチン insert subroutine insert do i=0,N do j=0,N if(A(i,j)== 1) A(i,j)=-1 if(A(i,j)== 0) A(i,j)=max(0,A(i-1,j),A(i,j-1),A(i,j+1),A(i+1,j)) if(A(i,j)==-1) A(i,j)=0 end do end do !end subroutine insert end do end program test これでコンパイラすると In file test.f90:48 subroutine visualize 1 Error: Unclassifiable statement at (1) In file test.f90:69 subroutine insert 1 Error: Unclassifiable statement at (1) とでます いろいろ調べたのですが全くわかりませんでした できればよろしくお願いします

  • FORTRAN subroutineと配列と繰り返し

     以下のように二次元配列の場合でsubroutineを使うときに、主プログラムで2重Doループ(iとj)で繰り返しをしているのですが、すでにsubroutineでDoループ(i)を用いて計算しています。これではsubroutineの利点をうまく使えていないと思うのですが、subroutineを使って配列、Doループをきれいにする方法をどなたか教えていただけませんか。  実際は4重ループ、4次元配列なので、プログラムをわかりやすくするためにサブルーチンを使いたいと思っています。 -------------------------------------------------------------- program S real,dimension(5,5) :: B real,dimension(5) :: A integer :: i,j do j=1,5 CALL sub1(A) do i=1,3 B(i,j)=A(i)*j write(*,*) B(i,j) end do end do end program S subroutine sub1(A) real,dimension(5) :: A integer :: i do i=1,3 A(i)=3.*i end do end subroutine sub1

  • fortran 初心者です。

    fortranでフィボナッチ数列 A0 = 0 , A1 = 1 , Ai+1 = Ai + Ai-1 (i =2,3...) を計算するプログラムを作っています。 得られた値が奇数の時には、数値の右横に*をつけ、奇数かつ3の倍数なら**をつけます。 が、以下のようにプログラムしましたが、*印がつきません。どこが、間違っているのか、アドバイスよろしくお願いします。 C Question A0 = 0.0 A1 = 1.0 A2 = 1.0 WRITE(6,*)'A0 = 0.0' WRITE(6,*)'A1 = 1.0' DO 10 I = 2,10,1 A2 = A1 + A0 N = A2-(A2/2)*2 M = A2-(A2/3)*3 IF ( M .NE. 0 .AND. N .NE.0) THEN WRITE(6,*)'A',I,'=' ,A2,'*' ELSE IF ( M .NE. 0.AND. N .EQ.0)THEN WRITE(6,*)'A',I,'=' ,A2,'**' ELSE WRITE(6,*) 'A',I,'=' ,A2 END IF A0 = A1 A1 = A2 10 CONTINUE STOP END

  • FORTRAN77のプログラミングです。

    FORTRAN77のプログラミングです。 プログラムがあと空白の部分がわからないんで教えてください。 九州・沖縄8件の名前kenと面積(km2)menと人口(人)jinが書かれたファイル'kyusyu.txt'がある。これを読み、面積、人口、人口密度(人/km2)mituの大きい順に県名と値を書き出すプログラムを完成させよ。(型宣言も必要) 主プログラムは、数、名前、値を与えるのみで、作業本体はサブルーチン副プログラムjunに任せる事とする。副プログラムは論理型変数を使う手法。 C main ken real men(8),jin(8),mitu(8) open (1,file='kyushu.txt') do 1 i=1,8 1 read (1,*) ken(i),men(i),jin(i) close (1) write (*,*)' 面積' call jun (8,ken,men) write (*,*)' 人口' call jun (8,ken,jin) write (*,*)' 人口密度' call jun (8,ken,mitu) end c sub subroutine jun (kazu,namae,atai) namae(47) atai(47) mark(47) do 1 i=1,kazu 1 mark(i)=.false. return end ここまではわかりました。空白の部分をお願いします。

  • fortran 配列受け渡し時の次元の一致

    fortran90、コンパイラはifortです。 普通メインプログラムとサブルーチン間での配列の受け渡しは、次元を揃えて渡すと思います。 とあるコード(以後コードA)を読んでいると、2次元配列を渡し、1次元配列で受け取っていました。 例 program test1 integer :: a(3,3) call testsub(a) end program subroutine testsub(b) integer :: b(9) end subroutine これが受け取り側でどう処理されているのかわからず、調べるために適当なテストコードを書きました。 a 123 456 789 ↓ b 123456789 になるとか 結果、コンパイルは通ったのですがサブルーチン側では全て0で置き換えられてしまいました。 コードAはpgiかなんかでコンパイルしていたようなのでコンパイラの違いでしょうか? よくわらなかったので質問させて頂きました。 質問をまとめますと、 (1)次元の異なる配列の受け渡しができるかどうか (2)その場合中身はどうなるか よろしくお願いします。 ---以下テストコード--- program testa implicit none integer :: a(3,3),i,j do i=1,3 do j=1,3 a(i,j)=j+(i-1)*3 enddo enddo do i=1,3 do j=1,3 write(6,*) a(i,j) enddo enddo call sub1(a) end program subroutine sub1(b) integer :: b(9),i do j=1,9 write(6,*) b(i),'sub' enddo end subroutine

  • fortran エラーについて

    fortranで、副プログラムを使ってデータを昇順または降順に並べ替えるプログラムを入力して実行しようとしたところ、 ・Unexpected junk in formal argument list at (1) ・Two main PROGRAMs at (1) and (2) という2つのエラーが出ました。 これらの改善方法を教えて頂きたいです。 初心者ですので簡単なところで間違えている可能性もありますが、ご指摘いただければ幸いです。 以下、実際に入力したプログラムです。 ------------------------------ implicit none integer::i,n real::x(1000),a(1000),b(1000) n=1000 open(10,file='input-data-1.txt') do i=1,n read(10,*) x(i) end do close(10) open(10,file='output-data-1.txt') do i=1,n call koukan(i,x(i),a(i),b(i)) write(10,'(i4,2f10.3)') i,a(i),b(i) end do close(10) stop end subroutine koukan(i,x(i),shoujun,koujun) implicit none integer::i,n,made real::x(1000),w,shoujun,koujun do made=n-1,1,-1 do i=1,made if(x(i)>x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do shoujun=x(i) do made=n-1,1,-1 do i=1,made if(x(i)<x(i+1)) then w=x(i) x(i)=x(i+1) x(i+1)=w end if end do end do koujun=x(i) return end ------------------------------

  • Fortran77のプログラム実行時にエラー

    Windows98でCPad for Salford FTN77というソフトを使って、Fortran77のプログラミングをしています。そこで学校での課題で、下のようなプログラムを作ったのですが、実行すると次のようなエラーがでます。 The insrtuction at address 0373f5b0 attempted to read from an illegal location 0373f5b0 routine at address 373F5B0 [+0000] 00401000 main [+074f] で、ファイルに書き込めてるかどうかチェックすると、何も書き込めていません。どうすれば、ちゃんと動くのでしょうか。どなたか分かる方、宜しくお願いします。 プログラム↓ *生徒50人の成績を読み込み平均点などを計算し、ファイルに書き込む PROGRAM GOKAMOKU HEIKIN INTEGER N(1:50),EP(1:50),MP(1:50),JP(1:50),SP(1:50),CP(1:50) INTEGER SUM(1:50),K,I,L,J,M,Q REAL PAV(1:50),PVX(1:50),PSD(1:50),EAV,ESD,MAV,MSD,JAV,JSD REAL SAV,SSD,CAV,CSD CHARACTER FNAME*30,SHUTURYOKU*20,CN*50,SHUTURYOKU2*20 READ(5,*)FNAME READ(5,*)SHUTURYOKU OPEN(1,FILE=FNAME) DO 10 K=1,50 READ(1,*)N(K),EP(K),MP(K),JP(K),SP(K),CP(K) 10 CONTINUE CLOSE(1) *英語の平均点、標準偏差の計算 OPEN(2,FILE=SHUTURYOKU) CALL AVEETC(EP,EAV,ESD) WRITE(2,*)'英語の平均点・標準偏差' WRITE(2,300) EAV,ESD 300 FORMAT(2F6.2) *数学の平均点、標準偏差の計算 CALL AVEETC(MP,MAV,MSD) WRITE(2,*)'数学の平均点・標準偏差' WRITE(2,300) MAV,MSD *国語の平均点、標準偏差の計算 CALL AVEETC(JP,JAV,JSD) WRITE(2,*)'国語の平均点・標準偏差' WRITE(2,300) JAV,JSD *理科の平均点、標準偏差の計算 CALL AVEETC(SP,SAV,SSD) WRITE(2,*)'理科の平均点・標準偏差' WRITE(2,300) SAV,SSD *社会の平均点、標準偏差の計算 CALL AVEETC(CP,CAV,CSD) WRITE(2,*)'社会の平均点・標準偏差' WRITE(2,300) CAV,CSD *各生徒の合計点、平均点、標準偏差の計算 DO 50 K=1,50 SUM(K)=EP(K)+MP(K)+JP(K)+SP(K)+CP(K) PVX(K)=EP(K)**2+MP(K)**2+JP(K)**2+SP(K)**2+CP(K)**2 PAV(K)=REAL(SUM(K))/5.0 PSD(K)=SQRT(PVX(K)/5.0-PAV(K)**2) 50 CONTINUE WRITE(2,*)'各生徒の合計点、平均点、標準偏差' WRITE(2,*)'番号 合計 平均点 標準偏差' DO 60 K=1,50 WRITE(2,200)K,SUM(K),PAV(K),PSD(K) 60 CONTINUE 200 FORMAT(I3,I5,2F10.2) *合計点のヒストグラムを書く DO 70 J=0,9 JL=10*J JH=JL+9 CALL STR(SUM(J),CN) WRITE(2,400)JL,JH,CN 70 CONTINUE 400 FORMAT(1X,I2,'-',I2,'I',A50) *英語の点数順に並べ変え DO 20 L=1,49 DO 30 I=L+1,50 IF(EP(L).LT.EP(I)) THEN M=EP(I) EP(I)=EP(L) EP(L)=M Q=N(I) N(I)=N(L) N(L)=Q END IF 30 CONTINUE 20 CONTINUE *表示 WRITE(2,*)'英語の成績高い順' WRITE(2,*)'番号 点数' DO 40 J=1,50 WRITE(2,100)N(J),EP(J) 40 CONTINUE 100 FORMAT(I2,I3) END SUBROUTINE AVEETC(P,AV,SD) REAL AV,SD INTEGER P(1:50) WX=0.0 VX=0.0 DO 10 K=1,50 WX=WX+P(K) VX=VX+P(K)*P(K) 10 CONTINUE AV=REAL(WX)/50.0 SD=SQRT(REAL(VX)/50.0-AV**2) END SUBROUTINE STR(SUM,C) INTEGER SUM CHARACTER C*50 DO 10 K=1,50 IF(K.LE.SUM(K))THEN C(K:K)='*' ELSE C(K:K)=' ' END IF 10 CONTINUE END

  • FORTRAN 初心者です

    以下の連立一次方程式をSOR法で解く問題です。 初心者なりにガウスザイデル法を応用してプログラムしたつもりですが、やはり難しいです(答えは違います)。 どこをどうすれば良いのか分かりませんので、よろしければヒントや助言をいただきたいです。 PROGRAM SOR REAL A(10,10),B(10),X(10),X0(10) INTEGER N,I,J,K,Kmax,w N=3 A(1,1)=4 ;A(1,2)=1 ;A(1,3)=2 A(2,1)=1 ;A(2,2)=3 ;A(2,3)=1 A(3,1)=1 ;A(3,2)=2 ;A(3,3)=5 B(1)=16 B(2)=10 B(3)=12 X0(1)=1 ;X0(2)=1 ;X0(3)=2 w=1.2 Kmax=50 EPS=1.D-5 DO I=1,N D=A(I,I) S=B(I) B(I)=B(I)/D END DO DO K=1,Kmax DO I=1,N DO J=1,N if(J<I) X0(J)=X(J) S=S-A(I,J)*X0(J) END DO X(I)=(1-w)*X(I)+w*S END DO DO I=1,N S=S-(X(I)-X0(I))**2 END DO IF(S<EPS) GOTO 10 DO I=1,N X0(I)=X(I) END DO END DO 10 WRITE(*,*) K DO I=1,N WRITE(*,*) 'SOR法で求めた解は' WRITE(*,*) 'X(',I,')=',X(I) END DO END PROGRAM SOR !------------------------------------ ※wは緩和係数です

  • FORTRANのプログラミングについて

    たびたび申し訳ありません。 またFORTRANに関しての質問です。 x y z 0 0 30 1 0 45 2 0 60 3 0 43 4 0 51 5 0 32 0 1 43 1 1 90 2 1 32 3 1 85 4 1 65 5 1 90 0 2 32 1 2 32 と続くファイルがあります。これをFORTRANをで書き換えて、 0 0 30 0 1 43 0 2 32 1 0 45 1 1 90 1 2 32 と続くデータにしたいのです。(これを以下目的のファイルという) 今のところ、次のようなプログラムを書き、特定のXに対しては、結果を吐き出すことに成功しています。 program dat real x1(100),h,y2(100),y1(100),z1(100) integer i,n,j,k,l,m,a(100) open(7,file='test.txt') open(9,file='af-test.dat') do i=1,100 read(7,*,end=200) x1(i),y1(i),z1(i) if(x1(i).eq.90)then write(9,*) x1(i),y1(i),z1(i) end if end do 200 close(7) close(9) end ここまではうまくいくのですが、これでは90以外の場合は出力されません。(あたりまえですが) 特定のXに限らずに例えばXを0から100まで吐き出されるような目的のファイル作るにはをどのようにしてプログラムを書けばいいかご教授ください。

  • fortran 実行結果がうまく表示されない

    グローバルモジュールを用いてプログラムを書いたのですが実行結果が表示されません、プログラム中に問題があるのでしょうか?教えて下さい。 module params implicit none integer :: n = 2 end module params module sample implicit none contains subroutine swapvec3(x,y) use params real(8), intent(inout) :: x(n), y(n) real(8) tmp(n) tmp(1:n) = x(1:n) x(1:n) = y(1:n) y(1:n) = tmp(1:n) end subroutine swapvec3 end module sample program main use sample implicit none real(8), allocatable :: a(:), b(:), tmp(:) integer n allocate(a(n),b(n),tmp(n)) call swapvec3(a,b) call random_seed call random_number(a) call random_number(b) call random_number(tmp) write(*,*) ' a = ', a(1:n) write(*,*) ' b = ', b(1:n) write(*,*) ' tmp = ', tmp(1:n) end program main 実行結果  a = b = tmp =