マウスでEND行を除くプログラム部分を選択し右クリックしてコピーし,BASICに貼り付けて実行させることができます。
2数a,bを入力すると,方程式ax+b=0の解を出力する。
(2数はコンマで区切って入力する)
解1
100 INPUT a,b 110 IF a=0 THEN 120 IF b=0 THEN 130 PRINT "任意の数" 140 ELSE 150 PRINT "解なし" 160 END IF 170 ELSE 180 PRINT -b/a 190 END IF 200 END |
解2
100 INPUT a,b 110 IF a<>0 THEN 120 PRINT -b/a 130 ELSE 140 IF b<>0 THEN 150 PRINT "解なし" 160 ELSE 170 PRINT "任意の数" 180 END IF 190 END IF 200 END |
BASICでは,等しくないこと(≠)を <> で表す。
解3 解2の論理はELSEIF文を用いて次のように書くこともできる。
100 INPUT a,b 110 IF a<>0 THEN 120 PRINT -b/a 130 ELSEIF b<>0 THEN 140 PRINT "解なし" 150 ELSE 160 PRINT "任意の数" 170 END IF 180 END |
西暦年を入力すると,平年かうるう年か答える。
解1
100 INPUT y 110 IF MOD(y,4)=0 THEN 120 IF MOD(y,100)=0 THEN 130 IF MOD(y,400)=0 THEN 140 PRINT "うるう年" 150 ELSE 160 PRINT "平年" 170 END IF 180 ELSE 190 PRINT "うるう年" 200 END IF 210 ELSE 220 PRINT "平年" 230 END IF 240 END |
MOD(a,b)はaをbで割った余りを求める組込関数。
解2
100 INPUT y 110 IF MOD(y,4)<>0 THEN 120 PRINT "平年" 130 ELSEIF MOD(y,100)<>0 THEN 140 PRINT "うるう年" 150 ELSEIF MOD(y,400)<>0 THEN 160 PRINT "平年" 170 ELSE 180 PRINT "うるう年" 190 END IF 200 END |
解3
10 INPUT y 20 IF MOD(y,4)=0 AND (MOD(y,100)<>0 OR MOD(y,400)=0) THEN 30 PRINT "うるう年" 40 ELSE 50 PRINT "平年" 60 END IF 70 END |
解4
10 INPUT y 20 IF MOD(y,4)<>0 OR (MOD(y,100)=0 AND MOD(y,400)<>0) THEN 30 PRINT "平年" 40 ELSE 50 PRINT "うるう年" 60 END IF 70 END |
BASICには,ANDはORより優先する約束があるので,解4の20行は
20 IF MOD(y,4)<>0 OR MOD(y,100)=0 AND MOD(y,400)<>0 THEN
と書いてもよい。
乗算九々の表を作成する。
(FOR〜NEXT 2重ループと出力制御の例題)
解1
10 FOR a=1 TO 9 20 FOR b=1 TO 9 30 PRINT a*b; 40 NEXT b 50 PRINT 60 NEXT a 70 END |
実行結果
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 |
PRINT文の末尾にセミコロンを書くと,次にPRINT文を実行したとき続けて出力する。
正の数の前後には空白がそれぞれ1つずつ付加される。
50行のようにPRINTのみを書いたPRINT文は,改行のみを行う。
解2
10 SET ZONEWIDTH 4 20 FOR a=1 TO 9 30 FOR b=1 TO 9 40 PRINT a*b, 50 NEXT b 60 PRINT 70 NEXT a 80 END |
実行結果
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 |
SET ZONEWIDTHは出力欄の幅を指定する命令。(省くと規定値が用いられる)
PRINT文の末尾をコンマで止めると,次にPRINT文を実行したとき改行しないで次の出力欄に出力する。
解3
10 FOR a=1 TO 9 20 FOR b=1 TO 9 30 PRINT USING "####": a*b; 40 NEXT b 50 PRINT 60 NEXT a 70 END |
実行結果
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 |
PRINT USINGは書式を指定して出力する命令。書式と出力項目はコロンで区切る。
PRINT USING文の末尾にはコロンまたはセミコロンを書いてもよい。
その場合の効果は通常のPRINT文と同様。
書式は,桁位置を#で表す。数値は桁位置のなかで右詰めにされる。
nの階乗を計算する。
定数1を代入した変数に,1〜nを順に掛け合わせる。
10 INPUT n 20 LET a=1 30 FOR i=1 TO n 40 LET a=a*i 50 NEXT i 60 PRINT a 70 END |
DEF文で定義した数列a(n)の第1項から第n項までの和を出力する。
10 DEF a(n)=n^2+3*n+2 20 INPUT n 30 LET s=0 40 FOR k=1 TO n 50 LET s=s+a(k) 60 NEXT k 70 PRINT s 80 END |
和を計算するための変数sを用意して,a(1)〜a(n)を順に加算していく。
DEF文で引数(関数名aに続く括弧内)にnが指定されているので,DEF行中のnと,プログラムの他の部分のnとは別の変数。
DATA文に書いた10個の数値の平均を求める。
10 DATA 34,29,34,90,12,78,66,85,34,92 20 LET s=0 30 FOR i=1 TO 10 40 READ a 50 LET s=s+a 60 NEXT i 70 PRINT s/10 80 END |
READ文はDATA文から順に数値を読み込む命令。
変数sに和を求め,s/10を出力している。
DATA文に書かれた不定個数の数値の平均を求める。
100 DATA 34,29,34,90,12,78,66,85,13,99,12,67 110 LET n=0 120 LET s=0 130 DO 140 READ IF MISSING THEN EXIT DO:a 150 LET n=n+1 160 LET s=s+a 170 LOOP 180 PRINT "件数";n 190 PRINT "合計";s 200 PRINT "平均";s/n 210 END |
DO〜LOOP内のREAD文にIF MISSING THEN EXIT DOを追加すると,DATA要素が尽きたときにDO〜LOOPを抜ける。
(DO〜LOOPは単純な繰り返しの命令。LOOP文を実行するとDO行に戻る。)
変数nに件数,変数sに和を求め,s/nを出力する。
PRINT文で出力項目をセミコロンで区切ると続けて表示する。
初めに件数nを入力し,続いてn人分の点数データを順に入力すると,10点刻みの度数分布を答える。ただし,点数は0点以上100点以下とする。
100 DIM a(0 TO 10) 110 MAT a=ZER 120 INPUT PROMPT "件数 ": n 130 FOR k=1 TO n 140 INPUT PROMPT STR$(k)&"件め ": x 150 IF 0<=x AND x<10 THEN LET a(0)=a(0)+1 160 IF 10<=x AND x<20 THEN LET a(1)=a(1)+1 170 IF 20<=x AND x<30 THEN LET a(2)=a(2)+1 180 IF 30<=x AND x<40 THEN LET a(3)=a(3)+1 190 IF 40<=x AND x<50 THEN LET a(4)=a(4)+1 200 IF 50<=x AND x<60 THEN LET a(5)=a(5)+1 210 IF 60<=x AND x<70 THEN LET a(6)=a(6)+1 220 IF 70<=x AND x<80 THEN LET a(7)=a(7)+1 230 IF 80<=x AND x<90 THEN LET a(8)=a(8)+1 240 IF 90<=x AND x<100 THEN LET a(9)=a(9)+1 250 IF 100=x THEN LET a(10)=a(10)+1 260 NEXT k 270 PRINT " 0点台 ",a( 0);"人" 280 PRINT " 10点台 ",a( 1);"人" 290 PRINT " 20点台 ",a( 2);"人" 300 PRINT " 30点台 ",a( 3);"人" 310 PRINT " 40点台 ",a( 4);"人" 320 PRINT " 50点台 ",a( 5);"人" 330 PRINT " 60点台 ",a( 6);"人" 340 PRINT " 70点台 ",a( 7);"人" 350 PRINT " 80点台 ",a( 8);"人" 360 PRINT " 90点台 ",a( 9);"人" 370 PRINT "100点 ",a(10);"人" 380 END |
110行の MAT a=ZER は,配列aの全要素に0(zero)を代入する行列(matrix)演算の命令。
Full BASICのIF文には,複数行に書かれるIF 〜 END IFの構文と,1行に書かれるIF文とがある。THENの直後に命令文があると1行IF文で,この場合,END IFを書かない。その代わり,この形のIF文には命令文は1個しか書けない。
解2
100 DIM a(0 TO 10) 110 MAT a=ZER 120 INPUT PROMPT "件数 ": n 130 FOR k=1 TO n 140 INPUT PROMPT STR$(k)&"件め ": x 150 FOR i=0 TO 10 160 IF i*10<=x AND x<10*(i+1) THEN LET a(i)=a(i)+1 170 NEXT i 180 NEXT k 190 FOR i=0 TO 10 200 PRINT 10*i;"点台 ",a(i);"人" 210 NEXT i 220 END |
解3
100 DIM a(0 TO 10) 110 MAT a=ZER 120 INPUT PROMPT "件数 ": n 130 FOR k=1 TO n 140 INPUT PROMPT STR$(k)&"件め ": x 150 LET i=INT(x/10) 160 LET a(i)=a(i)+1 170 NEXT k 180 FOR i=0 TO 10 190 PRINT 10*i;"点台 ",a(i);"人" 200 NEXT i 210 END |
上の例題と同様に点数を入力すると,最高点と最低点を出力する。(点数は0点以上100点以下とする)
100 INPUT PROMPT "件数 ": n 110 INPUT PROMPT "1件め ": x 120 LET max=x 130 LET min=x 140 FOR k=2 TO n 150 INPUT PROMPT STR$(k)&"件め ": x 160 IF x>max THEN LET max=x 170 IF x<min THEN LET min=x 180 NEXT k 190 PRINT "最高点 "; max 200 PRINT "最低点 "; min 210 END |
新たな点数が入力されたとき,それがそれ以前の最大値より大きければ,それがその時点での最大値と考える。(最小値も同様)
100 INPUT PROMPT "件数 ": n 110 LET max=0 120 LET min=100 130 FOR k=1 TO n 140 INPUT PROMPT STR$(k)&"件め ": x 150 IF x>max THEN LET max=x 160 IF x<min THEN LET min=x 170 NEXT k 180 PRINT "最高点 "; max 190 PRINT "最低点 "; min 200 END |
入力される数値の範囲が定まっているときは,最大値,最小値の初期値を範囲の限界の値に設定するとプログラムを簡略化できる。
数値積分
DEF文で定義された関数fの区間[a,b]における定積分の近似値を,台形公式,中点公式,シンプソンの公式により求める。
100 DEF f(x)=SIN(x) ! 被積分関数 110 LET a=0 ! 下端 120 LET b=PI ! 上端 130 LET n=10000 ! 小区間の個数 140 LET h=(b-a)/n ! 小区間の幅 150 LET t=(f(a)+f(b))/2 ! ここから台形公式 160 FOR i=1 TO n-1 170 LET t=t+f(a+i*h) 180 NEXT i 190 LET t=t*h ! 台形公式 200 LET m=0 ! ここから中点公式 210 FOR i=0.5 TO n-0.5 220 LET m=m+f(a+i*h) 230 NEXT i 240 LET m=m*h ! 中点公式 250 LET s=(t+2*m)/3 ! シンプソンの公式 260 PRINT "台形公式",t 270 PRINT "中点公式",m 280 PRINT "シンプソンの公式",s 290 END |
正弦・余弦の級数展開
正弦・余弦を級数展開した項は,x^n/(n!)の形をしている。
x^n/(n!) = (x/1)・(x/2)・(x/3)・…・(x/n)であることに注意すれば,
この項は初期値に1を与えた変数に,x/1,x/2,x/3,…,x/nを順に乗じることで得られる。
正弦関数の級数展開は,これらの項を,項の番号を4で割った余りが1のときに加算し,余りが3のときに減算したものになっている。
100 REM 正弦関数の級数展開 110 LET x=PI/6 120 LET t=1 130 LET s=0 140 FOR i=1 TO 60 150 LET t=t*x/i 160 SELECT CASE MOD(i,4) 170 CASE 1 180 LET s=s+t 190 PRINT i, s 200 CASE 3 210 LET s=s-t 220 PRINT i, s 230 CASE ELSE 240 END SELECT 250 NEXT i 260 END |
余弦関数の場合は,4で割った余りが0のときに加算し,余りが2のときに減算する。
100 REM 余弦関数の級数展開 110 LET x=PI/6 120 LET t=1 130 LET c=1 140 FOR i=1 TO 60 150 LET t=t*x/i 160 SELECT CASE MOD(i,4) 170 CASE 0 180 LET c=c+t 190 PRINT i, c 200 CASE 2 210 LET c=c-t 220 PRINT i, c 230 CASE ELSE 240 END SELECT 250 NEXT i 260 END |
これらのプログラムは,十進モード,2進モードでも実行可能であるが,加減算の繰り返しによる桁落ちの影響であまりよい数値にならない。(仮称)十進BASICでは,十進1000桁モードで実行すると,収束の様子がよく分かる。