• 締切済み

配列 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 とても困っていますし、急いでいます。 誰か助けてください。 よろしくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

numpos = count(x > 0)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

配列の個々の要素を判定して、条件成立していたらカウンタ変数を+1するようなループを記述して、そのカウンタ変数の値を関数の戻り値にすれば良いかと。 質問文のコードで、do文を使った配列へのアクセスを記述できているのだから、たぶん貴方なら書ける筈。

0124ponta
質問者

補足

if(x(i).gt.0.0d0) then count(x(i)) = count(x(i))+1 endif これでいいんですか?? ちなみに上の記述は、多少コピーしたものなので、 正直内容はあまり理解できていません。 ので、できれば文章より記号で教えて頂けると助かります。

関連するQ&A

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

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

  • 配列 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 ところどころが分かりません。 とても困っていますし、急いでいます。 だれか教えてください。 よろしくお願いします。

  • 配列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 教えてください。 よろしくお願いします。

  • 配列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 教えてください。 よろしくお願いします。

  • fortran allocateを使って配列宣言を

    今変数 aについて考えています.aは i,jの2次元の座標におけるデータです. a(1,1)は10個配列を持ちたい a(1,2)は5配列を持ちたい a(i,j)はn個配列を持ちたい このような場合どのように配列を定義すれば良いのでしょうか? 例えば 2次元の大きさが3x3の場合で,それぞれの位置に配列したいデータ個数をnとします. nには既に個数が定義されているとします.このとき aの配列は nを使ってどのように定義すれば良いのでしょうか? integer n(3,3) integer i,j real, allocatable :: a(:,:,:) do j=1,3 do i=1,3 n(i,j)=i*j end do end do do j=1,3 do i=1,3 allocate (a(n(i,j),3,3)) end do end do では aの宣言が重複するためエラーになってします. 何方か良い方法を教えて下さい.

  • ある値以上のデータの個数を表示させる関数は?

    25行目から下に、複数のデータがあります。 E,G,I,K,M,O,Q,S,U,W の列だけで、 値が9以上であるセルの個数を 「 B列 」 に表示させる関数はどのようになりますでしょうか? よろしくお願い致します。 下記例の場合は、 9以上の値は、 4つありますのでB列に 「 4 」 と表示させます。 --------------- 実行前   A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 25             10    8     7     9     12     3     25     1     4     5 ・ ・ 実行後   A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 25    4        10    8     7     9     12     3     25     1     4     5 ・  

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

    関数に配列を渡したいんですがこのソースが問題ないか見てください。 #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 で配列の数を指定するようにしています。 自分でテストした限りではちゃんと動いているようなんですが、間違ってるようなら指摘お願いします。

  • fortran 配列

    はじめまして。fortranを勉強しているのですが割付け配列がよく理解できないので教えていただきたいのですが。以下に自分で作った簡単なプログラムを実行していたのですが正しい値になりません。どこが間違っているのでしょうか?教えて下さい。よろしくお願いします。 program list2_3 implicit none real(8), allocatable :: u(:), v(:) integer :: i, n = 2 real(8) dotp allocate (u(n), v(n)) u(1:2) = (/1.2d0,3.4d0/) v(1:2) = (/4.1d0,2.6d0/) dotp = 0.0d0 do i = 1, n dotp = dotp + u(n) * v(n) enddo deallocate (u, v) write(*,*) ' dot product =' , dotp end program list2_3

  • 式の組み込み

    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=・・が反映されていないようです。 どの様にしたらいいのか教えて下さい。

  • 連続しない○の個数を数えるには?

    また、お世話になります。 質問は、次の通りです。 E11からY11まで、○が入っている行があります。 この中から、○が連続しないで単独で出ている個数を数えて表示させる関数をZ11に入れたいのですが、どのような関数を入れたらよいですか? 下の例ですと、GとPが単独で現われており、二個になりますので、Z11には2という風に表示させたいのです。 関数に詳しい方、宜しくお願い致します。 E  F  G  H  I  J  K  L  M  N  O  P  Q・・・ × × ○ × ○ ○ × ○ ○ ○ × ○ ×・・・

専門家に質問してみよう