2002年3月26日 アップロード
  関谷ビル トップページへ 関谷のKPCページへ 戻る(紀要本文ページへ) 作者へのメッセージ

ISM 階層計算(隣接リストによる) TOPO2.BAS

10010 ' TOPO2.BAS: ISM 階層計算(隣接リストによる)
10011 ' 91.6.29 北九州職業訓練短大  情報処理科 関谷順太
10012 '    8.01 LOOPの処理
10013 '   12.28 コメントの追加,出力の変更
10018 ' 参考図書 L.Ammeraal著/小山裕徳訳,C−データ構造とプログラム,pp.213-232,オーム社,1990
10020 ' 要素数<=60, 入次数・出次数<=10, 階層<=30, ループは 2要素のみ
10030 defint A-Z :LPSW=0
10040 dim NYUJI(60),SYUTUJI(60),KOUZOKU(60,10), SENKO(60,10),KAISO(30,10),NK(30)  ,SYUTU(60),KOUZ(60,10)
10050 '
10060 cls
10070 input "ファイル名:";INPFN$ '      入力ファイル名の入力
10080 if INPFN$ <>"" then goto 10230'    ヌル(すぐのリターンキー)なら、キーイン
10090 input "モデル名,要素数 N";MD$,N : if N>60 then print using " N:## > 60 ";N: goto 10090
10100 input "I,J(IからJ)";I,J: print using"##から##";I,J: if I=0 and J=0 then goto 10150
10110 if I>N or J>N then print using"I:##, J:## > N:## ";I,J,N :goto 10100
10118 if SYUTUJI(I)>9 then print using"##の出次数が10を超えます。";I: end
10120 SYUTUJI(I)=SYUTUJI(I)+1:KOUZOKU(I,SYUTUJI(I))=J
10128 if NYUJI(J)>9 then print using"##の入次数が10を超えます。";J: end
10130 NYUJI(J)=NYUJI(J)+1:SENKO(J,NYUJI(J))=I
10140 goto 10100
10150 input "保存するファイル名:";SAVEFN$
10160 if SAVEFN$ ="" then goto 10330
10170 open SAVEFN$ for output as #1     'ファイルへのデータ保存
10180 print #1,using " @ , ##"; MD$, N
10190 for I=1 to N: if SYUTUJI(I)=0 then goto 10210
10200   for J=1 to SYUTUJI(I): print #1,using "## ##";I,KOUZOKU(I,J): next J
10210 next I:  print #1,"0 0"
10220 close #1: goto 10330
10230 open INPFN$ for input as #1       'ファイルからのデータ入力
10240 input #1,MD$,N: if N>60 then print using " N:## > 60 ";N: goto 10070
10250 input #1,I,J: if I=0 and J=0 then goto 10300
10260 if I>N or J>N then print using"I:##, J:## > N:## ";I,J,N :goto 10250
10270 SYUTUJI(I)=SYUTUJI(I)+1:KOUZOKU(I,SYUTUJI(I))=J
10280 NYUJI(J)=NYUJI(J)+1:SENKO(J,NYUJI(J))=I
10290 goto 10250
10300 close #1
10310 '                                 隣接リストの表示
10320 print using"【隣接リストによる階層計算】@";date$
10330 print using"ファイル名:@ ";INPFN$
10340 print using"[@] 要素数:##  @";MD$,N,time$: print "   隣接リスト":  print " I(前提,要因) [入次数][出次数] J(後,結果)"
10350 if LPSW then lprint using"【隣接リストによる階層計算】@";date$
10360 if LPSW then lprint using"ファイル名:@ ";INPFN$
10370 if LPSW then lprint using"[@] 要素数:##  @";MD$,N,time$:lprint "   隣接リスト": lprint " I(前提,要因) [入次数][出次数] J(後,結果)"
10380 for I=1 to N: print using "  ## ";I;
10390   if LPSW then lprint using "  ## ";I;
10400   print using " [##][##]";NYUJI(I),SYUTUJI(I);
10410   if LPSW then lprint using " [##][##]";NYUJI(I),SYUTUJI(I);
10420   for J=1 to SYUTUJI(I): print using " ##";KOUZOKU(I,J);: next J:print
10430   if LPSW then for J=1 to SYUTUJI(I):lprint using " ##";KOUZOKU(I,J);: next J:lprint
10440 next I
10450 for I=1 to N: SYUTU(I)=SYUTUJI(I): for J=1 to SYUTU(I): KOUZ(I,J)=KOUZOKU(I,J): next J: next I
10460 NI=N : K=0 '                     TOPOLOGICAL SORT
10470 for KL=1 to 30 '                 階層分けのループ
10480  KF=0: if NI<=0 goto 10680
10490  for II=1 to N :if SYUTU(II)<0 then goto 10510'    出次数=0を見つける
10500   if SYUTU(II)=0 then NK(KL)=NK(KL)+1:KAISO(KL,NK(KL))=II:KF=1:SYUTU(II)=-1
10510  next II
10520  if KF=1 goto 10590'                               閉路でないので、削除へ
10530  for II=1 to N :if SYUTU(II)<0 then goto 10560'    閉路の探索(2要素のみ)
10540   if SYUTU(II)>1 then goto 10560
10550   JJ=KOUZ(II,1):if KOUZ(JJ,1)=II then NK(KL)=NK(KL)+1: KAISO(KL,NK(KL))=II:KF=1: SYUTU(II)=-1: NK(KL)=NK(KL)+1:KAISO(KL,NK(KL))=JJ:SYUTU(JJ)=-1
10560  next II
10570  if KF=1 goto 10590
10580  print "LOOP": end '                              閉路が2要素を越える。
10590  for JJ=1 to NK(KL): J=KAISO(KL,JJ)'              高いレベルの要素の削除
10600   for II=1 to NYUJI(J)
10610    I=SENKO(J,II): SYUTU(I)=SYUTU(I)-1
10620    for IJ=1 to SYUTU(I): if KOUZ(I,IJ)=J then for JI=IJ to SYUTU(I):KOUZ(I,JI)=KOUZ(I,JI+1): next JI
10630    next IJ
10640   next II
10650  next JJ
10660  NI=NI-NK(KL)
10670 next KL
10680 KL=KL-1'                                          階層の出力
10690 print: print using"[@] 階層データ表  @";MD$,time$: print "レベル:要素群"
10700 if LPSW then lprint:lprint using"[@] 階層データ表  @";MD$,time$:lprint "レベル:要素群"
10710 for K=1 to KL
10720  print using"  ##  :";K;: for I=1 to NK(K): print using" ##";KAISO(K,I);: next I:print
10730  if LPSW then lprint using"  ##  :";K;: for I=1 to NK(K):lprint using" ##";KAISO(K,I);: next I:lprint
10740 next K