10秒目をつむったら…

はじめまして。
初歩的な質問でごめんさい。

今次のようなデータがあります。
  (1)   (2)
1156605004 11514
1156605004 01543
1157605004 11514
1121405601 01111
1121405601 04184

これより出力を(1)が同じものの中にいくつ違う(2)があるのかカウントしたいのですがなぜだか出来ません。誰か教えてもらえないでしょうか?
出力はこのようにしたいのです。
1157605004 02
1121405601 02
としたいのです。

ちなみに私が作ったプログラムは、

INTEGER i,j,k,ii,jj
PARAMETER (numdis=9000000,namer=20)
INTEGER DAT1,DAT2,DAT3

DIMENSION NKOTU(numdis,namer),NUMR(numdis)

do 2 i=1,numdis
NUMR(i)=0
do 1 j=1,namer
NKOTU(i,j)=0
1 CONTINUE
2 CONTINUE

14 READ(11,5001,END=15) DAT1,DAT2,DAT3
5001 FORMAT(I10,1X,I5,1X,I2)
NKOTU(DAT1,DAT3)= 1
GOTO 14
15 CONTINUE

do 3 ii=100000,numdis
do 4 k=1,namer
If (NKOTU(ii,k).EQ.1) NUMR(ii)=NUMR(ii)+1
If (NKOTU(ii,k).EQ.1) WRITE(21,6004) NUMR(ii),KOTU(ii,k)
4 CONTINUE
3 CONTINUE

do 5 jj=100000,numdis
If (NUMR(jj).GE.1) WRITE(21,6004) jj, NUMR(jj)
5 CONTINUE

6004 FORMAT(I10,1X,I5)

STOP
END

配列が大きすぎるのでしょうか?
こんな初歩的な質問で申し訳ないのですが
誰か教えてください、よろしくお願いします。

A 回答 (2件)

> 14 READ(11,5001,END=15) DAT1,DAT2,DAT3


なぜDAT3まであるのでしょう?
質問文によるとデータは2つずつのはずですが?

> NKOTU(DAT1,DAT3)= 1
DAT2はどこで使うのでしょう?
DAT3を質問文の2つ目の要素としても、軽くnamerの値を超えていますし。

> If (NKOTU(ii,k).EQ.1) WRITE(21,6004) NUMR(ii),KOTU(ii,k)
単純なタイプミスなんでしょうけど、
KOTU(ii,k)→NKOTU(ii,k)
ですね。

プログラムを見る限り少々の手直しで目的の動作をするとは思えないです。
フローチャートを書くなりして、アルゴリズムを整理してみてはいかがですか?

ちなみに私のメモリが256MBしかないWin機では、このプログラムは重過ぎてまともに動かせませんでした。
INTEGERを32bitとした場合、GBクラスのメモリを要求してきますね。
    • good
    • 0

気になったので質問文のプログラムももう一度試してみました。


DAT2を無視して、DAT3の中身を(2)とした場合(5001のフォーマットを見るとDAT2の方に思えますが)、一応このプログラムでも動くようです。
うまく動かない原因は配列のサイズが小さ過ぎることでした。
ただその場合はnamerの値も5桁にしないといけないので、メモリを大量に載せた(namerの値によりますがTB単位で必要になってくるはず)ワークステーションとかでないとまともに動かせないでしょうね。
私はデータの方を2桁に落として試してみました。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!