流れ図(フローチャート)を描く 山中和義 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回)