• ベストアンサー

fortran

例えばここに(100、50、19、38)の配列Aがあるとします。 そしてこの配列の何番目かに50という数字が入っている事はわかっていて、何番目にあるかを調べるときは 50=A(n) write(*,*)n と書けば2と出てくるのでしょうか? それとも A(n)=50 とすべきなのでしょうか? はたまた全く違う方法なのでしょうか? プログラムを考えていて、ここの部分がわからず完成しません。 どなたか教えてください

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4856/10272)
回答No.1

プログラムは、欲しい結果を記述すれば、あとはコンピュータがよろしくやって答えを出してくれると言うものではありません(*注)。どういう手順で結果を求めるのか、その手順を書きます。 配列のどこかに目的の値のものが入っているなら、配列の要素を一つ一つ順番に見て探します。そういう風にプログラムを書きます。 1. 最初から見ることにする 2. それは50か? 3. 違うなら次を見ることにする 4. 2から繰り返し *注:それに近いことの出来るプログラミング言語もありますが、コンピュータに理解出来る形で「欲しい結果」を書くのはかなり難しいです。

noname#150296
質問者

お礼

やはりだめでしたか・・・ ありがとうございます。 do n=1,3 if(A(n).eq.50) then write(*,*)n end if end do で動くでしょうか???

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

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

Fortran なら (何もしなければ) 配列の添え字は 1 からです>#3. ただ, do で回す範囲は LBOUND(A, 1)~UBOUND(A, 1) にした方がよいでしょう. これなら大きさに関係なく見つかる... おぉ, Fortran2008 には FINDLOC なるイントリンシック関数があるのか....

noname#150296
質問者

お礼

ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.3

惜しいかも。 > do n=1,3 Aの要素数は4つですね。これでは3つしか検査しません。 それから、要素番号はお0から始まりますね。 これも、プログラミングの世界と日常の世界のギャップが あります。 何番目と要素番号は1つずれるということですね。 この短いプログラムを見て、私はFORTRANを忘れていることに 気が付きました。もう何十年も接していません。 もっとも文法書があれば、即座にコーディングする自信はありますが。

noname#150296
質問者

お礼

あっ! そうでした。 ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.2

> はたまた全く違う方法なのでしょうか? Yes 前述の二つの方法は代入という概念ですし、1つ目は数値に代入しようとしているので 文法として成立しません。 プログラミングで最初にぶつかる問題として「=」の扱いが数学と違うことです。 A(n)=50 としたらA(n)に50という値を代入するという意味です。 また、問題としてnの値が答えなのであるわけだから、いきなりnに答えが入っていると 考えるのはおかしいです。 配列Aの各要素を1つずつ検査する必要があり、検査の結果50が見つかったらそれが 答えです、 検査をするときも「=」を使いますね。ただし、ifなどが(ifに限らない)ないと 「=」が検査の意味になりません。 答えを書くのは簡単ですが、まあ考えてください。頑張って。

noname#150296
質問者

お礼

確かにおかしいですね。 人に言われないとわからないものです。 ありがとうございます。 したの方の回答にも書きましたが、 do n=1,3 if(A(n)=50)then write(*,*) end if end do ならばほしい情報がてに入りますでしょうか??

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  •  Fortran90を授業でやっています。

     Fortran90を授業でやっています。 入力されたNまでの素数を配列で返す関数をつくって、それを主プログラムで呼び出して素数を出力するという問題です。  素数を関数を用いて配列で返すまでは出来ました。しかし、その関数( Sosuu(N)としました。 )の要素数を(1000)と設定したため、Sosuu(N)の1番目から100番目までは素数が入っているのですが、それ以降の要素は値がすべて0になってしまいます。  なので、WRITE(*,*)Sosuu(N) とすると、素数が列挙された後さらに0が列挙されてしまいます。 0が出力されない方法は何かありませんか?

  • Fortran90/95の出力方法について

    Fortran90/95の出力方法について Fortran95において,変数の値をwrite文で出力した後に改行しない方法を教えてください. 具体的には次のProgram reiを用いて質問します. program rei implicit none integer i, n read(*,*) n do i = 1, n write(*,*) i end do end このプログラムを実行させnに3を代入すると次のように表示されます. 1 2 3 しかし,私としては次のように改行せずに表示させたいのです. 1 2 3 また,諸事情により配列は使用しません. プログラムをどのように改良すればよいのでしょうか.教えてください.

  • FORTRAN95でハフモデルの計算をしようと思っています。

    FORTRAN95でハフモデルの計算をしようと思っています。 ハフモデルをちょっと拡張して計算を行いたく、なかなかプログラムを組めていません。 一番苦戦しているのが、配列に数字を入れる方法です。 縦5、横9からなる配列Bを定義して、(Bの左上の要素はB11とします) 1列目の2~5行目に1~4の数字を入れ, 1行目の2列目から後ろには1~9を入れて、Bを表示したいです。 ほかの要素は実数なのでBは実数型で定義します。 Bの完成イメージとしては 0 1 2 3 4 5 6 7 8 9 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 です。スペース部分はコンマですが。 プログラムを REAL,DIMENSION(5,9)::B B=0 DO I4=1,4 B(2:5,1)=I4 DO IXW=10,80,10 XWEI=REAL(IXW)/10.0 B(1,2:9)=XWEI END DO END DO DO I5=1,5 WRITE(*,100) (B(I5,J5),J5=1,9) 100 FORMAT(20(',',F3.1)) END DO STOP END こうかくと、 ,0.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0,8.0, ,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, ,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, ,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, ,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0, のように表示されます。DO文の対になるEND DOよりしたではDOの最後の値しか使えないようです。 しかし、WRITE文をEND DOより中に入れると5×9ではなくもっと縦長の15×9のような配列が表示されてしまいます。 どなたか教えてください。お願いします。

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

    学校で下記のカッコ内を埋めなければいけないのですが、まったく分からなくて困っています。どなたか教えてくださいませんか?下のプログラムが分かりにくくてごめんなさい。 年賀はがきの当選番号(下二ケタ)5本を配列に登録しておき、コンソールから年賀はがきの下二桁の数字を入力するたびに、あたりはずれを返すプログラムを書きなさい。 登録用当選番号 07 12 35 46 77 1.配列に登録するというのは代入しておくことです。 2.入力は下2けたのみの入力とする 3.999を入力したら終了することとする 4.あたり・はずれは画面に表示すればよい 5.入力されたデータが5つの配列と同じかどうかを 比較して、同じ場合にはあたりを表示する命令文に とぶ。 6.あたりを表示したらデータ入力にもどる 7.同じ数値が無い場合は、はずれと表示してデータ 入力にもどる プログラム integer d(5),i,j,n d(1)=7 d(2)=12 d(3)=35 d(4)=46 d(5)=77 20 ( ) ( ) go to 40 do 10 ( ) if(d(i).eq.n) then write(6,*) ( ) go to 20 end if 10 continue write(6,*) ( ) go to 20 40 stop end

  • 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

  • fortran 途中まで考えたのですが。。。。

    エラトステネスのふるい(素数の倍数を除いていって残ったのが素数)で3桁の素数を求めて表示したいです。 私が考えたのは、 1・2~99までの数を素数かどうか調べて、素数を配列に入れていく 2・100~999まで素数の配列の中の数で割って、割り切れたらおしまい。割り切れなかったら表示していく ということです。 しかし下のプログラムではうまく素数配列ができていないようなのです。 ここまでかなり時間がかかったのでこのプログラムに手をいれて これ以外におかしくなるところもどこを直せばいいのか教えてくださるとうれしいです。 C C q223.f C PROGRAM q223 C IMPLICIT NONE C INTEGER N,i,K,s,l REAL a(99),b(99),c(99),X,Y C real M C a(1)=2 a(2)=3 l=2 C DO N=2,99,1 M=N**(0.5) S=M DO i=2,S,1 K=MOD(N,i) IF(K ==0)THEN exit ELSE IF(K /=0)THEN l=l+1 a(l)=N ENDIF ENDDO ENDDO C do N=100,999 do l=1,99 X=a(l) Y=N/X if(Y==0)then exit else if(Y/=0)then write(*,*)N end if end do end do c end よろしくおねがいします

  • プログラミング 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 よろしくお願いします!!

  • 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

  • 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 固有値

    プログラミング初心者です。 http://www.netlib.org/toms/496 ↑このサブルーチン(複素数からなる行列の固有値と固有ベクトルを求めるプログラム)を使いたいのですが、勉強不足のため、それすらできません。多分、配列の宣言の仕方がまずいと思うのですが… mainプログラムはどのように書けばいいのでしょうか? よろしくお願いします。 行列は3*3で試しています。 ↓これが今のプログラムです。 complex A,B,X,EIGA,EIGB integer N,NA,NB,NX,ITER dimension A(N,N),B(N,N),X(N,N),EIGA(N),EIGB(N),ITER(N) logical WANTX N=3 NA=3 NB=3 NX=3 A(1,1)= : A(3,3)= call LZHES(N,A,NA,B,NB,X,NX,WANTX) call LZIT(N,A NA,B,NB,X,NX,ANTX,ITER,EIGA,EIGB) end

このQ&Aのポイント
  • マイクロソフトsurfaceGo2のCポートにエレコムドッキングステーションDST-C14BKを繋げてVGA接続で液晶モニターにPC画像が映らなくなりました。
  • これまで使用していた変換アダプターでは映っていたのですが、接触が悪くなり映ったり映らなかったりの症状が出ていました。
  • エレコム製品を購入しましたが、それでも映らない状態が続いています。USBポートを通じての印刷は問題ありません。
回答を見る