[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 12:09 / Filesize : 350 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれFORTRAN(超初心者用)その2



1 名前:デフォルトの名無しさん [2006/11/22(水) 00:00:36 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)
pc8.2ch.net/test/read.cgi/tech/1138063703/

●関連スレ
FORTRAN W
pc8.2ch.net/test/read.cgi/tech/1163319215/


83 名前:デフォルトの名無しさん [2006/12/10(日) 17:07:02 ]
>>82
dクス。
意外に高機能だな。
サポートとかはどうなんだろう?パッチとか結構でてるんだろうか?


84 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 20:23:17 ]
intel fortran ver 9.0 for winを使っております。
自分でプログラムを組んでコンパイルできるところまでは到達したのですか実行すると
forrtl: severe (168):Program Exception - illegal instruction
Image PC Routine Line Source

Stack trace terminated adnormally.

と実行してくれません。なにがおかしいのでしょうか?
ソースをのせるべきなんでしょうがnetnumpacから主に引っ張ってきている分権利がややこしそうです。

よろしくお願いします。

85 名前:84 mailto:sage [2006/12/10(日) 20:35:24 ]
program main
common/ numbb / nnn,lll,dz,ameson
integer :: nnn, lll
real*8 :: dz, ameson, dr(251),scr,hx
open (unit=10, file='functest0.txt', status='unknown')
open (unit=11, file='functest1.txt', status='unknown')
open (unit=12, file='functest2.txt', status='unknown')
open (unit=13, file='functest3.txt', status='unknown')
open (unit=14, file='functest4.txt', status='unknown')
open (unit=15, file='functest5.txt', status='unknown')
nnn = 6
lll = 5
dz = 60.0d00
ameson = 413.536d00
dr(1)=exp(-8.8)*dz
hx=5.d-2


86 名前:デフォルトの名無しさん [2006/12/10(日) 20:37:23 ]
do l=2, 251
dr(l)=dr(1)* exp(hx*(l-1))
end do
zero = 0.0
y = 0.0
do i = 1, 251
call GASND (zero, dr(i), screen, 40, Y, ICON)
scr = y
write(10,'("i="i2," dr(i)="e15.8," scr="e20.10)')i,dr(i),scr
end do
close (unit = 10)
close (unit = 11)
close (unit = 12)
close (unit = 13)
close (unit = 14)
close (unit = 15)
end


87 名前:84 [2006/12/10(日) 20:38:49 ]
function screen(ddr)
! it's the Dnl(r)
common/ numbb / nnn,lll,dz,ameson
real*8 :: a1, a2, a3, al1, arn
integer :: nnn, lll, l5
real, external :: DPLAGG
integer, external :: factorial
real, intent(in) :: ddr
a0 = ameson
arn = - a0 * ddr
aa1 = 2.0d00*dz/(nnn*a0)
nl = nnn-lll - 1
nll = nnn + lll
a2 = factorial(nl)
a3 = factorial(nll)
a4 = 2.0d00*dble(nnn)*a3*a3*a3
a5 = aa1*(a2/a4)
l5 = 2*lll + 1
l6 = 2*lll
a6 = (arn)**(l6)
al6 = dble(l5)
al7 = DPLAGG(nll,al6, arn)
al8 = al7*al7
ss = a5*exp(arn)*al8*a6
screen = ss
write(11, '("nnn="i2," ss="e20.10)') nnn, ss
end function screen

88 名前:84 mailto:sage [2006/12/10(日) 20:40:33 ]
function factorial(n)
integer :: fact
integer, intent(in):: n
fact = 1
do i = 1, n ,1
fact = fact*n
end do
factorial = fact
write (12, '("n="i1," fact="i10)') n, fact
end function factorial

FUNCTION DPLAGG (N, A, X)
IMPLICIT REAL (8)(A - H, O - Z)

END FUNCTION DPLAGG
SUBROUTINE GASND (A, B, FUN, N, Y, ICON)
IMPLICIT REAL (8)(A - H, O - Z)
EXTERNAL FUN
DIMENSION X (50), W (50)
SUBROUTINE WGLEGD (NP, PT, WT, ICON)
! LEGENDRE-GAUSS FORMULA
IMPLICIT REAL (8)(A - H, O - Z)
DIMENSION X (25, 50), W (25, 50), PT (NP), WT (NP)


89 名前:84 mailto:sage [2006/12/10(日) 20:42:38 ]
netnumpacからのソースはプログラム名だけにしました
変数の定義があったりなかったりで非常にみづらいとは思いますがよろしくお願いします。

90 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 21:08:10 ]
>>84 これは試したかい?
Re: forrtl: severe (168) Program Exception - Illegal instructiom
Reply Quote
Turns out that the problem was caused by an older-generation processor not understanding
newer instructions. The application had been compiled with the "Generate most optimized code"
(/fast) setting, which implies /arch:host. Unfortunately, the project settings box display doesn't
reveal the implied switches, leading to this sort of problem.

Steve

softwareforums.intel.com/ISN/Community/en-US/forums/thread/106764.aspx

91 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 21:21:02 ]
>>83
SilverfrostのホームページからForumを見に行くと
ここのAnnouncementsにパッチの情報も載っている。



92 名前:84 mailto:sage [2006/12/10(日) 21:41:42 ]
>>90
英語をよみくだくと /arch:hostのコンパイラオプションをしろ ですよね
やってみましたが変化なしでした。
環境はpen4 2.4BGHz 1024MB 845Echipset winxp sp2なんですがね

93 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 22:03:23 ]
>>92
debugモードでtracebackもonにしてどのソース行でおかしくなってるか調べてみたら?


94 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 01:23:37 ]
>>92
Pentium 4の2.4BGHzだと拡張命令はSSE2までだから、
どこかにSSE3等を使ったコードが紛れ込んでるんですかね。

別のPCでコンパイルしたライブラリをリンクしているのなら
そのライブラリがSSE3命令を使っている可能性も考えられます。

95 名前:84,92 mailto:sage [2006/12/11(月) 03:06:49 ]
>>93
debugモードは使ったことがないけどやってみます
>>94
ライブラリはもってきていないはずなので
SSE3をつかったコードが紛れ込んでるんですかね


96 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 08:32:14 ]
>>95
つーかVisualStudio使わないでコマンドラインでやってるの?デフォはdebugのはずだが。

debugモードを使わないという神経が分からんぞい!
まずは警告オプションも全部onにしてやりんしゃい!

97 名前:デフォルトの名無しさん [2006/12/13(水) 20:37:45 ]
fortran77でファイルに書き込みをするときに
open(2,file='filename.txt')
とかけばfilename.txtに結果が書けるのですが、

ひとつのプログラムでa=1〜100まで変化したときに
(do a=1,100 〜continueを利用)
a=1のときの結果はfilename1.txtに記録
   ・・・
a=100のときの結果はfilename100.txtに記録
するにはどのようにすればいいのでしょうか?

可能であればa=i,b=j(i,jに自然数が入る)のときに
filename_a=i_b=j.txt
に書き込めるように、お願いします。

98 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 21:58:54 ]
>>97
前スレでも出てたと思うが、FORTRAN77の場合だと
fmt, fname は適当な長さの文字列変数として

write(fmt,100) int(log10(real(i)))+1, int(log10(real(j)))+1
100 format('(''fname_'',I',I1,',''_'',I',I1,',''.txt'')')
write(fname, fmt) i, j
open(10, file=fname, ...

書式に 'I0' を指定すると「その数値を表現するのに最小の欄幅」を取ってくれる処理系なら

write(fname,'(''filename_'',I0,''_'',I0,''.txt'')') i,j
open(10, file=fname, ...

個人的には数値は適当な桁数にそろえて
filename_001_001.txt, ..., filename_010_010.txt, ..., filename_100_100.txt, ...
としたほうが後でデータファイルをいじったりする時に都合がよいように思う。

write(fname,'(''filename_'',I3.3,''_'',I3.3,''.txt'')') i,j
open(10, file=fname, ...


99 名前:84,92 mailto:sage [2006/12/13(水) 23:06:12 ]
>>96
コンパイラマシンは混んでいていつもコンパイルのみに使っていたのでdebugモードは未経験でした

debugしてみたとこと
dr(1)=exp(-8.8)*dz がひっかかっており
sub = -8.8
dr(1) = dz *exp(sub) としたら動くようになりました。

exp(-8.8)がSSE3なりを使用しているんでしょうか

100 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 00:25:28 ]
最適化オプションを無効にすればSSE/2/3は使われないはずだが。

101 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 01:14:45 ]
>>99
ReleaseでSSE抑止命令(CPUを旧型に指定)すれば、SSEが原因なのかどうか分かる。

定数式だから変な最適化でバグったのかね?



102 名前:デフォルトの名無しさん [2006/12/14(木) 03:12:02 ]
求めるP3の値がちょうど3(限りなく近い)値になるときのdaの値
を小数点6桁ぐらいまで求めたいのですが、どうすれば次のプログラムを
効率よくdaの値が一回で出せるプログラムにできるか知恵をお貸しください。

DIMENSION E22(2),oo(2)
REAL k,pi,a,o,z,Kf,kf1
pi=3.1415926
DO 30 da= 1.000 , 0.800 , -0.002
DO 30 n4= 8 , 8

k=5.319
a=k/0.529177
o=(a**3)/2.0*da
oo(1)=o
z=1.0


103 名前:デフォルトの名無しさん [2006/12/14(木) 03:12:51 ]
rs=(3.0*o/(z*4.0*pi))**(1.0/3.0)
Kf=(9.0*pi/4.0)**(1.0/3.0)/rs
Ef=Kf**2
c=2.0*1.0/(1.0+0.0155*pi/Kf)
Ei=1.79186*z**(5.0/3.0)/(3.0*o*rs)
P=-Ei*1.4703*10**4
E0=-4.42*z/(3.0*o*rs**2)+0.916/(3.0*o*rs)+0.031/(3.0*o)
P0=-E0*1.4703*10**4
Rmk=3.182
q0=0.89*2*0.3947587
uk=q0*Rmk*cos(q0*Rmk)/(sin(q0*Rmk)-q0*Rmk*cos(q0*Rmk))
E1=-2.0*pi*z*2.0/o**2*(z*Rmk**2*(1.0+2.0/3.0*uk))
P1=-E1*1.4703*10**4
DO 20 L= 1 , 2
E2=0.0

IF(L.EQ.1) GO TO 100
o=o*0.996
oo(L)=o
a=(o*2.0)**(1.0/3.0)
rs=(3.0*o/(z*4.0*pi))**(1.0/3.0)
Kf=(9.0*pi/4.0)**(1.0/3.0)/rs
Ef=Kf**2
c=2.0*1.0/(1.0+(0.0155*pi)/Kf)


104 名前:デフォルトの名無しさん [2006/12/14(木) 03:13:27 ]
100 DO 10 n1= -n4 , n4
DO 10 n2= -n4 , n4
DO 10 n3= -n4 , n4
IF(n1==0.and.n2==0.and.n3==0)GO TO 10
IF(MOD(n1+n2+n3,2)/=0)GO TO 10

G=2.0*pi/a*SQRT(FLOAT(n1*n1+n2*n2+n3*n3))
f=G**2/(2.0*(G**2+c*Kf**2))
ae=1.0+(1.0-f)*4.0*pi*z*2/(o*G**2)*3.0/(2.0*Ef)*
&(1.0/2.0+((4.0*Kf**2-G**2)/(8.0*Kf*G))*ALOG(ABS((2.0*Kf+G)/(2*Kf-G))))
V=(-4.0*pi*Z*2.0/(o*G**2))*((1.0+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/(G*Rmk))

E3=1.0/(4.0*pi*2.0/(o*G**2))*V**2*(1.0/(1.0-f))*(1.0/ae-1.0)
E2 = E2 + E3

10 CONTINUE
E22(L)=E2/2.0
20 CONTINUE

E8=(E22(2)-E22(1))/(oo(2)-oo(1))
P2=-E8*1.4703*10**4
P3=P+P0+P1+P2

WRITE(6,50)P3
50 FORMAT(F15.8)
30 CONTINUE
WRITE(*,*)P,P0,P1,P2
WRITE(6,601) P3
601 FORMAT(1H , F15.8)
STOP
END


105 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 10:13:55 ]
>>102
その質問の仕方じゃ 答えようがない。
もう少し何をやっているのか、根本から家

106 名前:97 mailto:sage [2006/12/14(木) 13:14:13 ]
>>98
出来ました。ありがとうございます!

107 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 16:39:03 ]
fortran90です。
いまwindows上で動かしてたプログラムを
Linuxに移そうとしてるんですが

Unable to open MODULE file dflib.mod

とエラーが出てきます。
どうすればいいでしょうか?

108 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 20:00:26 ]
Unable to open MODULE file dflib.mod
   ↓
エキサイト翻訳
   ↓
MODULEファイルdflib.modを開くことができません。


109 名前:デフォルトの名無しさん [2006/12/14(木) 20:12:39 ]
>>107
ほかの人にやってもらう

110 名前:デフォルトの名無しさん [2006/12/14(木) 22:50:01 ]
>>107
dflib.mod はDECの拡張モジュールだから、そのままではLinuxでは動かない。

DECの拡張ルーチン中で用いているものがPOSIX互換のルーチンだったら
LINUX上に移植できるだろう。

そうでないなら、自分で回避策を考えねばならない。

とりあえず、USE DFLIB となっている行を全部つぶすべし。
そうして出てきた未定義ルーチン・エラーをひとつひとつ調べるべし。


111 名前:107 mailto:sage [2006/12/14(木) 23:36:52 ]
>>110
やはりそうですかー。気が遠くなりそうですが、やってみます。
ありがとうがざいました。



112 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 00:48:58 ]
>>111
あぁ、もしLinux上のIntelFortranを使っているなら、DFORTをIFORTに変えて試してみるといい。
今のWin上のIntelfortranではDFORTはIFORTになっている。
Intelが移植用に互換モジュールを用意してくれているかもしれない。

とりあえず一応マニュアルを検索してみるといい。

どっちにしろコマンドライン引数を取るために使っている程度なら、g77でも移植可能だ。


113 名前:102 [2006/12/15(金) 01:26:40 ]
このプログラムだとわざわざDOループのdaの値を何回も変えてよりP3の値が3に近い値のda
を求めなければいけないのですが、それを実行一回で求めたいのですがどうしたら
よいでしょうか?

114 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 01:55:18 ]
>>113
見た感じ非線形だから1回は無理で、はさみうち法とかでイターレションするしかナインでないの?
というかもし1回で求まるなら、はじめっからdaについての式を逆関数的に定式化してあるのでは?


115 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 10:24:04 ]
>>112
なるほど。試してみます。
ありがとうございました!!

116 名前:デフォルトの名無しさん [2006/12/17(日) 09:35:52 ]
下記のプログラムについて、fortran77で行うと実行できないのです><
何がおかしいですかね><
よければ、教えていただけませんか?


dimension ia(100),vw(12),ivw(12),vw2(100)
data am,ix,n/1.0 ,0 ,100/

call poiss(am,ix,ia,n,vw,ivw,vw2)

write(*,*) (ia(i),i=1,n)

stop
end
 
  subroutine poiss(am,ix,ia,n,vw,ivw,vw2)
dimension ia(*),vw(*),ivw(*),vw2(*)
real*8 x,y
data bm/-1.0/


if (am.ne.bm) then
bm=am
vw(1)=exp(-am)
vw(2)=vw(1)*am
m=2.0*am+10.0

do 10 k=2,m-1
vw(k+1)=vw(k)*am/k
10 continue



117 名前:デフォルトの名無しさん [2006/12/17(日) 09:38:41 ]
do 30 k=1,m-1
if (vw(k).ne.0.0) then
x=vw(k)
do 20 j=k+1,m
y=x+vw(j)
if (y.eq.x) go to 50
x=y
vw(j)=x
20 continue
go to 40
end if
30 continue

k=m
40 j=m

50 do 70 i=j,m
vw(i)=1.0
continue

mm=j-k+1
ai=mm






118 名前:デフォルトの名無しさん [2006/12/17(日) 09:39:33 ]
do 70 i=1,mm
af=(i-1)/ai
do 60 while(af.gt.vw(k))
k=k+1
60 continue
ivw(i)=k
70 continue
end if

call unfm2(ix,vw2,n)

do 90 i=1,n
k=vw2(i)*ai+1.0
if(k.eq.mm+1) k=mm
j=ivw(k)
do 80 while(vw2(i).gt.vw(j))
j=j+1
80 continue
ia(i)=j-1
90 continue

return
end


119 名前:デフォルトの名無しさん [2006/12/17(日) 09:40:24 ]
subroutine unfm2(ix,vw2,n)
implicit real*8 (a-h,o-z)
dimension vw2(*)
real*8 aa/32771.d0/,b/1234567891.d0/,x
real*8 c/2147483648.d0/,ci/4.6566128730773925d-10/

x=ix

do 10 i=1,n
x=dmod(aa*x+b,c)
vw2(i)=x*ci
10 continue
ix=x

return
end



120 名前:デフォルトの名無しさん [2006/12/17(日) 12:11:06 ]
>>116
質問の仕方がなっちょらん。
本文からコンパイルエラーなのか実行時エラーなのかすら読み取れない。
エラーメッセージを出すくらいの知恵も無いのか!www 

と叱られるよ


121 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 14:34:44 ]
>>116
一応DEGITAL Visual Fortranでコンパイルしてみた。
do 70のループが原因でコンパイルが通らない。
後ろの70を170にして、その前のcontinueしかなかったところを70にした。
コンパイルはできるが実行中にArray Bounds Exceededが起こる。

プログラムの中身を追いかけるのは面倒だからやらない。



122 名前:デフォルトの名無しさん [2006/12/21(木) 18:06:44 ]
高校の課題なんですが、妹に教えられなくて兄としての威厳がかかっていますw
正直、プログラムはさっぱりなんですが、シスアド初級持っているために安請け合いしてしまったのが間違いですたw

以下の問いなんですがよろしくお願いします。


乱数(0〜1までの範囲)を7個発生させなさい。
その発生させた7個の乱数はそれぞれa,b,c,d,e,f,gと定義する。
このa〜gの中で、最大値と最小値をとるものを選別するプログラムを作りなさい。

というものなんですが、例として何か提示していただけませんか?
それを本みながら自分で理解して、妹に説明できるようにしたいんで。

123 名前:デフォルトの名無しさん [2006/12/21(木) 20:01:24 ]
program main
a=rand()
b=rand()
c=rand()
d=rand()
e=rand()
f=rand()
g=rand()
write(6,*) 'MAX ',max(a,b,c,d,e,f,g)
write(6,*) 'MIN ',min(a,b,c,d,e,f,g)
stop
end


124 名前:122 [2006/12/21(木) 21:05:49 ]
>>123

この

write(6,*) 'MAX ',max(a,b,c,d,e,f,g)
write(6,*) 'MIN ',min(a,b,c,d,e,f,g)

の、

maxとminっていうのは最初に宣言しなくても機能するんですか?

125 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 21:34:43 ]
>>124
機能する。 最大値/最小値を返す関数の総称名として規格で規定されている。
RAND() の方は使えない可能性がある。

126 名前:122 [2006/12/21(木) 23:31:03 ]
>>125

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

127 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 00:35:10 ]
>>122 Fortran90風には国府田。

PROGRAM chinpoko
IMPLICIT NONE
REAL :: a(7)
CALL RANDOM_NUMBER(a)
WRITE(*, *) 'MAX=', MAXVAL(a)
WRITE(*, *) 'MIN=', MINVAL(a)
STOP
END PROGRAM chinpoko

128 名前:デフォルトの名無しさん [2006/12/23(土) 00:01:40 ]
ちょっと122番と若干かぶる要素があるんだけど、

0から1までの乱数@〜Dまで存在すると仮定する。

問1.乱数をそれぞれ、@*A、@*B、@*C、@*D…C*Dとすべてのパターンの積を求める問題。

問2.問1で得られた結果に100を掛けて、小数点以下を切り捨てる。

問3.問2で得られた全ての結果に対して50より小さい場合残し、そうでない場合は残さない。残すもの、残さないものを分けろ。

問4.問3で得られた結果(残った数値)を以下のような形でまとめるようにせよ。

yi(y1,y2,y3…yn)

問5.問4で得られた結果からその中で最大値を求めよ。


という5つの問題がある。元は一個の問題なんだが、問題文が無駄に長いので俺が解釈して5つに分割してみた。


質問1.問1を俺なりにやってみたんだが、いまいちプログラムがわからないので自力で全て値を@*Aというように入力していったのだが、もっといい方法はないかな?
質問2.50以下のものとそうでないものを分けるとき、使う分は「if」でいいのか?
質問3.yi(y1,y2,y3…yn)とあるけど、これはdimension?使えばいいのか?


わかりにくいけど質問の回答よろしくお願いします。

129 名前:128 [2006/12/23(土) 00:03:53 ]
できたら、問ごとにプログラムの例文作ってくださると理解しやすいのでありがたいです。

130 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 01:12:30 ]
>>129
FORTRAN77かFortran90か指定はあるか?


131 名前:129 [2006/12/23(土) 16:36:07 ]
特にないです。今使ってるのは、visual fortranってやつなんでたぶん新しい方だと思う。



132 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 18:27:45 ]
>>128
PROGRAM q1
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), y(n * (n - 1) / 2)
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
y(k) = x(i) * x(j)
END DO
END DO
PRINT *, x
PRINT *
PRINT *, y
STOP
END PROGRAM q1

大文字はFortranに存在する命令。小文字は自分の定義する変数名など。
RANDOM_NUMBER()は0以上1未満の数を返す。
>>132 インデント

133 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 19:13:04 ]
>>128
PROGRAM q2
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), w(n * (n - 1) / 2)
REAL, ALLOCATABLE :: y(:)
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
w(k) = x(i) * x(j)
END DO
END DO
w = AINT(w * 100.0)
PRINT *, x
PRINT *
PRINT *, w
STOP
END PROGRAM q2

問2
INT()は切り捨て整数化。AINTは切り捨て整数化を実数で返す。
>>133


134 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 22:44:21 ]
PROGRAM q3
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), w(n * (n - 1) / 2), y((n * (n - 1) / 2))
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
w(k) = x(i) * x(j)
END DO
END DO
w = AINT(w * 100.0)
k = 0
DO i = 1, n * (n - 1) / 2
IF (w(i) < 50.0) THEN
k = k + 1
y(k) = w(i)
END IF
END DO
print *, 'no. of less than 50 =', k
PRINT *, y(1:k)
STOP
END PROGRAM q3

135 名前:デフォルトの名無しさん [2006/12/24(日) 19:37:56 ]
すいません。FORTRANについての質問かどうかわからないのですが…。
2次元配列DDDD(512,512)に物理量、1次元配列X(512),Y(512)に座標値が
格納されている場合で、Text column形式で出力するならば
OPEN(10,FILE='TXTCOL.D')
DO L = 1, 512
DO K = 1, 512
WRITE(10,*) X(K),Y(L),DDDD(K,L)
END DO
END DO
というのは理解しているのですが、Binary Columns形式ですとどのように
書けば良いのでしょうか?
Binary Matrix形式ですと
OPEN(20,FILE='BINMAT.D',ACCESS='direct',FORM='unformatted',recl=8*512*512)
WRITE(20,rec=1) ((DDDD(K,L),K=1,512),L=1,512)
とすれば良いと勝手に思っています(※これだと座標値が入ってません)。
そもそもバイナリ書き出しを全然、理解しておりません。
どなたかお教えいただけないでしょうか?

136 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 20:01:14 ]
>>135
いまいち何をしようとしているのか理解できないが、単にバイナリー形式で配列を
書き出したいなら書式なし形式で出せばいい。
WRITE(10) DDDD
でおk
WRITE(10) X,Y,DDD
なら、Xのすべて、Yのすべて、DDDのすべて
の順で書き出される。

直接アクセス方式は、要素をランダムにアクセスしたいときの形式。
OPEN文のRECLは単一要素の大きさなので512*512はいらない。
あと、処理系によってバイトかワードか単位要素か単位が違うのでマニュアルで
確かめる必要がある。
WRITE文でのRECは位置を指定するので、要素ごとに1づつ増やしてゆかねばならない。

直接アクセス方式はしばらく使ってないから細部を忘れたw
マニュアルを穴があくまでにらんで読んでくれ。

137 名前:デフォルトの名無しさん [2006/12/28(木) 04:22:27 ]
fortran77を使用して、cos(pi*x)を初期値とした熱方程式の時間発展を計算したいと思います。
範囲は0≦x≦1です。
これで作られたdatファイル('C:\out.dat')が(exp((-(pi)**2)*0.05))*cos(pi*x)
とぴったり重なる様な結果を得たいのですが、ずれてしまいます。
改善点をご指摘いただければ幸いです。よろしくお願いします。
program heat equation
implicit none
integer i,j,nstep,n,ndim
parameter (ndim=5001)
double precision flam,f,h,u,c1,c2,fi,t,tmax,dt
double precision a,b,c
dimension a(ndim),b(ndim),c(ndim),u(ndim)
n=10
dt=0.005d0
tmax=0.05d0
h=1.0d0/float(n)
flam=dt/(h**2.0d0)
c1=1.0d0-2.0d0*flam
c2=flam
do 1 i=1,n-1
a(i)=c2
b(i)=c1
c(i)=c2
1 continue
do 2 i=1,n+1
fi=i-1
u(i)=f(fi*h)
2 continue
OPEN(11,FILE='C:\out.dat')
nstep=0.0

138 名前:デフォルトの名無しさん [2006/12/28(木) 04:23:45 ]
3 continue
do 4 i=1,n-1
4 u(i)=b(i)*u(i+1)+a(i)*u(i)+c(i)*u(i+2)
do 5 i=n,1,-1
5 u(i+1)=u(i)
a(1)=0.0d0
b(1)=c1
c(1)=2.0d0*c2
a(n+1)=2.0d0*c2
b(n+1)=c1
c(n+1)=0.0d0
nstep=nstep+1.0
t=dt*float(nstep)
do j=1,n+1
if(mod(nstep,5).eq.0)then
write(11,*) j*h-1.0d0/n,u(j)
end if
end do
write(11,*)' '
if(t+dt.lt.tmax+0.10d0*dt) go to 3
end

function f(x)
implicit none
double precision x,f,pi
pi=3.14159265358979323846264338327950288
f=dcos(pi*x)
end


139 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 05:40:21 ]
>>137
ぴったり重なるといっても、どの程度の重なりを求めているのか?
そもそも積分方程式を差分化して数値積分している時点で誤差が溜まってゆくので
相応の誤差はある。見積もり以上の誤差が出ていると言いたいのか?

中身を全く見ていないが、表面だけを見た感じでは
floatは単精度を返すので、DBLEにしてみそとか、
『fi=i-1』も単精度に変換されているだろうといえる。

*昔のコンパイラは倍精度に単精度の数を入れると、あまった桁数にはゴミが入るので
結局数値誤差は単精度と変わりないレベルまで汚染されてしまう。



140 名前:137 [2006/12/28(木) 06:08:19 ]
>>137
ご指摘の点、早速改善させて頂きました。
ありがとうございました。
ずれは、x=1付近ではほとんどありませんがx=0では誤差では済まない程あります。
グラフにすると形もcos関数ではなくなってしまっているのですが、
改善する手立てが見つけられないでいます。

141 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 12:22:48 ]
>>137
なんでFORTRAN77のプログラムを1カラム目から書いてるの?
整形めんどい。



142 名前:デフォルトの名無しさん [2006/12/28(木) 13:17:56 ]
>>141
s/^/ /

FORTRANネタじゃないけど、まいっか

143 名前:141 mailto:sage [2006/12/28(木) 14:16:16 ]
どうも。
質問者がこれを暗黙に要求するのはどうかと思いまして。

viを起動して137-138をコピーペーストして、
:%s/^/ /
を実行した後数字のラベルの前の空白を手動で2カラム削除しました。
スレ違いで済みませんが、
「7カラム目が数字の行の先頭を2カラム削除する」というのもsedかviで
自動で処理出来るのでしょうか?

144 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 15:03:05 ]
/^......[0-9]/s/^..//

145 名前:141 mailto:sage [2006/12/28(木) 17:33:24 ]
>>144
ありがとうございます。

146 名前:137 [2007/01/01(月) 04:02:41 ]
前述の計算は以下のように書き直したら期待通りのグラフが描けました。
       program heat equation
       implicit none
       integer i,j,nstep,n,ndim
       parameter (ndim=5001)
       double precision flam,f,h,u,c1,c2,fi,t,tmax,dt
       double precision a,b,c
       dimension a(ndim),b(ndim),c(ndim),u(ndim)
       n=10
       dt=0.005d0
       tmax=0.05d0
       h=1.0d0/dble(n)
       flam=dt/(h**2.0d0)
       c1=1.0d0-2.0d0*flam
       c2=flam
       do 1 i=1,n
       a(i)=c2
       b(i)=c1
       c(i)=c2
      1 continue
       do 2 i=1,n+2
       fi=i-2.0d0
       u(i)=f(fi*h)
      2 continue
       OPEN(11,FILE='C:\out.dat')
       nstep=0.0

147 名前:137 [2007/01/01(月) 04:13:19 ]
      3 continue
       do 4 i=1,n
      4 u(i)=b(i)*u(i+1)+a(i)*u(i)+c(i)*u(i+2)
       do 5 i=n+1,1,-1
      5 u(i+1)=u(i)
       a(1)=0.0d0
       b(1)=c1
       c(1)=2.0d0*c2
       a(n+2)=2.0d0*c2
       b(n+2)=c1
       c(n+2)=0.0d0
       nstep=nstep+1.0
do j=1,n+1
if(mod(nstep,5).eq.0)then
write(11,*) j*h-1.0d0/n,u(j+1)
end if
end do
write(11,*)' '
if(t+dt.lt.tmax+0.10d0*dt) go to 3
end
function f(x)
implicit none
double precision x,f,pi
pi=3.14159265358979323846264338327950288
f=dcos(pi*x)
end
しかしcos(pi*x)としていた初期関数を
if(x.le.0.5) f=x
if(x.gt.0.5) f=1.0d0-x
に変えてみると誤った計算結果が出ます。
改善点等みつかりましたらご指摘頂けると幸いです。

148 名前:JAVAはじめました [2007/01/01(月) 07:10:35 ]
初めてプログラミングをやってみましたが本の通りに入力してもできません(涙)。
こんな事聞いたら馬鹿にされるかもしれませんが、これができなければ前に進めません…
ソースコードをコンパイルできません…何度やっても「javacはコマンドとして認識できません」とエラーが起きます。
Java2SDKの本を買って付属のCDROMよりインストールしたのですが、いったいどこが悪いのかわかりません。
ソースコードにはミスないはずなのにPCが壊れてるのかな?…すいませんわかる方教えてください

149 名前:デフォルトの名無しさん mailto:sage [2007/01/01(月) 13:46:06 ]
>>148
このスレッドはFORTRANという(恐らくキミが生まれるより以前から存在する)言語の
スレッドであって、Javaのスレッドではありません。適切なスレッドに映ってください。

一般的に、コンピュータは同じ事を繰り返すと同じ結果が得られます。
何も変更しないで同じ事を繰り返して、↓こういう結果になるのは極めて当然、当たり前。
> 「javacはコマンドとして認識できません」とエラーが起きます。

150 名前:デフォルトの名無しさん [2007/01/05(金) 21:11:49 ]
登山道がAからFまであるとする。

さいころX,Yを二つ振って、出た目の合計でその登山道を選ぶかどうか決定する。

出た目の合計が7以上であるならば、その登山道を登ることができる、とする。

それぞれの結果を、Aは**、Bは**というように表示し、

Aは8だから行ける、Bは5だから行けないと表示するプログラムを作りなさい。


こんなプログラムなんだが、まずサイコロをどう表現したらいいかわからない点、
次に、でた結果を全てAは**、Bは**というように表示すんのはいいんだけどさ、

行くか行かないかを判別するのって一個一個ifで分岐させてやらないかんの?

151 名前:デフォルトの名無しさん [2007/01/05(金) 21:19:44 ]
追加で書かせてもらうと、

if ( AからFの結果 >7) then
write文で表示する
else
データ破棄、


みたいな感じにしたいんだけど…
プログラム全然できなくて日本語はいりまくりですが…
 



152 名前:age [2007/01/05(金) 21:55:11 ]
おお!こんな奇跡のスレがあるとは…
まじヘルプお願いします。


        え-------------か
      /
    い
  /   \
あ       お-------------き
  \
      / 
    う -------------------く


上記のような図がある。
あ〜くはそれぞれ独立した乱数である。

あ〜くで、次の経路の距離は(例:あ−い間はあ・いの積を小数点第3位で四捨五入したもの
)とする。

終点までの全経路の距離の合計を表示し、(例:あ+い+え+か、あ+う+く etc)
もっとも合計距離が小さいものを選ぶプログラムを作りなさい。


なんか上のほうにも似たようなものたくさんあるけど、応用力がなさすぎて作れない…
助けてください…orz

153 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 05:53:37 ]
>>152
Fortranで挑戦、途中で挫折・・・
その後、rubyで作成しました。
あいうえおかきく→abcdefghと置き換えて
tree[]にabc...fghの値を入れると答えを見つけてくれます

#------------------------------
a=0; b=1; c=2; d=3; e=4; f=5; g=6; h=7;
null = nil
$ans = []

# a,b,c,d,e,f,g,h
tree=[1,2,3,4,5,6,7,8]

aa = [b,c]; bb = [e,d]
cc = [d,h]; dd = [g,null]
ee = [f,null]; ff = [f,null]
gg = [g,null]; hh = [h,null]

node = [aa,bb,cc,dd,ee,ff,gg,hh]

def len(tree,node,i,n)
tree[i]*tree[node[i][n]]
end

def path(x)
pair = ["a","b","c","d","e","f","g","h"]
pair[x]
end




154 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 05:54:24 ]
>>153

def get_ans(node,tree,i,n,sum,_path_)
_next = node[i][n]
if _next == i then
a = [[sum,_path_]]
$ans = $ans + a
elsif _next == nil
nil
else
x = len(tree,node,i,n)
for j in 0..1
get_ans(node,tree,_next,j,sum+x,_path_+path(_next))
end
end
end

# --- main ---
for i in 0..1
get_ans(node,tree,0,i,0,path(0))
end
p $ans.sort
# --- end main ---

#[[27, "ach"], [38, "abdg"], [42, "abef"], [43, "acdg"]]


155 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 20:59:33 ]
>>152
real function distance(path)
common /rval/ rval
real rval(10)
integer path(*), i

distance = 1.0
do i=1,1000
if (path(i) .lt. 1) then
distance = int((distance + 0.5) * 100) / 100.0
return
endif
distance = distance * rval(path(i))
enddo
write(*,*) 'internal error'
stop
end


156 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 21:00:26 ]
>>155
program f152
common /rval/ rval
real d(6), minimum
integer i, path(10,6)
data path /
+ 1,2,4,6,0,0,0,0,0,0, ! あいえか
+ 1,3,5,2,4,6,0,0,0,0, ! あうおいえか
+ 1,2,5,7,0,0,0,0,0,0, ! あいおき
+ 1,3,5,7,0,0,0,0,0,0, ! あうおき
+ 1,3,8,0,0,0,0,0,0,0, ! あうく
+ 1,2,5,3,8,0,0,0,0,0 ! あいおうく
+ /
real rval(10)
rval(1) = rand(1) ! seed
do i=1,10
rval(i) = rand(0) * 10
enddo
minimum = 3.40282347E+38
do i=1,6
d(i) = distance(path(1,i))
if(minimum .gt. d(i)) minimum = d(i)
write(*,'(i10,f10.3)') i,d(i)
enddo
write(*,'(a10,f10.3)') 'mininum :',minimum
stop
end

157 名前:デフォルトの名無しさん [2007/01/07(日) 17:59:33 ]
質問させてください.
Windowsのgfortranだとコンパイルも実行もできるソースが,
Linux版のgfortranではコンパイルは通るのに実行時に
  At line 91 of file LHDmake.f90
  fortran runtime error;Bad adress
となって止まってしまいます.

LHDmake.f90はMODULEで,その91行目は「WRITE(21,*) ''」という文(データを改行するため)
なのですが,なにがおかしいのでしょうか?

ちなみにUNIT=21は
「OPEN(UNIT=21,file='Result/plotLHD1_polygon.dat',status='unknown')」
です.

コンパイラのバージョンは
Win:gcc version 4.2.0 20060401 (experimental)
Linux:gcc version 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)
です

158 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 20:33:38 ]
>>157
こんなのがあった
ttp://gcc.gnu.org/ml/gcc-bugs/2006-01/msg00595.html


159 名前:デフォルトの名無しさん [2007/01/08(月) 16:12:05 ]
「0.360e-10」は0.360×(10の-10乗)ですよね。

eがなくて、「0.360+250」のように表示されるのは
どういう意味でしょうか?

160 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 16:51:03 ]
指数が3桁になって表示を切り詰めたんじゃないのかな?

161 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 19:14:02 ]
>>159
マニュアルでFORMAT文のところを嫁



162 名前:デフォルトの名無しさん [2007/01/09(火) 15:52:01 ]
すいません…どなたか150の回答お願いします…


163 名前:デフォルトの名無しさん [2007/01/09(火) 18:18:55 ]
課題で、

-4(V/x)^2*a^3-2*(V/x)^2*3a^2+λv3a^2+a{2-2*(V/x)^2+4λV}+1+λV=0

V=0.1、xは0.1-1.0、
未定乗数λ=1,2,…t適当に入れて決める
求めたいのがaなのですが、
3次方程式なのでまったくプログラムが解りません
お助けねがえないでしょうか?
フォートランのバージョンはFujitsu Fortran V4.0L10です。
知恵をおかしください。 

164 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 20:45:15 ]
>>162
program hoge
integer, parameter :: N=6; real :: X(N), Y(N); integer :: Z(N)
character(len=8) :: f(N) = "行けない"
call random_seed(); call random_number(X); call random_number(Y)
Z = int(X*6 + 1) + int(Y*6 + 1); where (Z >= 7) f = "行ける"
print "(1X,A,A,I2,A,A)",(char(ichar("A")+i-1),"は",Z(i),"だから",f(i),i=1,N)
end program hoge

165 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 23:29:07 ]
>>163
安直にはニュートン法でとくべし。

1個は必ず実の解がある。残りはたとえば2次方程式として公式で。


166 名前:デフォルトの名無しさん [2007/01/10(水) 00:10:01 ]
fortran77 でのプログラム作成なんですが、

x=1でのf(x)=exp(x)の一次微係数を2点微分方と4点微分法を用いて、
hを0.1から0.01ずつ掛けながら数値微分するプログラムを作れ。
hは10^(ー15)まで変化させ各hでの値と厳密値とを比較せよ。

f(1)(x)を一次微係数を表す式としますと

2点微分法は

f(1)(x)=(f(x+h)-f(x))/2h

4点微分法は

f(1)(x)=(8f(x+h)-f(x+2h)-8f(x-h)+f(x-2h))/12h

で表されています。

どなたか分かる方お願いします。

167 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 02:31:47 ]
double precision f,dx2,dx4,h,x
integer i
f(x) = exp(x)
dx2(h,x) = (f(x+h)-f(x)) / (2*h)
dx4(h,x) = (8*f(x+h)-f(x+2*h)-8*f(x-h)+f(x-2*h)) / (12*h)
x = 1.0
write(*,*) 'exp(1) = ', exp(1.0D0)
do 10 i=1, 15, 2
h = 0.1D0 * 10.0D0**(1-i)
write(*,*) h, dx2(h,x), dx4(h,x)
10 continue
end


168 名前:デフォルトの名無しさん [2007/01/10(水) 15:35:09 ]
>>165
ニュートン法は使ってはいけない
ということなので、
他の方法はないのでしょうか?

169 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 17:00:29 ]
>>168
つ ニュートンラプソン法

170 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 17:26:19 ]
三次方程式なら普通に代数的解法があるんだからそれを使えばいいんじゃね?

171 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 04:54:06 ]
   REAL*8 FM(6),X(6),H,T,TI,TF
   WRITE(*,201)
 201 FORMAT(' ',5X,'T',9X,'X',11X,'Y',11X,'U',11X,'V')
   OPEN(8,FILE='b:alinda.dat')
CALL ICOND(N,TI,TF,H,X)
DO 20 T=TI,TF,H
WRITE(*,'('' '',F8.1,4F12.7)')T,(X(I),I=1,N)
WRITE(8,'(2F10.5)')X(1),X(2)
CALL RUNGE(N,H,T,X,FM)
DO 30 I=1,N
30 X(I) = X(I) + FM(I)*H
20 CONTINUE
CLOSE(8)
END


上記のプログラムで、理解できないところがありまして。
>WRITE(*,'('' '',F8.1,4F12.7)')T,(X(I),I=1,N)
ここの括弧内なのですが、[4F12.7]は4回実数を繰り返し表示する、という意味であっているのでしょうか?
あと、Tが何のためにあるのかがわかりません。



172 名前:デフォルトの名無しさん [2007/01/12(金) 12:26:52 ]
退職金1000万を源資とし、毎年100万ずつ引き出して使用した場合
預金が無くなるまでの毎年の元利合計を計算するプログラムを作れ
なお、年利率が0.1%、1%、5%の3種類について計算を実行して
預金が無くなるまでの年数を比較しなさい
(預け入れ時点では引き出さず、1年後から引き出すものとする)

という課題が出たのですが、分らなくて困っています。
教えて下さい。

173 名前:デフォルトの名無しさん [2007/01/12(金) 12:50:45 ]
program report11_2
implicit none
integer :: a(3),n,i,j,b
real :: r(3)

read(*,*) a(1)
do i=2,3
a(i)=a(1)
end do
do i=1,3
read(*,*) r(i)
end do
read(*,*) n

b=100.0
do i=2,n
do j=1,3
a(j)=a(j)+a(j)*r(j)/100.0-b
end do
write(*,*) i,(int(a(j)),j=1,3)
end do

stop
end program report11_2

ここまでやってみました。

174 名前:デフォルトの名無しさん [2007/01/12(金) 13:00:11 ]
n原子分子を構成する各原子の質量Miと座標(Xi、Yi、Zi)を読み込み、
質量中心を計算するプログラムを作れ。

っていう問題なんですが、どのようにすればいいでしょうか?
If文とDo文と配列を使わないといけないのですが・・・。
よろしくお願いします。

175 名前:デフォルトの名無しさん [2007/01/12(金) 23:51:10 ]
三つの数値データを与えてその三つの数値の最大値、最小値、中央値、
平均値、標準偏差、不偏分散を求められるプログラムを作成せよ。
という問題が出されてわからなくて大変です。
お願いします

176 名前:デフォルトの名無しさん [2007/01/13(土) 00:48:37 ]
超素人な俺が考えてみた
 PROGRAM DISTS
C
C
C
real x,y,z,max,min,mid,hyoujun,heikin,wa
print *,'enter x,y,z
read x,y,z
wa=x+y+z
***heikinti***
heikin=wa/3
print *,'heikin=wa/3
***max***
if (x .gt. y) .and. (x .gt. z)
print *,'max=x
elseif (y .gt. x) .and. (y .gt. z)
print *,'max=y
elseif (z .gt. y) .and. (z .gt. x)
print *,'max=z
endif
***min***
if (x .gt. z) .and. (y .gt. z)
print *,'min=z
elseif (y .gt. x) .and. (z .gt. x)
print *,'max=x
elseif (z .gt. y) .and. (x .gt. y)
print *,'max=y
endif
***mid***

177 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 01:06:20 ]
>>175
program hage
real :: a(3),b,c(1),d(3)=3;read *,a
c=maxloc(a);d(int(c(1)))=0;print *,maxval(a)
c=minloc(a);d(int(c(1)))=0;print *,minval(a)
print *,pack(a,d>1);b=sum(a)/3;print *,b
print *,sqrt(sum((a-b)**2)/3);print *,sum((a-b)**2)/2
end program hage


178 名前:デフォルトの名無しさん [2007/01/13(土) 01:46:19 ]
177を初心者向けのプログラムに出来ませんか?

179 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 07:47:54 ]
>>178
十分初心者向け

180 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 11:55:23 ]
>>178 >>177は筋が悪い、学んでもかえって馬鹿になるからやめとけ。


181 名前:デフォルトの名無しさん [2007/01/13(土) 12:53:05 ]
fortran90の課題なのですが、分からなくて困っています。
どなたか優しい方、よろしくお願いします。

数字1.2.・・・.nを様々な順序に並べたものを置換という。
例えば、1.2.3の置換は次の6通りである。
(1.2.3)(1.3.2)(2.1.3)(2.3.1)(3.1.2)(3.2.1)
1.2.・・・.nの置換はn!通り存在するが、これらを全て重複なくリストアップする
プログラムを作れ。

というものです。



182 名前:181 [2007/01/13(土) 13:08:34 ]
追加です。

nはデータとして読み込むものとする。

ってのを忘れてました。
よろしくお願いします。

183 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 13:23:09 ]
順列 再帰 でググるといいかも






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<350KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef