プチコンまとめWiki (初代/mkII)

投稿プログラム : 真理値表作成ソフト

2012年01月29日投稿 / タグ : 投稿プログラム QRコード

概要

論理式を入力すると真理値表、加法標準形と乗法標準形を出力するプログラムです。
十字キーの下で真理値表をスクロールしますが、ゆっくり表示させたい場合はBボタンでどうぞ。

論理式の文法

中置記法なので、逆ポーランド記法で入力する必要はありません。
演算子は+がOR、^がXOR、*がAND、!がNOTに対応しており、変数名には大文字アルファベットと数字が使用出来ます。
(ただし、変数名の最初の文字に数字は使えません。)
真は1、偽は0に対応しており、式の中で使用することも可能です。

演算子の優先順位

() > ! > * > ^ > +
!は右結合、それ以外は左結合

スクリーンショット・動画

スクリーンショットや動画はありません。

QRコード

truth.png

プログラムリスト

  1. ’ショキカ
  2. CLEAR
  3. DIM POW2(16)
  4. POW2(0)=1
  5. FOR I=1 TO 15
  6.  POW2(I)=2*POW2(I−1)
  7. NEXT
  8. ’ニュウリョク カノウモシ゛
  9. ALP$=”ABCDEFGHIJKLMNOPQRSTUVWXYZ”
  10. VARCHR$=ALP$+”0123456789”
  11. INPUT”ロンリシキ”;EXPR$
  12. ’ヘンスウシ゛ョウホウ
  13. DIM VAR$(16)
  14. FOR P=0 TO LEN(EXPR$)−1
  15.  FOR I=1 TO 1
  16.   I=INSTR(ALP$,MID$(EXPR$,P,1))+1
  17.   P=P+1
  18.  NEXT
  19.  P=P−1
  20.  GOSUB @GETN
  21.  J=N
  22.  FOR I=0 TO N
  23.   IF S$==VAR$(I) THEN J=I:N=N−1
  24.  NEXT
  25.  VAR$(J)=S$
  26.  N=N+1
  27. NEXT
  28. SORT 0,N,VAR$
  29. ’ヘンスウノ ヒョウカチ
  30. L=POW2((ABS(N−4)+N−4)/2)
  31. DIM TBL(N,L),STK(128,L)
  32. FOR I=0 TO 3
  33.  IF I<N THEN READ TBL(I,0)
  34.  FOR J=1 TO L−1
  35.   TBL(I,J)=TBL(I,0)
  36.  NEXT
  37. NEXT
  38. FOR I=4 TO N−1
  39.  FOR J=0 TO L−1
  40.   Q=J AND POW2(I−4)
  41.   TBL(I,J)=(Q==0)−1
  42.  NEXT
  43. NEXT
  44. P=0
  45. GOSUB @EVAL
  46. ’ヘンスウメイノ ヒョウシ゛
  47. FOR I=1 TO N
  48.  PRINT VAR$(N−I);” ”;
  49. NEXT
  50. PRINT”│”
  51. ’シ゛クノヒョウシ゛
  52. FOR I=0 TO N−1
  53.  FOR J=0 TO LEN(VAR$(I))
  54.   PRINT”─”;
  55.  NEXT
  56. NEXT
  57. PRINT”┼──”
  58. ’シンリチヒョウノ ヒョウシ゛
  59. FOR I=0 TO POW2(N)−1
  60.  FOR J=1 TO N
  61.   PRINT(POW2(N−J)AND I)!=0;
  62.   FOR K=1 TO LEN(VAR$(N−J))
  63.    PRINT” ”;
  64.   NEXT
  65.  NEXT
  66.  Q=STK(SP,I/16)AND POW2(I%16)
  67.  PRINT”│”;Q!=0
  68.  FOR J=0 TO 1
  69.   J=2AND BUTTON()
  70.   IF 32AND NOT BUTTON() THEN WAIT 5
  71.  NEXT
  72. NEXT
  73. ’カホウヒョウシ゛ュンケイノ ヒョウシ゛
  74. FIRST=TRUE
  75. FOR I=0 TO POW2(N)−1
  76.  FOR J=NOT STK(SP,I/16)AND POW2(I%16) TO 0
  77.   IF FIRST==FALSE THEN PRINT ”+”;
  78.   FIRST=FALSE
  79.   FOR J=0 TO N−1
  80.    IF NOT I AND POW2(J) THEN PRINT”!”;
  81.    PRINT VAR$(J);
  82.    IF J!=N−1 THEN PRINT”*”;
  83.   NEXT
  84.  NEXT
  85. NEXT
  86. PRINT””
  87. ’シ゛ョウホウヒョウシ゛ュンケイノ ヒョウシ゛
  88. FIRST=TRUE
  89. FOR I=0 TO POW2(N)−1
  90.  FOR J=STK(SP,I/16)AND POW2(I%16) TO 0
  91.   IF FIRST==FALSE THEN PRINT ”*”;
  92.   FIRST=FALSE
  93.   PRINT”(”;
  94.   FOR J=0 TO N−1
  95.    IF I AND POW2(J) THEN PRINT”!”;
  96.    PRINT VAR$(J);
  97.    IF J!=N−1 THEN PRINT”+”;
  98.   NEXT
  99.   PRINT”)”;
  100.  NEXT
  101. NEXT
  102. END
  103. DATA &HAAAA,&HCCCC,&HF0F0,&HFF00
  104. ’−−−ORエンサ゛ン
  105. @EVAL
  106.  SP=SP+1
  107.  GOSUB @LOW
  108.  @ORLOOP
  109.   GOSUB @FACT1
  110.   FOR I=0 TO L−1
  111.    STK(SP−1,I)=STK(SP−1,I)OR STK(SP,I)
  112.   NEXT
  113.   C$=MID$(EXPR$,P,1)
  114.   IF C$==”+” THEN P=P+1:GOTO @ORLOOP
  115.  SP=SP−1
  116.  RETURN
  117. ’−−−XORエンサ゛ン
  118. @FACT1
  119.  SP=SP+1
  120.  GOSUB @LOW
  121.  @XORLOOP
  122.   GOSUB @FACT2
  123.   FOR I=0 TO L−1
  124.    STK(SP−1,I)=STK(SP−1,I)XOR STK(SP,I)
  125.   NEXT
  126.   C$=MID$(EXPR$,P,1)
  127.   IF C$==”^” THEN P=P+1:GOTO @XORLOOP
  128.  SP=SP−1
  129.  RETURN
  130. ’−−−ANDエンサ゛ン
  131. @FACT2
  132.  SP=SP+1
  133.  GOSUB @HIGH
  134.  @ANDLOOP
  135.   GOSUB @TERM
  136.   FOR I=0 TO L−1
  137.    STK(SP−1,I)=STK(SP−1,I)AND STK(SP,I)
  138.   NEXT
  139.   C$=MID$(EXPR$,P,1)
  140.   IF C$==”*” THEN P=P+1:GOTO @ANDLOOP
  141.  SP=SP−1
  142.  RETURN
  143. ’−−−ニコウエンサ゛ンシイカ゛イ
  144. @TERM
  145.  SP=SP+1
  146.  GOSUB @SKIP
  147.  ’ヘンスウノヒョウカ
  148.  FOR I=!(INSTR(ALP$,MID$(EXPR$,P,1))+1) TO 0
  149.   GOSUB @GETN
  150.   FOR I=0 TO N−1
  151.    IF VAR$(I)==S$ THEN J=I
  152.   NEXT
  153.   FOR I=0 TO L−1
  154.    STK(SP−1,I)=TBL(J,I)
  155.   NEXT
  156.  NEXT
  157.  ’NOTエンサ゛ン
  158.  FOR I=C$!=”!” TO 0
  159.   P=P+1
  160.   GOSUB @TERM
  161.   FOR I=0 TO L−1
  162.    STK(SP−1,I)=NOT STK(SP,I)
  163.   NEXT
  164.  NEXT
  165.  IF C$==”0” THEN P=P+1:GOSUB @LOW
  166.  IF C$==”1” THEN P=P+1:GOSUB @HIGH
  167.  ’カッコノヒョウカ
  168.  FOR I=C$!=”(” TO 0
  169.   P=P+1
  170.   SP=SP−1
  171.   GOSUB @EVAL
  172.   SP=SP+1
  173.   P=P+1
  174.  NEXT
  175.  GOSUB @SKIP
  176.  SP=SP−1
  177.  RETURN
  178. ’−−−ヘンスウメイノ シュトク
  179. @GETN
  180.  Q=P
  181.  FOR I=1 TO 1
  182.   C$=MID$(EXPR$,P,1)
  183.   FOR J=!(INSTR(VARCHR$,C$)+1)OR C$==”” TO 0
  184.    P=P+1
  185.    I=0
  186.   NEXT
  187.  NEXT
  188.  S$=MID$(EXPR$,Q,P−Q)
  189.  RETURN
  190.  
  191. ’−−−スヘ゛テノケタニ1
  192. @HIGH
  193.  FOR I=0 TO L−1
  194.   STK(SP−1,I)=−1
  195.  NEXT
  196.  RETURN
  197. ’−−−スヘ゛テノケタニ0
  198. @LOW
  199.  FOR I=0 TO L−1
  200.   STK(SP−1,I)=0
  201.  NEXT
  202.  RETURN
  203. ’−−−クウハクヲ トハ゛ス
  204. @SKIP
  205.  C$=MID$(EXPR$,P,1)
  206.  IF C$==” ” THEN P=P+1:GOTO @SKIP
  207.  RETURN

CHECKER FLAG (ひとことコメント)

この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)

  • 名無しさん : 式全体を()でくくらないと@GETNが無限ループになるようです。 (2012/02/04 (土) 22:35:28)
  • 投稿者 : 修正しました。ご指摘ありがとうございます。 (2012/02/09 (木) 15:10:49)
  • @わぁいさんへ : SPSETで管理0が管理1にふれたらきえるのどうやるの (2012/02/10 (金) 11:26:37)
  • @わぁいさんへ : SPSETで管理0が管理1にふれたらきえるのどうやるの (2012/02/10 (金) 11:26:38)
  • RND 128 : ↑ IF ABS(X(0)-X(1))>16 AND ABS(Y(0)-Y(1))>16 THEN X(0)=-256 (2012/02/10 (金) 11:39:14)
  • RND 128 : 質問に関してはOFコーナーやプチコン掲示板でどうぞ。 (2012/02/10 (金) 11:42:57)
  • RND 128 : ↑↑>じゃなくて<=でした、すいません。 (2012/02/10 (金) 12:18:40)
  • 投稿者 : リダイレクトとdiffが欲しいです・・・ (2012/06/17 (日) 17:49:52)

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.053 秒 | このページの最終更新 : 2012/09/07 (金) 20:31:01 (2621d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30