新しく発言する  EXIT  インデックスへ
流れ図(フローチャート)を描く

  流れ図(フローチャート)を描く 山中和義 2008/01/09 16:18:14  (修正1回)
  つづき 山中和義 2008/01/09 16:20:23  (修正1回)
   └流れ図でアルゴリズムを検証する。2008.1.1... 山中和義 2008/01/10 12:53:57  (修正4回)
    ├つづき 山中和義 2008/01/10 12:55:58  (修正4回)
    ├つづき2 山中和義 2008/01/10 13:01:14  (修正4回)

Re: 流れ図でアルゴリズムを検証する。2008.1.1...  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/01/10 13:01:14 ** この記事は4回修正されてます
つづき2

SUB CodeGen(n,d1$,d2$,s$,c$) !流れ図記号に対応するコードを生成する
PRINT 100*x+y !行番号(ラベル)

SELECT CASE n !命令文
CASE 1 !端子
CALL CodeComment(c$)
IF POS(s$,"開始")>0 THEN
ELSEIF POS(s$,"終了")>0 THEN
PRINT "STOP"
ELSEIF POS(s$,"戻る")>0 THEN
PRINT "RETURN"
ELSE !関数、手続き
CALL CodeParm(parm$(s$),1) !引数
END IF
CASE 2 !結合子
IF d1$="" THEN PRINT "GOTO";JMP(VAL(s$));"!";c$ !出口なら
CASE 3 !処理
PRINT "LET ";var$(s$);"=";expr$(s$);
CALL CodeComment(c$)
CASE 4 !定義済み処理
CALL CodeParm(parm$(s$),0) !引数を展開する
FOR ii=1 TO w !関数の先頭を探す
LET jj=1 !!!FOR jj=1 TO h
DO UNTIL jj>h !!!
IF NAM$(ii+w*jj)=fnc$(s$) THEN
PRINT "GOSUB";100*ii+jj;
CALL CodeComment(c$)
EXIT FOR !!!
END IF
LET jj=jj+1 !!!NEXT jj
LOOP !!!
NEXT ii
IF POS(s$,"→")>0 THEN PRINT "LET ";var$(s$);"=";fnc$(s$) !関数なら、戻り値を設定
CASE 5 !判断
PRINT "IF NOT(";exprL$(s$);op$(d1$);exprR$(s$);") THEN ";
CALL CodeJump(VAL(d2$(1:1))) !「判断」は矢印が2本!
CASE 6 !繰り返しの開始
LET d2=VAL(d2$)
IF s$<>"" THEN !前判定
PRINT "IF ";s$;" THEN GOTO";10000+LBL(d2)
ELSE !後判定
IF LBL(d2)>0 THEN PRINT 10000+LBL(d2) !無条件は負
END IF
CASE 7 !繰り返しの終了
LET d2=VAL(d2$)
IF s$="" THEN !前判定
PRINT "GOTO";ABS(LBL(d2)) !無条件は負
PRINT 10000+ABS(LBL(d2))
ELSE !後判定
PRINT "IF NOT(";s$;") THEN GOTO";10000+LBL(d2)
END IF
CASE 8 !手操作入力
PRINT "INPUT PROMPT ";ToString$(c$);": ";s$
CASE 9 !表示
PRINT "PRINT ";ToString$(c$);"; ";s$
CASE 10 !入出力
PRINT "READ ";s$
PRINT "DATA ";c$

CASE 13 !NOP、結線
PRINT "!NOP"
CASE 16 !繰り返しの開始(FOR)
CALL CodeParm(parm2$(s$),0) !引数
PRINT "PARM2_";var2$(s$);"=PARM2"
PRINT "PARM3_";var2$(s$);"=PARM3"
PRINT var2$(s$);"=PARM1" !始値
PRINT "GOTO";20000+100*x+y
PRINT 30000+100*x+y
PRINT var2$(s$);"=";var2$(s$);"+PARM3_";var2$(s$) !+増分
PRINT 20000+100*x+y
LET d2=VAL(d2$) !DO UNTIL型へ
PRINT "IF (";var2$(s$);"-PARM2_";var2$(s$);")*SGN(PARM3_";var2$(s$);")>0 THEN GOTO";10000+LBL(d2)
CASE 17 !繰り返しの終了(NEXT)
LET d2=VAL(d2$)
PRINT "GOTO ";30000+ABS(LBL(d2)) !LOOP型へ
PRINT 10000+ABS(LBL(d2))
CASE 23 !準備
PRINT s$;
CALL CodeComment(c$)

CASE ELSE
END SELECT

IF d1$<>"" THEN CALL CodeJump(VAL(d1$(1:1))) !次の処理へ
END SUB

    ├つづき3 山中和義 2008/01/11 21:06:32  (修正2回)
    └つづき4 山中和義 2008/01/13 20:10:24  (修正1回)
     └サンプル(右から左へ受け流す〜♪) 山中和義 2008/01/13 20:18:23  (修正1回)
      └高校数学「数値計算とコンピュータ」 山中和義 2008/01/22 20:37:31  (修正1回)

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。