Imo Soft  | TOP | Imo Soft | ドン!3 | 大学関係 | 掲示板 | リンク |
日曜プログラマのソフト置き場 >> Imo Soft >> miniBASICとは >> サンプルプログラムの解説 03/12/28更新

[miniBASICロゴ]サンプルプログラムの解説

サンプルプログラム一覧

HELLO_WORLD.BAS プログラミングの世界では、はじめて出会った言語では、最初に必ずこのプログラムを書くのがしきたりですね。(^_^;)
アナログ時計の実行画面
アナログ時計.BAS

カラフルなアナログ時計を表示するプログラムです。
[色見本の画面]
色見本.BAS
色見本を表示するプログラムです。見本の中から、色を選ぶとそのRGB値を表示します。思いつきで作ったので、コードが汚い…
階乗.BAS 任意の自然数の階乗を求めるプログラムです。
さいころの実行画面
さいころ.BAS
ランダムにアニメーションするさいころのプログラムです。1の直後に6が出たりと不自然な点もありますが、気にしない、気にしない。
ニュートン法.BAS
ニュートン法を使って『3の平方根』を求めるサンプルです。
最初に初期値を入力すると次第に値が収束していく様子が分かります。
平均.BAS

任意の数の値の入力を受け付けて、その平均を表示するプログラムです。
べき乗.BAS
XのN乗を求めるプログラムです。
PARABOLAの実行画面
放物線.BAS

放物線を書くプログラムです。『Y=AX^2+BX+C』のA,B,Cを入力し、色を選択すると放物線が描画されます。

ソースコード

(長い行がブラウザによって折り返されている可能性があります。ご注意を)

・HELLO_WORLD


'########################
'# お決まりのHelloWorld #
'########################
'まずは、基本形
PRINT "Hello miniBASIC world!!"

A="こんにちは、"
B="さん。miniBASICの世界にようこそ!!"
INPUT "あなたのお名前は?";N
PRINT A,N,B
END


・アナログ時計


'####################################
'# アナログ時計を表示するプログラム #
'####################################

X0=120: Y0=120: R=80
P=Pi()
LABEL START
CLS

'円を表示
CIRCLE(X0,Y0,R,255+255*256+255*256*256,0)

'15分毎の『●』を描画
CurrentX=X0-7: CurrentY=Y0-R*0.9
PRINT "●"
CurrentX=X0+R*0.9-14: CurrentY=Y0-7
PRINT "●"
CurrentX=X0-7: CurrentY=Y0+R*0.9-14
PRINT "●"
CurrentX=X0-R*0.9: CurrentY=Y0-7
PRINT "●"

'数字で表示
CurrentX=X0-30: CurrentY=Y0+35
H=Hour()
M=Minute()
S=Second()
PRINT Right("0"&H,2)&":"&Right("0"&M,2)&":"&Right("0"&S,2)

'時針を表示
H=(H-3)/12*P*2+(M-15)/60*P*2/12
X=Cos(H)*R/2+X0: Y=Sin(H)*R/2+Y0
SetDrawWidth(5)
Line(X0,Y0)-(X,Y),255

'分針を表示
M=(M-15)/60*P*2
X=Cos(M)*R/4*3+X0: Y=Sin(M)*R/4*3+Y0
SetDrawWidth(3)
Line(X0,Y0)-(X,Y),255+127*256

'秒針を表示
S=(S-15)/60*P*2
X=Cos(S)*R+X0: Y=Sin(S)*R+Y0
SetDrawWidth(1)
Line(X0,Y0)-(X,Y),255+255*256

WAIT(100)
GOTO START
END


・色見本


'#################################################
'# 色見本を表示してそのRGB値を取得するプログラム #
'#################################################

'** 初期化 **
NC=6         '=色合の数/6
NL=10        '(明度の数-1)/2
SX=255/NC    '1回に変化する色合の幅
LeftPos=20   '色見本の左端
TopPos=20    '色見本の上端
IntervalX=20 'それぞれの色の間隔(横)
IntervalY=20 'それぞれの色の間隔(縦)

Label Main
    GoSub DrawColors
    GoSub ChoseColor
    GoSub EndCheck
    GoTo Main
End

'** 色見本を表示 **
Label DrawColors

    '** Y 座標を描画 **
    ForeColor=RGB(255,255,255)
    For Y=0 To NL*2
        CurrentX=0: CurrentY=Y*IntervalY+TopPos
        Print Right(" " & Str(Y),2)
    Next Y

    For X=0 To NC*6-1
        '** X座標を描画 **
        ForeColor=RGB(255,255,255)
        CurrentX=X*IntervalX+LeftPos: CurrentY=3
        If X<10 Then CurrentX=CurrentX+4
        Print X

        '**  縦1列分『■』を描画 **
        For Y=0 To NL*2
            GoSub GetColor '変数 RR,GG,BBに、座標 X,Y の色を代入
            ForeColor=RGB(RR,GG,BB)
            CurrentX=X*IntervalX+LeftPos: CurrentY=Y*IntervalY+TopPos
            Print "■"
        Next Y
    Next X
Return

'** 色の選択 **
Label ChoseColor
    GoSub DrawFrame
    Label ReTry
    '** 色を選んでもらう **
    Input "横の列の番号を入力してください。";X
    Input "縦の列の番号を入力してください。";Y

    If X<0 or X>(NC*6-1) Then 'Xの範囲チェック
        GoSub DrawFrame
        Print "横の列には、0から"& Str(NC*6-1) & "の整数を入力してください。"
        GoTo ReTry
    ElseIf Y<0 or Y>NL*2 Then 'Yの範囲チェック
        GoSub DrawFrame
        Print "縦の列には、0から" & Str(NL*2) & "の整数を入力してください。"
        GoTo ReTry
    End If

    '** 選択した色とRGB値を表示 **
    GoSub GetColor
    ForeColor=RGB(RR,GG,BB)
    Print "■"
    ForeColor=RGB(255,255,255)
    Print "R: " & RR & "  G: " & GG & "  B: " & BB
Return

'** 終了確認 **
Label EndCheck
    Input "終了:0 続行:1 ?:"; X
    If X=0 Then
        End
    ElseIf X=1 Then
    Else
        GoSub DrawFrame
        Print "終了: 0 続行:1 のいずれかを入力してください。"
        Goto EndCheck
    End If
Return

'** 座標値から色を求める **
Label GetColor
    'X:色合、Y:明度(0:白、NL*2:黒)

    If X<=(NC-1) then '赤→黄
        If Y<=(NL-1) Then '白→純色
            RR=255
            GG=255-Y/NL*(255-SX*(X+1))
            BB=255-255*Y/NL
        Else '純色→黒
            RR=255*(NL*2-Y)/NL
            GG=SX*(X+1)*(NL*2-Y)/NL
            BB=0
        End If
    ElseIf X<=(2*NC-1) then '黄→緑
        If Y<=(NL-1) Then '白→純色
            RR=255-SX*(X-NC+1)*Y/NL
            GG=255
            BB=255-255*Y/NL
        Else '純色→黒
            RR=( 255-SX*(X-NC+1) )*(NL*2-Y)/NL
            GG=255*(NL*2-Y)/NL
            BB=0
        End If
    ElseIf X<=(3*NC-1) then '緑→シアン
        If Y<=(NL-1) Then '白→純色
            RR=255-255*Y/NL
            GG=255
            BB=255-Y/NL*(255-SX*(X-NC*2+1))
        Else '純色→黒
            RR=0
            GG=255*(NL*2-Y)/NL
            BB=SX*(X-NC*2+1)*(NL*2-Y)/NL
        End If
    ElseIf X<=(4*NC-1) then 'シアン→青
        If Y<=(NL-1) Then '白→純色
            RR=255-255*Y/NL
            GG=255-SX*(X-NC*3+1)*Y/NL
            BB=255
        Else '純色→黒
            RR=0
            GG=( 255-SX*(X-NC*3+1) )*(NL*2-Y)/NL
            BB=255*(NL*2-Y)/NL
        End If
    ElseIf X<=(5*NC-1) then '青→マゼンタ
        If Y<=(NL-1) Then '白→純色
            RR=255-Y/NL*(255-SX*(X-NC*4+1))
            GG=255-255*Y/NL
            BB=255
        Else '純色→黒
            RR=SX*(X-NC*4+1)*(NL*2-Y)/NL
            GG=0
            BB=255*(NL*2-Y)/NL
        End If
    ElseIf X<=(6*NC-1) then 'マゼンタ→赤
        If Y<=(NL-1) Then '白→純色
            RR=255
            GG=255-255*Y/NL
            BB=255-SX*(X-NC*5+1)*Y/NL
        Else '純色→黒
            RR=255*(NL*2-Y)/NL
            GG=0
            BB=( 255-SX*(X-NC*5+1) )*(NL*2-Y)/NL
        End If
    End If
    RR=Int(RR): GG=Int(GG): BB=Int(BB)
Return

'** 文字を表示する枠を描画 **
Label DrawFrame
    ForeColor=RGB(255,255,255) '枠の色:白
    FillColor=0 '塗りつぶし色:黒
    Line (2,NL*2*IntervalY+TopPos+20)-(500,NL*2*IntervalY+TopPos+130),RGB(255,255,255),2
    CurrentY=NL*2*IntervalY+TopPos+25
Return


・階乗


'##########################
'# 階乗を求めるプログラム #
'##########################
LABEL MAIN_PROGRAM
    GOSUB GET_DATA        '変数Nに対象の数値を読み込む
    GOSUB FACTORIAL       '階乗を求める
    PRINT "N!=",N;""      '画面に出力
    GOSUB ENDorCONTENUE   '終了判定
    GOTO MAIN_PROGRAM     '続行   
END

LABEL GET_DATA
    CLS
    PRINT "階乗を求めるプログラムです。Nに1以上の整数を入力して下さい。"
    INPUT N                        
    Nr=N%1                           '丸め
    IF N<=0 THEN GOTO UNDER_ERROR    'エラー処理(0以下を入力したとき)
    IF N<>Nr THEN GOTO FORMAT_ERROR  'エラー処理(非整数を入力したとき)
RETURN

LABEL UNDER_ERROR
    PRINT "0以下の数の階乗は求められません。"
    GOTO GET_DATA
'END

LABEL FORMAT_ERROR
    PRINT "整数を入力して下さい。"
    GOTO GET_DATA
'END

LABEL FACTORIAL '階乗を求める
    A=N
    LABEL LOOP
    IF A=1 THEN GOTO EXIT
        A=A-1
        N=N*A
    GOTO LOOP
    LABEL EXIT
RETURN

LABEL END_PROGRAM '終了判定
    LABEL ENDorCONTENUE
        PRINT "終了:0 続行:1"
        INPUT COMMAND
        IF (COMMAND<0) OR (COMMAND>1) THEN GOTO ENDorCONTENUE
        IF COMMAND=0 THEN END 'プログラム終了
RETURN


・さいころ


'################################
'# さいころを表示するプログラム #
'################################
LABEL MAIN_PROGRAM
    I=0
    LABEL LOOP
        A=RND()*6%1+1
        GOSUB DRAW_CUBE
        I=I+1
    IF I<10 THEN GOTO LOOP
    GOSUB END_PROGRAM
    CLS
    GOTO MAIN_PROGRAM
'END

LABEL END_PROGRAM
    CurrentY=130
    ForeColor=RGB(255,255,255)
    LABEL ENDorCONTENUE
    PRINT "続行:0 終了:1"
    INPUT COMMAND
    IF (COMMAND<0) OR (COMMAND>1) THEN GOTO ENDorCONTENUE
    IF COMMAND=1 THEN END 'プログラム終了
RETURN

LABEL DRAW_CUBE
    FillColor=RGB(255,255,255)
    Line(20,20)-(120,120),RGB(255,255,255),2
   
    IF A=1 THEN GOSUB DRAW_1
    IF A=2 THEN GOSUB DRAW_2
    IF A=3 THEN GOSUB DRAW_3
    IF A=4 THEN GOSUB DRAW_4
    IF A=5 THEN GOSUB DRAW_5
    IF A=6 THEN GOSUB DRAW_6
    WAIT(100)
RETURN

LABEL DRAW_1
    ForeColor=RGB(255,0,0)
    CurrentX=63: CurrentY=63
    PRINT "●"
RETURN

LABEL DRAW_2
    ForeColor=0
    CurrentX=46: CurrentY=46
    PRINT "●"
    CurrentX=79: CurrentY=79
    PRINT "●"
RETURN

LABEL DRAW_3
    ForeColor=0
    CurrentX=38: CurrentY=38
    PRINT "●"
    CurrentX=63: CurrentY=63
    PRINT "●"
    CurrentX=88: CurrentY=88
    PRINT "●"
RETURN

LABEL DRAW_4
    ForeColor=0
    CurrentX=38: CurrentY=38
    PRINT "●"
    CurrentX=88: CurrentY=88
    PRINT "●"
    CurrentX=88: CurrentY=38
    PRINT "●"
    CurrentX=38: CurrentY=88
    PRINT "●"
RETURN

LABEL DRAW_5
    ForeColor=0
    CurrentX=38: CurrentY=38
    PRINT "●"
    CurrentX=88: CurrentY=88
    PRINT "●"
    CurrentX=88: CurrentY=38
    PRINT "●"
    CurrentX=38: CurrentY=88
    PRINT "●"
    CurrentX=63: CurrentY=63
    PRINT "●"
RETURN

LABEL DRAW_6
    ForeColor=0
    CurrentX=38: CurrentY=38
    PRINT "●"
    CurrentX=88: CurrentY=88
    PRINT "●"
    CurrentX=88: CurrentY=38
    PRINT "●"
    CurrentX=38: CurrentY=88
    PRINT "●"
    CurrentX=38: CurrentY=63
    PRINT "●"
    CurrentX=88: CurrentY=63
    PRINT "●"
RETURN


・ニュートン法


'###################################
'# ニュートン法を用いて√3を求める #
'###################################
LABEL MAIN_PROGRAM
    GOSUB GET_DATA       'データを取得
    GOSUB NEWTON         '演算と表示
    GOSUB ENDorCONTENUE  '終了判定
    GOTO MAIN_PROGRAM    '続行
'END

LABEL GET_DATA
    CLS
    PRINT "ニュートン法を用いて√3を求めるプログラムです。"
    PRINT "Xの初期値として、0より大きな値を代入して下さい。"
    PRINT "ただし、極端な値を入れるときれいに収束しません。"
    INPUT "X0=";X '初期値をXに代入
    IF X<=0 THEN GOTO GET_DATA  
RETURN

LABEL NEWTON
    '値を徐々に収束させていく
    N=1
    LABEL LOOP
        N=N+1
        X=(X+3/X)/2
        PRINT "N=",N,"   X=",X;""
    IF N<10 THEN GOTO LOOP
RETURN

LABEL END_PROGRAM '終了判定
    LABEL ENDorCONTENUE
        PRINT "終了:0 続行:1"
        INPUT COMMAND
        IF (COMMAND<0) OR (COMMAND>1) THEN GOTO ENDorCONTENUE
        IF COMMAND=0 THEN END 'プログラム終了
RETURN


・平均


'############################
'# 平均値を求めるプログラム #
'############################
'※対象の数を順に入力して行き、
'最後に-1を入力すると、
'合計と要素数と平均値を表示する。
LABEL MAIN_PROGRAM
    CLS               '画面クリア
    A=0: B=0: C=0     '変数の初期化
    GOSUB GET_DATUM   'データの取得
    GOSUB SHOW_DATUM  'データを表示
    GOSUB END_PROGRAM '終了/続行の判定
    GOTO MAIN_PROGRAM '続行
'END

LABEL GET_DATUM
    PRINT "対象の数を順に入力して下さい。"
    PRINT "最後に-1を入力すると、合計と要素数と平均値を表示します。"
    LABEL LOOP
        S="A" & C & "="
        INPUT S;A
        IF A<0 THEN GOTO EXIT '入力終了
        B=B+A
        C=C+1
    GOTO LOOP
    LABEL EXIT
RETURN

LABEL SHOW_DATUM
    PRINT "合計=",B
    PRINT "要素数=",C
    B=B/C
    PRINT "平均=",B;""
RETURN

LABEL END_PROGRAM
    LABEL ENDorCONTENUE
    PRINT "終了:0 続行:1"
    INPUT COMMAND
    IF (COMMAND<0) OR (COMMAND>1) THEN GOTO ENDorCONTENUE
    IF COMMAND=0 THEN END 'プログラム終了
RETURN


・べき乗


'#########################
'# X^Nを求めるプログラム #
'#########################

LABEL MAIN_PROGRAM
    GOSUB GET_DATUM
    GOSUB POWER
    GOSUB ENDorCONTENUE
    GOTO MAIN_PROGRAM
'END

LABEL GET_DATUM
    CLS
    PRINT "X^Nを求めるプログラムです。"
    PRINT "Xに対しては任意の実数を、Nに対しては自然数を入力して下さい。"
    INPUT X
    INPUT N
    Nr=N%1 '小数点以下切り捨て
    IF (N<>Nr) OR (N<1) THEN GOTO GET_DATUM  'エラー処理(Nが整数でないか、1未満の時)
RETURN

LABEL POWER
    A=1
    tmpX=X
    LABEL LOOP
    IF A=N THEN GOTO END_LOOP
        A=A+1
        tmpX=tmpX*X
    GOTO LOOP
    LABEL END_LOOP
    PRINT "X^N=",tmpX;""
RETURN

LABEL END_PROGRAM '終了判定
    LABEL ENDorCONTENUE
        PRINT "終了:0 続行:1"
        INPUT COMMAND
        IF (COMMAND<0) OR (COMMAND>1) THEN GOTO ENDorCONTENUE
        IF COMMAND=0 THEN END 'プログラム終了
RETURN


・放物線


'#############################
'# Y=AX^2+BX+C のグラフを描く#
'#############################
'Lineに渡すオプション
BF=2  'BR: 中を塗りつぶす

'色
RR=255: GG=RR*256: BB=GG*256

LABEL INIT '初期化
    EXPRESSION_POS=0  '式の表示位置:一番上
    CLS               '画面をクリア
    GOSUB DRAW_AXIS   '軸を描画
    GOTO MAIN_PROGRAM
'END

LABEL MAIN_PROGRAM
    GOSUB GET_DATUM   'データの取得
    GOSUB DRAW_AXIS   '軸の描画
    GOSUB DRAW_GRAPH  'グラフの描画
    GOSUB END_PROGRAM '終了/続行の判定
    GOTO MAIN_PROGRAM '続行の場合もう一度繰り返す
'END

LABEL DRAW_WINDOW '文字を書き出す枠を描画
    CURRENTY=415
    FILLCOLOR=RGB(0,0,127)
    LINE (0,410)-(600,565),RR+GG+BB,BF
RETURN

LABEL GET_DATUM 'データを収集
    '窓を描画
    GOSUB DRAW_WINDOW

    PRINT "y=Ax^2+Bx+C のグラフを描画します。A,B,Cを順に入れて下さい。"

    '係数
    INPUT "A="; A
    INPUT "B="; B
    INPUT "C="; C

    '色
    COLOR=0
    PRINT "0:赤 1:緑 2:青 3:シアン 4:マゼンタ 5:黄 6:白"
    INPUT "色を入力して下さい。";COLOR_INDEX
    IF (COLOR_INDEX=0) OR (COLOR_INDEX=4) OR (COLOR_INDEX=5) OR (COLOR_INDEX=6) THEN COLOR=RR
    IF (COLOR_INDEX=1) OR (COLOR_INDEX=3) OR (COLOR_INDEX=5) OR (COLOR_INDEX=6) THEN COLOR=COLOR+GG
    IF (COLOR_INDEX=2) OR (COLOR_INDEX=3) OR (COLOR_INDEX=4) OR (COLOR_INDEX=6) THEN COLOR=COLOR+BB

    'グラフを表示する式を画面に書き出す
    CURRENTX=10: CURRENTY=0
    GOSUB SET_POS: FORECOLOR=COLOR
    PRINT "y=",A,"x^2+",B,"X+",C
    FORECOLOR=RR+GG+BB
RETURN

LABEL DRAW_AXIS '軸を描画
    BEF_Y_POS=CURRENTY 'プロンプトの文字の出力位置を待避

    'X軸を引く
    LINE(0,200)-(600,200)
    CURRENTX=593: CURRENTY=203
    PRINT "X"

    'Y軸を引く
    LINE (300,0)-(300,400)
    CURRENTX=290: CURRENTY=0
    PRINT "Y"

    '原点
    CURRENTX=288: CURRENTY=203
    PRINT "O"
    CURRENTY=BEF_Y_POS '待避しておいた値を戻す
RETURN

LABEL DRAW_GRAPH 'グラフを描画
    X=-29: Y=0   
    BefX=-30: BefY=-( ( A*(-30)*(-30)+B*(-30)+C ) )
    LABEL LOOP
        X=X+0.1
        Y=-( ( A*(X*X)+B*(X)+C ) )
        IF (Y>-120) AND (Y<30) THEN LINE (BefX*10+300,BefY*10+200)-(X*10+300,Y*10+200),Color
        BefX=X: BefY=Y
    IF X<30 THEN GOTO LOOP
RETURN

LABEL END_PROGRAM '終了判定
    LABEL ENDorCONTENUE
        GOSUB DRAW_WINDOW '窓を再描画
        PRINT "続行:0 画面をクリアして続行:1 終了:2"
        INPUT COMMAND
        IF (COMMAND<0) OR (COMMAND>2) THEN GOTO ENDorCONTENUE
        IF COMMAND=2 THEN END 'プログラム終了
        IF COMMAND=1 THEN GOTO INIT
        EXPRESSION_POS=EXPRESSION_POS+1 '式を吐き出す位置をインクリメント
RETURN

LABEL SET_POS '式を書く位置に移動
    I=0
    LABEL LOOP2
    IF I=EXPRESSION_POS THEN GOTO EXIT
        PRINT ""
        I=I+1
    GOTO LOOP2
    LABEL EXIT
RETURN