数式パズル - しばっち
2025/09/14 (Sun) 07:33:53
数式パズル
実行すると下記のような問題をファイルに出力します。
数字の間にプラス(+)かマイナス(-)を入れて
数式を完成させるパズルです。
※テキストエディタで開くか印刷してから利用してください。
問題
8 6 8 9 = 1
6 6 9 7 = 10
1 4 8 6 = 7
4 9 2 8 = 1
3 6 5 8 = 12
RANDOMIZE
LET N=4 ! 項数
DIM NUM(N),SIGN(N)
OPEN #1:NAME "数式パズル問題.txt"
OPEN #2:NAME "数式パズル解答.txt"
ERASE #1
ERASE #2
FOR J=1 TO 20 ! 問題数
DO
LET SUM=0
FOR I=1 TO N
LET NUM(I)=INT(RND*9+1)
IF I=1 THEN
LET SIGN(1)=1 ! 先頭はプラス
ELSE
LET SIGN(I)=(-1)^INT(2*RND)
END IF
LET SUM=SUM+NUM(I)*SIGN(I)
NEXT I
LOOP WHILE SUM<0 OR SUM>20 ! 0~20迄の範囲
FOR I=1 TO N
PRINT #1:NUM(I);
NEXT I
PRINT #1:"=";SUM
FOR I=1 TO N
LET S=SIGN(I)
IF I>1 THEN
IF S>0 THEN PRINT #2:"+"; ELSE PRINT #2:"-";
END IF
PRINT #2:NUM(I);
NEXT I
PRINT #2:"=";SUM
NEXT J
CLOSE #1
CLOSE #2
END
解答
8 - 6 + 8 - 9 = 1
6 + 6 - 9 + 7 = 10
1 + 4 + 8 - 6 = 7
4 - 9 - 2 + 8 = 1
3 + 6 - 5 + 8 = 12
------------------------------------------------------------------------------
DLLによるパーサー(数式解析器)を利用して
足し算と引き算に掛け算と割り算にかっこも使用した
問題をファイルに出力します。
プログラムが手抜きなので表記のおかしなところもありますが
難易度は格段に上がるかと思います。
更に(%)剰余、(^)ペキ乗、(&)and演算、(|)or演算も追加できます。
問題
7 6 7 1 = 1
10 6 10 5 = 15
9 4 2 10 = 1
4 5 4 4 = 1
9 1 5 2 = 9
2 6 6 8 = 1
2 5 5 2 = 2
1 1 3 3 = 13
4 7 5 4 = 0
1 3 7 9 = 1
VC++2022でコンパイルしました。
下記からダウンロードしてください。parser.zip
https://106.gigafile.nu/1113-b721e75329147bc93b924352188c2f121
ダウンロード期限:2025年11月13日(木)
ダウンロードパス:設定していません
ヘッダーライブラリーです。(インクルードするだけで使えます)
下記からダウンロードしてこの下にあるcppソースからコンパイルできます。
https://www.partow.net/programming/exprtk/index.html#downloads
https://github.com/ArashPartow/exprtk/tree/master
RANDOMIZE
LET N=4
DIM TERM$(N),NUM$(N),K$(N),KK$(N)
LET A$="+-*/"
! A$="+-*/%^&|"
OPEN #1:NAME "数式パズル問題.txt"
OPEN #2:NAME "数式パズル解答.txt"
ERASE #1
ERASE #2
FOR J=1 TO 50
DO
DO
IF RND<.5 THEN
MAT KK$=NUL$
DO
MAT K$=NUL$
LET P1=INT(RND*N+1)
LET K$(P1)="("
LET P2=INT(RND*N+1)
LOOP WHILE P1>=P2
LET KK$(P2)=")"
END IF
LET ER=0
FOR I=1 TO N
LET P=INT(RND*LEN(A$)+1)
LET TERM$(I)=A$(P:P)
IF TERM$(I)="^" AND ER=0 THEN LET ER=1
LET NUM$(I)=STR$(INT(10*RND+1))
NEXT I
LOOP UNTIL ER=0
LET FORMULA$=""
LET F$=""
FOR I=1 TO N-1
LET FORMULA$=FORMULA$&K$(I)&NUM$(I)&KK$(I)&TERM$(I)
LET F$=F$&NUM$(I)&" "
NEXT I
LET FORMULA$=FORMULA$&NUM$(N)
LET F$=F$&NUM$(I)
CALL PARSER(FORMULA$,ANS,ERR)
LOOP UNTIL ERR=0 AND ANS>=0 AND ANS<=100 AND FP(ANS)=0
PRINT #2:FORMULA$;" =";ANS
PRINT #1:F$;" =";ANS
NEXT J
CLOSE #1
CLOSE #2
END
EXTERNAL SUB PARSER(X$,ANS,ERR)
OPTION CHARACTER BYTE
LET ERR$=REPEAT$(" ",4)
IF X$="" THEN
LET ERR=1
LET ANS=0
EXIT SUB
END IF
LET ANS=PARSER16(LCASE$(X$),ERR$)
LET ERR=INT32(ERR$)
FUNCTION PARSER16(X$,ERR$)
ASSIGN ".\DLL\parser-exprtk.dll","parser16",FPU
END FUNCTION
END SUB
EXTERNAL FUNCTION INT32(S$)
OPTION CHARACTER BYTE
FOR I=1 TO 4
LET N=N+256^(I-1)*ORD(S$(I:I))
NEXT I
LET INT32=MOD(N+2^31,2^32)-2^31
END FUNCTION
------------------------------------------------------------------------------
parser-exprtk.cpp
#include <cstdio>
#include <cmath>
#include <string>
#include <exprtk.hpp>
using namespace std;
extern "C" __declspec(dllexport) double parser16(char *input,int *err)
{
typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t;
double y;
string expression_string = input;
symbol_table_t symbol_table;
symbol_table.add_constants();
expression_t expression;
expression.register_symbol_table(symbol_table);
parser_t parser;
try {
if (parser.compile(expression_string,expression)) {
y = expression.value();
*err=0;
return y;
}
*err=1;
return 0;
} catch(...) {
*err=1;
return 0.0;
}
}
解答
7&6*7-1 = 1
10%(6*10)+5 = 15
9|(4-2)&10 = 1
4*(5|4)|4 = 1
9^(1%5)^2 = 9
(2|6)*6|8 = 1
2^(5|5)^2 = 2
1+(1+3)*3 = 13
4%(7&5)&4 = 0
1+(3+7)&9 = 1
------------------------------------------------------------------------------
数式解析にSAMPLEフォルダ内のINTERPRE.basを使用してみました。
DECLARE EXTERNAL FUNCTION interpreter.expression ! 数値式を評価する関数
DECLARE EXTERNAL STRING interpreter.s$ ! 入力行
DECLARE EXTERNAL NUMERIC interpreter.i ! 入力行の文字位置
DECLARE EXTERNAL NUMERIC interpreter.ERR
DECLARE EXTERNAL SUB interpreter.skip ! 空白文字を読み飛ばす副プログラム
RANDOMIZE
LET N=4
DIM TERM$(N),NUM$(N),K$(N),KK$(N)
LET A$="+-*/"
! A$="+-*/%\^&|<>@"
OPEN #1:NAME "算数パズル問題.txt"
OPEN #2:NAME "算数パズル解答.txt"
ERASE #1
ERASE #2
FOR J=1 TO 50
DO
DO
MAT KK$=NUL$
IF RND<.5 THEN
DO
MAT K$=NUL$
LET P1=INT(RND*N+1)
LET K$(P1)="("
LET P2=INT(RND*N+1)
LOOP WHILE P1>=P2
LET KK$(P2)=")"
END IF
LET ER=0
FOR I=1 TO N
LET P=INT(RND*LEN(A$)+1)
LET TERM$(I)=A$(P:P)
IF TERM$(I)="^" AND ER=0 THEN LET ER=1
LET NUM$(I)=STR$(INT(10*RND+1))
NEXT I
LOOP UNTIL ER=0
LET S$=""
LET F$=""
FOR I=1 TO N-1
LET S$=S$&K$(I)&NUM$(I)&KK$(I)&TERM$(I)
LET F$=F$&NUM$(I)&" "
NEXT I
IF KK$(N)<>"" THEN
LET S$=S$&NUM$(N)&KK$(N)
LET F$=F$&NUM$(N)&KK$(N)
ELSE
LET S$=S$&NUM$(N)
LET F$=F$&NUM$(N)
END IF
LET I=1
LET ERR=0
CALL SKIP
LET ANS=EXPRESSION
LOOP UNTIL ERR=0 AND ANS>=0 AND ANS<=100 AND FP(ANS)=0
PRINT #2:S$;" =";ANS
PRINT #1:F$;" =";ANS
NEXT J
CLOSE #1
CLOSE #2
END
1200 MODULE interpreter
1210 PUBLIC STRING s$
1220 PUBLIC NUMERIC i,ERR
1230 PUBLIC FUNCTION expression
1240 PUBLIC SUB skip
1250 SHARE FUNCTION term,factor,primary,numeric
1260 !
1270 EXTERNAL SUB skip
1280 DO WHILE s$(i:i)=" "
1290 LET i=i+1
1300 LOOP
1310 END SUB
1320 !
1330 EXTERNAL FUNCTION expression
1340 DECLARE NUMERIC n
1350 DECLARE STRING op$
1360 SELECT CASE s$(i:i)
1370 CASE "-"
1380 LET i=i+1
1390 CALL skip
1400 LET n=-term
1410 CASE "+"
1420 LET i=i+1
1430 CALL skip
1440 LET n=term
1450 CASE ELSE
1460 LET n=term
1470 END SELECT
1480 DO WHILE s$(i:i)="+" OR s$(i:i)="-" OR S$(I:I)=">" OR S$(I:I)="<"
1490 LET op$=s$(i:i)
1500 LET i=i+1
1510 CALL skip
1520 IF op$="+" THEN LET n=n+term
IF OP$="-" THEN LET n=n-term
IF OP$="<" THEN LET N=MIN(N,TERM)
IF OP$=">" THEN LET N=MAX(N,TERM)
1530 LOOP
IF ERR=1 THEN EXIT FUNCTION
1540 LET expression =n
1550 CALL skip
1560 END FUNCTION
1570 !
1580 EXTERNAL FUNCTION term
1590 DECLARE NUMERIC n
1600 DECLARE STRING op$
1610 LET n=factor
1620 DO WHILE s$(i:i)="*" OR s$(i:i)="/" OR S$(I:I)="%" OR S$(I:I)="\" OR S$(I:I)="@"
1630 LET op$=s$(i:i)
1640 LET i=i+1
1650 CALL skip
1660 IF op$="*" THEN LET n=n*factor
IF OP$="/" THEN
LET M=FACTOR
IF M=0 THEN
LET ERR=1
EXIT FUNCTION
ELSE
LET n=n/M
END IF
END IF
IF OP$="%" THEN
LET M=FACTOR
IF M=0 THEN
LET ERR=1
EXIT FUNCTION
ELSE
LET N=MOD(N,M)
END IF
END IF
IF OP$="\" THEN
LET M=FACTOR
IF M=0 THEN
LET ERR=1
EXIT FUNCTION
ELSE
LET N=IP(N/M)
END IF
END IF
IF OP$="@" THEN LET N=(N+FACTOR)/2
1670 LOOP
1680 LET term=n
1690 END FUNCTION
1700 !
1710 EXTERNAL FUNCTION factor
1720 DECLARE NUMERIC n
1730 LET n=primary
1740 DO WHILE s$(i:i)="^" OR S$(I:I)="&" OR S$(I:I)="|" OR S$(I:I)="~"
1750 LET i=i+1
1760 CALL skip
IF OP$="^" THEN LET n=n^primary
IF OP$="&" THEN LET N=BITAND(N,PRIMARY)
IF OP$="|" THEN LET N=BITOR(N,PRIMARY)
IF OP$="~" THEN LET N=BITXOR(N,PRIMARY)
1780 LOOP
1790 LET factor=n
1800 END FUNCTION
1810 !
1820 EXTERNAL FUNCTION primary
1830 IF s$(i:i)>="0" AND s$(i:i)<="9" THEN
1840 LET primary=NUMERIC
1850 ELSEIF s$(i:i+1)="PI" THEN
1860 LET i=i+2
1870 CALL SKIP
1880 LET primary=PI
1890 ELSE
1900 IF s$(i:i)="(" THEN
1910 LET i=i+1
1920 CALL SKIP
1930 LET primary=expression
1940 ELSEIF s$(i:i+3)="SIN(" THEN
1950 LET i=i+4
1960 CALL SKIP
1970 LET Primary=SIN(expression)
1980 ELSEIF s$(i:i+3)="COS(" THEN
1990 LET i=i+4
2000 CALL SKIP
2010 LET Primary=COS(expression)
2020 ELSEIF s$(i:i+3)="TAN(" THEN
2030 LET i=i+4
2040 CALL SKIP
2050 LET Primary=TAN(expression)
2060 ELSEIF s$(i:i+3)="LOG(" THEN
2070 LET i=i+4
2080 CALL SKIP
2090 LET Primary=LOG(expression)
2100 ELSEIF s$(i:i+3)="EXP(" THEN
2110 LET i=i+4
2120 CALL SKIP
2130 LET Primary=EXP(expression)
2140 ELSEIF s$(i:i+3)="SQR(" THEN
2150 LET i=i+4
2160 CALL SKIP
2170 LET Primary=SQR(expression)
2180 ELSEIF s$(i:i+3)="INT(" THEN
2190 LET i=i+4
2200 CALL SKIP
2210 LET Primary=INT(expression)
2220 ELSEIF s$(i:i+3)="ABS(" THEN
2230 LET i=i+4
2240 CALL SKIP
2250 LET Primary=ABS(expression)
2260 ELSE
2270 LET ERR=1
2280 EXIT FUNCTION
2290 END IF
2300 IF s$(i:i)=")" THEN
2310 LET i=i+1
2320 CALL skip
2330 ELSE
2340 LET ERR=1
2350 EXIT FUNCTION
2360 END IF
2370 END IF
2380 END FUNCTION
2390 !
2400 EXTERNAL FUNCTION numeric
2410 DECLARE NUMERIC i0
2420 CALL skip
2430 LET i0=i
2440 DO WHILE s$(i:i)>="0" AND s$(i:i)<="9"
2450 LET i=i+1
2460 LOOP
2470 IF s$(i:i)="." THEN LET i=i+1
2480 DO WHILE s$(i:i)>="0" AND s$(i:i)<="9"
2490 LET i=i+1
2500 LOOP
2510 LET numeric=VAL(s$(i0:i-1))
2520 CALL skip
2530 END FUNCTION
2540 !
2550 END MODULE
Re: 数式パズル - しばっち
2025/09/14 (Sun) 07:35:27
実行すると下記のような問題を出力します。
〇に1か2を入れて足し算を完成させるパズルです。
https://warabe.or.jp/airwarabe4/?gad_source=1&gclid=EAIaIQobChMIlcyvz7z5igMVYtcWBR2LOSM2EAMYASAAEgIW2fD_BwE
但し、乱数使用の為場合によって
〇+〇+1+2
〇+〇+2+1
と
〇+〇+2+1
〇+〇+1+2
のような入れ替わりで解が複数存在する場合があります。
〇+〇+〇+〇= 8
+ + + +
〇+〇+〇+〇= 6
+ + + +
〇+〇+〇+〇= 6
+ + + +
〇+〇+〇+〇= 6
= = = =
7 6 8 5
〇+〇+〇+〇= 6
+ + + +
〇+〇+〇+〇= 7
+ + + +
〇+〇+〇+〇= 5
+ + + +
〇+〇+〇+〇= 5
= = = =
6 7 5 5
〇+〇+〇+〇= 5
+ + + +
〇+〇+〇+〇= 8
+ + + +
〇+〇+〇+〇= 6
+ + + +
〇+〇+〇+〇= 5
= = = =
5 5 8 6
RANDOMIZE
LET N=4 ! 項数
DIM M(N,N),B(N),C(N)
DIM NUM(2)
MAT READ NUM
DATA 1,2 ! 使用する数値(1,2以外も指定できる。個数を3つ以上にもできます)
OPEN #1:NAME "丸数字足し算問題.txt"
OPEN #2:NAME "丸数字足し算解答.txt"
ERASE #1
ERASE #2
FOR K=1 TO 20 ! 問題数
MAT B=ZER
MAT C=ZER
FOR I=1 TO N
FOR J=1 TO N
LET M(I,J)=NUM(INT(RND*UBOUND(NUM,1)+1))
NEXT J
NEXT I
FOR J=1 TO N
FOR I=1 TO N
LET B(I)=B(I)+M(J,I)
NEXT I
NEXT J
FOR J=1 TO N
FOR I=1 TO N
LET C(J)=C(J)+M(J,I)
NEXT I
NEXT J
FOR J=1 TO N
FOR I=1 TO N-1
PRINT #1:"〇+";
NEXT I
PRINT #1:"〇=";B(J)
IF J<N THEN PRINT #1:" ";REPEAT$("+ ",N)
NEXT J
FOR J=1 TO N
FOR I=1 TO N-1
PRINT #2:M(I,J);"+";
NEXT I
PRINT #2:M(N,J);"=";B(J)
IF J<N THEN PRINT #2:REPEAT$(" + ",N)
NEXT J
FOR I=1 TO N
PRINT #1:" = ";
PRINT #2:" = ";
NEXT I
PRINT #1
PRINT #2
FOR I=1 TO N
PRINT #1:C(I);
PRINT #2:C(I);" ";
NEXT I
PRINT #1
PRINT #1
PRINT #2
PRINT #2
NEXT K
CLOSE #1
CLOSE #2
END
解答
2 + 2 + 2 + 2 = 8
+ + + +
2 + 1 + 2 + 1 = 6
+ + + +
2 + 1 + 2 + 1 = 6
+ + + +
1 + 2 + 2 + 1 = 6
= = = =
7 6 8 5
2 + 2 + 1 + 1 = 6
+ + + +
2 + 2 + 2 + 1 = 7
+ + + +
1 + 1 + 1 + 2 = 5
+ + + +
1 + 2 + 1 + 1 = 5
= = = =
6 7 5 5
1 + 1 + 2 + 1 = 5
+ + + +
2 + 2 + 2 + 2 = 8
+ + + +
1 + 1 + 2 + 2 = 6
+ + + +
1 + 1 + 2 + 1 = 5
= = = =
5 5 8 6
------------------------------------------------------------------------------------
実行すると下記のような足し算だけではなく、引き算も加えた問題を出力します。
Xに1か2を入れるパズルです。
+ X - X + X - X =-1
+ X + X + X + X = 6
+ X - X + X + X = 1
+ X + X - X - X = 1
= = = =
7 -2 3 -1
- X - X - X - X =-6
+ X - X - X + X = 0
+ X - X - X + X = 1
- X + X - X + X =-1
= = = =
-1 -3 -5 3
+ X + X - X - X = 1
+ X + X + X - X = 3
- X - X - X + X =-1
+ X + X + X - X = 2
= = = =
4 4 1 -4
RANDOMIZE
LET N=4
DIM NUM(N,N),SIGN(N,N),YOKO(N),TATE(N)
DIM NUMBER(2)
MAT READ NUMBER
DATA 1,2 ! 使用する数
OPEN #1:NAME "数字和算減算問題.txt"
OPEN #2:NAME "数字和算減算解答.txt"
ERASE #1
ERASE #2
FOR K=1 TO 20 ! 問題数
MAT YOKO=ZER
MAT TATE=ZER
FOR J=1 TO N
FOR I=1 TO N
LET NUM(J,I)=NUMBER(INT(RND*UBOUND(NUMBER,1)+1))
LET SIGN(J,I)=(-1)^INT(2*RND)
NEXT I
NEXT J
FOR J=1 TO N
FOR I=1 TO N
LET TATE(I)=TATE(I)+NUM(J,I)*SIGN(J,I)
NEXT I
NEXT J
FOR J=1 TO N
FOR I=1 TO N
LET YOKO(J)=YOKO(J)+NUM(J,I)*SIGN(J,I)
NEXT I
NEXT J
FOR J=1 TO N
FOR I=1 TO N
PRINT #1:" ";SIGN$(SIGN(J,I));" X";
NEXT I
PRINT #1:" =";YOKO(J)
NEXT J
FOR J=1 TO N
FOR I=1 TO N
PRINT #2:SIGN$(SIGN(J,I));NUM(J,I);
NEXT I
PRINT #2:" =";YOKO(J)
NEXT J
PRINT #1:" ";
PRINT #2:" ";
PRINT #1:REPEAT$(" = ",N);
PRINT #2:REPEAT$(" = ",N);
PRINT #1
PRINT #2
PRINT #1:" ";
FOR I=1 TO N
PRINT #1:" ";TATE(I);
PRINT #2:" ";TATE(I);
NEXT I
PRINT #1
PRINT #1
PRINT #2
PRINT #2
NEXT K
CLOSE #1
CLOSE #2
END
EXTERNAL FUNCTION SIGN$(X)
IF X<0 THEN LET SIGN$="-" ELSE LET SIGN$="+"
END FUNCTION
解答
+ 2 - 2 + 1 - 2 =-1
+ 2 + 1 + 2 + 1 = 6
+ 1 - 2 + 1 + 1 = 1
+ 2 + 1 - 1 - 1 = 1
= = = =
7 -2 3 -1
- 2 - 2 - 1 - 1 =-6
+ 1 - 1 - 1 + 1 = 0
+ 2 - 1 - 2 + 2 = 1
- 2 + 1 - 1 + 1 =-1
= = = =
-1 -3 -5 3
+ 2 + 2 - 1 - 2 = 1
+ 1 + 2 + 2 - 2 = 3
- 1 - 1 - 1 + 2 =-1
+ 2 + 1 + 1 - 2 = 2
= = = =
4 4 1 -4
Re: 数式パズル - しばっち
2025/09/14 (Sun) 07:37:18
実行すると下記のような問題を出力します。
各A,B,C,Dには同じ数字が入ります。
A,B,C,Dには1か2か3か4が入ります。
+ D - A + C + B = 6
+ A - A / C - B =-4
- A - D * B - A =-16
- A - A - B + D =-5
= = = =
1 -9 0 1
+ A - C - A + C = 0
+ D + A / A - B = 0
- B + D - B * C =-5
- C + A - D + B = 2
= = = =
0 6 -8 1
+ D + A + A - C = 6
+ A + C - A * B =-5
+ D - B + C * A = 1
- A - A - D + A =-5
= = = =
6 -3 -2 -6
RANDOMIZE
LET PARA=4 ! パラメータ数 A,B,C,D... PARA>=2
LET N=4 ! 項数
DIM NUM(N,N),OPERATOR(N,N),ROW(N),COL(N),OP$(4),TERM$(PARA),NUMBER(PARA)
MAT READ OP$
DATA "+","-","*","/"
FOR I=1 TO PARA
READ TERM$(I) ! ! 置き換える文字
NEXT I
DATA A,B,C,D
FOR I=1 TO PARA
SWAP TERM$(I),TERM$(INT(RND*PARA)+1) ! シャッフルする
NEXT I
FOR I=1 TO PARA
READ NUMBER(I)
NEXT I
DATA 1,2,3,4 ! 使用する数値
FOR I=1 TO PARA
SWAP NUMBER(I),NUMBER(INT(RND*PARA+1))
NEXT I
OPEN #1:NAME "計算パズル問題.txt"
OPEN #2:NAME "計算パズル解答.txt"
ERASE #1
ERASE #2
FOR K=1 TO 20 ! 問題数
DO
FOR I=1 TO N
FOR J=1 TO N
LET NUM(I,J)=INT(RND*PARA+1) ! 1,2,3... パラメータ数 各A,B,C...には同じ数が入る
IF J=1 OR I=1 THEN
LET OPERATOR(I,J)=INT(RND*2+1)
ELSE
LET OPERATOR(I,J)=INT(RND*4+1)
END IF
NEXT J
NEXT I
FOR I=1 TO N
LET S$=""
FOR J=1 TO N
SELECT CASE OPERATOR(I,J)
CASE 1
LET S$=S$&"+"&STR$(NUMBER(NUM(I,J)))
CASE 2
LET S$=S$&"-"&STR$(NUMBER(NUM(I,J)))
CASE 3
LET S$=S$&"*"&STR$(NUMBER(NUM(I,J)))
CASE 4
LET S$=S$&"/"&STR$(NUMBER(NUM(I,J)))
END SELECT
NEXT J
CALL PARSER(S$,ANS,ERR)
IF FP(ANS)<>0 THEN LET ERR=1
IF ERR=0 THEN
LET ROW(I)=ANS
ELSE
EXIT FOR
END IF
NEXT I
IF ERR=0 THEN
FOR J=1 TO N
LET S$=""
FOR I=1 TO N
SELECT CASE OPERATOR(I,J)
CASE 1
LET S$=S$&"+"&STR$(NUMBER(NUM(I,J)))
CASE 2
LET S$=S$&"-"&STR$(NUMBER(NUM(I,J)))
CASE 3
LET S$=S$&"*"&STR$(NUMBER(NUM(I,J)))
CASE 4
LET S$=S$&"/"&STR$(NUMBER(NUM(I,J)))
END SELECT
NEXT I
CALL PARSER(S$,ANS,ERR)
IF FP(ANS)<>0 THEN LET ERR=1
IF ERR=0 THEN
LET COL(J)=ANS
ELSE
EXIT FOR
END IF
NEXT J
END IF
LOOP UNTIL ERR=0
CALL DISPLAY
CALL DISPLAY2
NEXT K
CLOSE #1
CLOSE #2
SUB DISPLAY ! 問題
FOR I=1 TO N
FOR J=1 TO N
LET P=OPERATOR(I,J)
PRINT #1:OP$(P);" ";TERM$(NUM(I,J));" ";
NEXT J
PRINT #1:"=";ROW(I)
NEXT I
FOR I=1 TO N
PRINT #1:" = ";
NEXT I
PRINT #1
FOR I=1 TO N
PRINT #1:USING$("-##",COL(I));" ";
NEXT I
PRINT #1
PRINT #1
END SUB
SUB DISPLAY2 ! 解答
FOR I=1 TO N
FOR J=1 TO N
LET P=OPERATOR(I,J)
PRINT #2:OP$(P);" ";STR$(NUMBER(NUM(I,J)));" ";
NEXT J
PRINT #2:"=";ROW(I)
NEXT I
FOR I=1 TO N
PRINT #2:" = ";
NEXT I
PRINT #2
FOR I=1 TO N
PRINT #2:USING$("-###",COL(I));
NEXT I
PRINT #2
PRINT #2
END SUB
END
EXTERNAL SUB PARSER(X$,ANS,ERR)
OPTION CHARACTER BYTE
LET ERR$=REPEAT$(" ",4)
IF X$="" THEN
LET ERR=1
LET ANS=0
EXIT SUB
END IF
LET ANS=PARSER16(LCASE$(X$),ERR$)
LET ERR=INT32(ERR$)
FUNCTION PARSER16(X$,ERR$)
ASSIGN ".\DLL\parser-exprtk.dll","parser16",FPU
END FUNCTION
END SUB
EXTERNAL FUNCTION INT32(S$)
OPTION CHARACTER BYTE
FOR I=1 TO 4
LET N=N+256^(I-1)*ORD(S$(I:I))
NEXT I
LET INT32=MOD(N+2^31,2^32)-2^31
END FUNCTION
解答
+ 3 - 2 + 1 + 4 = 6
+ 2 - 2 / 1 - 4 =-4
- 2 - 3 * 4 - 2 =-16
- 2 - 2 - 4 + 3 =-5
= = = =
1 -9 0 1
+ 2 - 1 - 2 + 1 = 0
+ 3 + 2 / 2 - 4 = 0
- 4 + 3 - 4 * 1 =-5
- 1 + 2 - 3 + 4 = 2
= = = =
0 6 -8 1
+ 3 + 2 + 2 - 1 = 6
+ 2 + 1 - 2 * 4 =-5
+ 3 - 4 + 1 * 2 = 1
- 2 - 2 - 3 + 2 =-5
= = = =
6 -3 -2 -6