初歩のBASICプログラム例題集

マウスでEND行を除くプログラム部分を選択し右クリックしてコピーし,BASICに貼り付けて実行させることができます。

  1. 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
    



  2. 西暦年を入力すると,平年かうるう年か答える。

    解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
    と書いてもよい。

  3. 乗算九々の表を作成する。

    (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文と同様。
    書式は,桁位置を#で表す。数値は桁位置のなかで右詰めにされる。


  4. 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
    



  5. 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とは別の変数。

  6. 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を出力している。

  7. 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文で出力項目をセミコロンで区切ると続けて表示する。

  8. 初めに件数nを入力し,続いてn人分の点数データを順に入力すると,10点刻みの度数分布を答える。ただし,点数は0点以上100点以下とする。

    解1
    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
    



  9. 上の例題と同様に点数を入力すると,最高点と最低点を出力する。(点数は0点以上100点以下とする)

    解1
    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
    

    新たな点数が入力されたとき,それがそれ以前の最大値より大きければ,それがその時点での最大値と考える。(最小値も同様)

    解2
    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
    

    入力される数値の範囲が定まっているときは,最大値,最小値の初期値を範囲の限界の値に設定するとプログラムを簡略化できる。

  10. 数値積分

    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
    



  11. 正弦・余弦の級数展開

    正弦・余弦を級数展開した項は,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桁モードで実行すると,収束の様子がよく分かる。


戻る