• ベストアンサー

配列Xの平均値を求める関数副プログラムaver(x,n)の作り方

配列xに入っているデータの平均値を求める関数副プログラムaver(x,n)の作り方がよく分かりません。 function aver(x,n) implicit real*8(a-h,o-z) real*8 x(*) !!この部分が分かりません。!! return end 教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

program test implicit none integer::n real*8,allocatable,dimension(:)::arr !面倒なので直接ソース中に埋め込んでいるが, !本来は別ファイルから読み込み,値の個数に応じて, !allocateしなおすような仕組みを作るべき。 allocate(arr(5)) arr(1) = 57d0 arr(2) = 24d0 arr(3) = 38d0 arr(4) = 92d0 arr(5) = 37d0 !本当は引数渡しではなく,引数のみを関数に渡し, !関数がuboundを行うべきだろうと思う。 n = ubound(arr,1) print *,aver(arr,n) contains real*8 function aver(x,n) real*8,dimension(:)::x integer::n integer::i do i = 1,n aver = aver + x(i) end do aver = aver / n end function end program

0124ponta
質問者

お礼

詳しく教えて下さり、 ありがとうございました。 参考になりました。

関連するQ&A

  • 配列 x に入っているデータの個数を求める関数の作り方

    配列 x に入っているデータのうちで、値が正(つまり x(i) .gt. 0.0d0 ) であるデータの個数を求める関数 numpos(x,n) を作り方を教えてください。n はデータの個数。 implicit real*8(a-h,o-z) real*8 x(1000) dummy = rand(13) 乱数の初期化 n = 1000 do 10 i=1,n x(i) = rand(0)-0.4d0 テストデータ 10 continue write(6,*) 'numpos =', numpos(x,n) stop end function numpos(x,n) implicit real*8(a-h,o-z) real*8 x(*) この部分が分かりません。(関数副プログラムなので、関数の値、つまり正のデータの個数は、関数名と同じ名前の変数、つまり numpos という名前の変数へ代入すること、らしいです。) return end とても困っていますし、急いでいます。 誰か助けてください。 よろしくお願いします。

  • 配列xのヒストグラムを求めるサブルーチンhist(x,n,ndiv,count)の作り方

    配列xに入っているデータのヒストグラムを求めるサブルーチンhist(x,n,ndiv,count)の作り方 が分かりません。 subroutine hist(x,n,ndiv,count) implicit real*8(a-h,o-z) real*8 x(*) integer count(*) C まずデータの最大値、最小値を求める: call maxmin(x,n,xmax,xmin) C xminからxmaxまでをndiv等分する。分割幅は dx = (xmax-xmin)/ndiv !!この部分のプログラムが分かりません!! return end 教えてください。 よろしくお願いします。

  • 配列Xの最大値、最小値を求めるサブルーチンmaxminの作り方

    配列Xに入っているデータの最大値、最小値を求めるサブルーチンmaxminの作り方を教えてください。(n:データ数) subroutine maxof(x,n,xmax,xmin) implicit real*8(a-h,o-z) real*8 C 最大値は変数xmaxに、最小値は変数xminに代入する  !!この部分が分かりません!! return end 教えてください。 よろしくお願いします。

  • なぜ計算結果が出力されないのか・・・

    エラーも何もないプログラムなのに、計算されません。 答えは、401.0になるはずなのに・・ 理由がわかりません。 コード載せておくので、どなたかお願いします。 implicit real*8 (a-h,o-z) Parr_M=1.0d0 Temp=1.0d0 Mc=val_Mc (p,M_C_gamma,M_C_alpha) x=Mc+1.0d0 write(6,10) x 10 format(1H ,F9.3) end ーーーーーーーーーーーーーー real*8 function val_p (Parr_M) implicit real*8 (a-h,o-z) val_p=Parr_M(ix,iy)**3 return end ーーーーーーーーーーーーーー real*8 function val_Mc (p,M_C_gamma,M_C_alpha) implicit real*8 (a-h,o-z) val_M_C_alpha=M_C_alpha(Temp) val_M_C_gamma=M_C_gamma(Temp) p=val_p (Parr_M) * val1=val_M_C_alpha val2=val_M_C_gamma*p val=val1*val2 * val_Mc=val return end ーーーーーーーーーーーーーーー real*8 function M_C_alpha(Temp) implicit real*8 (a-h,o-z) M_C_alpha=Temp/2.0d0 return end ーーーーーーーーーーーーーーー real*8 function M_C_gamma(Temp) implicit real*8 (a-h,o-z) M_C_gamma=Temp return end ーーーーーーーーーーーーーーー 以上をはしらせると、 『forrtl: severe (157):Program Exception - access violation』 と出てきます。謎です。結果もちゃんと出る様に、F9.3で入力してるはずだが・・

  • 配列 x に入っているデータの最大値、最小値を求めるサブルーチンとそのヒストグラムの作り方

    配列 x に入っているデータの最大値、最小値を求めるサブルーチン maxmin(x,n,xmax,xmin) を作り方を教えてください。 n はデータ数。 最大値、最小値はそれぞれ xmin, xmax に代入する。 次に、そのサブルーチンを用い、x に入っているデータのヒストグラムを作成するプログラムを作り方も教えてください。 (途中までしか分かりません) implicit real*8(a-h,o-z) real*8 x(10000) integer count(100) ndiv = 40 分割数は 40 にする n = 10000 データ数は 10000 dummy = rand(13) 乱数の初期化 do 10 i=1, n sum = 0.0d0 do 20 j=1,5 sum = sum + rand(0) 5個の乱数の和 20 continue x(i) = sum 10 continue call maxmin(x,n,xmax,xmin) 最大・最小値を求める dx = (xmax - xmin)/ndiv 分割幅 !!count をゼロで初期化する do ループを追加!!(よく分かりません) !!ヒストグラムを作成する do ループを追加!!(よく分かりません) do 100 k=1, ndiv write(6,*) xmin+(k-0.5d0)*dx, count(k) データの中心値と個数を出力 100 continue stop end subroutine maxmin(x,n,xmax,xmin) implicit real*8(a-h,o-z) real*8 x(*) !!この部分を作成してサブルーチンの完成のさせ方が分かりません!! return end ところどころが分かりません。 とても困っていますし、急いでいます。 だれか教えてください。 よろしくお願いします。

  • 式の組み込み

    implicit real*8 (a-h,o-z) y=2.0d0 k=1.0d0+y x=k+3.0d0 write(6,10) x 10 format(1H ,F7.3) end とすると、当然6.000が出力されます。ここにおいてk=1.0d0+yをfunction又は、subroutineで書こうと思い、 subroutineで書いたのを以下に載せます。 *main implicit real*8 (a-h,o-z) y=2.0d0 call setcns (y) x=k+3.0d0 write(6,10) x 10 format(1H ,F7.3) end *sub function setcns (y) implicit real*8 (a-h,o-z) k=1.0d0+y return end これでビルドすると、『Variable K is used before its value has been defined』と警告されます。 走らすと、3.000と表示され、k=・・が反映されていないようです。 どの様にしたらいいのか教えて下さい。

  • fortran90 引数で渡された関数の呼び出し

    fortran90を始めて間もない者です。 メインプログラムより呼び出しているサブルーチンにユーザ関数を渡しています。 このサブルーチンを自前で作成するのが目的です。 引数で受け取った関数を、自前の別関数より呼び出すにはどうしたら良いでしょうか。 Cであれば関数のポインタをグローバルな変数にセットしてやれば可能だと思いますが・・・ !-------------------------------- subroutine sub(func1, a) real::a interface real function func1(x) real::x end function func1 real function func2(x) real x end function func2 end interface call sub2(func2, a) write(*,*) a return end subroutine sub !-------------------------------- real function func2(x) real::func2, x ! ここでfunc1を呼び出したい ! func2=func1(x) end function func2 !-------------------------------- subroutine sub2(funca, a) real::a interface real function funca(x) real::x end function funca end interface a=funca(10.) return end !-------------------------------- program main external func real a call sub(func, a) write(*,*) a end program !-------------------------------- function func(x) real func, x func=2.*x*x end function func

  • 関数に配列を渡すときの質問です

    関数に配列を渡したいんですがこのソースが問題ないか見てください。 #include<stdio.h> #define N 10 #define M 20 int sig(int X[],int x); main() { int a[N],b[M],i,x,y; for(i=0 ; i<N ; i++){ a[i]=i; } for(i=0 ; i<M ; i++){ b[i]=i; } x=sig(a,N); y=sig(b,M); } int sig(int Z[],int x){ int i,k; k=0; for(i=0 ; i<x ; i++){ k=k+Z[i]; } return k; } ソースは以上です。 1つのソースの中でa[N]とb[M]のように違う数の 配列があるんですが、その配列全部(0~N-1、0~M-1)とかを足してくれる(シグマ)関数を作りたいんですが、Z[]と配列の数を指定しなくてもちゃんと動いてくれるんでしょうか?関数のほうの int x で配列の数を指定するようにしています。 自分でテストした限りではちゃんと動いているようなんですが、間違ってるようなら指摘お願いします。

  • gfortranでlog2(x)を自作関数

    お世話になります。 fotran90でlog2(x)を-----ここからのように作成しましたが、以下のエラーとなりコンパイルできません。 環境はLubuntu14.04LTS、gcc version 4.8.2です。 log2.f90:7.19: write(*,*) x, log2(x) 1 Error: Return type mismatch of function 'log2' at (1) (INTEGER(4)/REAL(4)) -----ここから program main integer i real x do i=0, 10 x=2.+0.1*real(i) write(*,*) x, log2(x) end do end program main real function log2(x) real x log2=log(x)/log(2.) end function -----ここまで よろしくお願いします。

  • 関数とarguments配列

    ●質問の主旨 下記サイト、CodeStudyによる JavaScriptの関数とarguments配列の 使い方に関する問題に対する 答えとなるコードの記述が分かりません。 どなたかアドバイスをお願いします。 CodeStudy 関数その2 3.arguments その3 http://jeek.jp/study/section18/3 ●問題文 関数checkが定義されています。 check内のif文により、引数が3つ以外の際は、 outputで"引数が3つではありません。"と出力させましょう。 function check(x, y, z) { if() { output("引数が3つではありません。"); } } check(1, 2, 3, 4); ●自分で作った途中経過 resultやreturnの使い方がよく分かりません。 function check(x, y, z) {  var result = 0; if(arguments.length !== 3) { output("引数が3つではありません。"); } return result; } check(1, 2, 3, 4); output(check); ●コードの条件(ヒント) argumentsは、引数を格納する配列で、 argumentsを使うと引数をいくつでもとることが出来ます。 また、argumentsは配列なので、 .lengthを使うと長さが求められます。

専門家に質問してみよう