I-ichirow Suzuki _/_/_/_/_/_/_/_/_/_/_ URL : www.kg-group.com Top Page Mail : suzuki@kg-group.com /_/_/_/_/_/_/_/_/_/_/_/_ ICQ : 3743158 Windows95対応 ////////////////////////////////////////////////////////////////////////////// //////////////////////// コンピュータとプログラム <> プログラミングの前に プログラム・・・・それは一体何? コンピュータの世界で使われている物らしいのだが・・・・・ プログラムとは一般的にはコンピュータに行わせる仕事の内容を記述する物と考えられ ているようです。 #! コンピュータの仕組み コンピュータの中心的な役割を果たしているのはCPUとメモリの2つです。 # CPU(Central Processing Unit) コンピュータの中でいわば司令塔の役割を担っているのがCPUです。 コンピュータが行う全ての動きは、このCPUを介しています。 # Memory データを電気的に記憶する装置の事です。 CPUはこのメモリ上に置かれたプログラムやデータを逐一読みながら司令塔の 役割を果たしています。 ある仕事に対する「命令」が出されると、CPUはその仕事の「作業手順」が記 されたプログラムをメモリ上から探し出し、その内容に従ってコンピュータの 各部に指示を送り仕事を行います。 この単純な作業を高速に繰り返すのがコンピュータの本質です。 #! CPUは0と1しか解らない 通常数を書き留める時は0〜9の10種類の数字を使います。(10進法) しかし、10進法で表された数を0と1の2種類の記号の組み合わせだけで表現す る事も可能です。 0 → 0 1 → 1 2 → 01 3 → 11 4 → 001 5 → 010 15 → 1111 56 → 110010 100 → 1100100 この様に0と1だけで表現する方法を2進法と言い、その数を2進法と呼びます。 CPUは2進数によるデータしか処理出来ないのです。実際には1と0の代わりに電 気のON/OFFで数を表現し、その電気的な状態をデータとしてメモリ上に記憶し ます。 #! ビットとバイト ビット(bit)と言うのは先ほどの0と1のように2つの内どちらか一方の状態を示 す物です。 例えば電球では点灯・消灯の2つの状態を表せますから、電球1個で1ビットの 情報を持っていると見なせます。 1ビットは0と1の2種類の状態しか表すことが出来ません。 1ビットを8つまとめて1バイトと言います。 1ビットは2通りの情報を表現出来ます。 2ビットは 2 X 2 = 4通り 3ビットは 2 X 2 X 2 = 8通り 4ビットは 2 X 2 X 2 X 2 = 16通り 1バイトつまり8ビットは 2 X 2 X 2 X 2 X 2 X 2 X 2 X 2 = 256通りとなります。 つまり1バイトは256通りの情報を表現出来る事が解ります。 #! Basicの役割 プログラム用の言葉を使ってコンピュータに仕事をさせるための命令(プログ ラム)を記述します。1と0に置き換える仕事は他の誰かに任せてしまえば良い のです。この仕事を担っているのがプログラミング言語と呼ばれる物で「Basi c」はその内の1つです。 BASICの文法で書かれたプログラムを元に ↓ BASICが加工します ↓ コンピュータが理解出来るデータをメモり上に作成 /////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// BASICの世界へ <> これがBASICプログラム ######################################################### 10 PI =3.141593 20 RAD = 40000 /2 /PI 30 INPUT "標高[m] = "; HIGHT 40 HIGHT = HIGHT / 1000 50 DISTANCE = SQR(2 * RAD * HIGHT+ HIGHT * HIGHT) 60 PRINT "距離[km] = "; DISTANCE 70 PRINT 80 END ########################################################## このプログラムは標高を入力すると水平線までの距離を計算して表示する物です。 #! プログラムの1行1行を文と言います。 これは英語を元にした言葉を使って記述するのですが、あらかじめ決められた 言葉で記述する文と自分で自由に決める文とがあります。 #! 変数や関数と呼ばれる物も使います。 #! プログラムとは、これらを使って記述して行くのですが、単に記述しただ けではコンピュータは何もしてくれません。 実際に動かす(実行)ためには、RUNという命令が必要です。 #! RUNのような命令をコマンドと言います。 ------------------------------------------------------------------------------ <>簡単なメッセージの表示 10 PRINT "Hello Basic!!" 20 END を記述して実行して下さい。 RUNとコマンドで入力してEnterキーを押すかそれぞれのアプリケーションの 実行ボタンをクリックして下さい。 これから先はこの一連の作業を 10 PRINT "Hello BASIC!!" 20 END RUN Hello BASIC! と明記する事にします。 前のプログラムの"PRINT"と言うのは画面に何かを表示させる為の命令なのです。これを PRINT文と言います。 ------------------------------------------------------------------------------ <>ファイルの保存(SAVEコマンド) 記述したばかりのプログラムはメモリ上に電気的に存在しているだけですので電源を切 ると消えてしまいます。これは電卓のメモリの内容が電源をOFFにすると消えてしまう のと同じです。 せっかく作成したプログラムですから、保存(SAVE)して置く事にしましょう。 #! SAVEする為にはまず名前を付けます。 プログラムに名前を付けて置く事で簡単に探し出す事が出来ます。 前の説で作成したプログラムには"HORIZON"という名前を付けて保存する事に します。Windows互換のBASICアプリケーションの場合はファイルメニューの名 前を付けて保存で同じ事が出来ます。 ################################## SAVE "C:\MyProgram\HORIZON" ################################## CドライブのMyProgramフォルダの中にHORIZONというファイル名で保存しました #! ファイル名は8文字以内 #! アルファベットの大文字と小文字は区別されない #! "."(ピリオド)以降には拡張子が使用可能 #! BASICプログラムには自動的に拡張子 *.bas が付けられる ------------------------------------------------------------------------------- <>ファイルの一覧(FILESコマンド) FILESコマンドを使ってSAVEしたファイルを一覧する事が出来ます。 ################################# FILES C:\MyProgram <DIR> HORIZON BAS 389 98/08/29 Ok ################################# ------------------------------------------------------------------------------ <>ファイルの読み込み(Loadコマンド) SAVEされたファイルを読み込むには次の様にします。 先ほどのHORIZONを読み込みます。拡張子を入力する必要はありません。 ################################# LOAD "HORIZON" ################################# SAVEもLOADなどもRUNと同じくプログラムその物の扱いをコンピュータに支持するコマ ンドです。 またLOADで読み込まれたデータの内容を確認するには次の様に入力します。 ################################# LOAD "HORIZON" Ok LIST 10 PRINT "Hello BASIC!" 20 END Ok ################################# ------------------------------------------------------------------------------- <>プログラムを消す(NEWコマンド) プログラムを入力する時も直前のプログラムがメモリ上に残っていると思わぬ勘違いを 起こす事があります。それらは消してしまった方が安全です。 NEWと入力するとメモリ上にあるプログラムは消えます。 ################################ NEW ################################ /////////////////////////////////////////////////////////////////////////////// ///////////////////////////// 様々な変数 <> 変数(Variable)で計算する コンピュータでは膨大な数のメモリを使い保管して活用します。あまりに多くのメモリ があるので名前を付けて区別する事になっています。 #! 名前を付けたメモリのことを変数、その名前を変数名と呼びます。 #!変数の命名規則 変数名の先頭は英字に限定 2文字以後は英字、数字、ピリオドがしよう可能 変数名の長さは最大40文字 具体的には高さのデータを扱うなら『HEIGHT』と言う様に内容を示す様な名前 にすると良いでしょう ----------------------------------------------------------------------------- <>変数に値を代入する 変数にデータを格納します。この作業を代入と言い、数式に似た代入文の形で行います A = 0 は Aは0と等しいと言う意味ではありません。 #! 0 という値を変数Aに代入する と言う意味です。 #! 代入文における[ = ]の意味は等しいと言う事を意味するのでは無いのです #! 右辺の値は左辺の値と比べてどうだ・・・と言う意味です。 A = 0 Aという変数名の変数に0を代入する A = 12 * 34 Aという変数名の変数に12 * 34 の計算結果を代入する A = A + 1 Aという変数名の変数に Aの値に1を加えて代入する S$ = "Hello!" S$という変数名の変数に文字を代入する ################################ 10 A = 12 * 34 20 PRINT A 30 END ################################ 12 X 34を計算し、結果を変数Aに保管する 変数Aの内容を画面に表示する #! ちなみに * をアスタリスクと呼びます。 #! かけ算の ”掛ける”ですね。 ################################ 10 A = 12 * 34 15 A = A + 56 * 78 20 PRINT A 30 END RUN 4776 Ok ################################ ------------------------------------------------------------------------------ <> 計算式に変数を使う ################################ 10 RAD = 40000 / 2 / PI 20 PRINT RAD 30 END ################################ #! / わり算です。スラッシュと言う記号です。 40000を2で割り、さらに変数PIに保管してある数値で割る。 その結果を変数RADに代入する。と言う意味の記述になります。 ----------------------------------------------------------------------------- <> 関数 例えば、電卓にはルートキーがあり、一発で平方根を求める事が出来ます。 BASICにも同じ様な働きがあります。 入力 → 関数 → 出力 4 → ルート → 2 三角関数 SIN(1) 1に対するSINを出力 自然体数関数 LOG(10) 10に対するLOGを出力 平方根関数 SQR(4) 4の平方根を出力 <>SQR関数 #! 電卓ではルートキーで平方根を算出出来ますが、BASICでは次の様にして平 方根(Square-root)を求めます。 ################################ 10 R = SQR(4) 20 PRINT R 30 END RUN 2 Ok ############################### さらにPRINT文を次の様に編集してみます。 ############################## 10 R = SQR(4) 20 PRINT "平方根は" ; R ; "です" 30 END RUN 平方根は 2 です Ok ############################## <> キーボード入力 #! キーボードからデータを入力し、それをプログラムの中で使える様にする 為にはINPUT文を使います。 INPUT "A = "; A これを使うと下記の様にメッセージが表示され、ユーザーの入力を待つ状態になります A = ? #! INPUT文を使うとプロンプトが表示されて入力待ち ############################### 10 INPUT " A = " ;A 20 R = SQR(A) 30 PRINT "平方根は" ; R ; "です" 40 END RUN A = ? 3 << 3を入力した 平方根は 1.732051 です ############################### ------------------------------------------------------------------------------ <>水辺線までの距離 ############################## 10 PI = 3.141593 20 RAD = 40000 /2 / PI 30 INPUT "標高[m] = " ; HIGHT 40 HIGHT = HIGHT / 1000 50 DISTANCE = SQR(2 * RAD * HIGHT + HIGHT * HIGHT) 60 PRINT "距離[km] = " ;DISTANCE 70 PRINT 80 END RUN 標高[m] = ? 100 << 100を入力 距離[km] = 35.6826 Ok ################################ ////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 様々な変数 2 <> 変数型とデータ #! 整数変数(2バイト)高速でメモリ消費が少ない #! 単精度変数(4バイト)速度もメモリ消費も中間的な性格 #! 倍精度変数(8バイト)15〜16桁まで扱えるがメモリ消費が多く速 度も落ちる PI# = 3.14159265358979 Ok PI! = 3.14159265358979 Ok PI% = 3.14159265358979 Ok PRINT PI# 3.14159265358979 << 倍精度変数では15桁表示された Ok PRINT PI! 3.14159 << 単精度変数では6桁しか表示されない Ok PRINT PI% 3 << 整数変数では小数点以下は表示されない Ok #! この様に % ! # の3種の記号を使うだけで変数の代入値が全く違う物にな る訳です。 #! 今後のプログラムには少数が発生しない変数には[%]を付けて、整数変数と して用いることにします。 %を使う事から始めて変数の方への違いへの理解を深めて行きましょう! ------------------------------------------------------------------------------- <> 数値と数字は別の物 例えば"5555-1234"という電話番号があるとします。でもこれは決して5555から 1234を引き算するという意味ではありません。ところが今迄学んだ式でこれを 表記するとコンピュータは引き算してしまうのです。そこでこういう問題を解 決する為に文字列変数の登場となります。 #! "Hello!"のように ""(ダブルクォーテーション)で囲む事によって囲まれ た文字列をStringと認識します。 #! 計算を目的とした数値変数と文字を扱うのが目的の文字列変数を区別しま しょう ############################### 10 S$ = "Hello!" 20 PRINT S$ 30 END ############################### ---------------------------------------------------------------------------- <>数値と数字の違い ストリングには数字(数値では無く)も含めることが出来ます。 ############################### 10 A$ = "5555-1234" 20 A = 5555 - 1234 30 PRINT A$ 40 PRINT A 50 END RUN 5555-1234 -4321 Ok ############################### ----------------------------------------------------------------------------- <>ストリングの連結 ストリングは連結する事が出来ます #! 実務的なプログラムには文字列を連結する機能はなくてはならない物 です。例えば住所録等で、住所と名前を繋げたりする場合にどうしても必要な 機能です。 ############################## 10 A$ = "ABC" 20 B$ = "DEF" 30 C$ = A$ + B$ 40 PRINT "C$ = " ; C$ 50 END RUN C$ = ABCDEF Ok ############################ ----------------------------------------------------------------------------- <>数値と数字の相互変換 ストリングとして扱われている数字を計算に使用する必要に迫られたとします。 そういう場合に備えて数値と数字は # STR$関数 # VAL関数 を使って相互に変換する事が出来ます。 数値 → STR$関数 → 数字 数字 → VAL関数 → 数値 ############################## 10 A = 7 20 B$ = STR$(A) 変数Aの内容をストリング に変換 30 C$ = "00" + B$ B$を00に連結してC$に保管 40 D = VAL(C$) C$を数値に戻す 50 PRINT "C$ = " ;C$ 60 PRINT "D = " ;D 70 END RUN C$ = 00 7 C$は文字列型変数なので、先頭に00が表示された D = 7 Dは数値変数なので、単に7と表示されるだけ Ok ############################## ----------------------------------------------------------------------------- <>NULLストリング NULLストリングは2つの""で囲んだ物ですが2つの""の間に何も囲んでいないストリン グもあります。これを # NULLストリング と言います。 N$ = "" 数値変数の初期値「0」に相当します。 NULLとは「何もない」「空の」という意味です。 ------------------------------------------------------------------------------- <>配列 配列とは(Array,配列変数とも言う)とは変数の仲間です。 次の様な()を伴っており、()の中には添え字が入ります。 # 変数名( 添え字 ) 月 1月 2月 3月 4月 日数 31 28 31 30 を配列を使って記述すると MONTH(1) = 31 MONTH(2) = 28 MONTH(3) = 31 MONTH(4) = 30 となります。 ############################# 10 MONTH(1) = 31 一つ一つを配列の要素と呼びます。 20 MONTH(2) = 28 30 MONTH(3) = 31 40 FOR I% = 1 TO 3 ループ変数は正数変数 50 PRINT MONTH(I%) 配列の添え字は変数で指定出来る。 60 NEXT I% 70 END ############################# ------------------------------------------------------------------------------ <>配列の宣言 配列は普通の変数と違い最初に配列を使いますと言う「宣言」をしなければなりません 宣言はDIM文によって行います。 DIM MONTH(12) この文は配列MONTH()について添え字の最大値が12までは使える様にすると言う意味です また、仮にDIM文を省略しても自動的に10の添え字迄の配列は宣言無しで使える事にな っています。 # 添え字の始まりは0から数え始めます。 /////////////////////////////////////////////////////////////////////////////// ////////////////////////////// 流れを制御する <> ループの動き これまでのプログラムは記述の内容を1行目から最後の行迄順に実行するという単純な 流れの物でした。 ループという方法を使うとプログラムのある部分を繰り返し実行させる事が出来ます。 これまでの行番号に従って行う一方通行の処理の流れを順次処理と言います。 順次処理に対し、プログラムの流れを変える物として、繰り返しと分岐があります。 #! WHILE 文・・・・WEND 文 繰り返しの始まりと終わりを示す為にBASICではWHILEとWENDを使います。 #! 条件式 繰り返し処理の実行はWHILE文に条件式という物を記述して、その内容に合致 するかどうかで決定されます。 # WHILE <条件式> #! 真と偽 ある変数が条件式に当てはまる事を「条件式が成り立つ」あるいは「条件式我 身(TRUE)である」と言います。逆に条件式に当てはまらない事を「条件式が 偽(FALSE)である」と言います。 #! 無限ループ プログラム自身でプログラムを終了する手続きを持たないループを無限ループ と言います。言葉の通り条件式が合致しなければ永遠にその作業は繰り返され ます プログラムは本来何らかの操作で終了出来るように作成するべきです = 等しい <> 等しくない < より小さい > より大きい <= 以下である >= 以上である #! インデントについて プログラムの見やすさにも配慮してみます。 ループの内部は以下の様に記述して置いた方が解り安いでしょう。 TABキーを利用する事で綺麗に揃える事が出来ます。 #! WHILE 1 について 1 は 真である事を示します。 0 は 偽である事を示します。 While 1は 真であり続ける限りWHILE文を実行し続けると言う意味になります 下のプログラムは無限ループとなります。 STOPキーを押して脱出して下さい。 ################################ 10 PI =3.141593 20 RAD = 40000 /2 /PI 25 WHILE 1 30 INPUT "標高[m] = " ;HIGHT 40 HEIGHT = HEIGHT / 1000 50 DISTANCE = SQR(2 * RAD * HEIGHT + HEIGHT * HEIGHT) 60 PRINT "距離"[km] = " ; DISTANCE 70 PRINT 75 WEND 80 END ################################# 70行目に挿入したPRINTは1行空けてくれる物です。 1回目の計算結果と2回目の計算結果との間に1行空白業を挿入する物です。 ------------------------------------------------------------------------------ <>条件式 何らかの条件に応じて処理を行う事を条件判断と言います。 # IF <条件式A> THEN <処理B> これをIF文と言います。 それでは先程のプログラムをINPUT文で0が入力されたら終了する様に改造する事にしま す。 INPUT文で0が入力されたかどうかは、入力直後に変数HEIGHTの値を調べて見れば解りま す。 そのときHEIGHT = 0 であれば終了(END)してしまえば良い訳です。 ################################ 10 PI =3.141593 20 RAD = 40000 /2 /PI 25 WHILE 1 30 INPUT "標高[m] = " ;HIGHT 35 IF HEIGHT = 0 THEN END 40 HEIGHT = HEIGHT / 1000 50 DISTANCE = SQR(2 * RAD * HEIGHT + HEIGHT * HEIGHT) 60 PRINT "距離"[km] = " ; DISTANCE 70 PRINT 75 WEND 80 END RUN 標高[m] = ? 0 0を入力 Ok ################################# ------------------------------------------------------------------------------ <>エラーメッセージ 前回のプログラムで負の数を入力するとどうなるでしょうか? RUN 標高[m] = ? -1 Illegal function call in 50 Ok これをエラーメッセージと言います。 次の様にプログラムを修正します。 35 IF HEIGHT <= 0 THEN END ################################ 10 PI =3.141593 20 RAD = 40000 /2 /PI 25 WHILE 1 30 INPUT "標高[m] = " ;HIGHT 35 IF HEIGHT <= 0 THEN END 40 HEIGHT = HEIGHT / 1000 50 DISTANCE = SQR(2 * RAD * HEIGHT + HEIGHT * HEIGHT) 60 PRINT "距離"[km] = " ; DISTANCE 70 PRINT 75 WEND 80 END RUN 標高[m] = ? 0 0を入力 Ok ################################# ------------------------------------------------------------------------------ <>書式設定 このプログラムで得られる値は、小数点以下の桁数がこんなにあっても意味がありませ ん。そこで、小数点以下は1桁だけ表示する様にしてみます。 結果を表示するPRINT文を次の様に変更するだけです。 60 PRINT USING "距離[km] = ######.#" ;DISTANCE これをPRINT USING文と言います。 "#"の記号を使って表示する桁を指定する物です。 こういう方法を書式設定と言います。 ################################ 10 PI =3.141593 20 RAD = 40000 /2 /PI 25 WHILE 1 30 INPUT "標高[m] = " ;HIGHT 35 IF HEIGHT <= 0 THEN END 40 HEIGHT = HEIGHT / 1000 50 DISTANCE = SQR(2 * RAD * HEIGHT + HEIGHT * HEIGHT) 60 PRINT USING "距離[km] = ######.#" ;DISTANCE 70 PRINT 75 WEND 80 END RUN 標高[m] = ? 0 0を入力 Ok ################################# 標高[m] = ? 3776 距離[km] = 219.3 となります。 金額などの3桁区切りなどに利用すると良いですね。 ------------------------------------------------------------------------------ <> 条件で分岐する IF文による条件判断は、これまでは単純な物しか紹介していませんでしたが、ここでは 、IF文の少し進んだ使い方を解説しながら条件分岐という物について解説していきます 。 これまでのIF文は # IF HEIGHT <= 0 THEN END の様なごく簡単な条件判断を行う物でした。 しかし、時には、真、偽に応じて別々の処理を行いたい場合もあります。 つまり、条件が成り立つ時は「Aの処理」、成り立たなければ「Bの処理」という調子 です。 こう言う複雑な処理を実現する為にIF文にはELSE節というオプションがあります。 # IF <条件式> THEN [真の時の実行文] ELSE [偽の時の実行文] ELSE節は「条件式が偽の場合」に限り、特定の処理を行わせる時に使います。 ELSE節に対して、これまでに登場してきたのはTHEN節で「条件式が真の場合」にのみ特 定の処理を行う物でした。 ------------------------------------------------------------------------------- <> GOTO文 プログラムの実行中に他の行にジャンプする事を分岐と言います。 kの分岐処理を行う文としてGOTO文という物があります。 昔はこのGOTO文を多用してプログラムを作成していました。 行番号とGOTO文がBASICの代表的な側面の様に言われた物です。 しかし、1つのプログラム中でGOTO文を多用したり、長いプログラムの中でGOTO文を使 って遠くに分岐したりすると、プログラムが極めて解りにくくなります。 GOTO文は出来るだけ使わないようにすべきです。 ################################################ 10 IF C(I%)<100000 THEN GOTO *NOCARRY 真の場合は*NOCARRYにジャンプする 20 C(I%) = C(I%) - 100000 偽の時の処理 30 CARRY = 1 40 GOTO *ENDCARRY 偽の時の処理の終わり 50 *NOCARRY 真の時の処理の始まり 60 CARRY = 0 70 *ENDCARRY 真の時の処理の終わり ################################################ ------------------------------------------------------------------------------ <> 回数の決められたループ WHILE........WEND #! WHILE........WEND WHILE文に条件式を記述して置くと「条件に当てはまる間、ループを繰り返す」と言う 意味になりますが、ここで取り組んでいる「10まで数えたら・・・」の場合WHILE.... WENDループでは「〜である間」で考えます。従って「10まで数えたら」ではなく「1 0より小さい間」とします。 ################################################ 10 I = 0 20 WHILE I < 10 30 I = I + 1 40 PRINT 50 WEND 60 END RUN 1 2 3 4 5 6 7 8 9 10 Ok ################################################ ---------------------------------------------------------------------------- <> 回数が決められたループ FOR.....NEXTループ #! FOR.....NEXTループ WHILE....WENDループと条件判断を組み合わせて、作業を10回繰り返すループを作り ました。これと同じ動きをする命令があります。それはあらかじめ決められた回数を繰 り返したら自動的に終了すると言うループです。 ################################################ 20 FOR I = 1 TO 10 30 PRINT I 40 NEXT I 50 END RUN 1 2 3 4 5 6 7 8 9 10 Ok ############################################### FOR...NEXTループはこの様に、条件判断とループ下回数をカウントする機能を内蔵した ループで、FORで始まる行(FOR文)とNEXTで始まる行(NEXT文)との間を決められた回数だ け繰り返す物です。 その間、変数Iは自動的に増加して行きます。 繰り返しを何回行うかは、FOR文の[ I = 1 TO 10 ]の部分をどう記述するかによって変 わります。 ################################################ 10 A = 0 20 FOR I = 1 TO 10 30 A = A + I 40 NEXT I 50 PRINT "A = " ;A 60 END RUN A = 55 Ok ################################################ 試しに100までの合計も求めてみましょう。 20行を変更するだけです。 20 FOR I = 1 TO 100 このプログラムの実行結果は、次の様になります。 RUN A = 5050 Ok ============================================================================== POINT WHILE.....WEND # 回数は解らないが繰り返し条件が解る場合。 # ループ変数が必要な場合は自分で記述する。 FOR.....NEXT # 繰り返しの回数が解っている場合に使う。 # ループ変数が自動的に変化する。 ----------------------------------------------------------------------------- <> 降順のFOR....NEXTループ 1,2,3....と順に大きくする変化を「昇順」と言います。 10,9,8,....の様に純に小さくする変化を「降順」と言います。 FOR文にはSTEP節というオプションがあり、例えば、10,9,8,.......の様に次第に小さ くなるようにしたい場合等に「STEP増分」という形で使います。 ################################################# 10 FOR I% = 10 TO 1 STEP -1 20 PRINT I% 30 NEXT I% 40 END RUN 109 8 7 6 5 4 3 2 1 Ok ################################################## ループ変数が10から1まで、順に小さくなっている事が解ります。 つまりこれまで見てきたFOR....NextループはSetp1の動きをする物だったのです。 FOR.....NRXTループでは、STEP増分の記述を省略すると、STEP1と解釈されます。 勿論STEP1以外の場合はきちんと記述しなければなりません。 またSTEP節はこのほかにもSTEP2やSTEP-10などの使い方も出来ます。 仮に初期値が10からSTEP2とすれば 10,12,14,16....と増えていきます。 初期値200からSTEP-20とすれば、 200,180,160,140......と、減って行く事になります。 /////////////////////////////////////////////////////////////////////////////// ////////////////////////////// プログラムの構造化 <> サブルーチン あれ松虫が鳴いている チンチロチンチロチンチロチン あれ鈴虫も鳴き出した リンリンリンリンリィンリン (*くりかえし) 秋の夜長を鳴き通す ああおもしろい虫の声 キリキリキリキリキリギリス ガチャガチャガチャガチャクツワムシ 後から馬おい追いついて チョンチョンチョンチョンスイッチョン (*くりかえし) この歌を歌うときの視線の動きは(*繰り返し)から「*」に移動します。 *繰り返しの部分を歌い終わったら再び(*繰り返し)に戻り、その後に続いていきます。 この方法を使う事により、歌詞を記述するスペースを節約しながら記述に掛かる手間も 省いている訳です。 つまり効率化しているのです。 プログラムでこれと同様な効率化を実現するのが「サブルーチン」です。 2回以上同じ事を記述するならば、記述は1回だけにして、後はそれを再利用すると言 う方法です。 単に記述を効率化するだけでなくプログラムの各部の独立性を高めプログラムの作成や その再利用を容易にしようとする考え方をプログラムの構造化と言います。 サブ(Sub)は補助的なとか「副」のと言う意味です。 ルーチン(Routine)とは決まり切った仕事と言う意味です。 サブルーチンに対してそれ以外の部分をメインルーチンと言う事もあります。 歌詞カードの場合は(*繰り返し)という記述が在ればその(*繰り返し)という目印の所に ジャンプします。 Basicプログラムではこの目印の事をラベルと言います。 100 *LABEL 次にそのラベル(目印)で始まるサブルーチンの所に「ジャンプしろ」という意味の命 令がGOSUB文で次の様に使います。 GOSUB LABEL 最後に歌詞カードでは「*」という目印を付けておけば、その部分だけを歌い再び元の( *繰り返し)に戻ると言う暗黙の了解がありますが、プログラムではそうではありませ ん。 サブルーチンの中に「サブルーチンはここまで、だから元へ戻れ」という命令が必要で す。この為にRETURN文という物があります。 RETURN ----------------------------------------------------------------------------- FOR ..... NEXT で作成したサンプル ############################################# 100 PRINT "DOUYOU START" 110 PRINT "" 120 PRINT "あれ松虫が鳴いている" 130 PRINT "チンチロチンチロチンチロチン" 140 PRINT "あれ鈴虫も鳴き出した" 150 PRINT "リンリンリンリンリィンリン" 160 PRINT "" 170 FOR I = 1 TO 2 180 GOSUB *KURIKAESI 190 NEXT I 200 END 210 * KURIKAESI 220 PRINT "秋の夜長を鳴き通す" 230 PRINT "ああおもしろい虫の声" 240 PRINT "キリキリキリキリキリギリス" 250 PRINT "ガチャガチャガチャガチャクツワムシ" 260 PRINT "後から馬おい追いついて" 270 PRINT "チョンチョンチョンチョンスイッチョン" 280 PRINT "" 290 RETURN ############################################## ------------------------------------------------------------------------------ WHILE ........WEND で作成したサンプル ############################################## 100 PRINT "DOUYOU START" 110 PRINT "" 120 PRINT "あれ松虫が鳴いている" 130 PRINT "チンチロチンチロチンチロチン" 140 PRINT "あれ鈴虫も鳴き出した" 150 PRINT "リンリンリンリンリィンリン" 160 PRINT "" 170 I = 0 180 WHILE I < 2 190 I = I + 1 200 GOSUB *KURIKAESI 210 WEND 220 END 230 * KURIKAESI 240 PRINT "秋の夜長を鳴き通す" 250 PRINT "ああおもしろい虫の声" 260 PRINT "キリキリキリキリキリギリス" 270 PRINT "ガチャガチャガチャガチャクツワムシ" 280 PRINT "後から馬おい追いついて" 290 PRINT "チョンチョンチョンチョンスイッチョン" 300 PRINT "" 310 RETURN ############################################### ------------------------------------------------------------------------------ IF 文と WHILE.....WNEDを組み合わせたサンプル ############################################### 100 PRINT "DOUYOU START" 110 PRINT "" 120 PRINT "あれ松虫が鳴いている" 130 PRINT "チンチロチンチロチンチロチン" 140 PRINT "あれ鈴虫も鳴き出した" 150 PRINT "リンリンリンリンリィンリン" 160 PRINT "" 161 I = 0 162 WHILE I < 3 180 IF I < 2 THEN GOSUB *KURIKAESI ELSE GOSUB *OWARI 190 I = I + 1 191 WEND 210 END 230 *KURIKAESI 240 PRINT "秋の夜長を鳴き通す" 250 PRINT "ああおもしろい虫の声" 260 PRINT "キリキリキリキリキリギリス" 270 PRINT "ガチャガチャガチャガチャクツワムシ" 280 PRINT "後から馬おい追いついて" 290 PRINT "チョンチョンチョンチョンスイッチョン" 300 PRINT "" 310 RETURN 320 *OWARI 330 PRINT "終わりです。お疲れさまでした(^^ ;" 340 PRINT "" 350 RETURN ################################################# ////////////////////////////////////////////////////////////////////////////// //////////////////////////////// 演算ルーチンの作成 <> 加算 4 5 6 3 5 7 +)________________ 8 1 3 単純化すると・・・・ 1桁の加算 ↓ 答えが10以上なら、左隣に1を繰り上げる ↓ 答えの欄には下1桁だけを記入する この単純な作業の繰り返しで計算を行っています。 でもこの様な単純な作業の繰り返しならコンピュータの得意な仕事です。 ----------------------------------------------------------------------------- <> 変数に置き換える 4 5 6 A1 A2 A3 3 5 7 B1 B2 B3 +)________________ +)_____________________ 8 1 3 C1 C2 C3 変数に代入 A1 = 4 A2 = 5 A3 = 6 B1 = 3 B2 = 5 B3 = 7 C3 = A3 + B3 と計算されます。 次は計算結果(すなわちC3を調べて、もし「10以上」であるならば、左隣に1を繰り 上げます。 C3 < 10 の時、次の計算は C2 = A2 + B2 C3 <= 10 の時、 次の計算は C2 = A2 + B2 + 1 次に C3から10を引く1行を繰り上がりの発生するC3が10以上の場合の方に書き入れま す。 C3 = C3 - 10 となります。 これでとりあえず1桁文の計算を実行するプログラムが出来上がりました。 ########################################### 100 A1 = 4 110 A2 = 5 120 A3 = 6 130 B1 = 3 140 B2 = 5 150 B3 = 7 160 C3 = A3 + B3 170 IF C3 < 10 THEN GOTO *LABEL1 180 C3 = C3 - 10 190 C2 = A2 + B2 + 1 200 GOTO *LABEL2 210 *LABEL1 220 C2 = A2 + B2 230 *LABEL2 235 PRINT "" 240 PRINT A1, A2, A3 250 PRINT B1, B2, B3 260 PRINT C1, C2, C3 265 PRINT "" 270 END ############################################ ------------------------------------------------------------------------------ <> 複数行を加算する 下の桁から1桁ずつ加算していきます。それぞれの桁での加算ルーチンは基本的に同じ 動きをします。ここでループの動きを思い出して下さい。例えば、在る変数を3,2,1と 順に変化させる事が出来ます。 FOR I% = 3 TO 1 STEP -1 NEXT I% さらにここで「配列」を活用します。 配列は()の中の「添え字」をかえる事で次々と数値を指示する事が出来ます。 C(I%) = A(I%) + B(I%) IF C(I%) < 10 THEN の様になります。 後はFOR....NEXTループで1桁計算する度に、変数Iを3,2,1と変化させればいいはずで す。 FOR I% = 3 TO 1 STEP -1 C(I%) = A(I%) + B(I%) IF C(I%) < 10 THENGOTO * LABEL1 C2 = A2 + B2 + 1 ' この部分の処理をどうするか? NEXT I% 問題があるのは「1繰り上がって」の処理をする部分です。 これでは同じ桁で2度も加算を行うことになってしまいます。 何とか1度の計算で「加算」と「繰り上がり」をこなせないか検討します。 C3 < 10 の時、次の計算は C2 = A2 + B2 C3 >= 10 の時、次の計算は C2 = A2 + B2 + 1 C3 < 10の時は繰り上げる数が無く、左の桁(C2)には特別な値は加えません。 この「加えない」というのは、「0を加える」と言い換える事も出来ます。 C3 < 10 の時、次の計算は C2 = A2 + B2 + 0 C3 >= 10 の時、次の計算は C2 = A2 + B2 + 1 ここで変数を使ってみます。 Carry と言う変数です。Carryとは繰り上げるという意味の変数です。 C(I%) = A(I%) + B(I%) + CARRY 1を繰り上げる時はCARRY = 1 とし、その必要な無い時は CARRY = 0 にすれば問題は 解決します。 #################################################### 100 A(1) = 4 110 A(2) = 5 120 A(3) = 6 130 B(1) = 3 140 B(2) = 5 150 B(3) = 7 200 FOR I% = 3 TO 1 STEP -1 210 C(I%) = A(I%) + B(I%) + CARRY 220 IF C(I%) < 10 THEN GOTO *NOCARRY 230 C(I%) = C(I%) -10 240 CARRY = 1 250 GOTO *ENDCARRY 310 *NOCARRY 320 CARRY = 0 330 *ENDCARRY 340 NEXT I% 400 PRINT "" 410 PRINT A(1), A(2), A(3) 420 PRINT B(1), B(2), B(3) 430 PRINT "----------------------------------" 440 PRINT C(1), C(2), C(3) 450 PRINT "" 460 END ################################################### ----------------------------------------------------------------------------- <> 減算ルーチンへの展開 4 6 8 2 7 9 -)________________ 1 8 9 最初の計算は"8 -9"です。 結果は"-1"という負の数になります。 左隣の6から1を借りてきて18 - 9 とします。以下同様に計算します。 借りについてもう少し詳しく見てみます。 まず468と言う数は分解すると次の様な数の合計です。 4 X 100 6 X 10 -)____________8_X 1__ 4 6 8 すると"8-9"の計算で左の6から1を借りて来るというのは、実は"1X10 = 10"を借りて くるのだと言うことが解ります。 従って・・・・ (10 + 8) - 9 = 18 - 9 = 9 となります。 A1 A2 A3 B1 B2 B3 -)______________________ C1 C2 C3 借りる事を BORROW として計算します。 C(I%) = A(I%) - B(I%) - BORROW となります。 ################################################### 100 A(1) = 4 110 A(2) = 6 120 A(3) = 8 130 B(1) = 2 140 B(2) = 7 150 B(3) = 9 200 FOR I% = 3 TO 1 STEP -1 210 C(I%) = A(I%) - B(I%) - BORROW 220 IF C(I%) >= 0 THEN GOTO *NOBORROW 230 C(I%) = C(I%) + 10 240 BORROW = 1 250 GOTO *ENDBORROW 310 *NOBORROW 320 CARRY = 0 330 *ENDBORROW 340 NEXT I% 400 PRINT "" 410 PRINT A(1), A(2), A(3) 420 PRINT B(1), B(2), B(3) 430 PRINT "----------------------------------" 440 PRINT C(1), C(2), C(3) 450 PRINT "" 460 END #################################################### ////////////////////////////////////////////////////////////////////////////// //////////////////////// プログラムの修正 <> デバッグ プログラムの誤り(ミス)のことをバグ(BUG)と言います。 バグを見つけ出す事をデバッグ作業と言います。 Bugとは無視のことで転じて欠陥を意味します。 デバッグとはバグを取り除くという意味です。プログラムから小さな誤りを見つけ出す 作業が虫取りに似ていることからでバッグと言われています。 文法上のバグ (ランタイムエラーなどBASICから何らかのメッセージがあります。) 論理的バグ (プログラムが途中で停止する事なく最後まで実行されるのに結果が おかしい) 論理的なバグの場合は自分で見つけ出さないといけません。 /////////////////////////////////////////////////////////////////////////////// ///////////////////////// グラフィックス <> グラフィックスの作成 画面はドットの集合 グラフィックスを学ぶ為には、パソコンの画面が「点」(ドット)の集まりで構成され ている事を理解する必要があります。 一般的には 横 640 X 縦 400 ドットで構成されています。 コンピュータではこのドットの1つをオンにしたりオフにしたりすると言う事でグラフ ィックスを操作します。 また、黒、青、赤、紫、緑、水色、黄、白 の8つの色を制御することが出来ます。 これらの点や線、そして色を使ってコンピュータは文字や数字の他、図形やイラストを 表現する事が出来ます。 ################################################################## 100 CLS 3 110 SCREEN 3 120 XMIN = 0 130 YMIN = 0 140 XMAX = 639 150 YMAX = 399 160 LSTEP = 30 170 XSTEP = (XMAX - XMIN) / LSTEP 180 YSTEP = (YMAX - YMIN) / LSTEP 190 FOR I% = 0 TO LSTEP 200 LINE (XMIN + XSTEP * I%, YMAX) - (XMAX, YMAX - YSTEP * I%) 210 LINE (XMAX - XSTEP * I%, YMIN) - (XMAX, YMAX - YSTEP * I%) 220 LINE (XMAX - XSTEP * I%, YMIN) - (XMIN, YMIN + YSTEP * I%) 230 LINE (XMIN + XSTEP * I%, YMAX) - (XMIN, YMIN + YSTEP * I%) 240 NEXT I% 250 END ################################################################## 100 CLS 3 <> 図形を消去する(CLS文) 複数の図形をまとめて消すときにはCLS文を使います。 CLS 1 テキスト画面(文字)だけを消す CLS 2 グラフィック画面だけを消す CLS 3 両方消す ------------------------------------------------------------------------------ 110 SCREEN 3 <> 画面モード指定です 0 カラーモード 640X400 1 白黒モード 640X400 2 高分解白黒モード 640X400 3 高分解カラーモード 640X400 画面一番左上の隅の座標は (0, 0)となります。 画面一番右下の隅の座標は (639, 399)となります。 (640, 400)となりそうな物ですが、0 から始まっているので(639, 399)となります。 (X, Y) X = 横方向 Y = 縦方向 ----------------------------------------------------------------------------- <> 点を描く 画面に点を描くには、特定のドットをオンにします。 このためにPSET文があります。つまりドットが点にになって見えます。 PSET(100, 200) このドットをオフにする(すなわち点を消す)にはPRESET文を使います。 PRESET(100, 200) ----------------------------------------------------------------------------- <> 直線を描く 簡単に直線を描くためにLINE文があります。次の例は座標(100, 200)と(200, 100)を結 ぶ直線を描きます。 LINE(100, 200) - (200, 100) 始点と終点を指定することで直線を描くことが出来ます。 また、一度描いた直線を消すには、次の様に末尾に", 0"を記述します。 LINE(100, 200) - (200, 100), 0 0 黒 1 青 2 赤 3 紫 4 緑 5 水色 6 黄 7 白 の色指定が出来ます。 , 0は黒ですから直線を黒い画面に黒で描けば消去された様に見える訳です。 ------------------------------------------------------------------------------ <> 四角形を描く LINE文は直線だけでなく、以下の様に四角形を描く事も出来ます。 LINE文で書く四角形の事を「箱(BOX)」と言います。 LINE(200, 100) - (100, 200), , B 赤い箱を描きたければ LINE(200, 100) - (100, 200),2 , B となります。 ------------------------------------------------------------------------------ <> 塗りつぶし LINE文は内部を塗りつぶした四角形を描く事も出来ます。 LINE(200, 100) - (100, 200), , BF となります。 これも消去するには LINE(200, 100) - (100, 200),0 , BF ------------------------------------------------------------------------------- <> 円を描く 円を描くためにCIRCLE文があります。 CIRCLE文では書きたい円の中心と長さ(ドット単位)を指示します。 次の例では座標(100, 100)を中心に半径50ドットの円を描きます。 CIRCLE(100, 100), 50 これを消去するときも CIRCLE(100, 100), 50, 0 となります。 CIRCLE(中心座標), 半径, 色の指定, 開始角度, 終了角度, 比率 ----------------------------------------------------------------------------- <> 円の塗りつぶし CIRCLE文はLINE文と違いそれ自体で内部を塗りつぶす事は出来ません。 内部を塗りつぶした円を描く時はPAINT文を使います。 CIRCLE(100, 100), 50 PAINT (100, 100) となります。 <> 1秒おきに動き続けグラフィックカラーを変化させるプログラムです。 #################################################### 100 CLS 3 110 SCREEN 3 300 DIM CCODE(7) 310 FOR I% = 0 TO 7 320 CCODE(I%) = I% 330 NEXT I% 410 WHILE 1 420 XMIN = 0 430 YMIN = 0 440 XMAX = 639 450 YMAX = 399 460 LSTEP = 30 470 XSTEP = (XMAX - XMIN) / LSTEP 480 YSTEP = (YMAX - YMIN) / LSTEP 490 FOR I% = 0 TO LSTEP 500 LINE (XMIN + XSTEP * I%, YMAX) - (XMAX, YMAX - YSTEP * I%) 510 LINE (XMAX - XSTEP * I%, YMIN) - (XMAX, YMAX - YSTEP * I%) 520 LINE (XMAX - XSTEP * I%, YMIN) - (XMIN, YMIN + YSTEP * I%) 530 LINE (XMIN + XSTEP * I%, YMAX) - (XMIN, YMIN + YSTEP * I%) 540 NEXT I% 640 PI = 3.14159 650 X0 = 320 660 Y0 = 200 670 RAD = 50 680 CIRCLE (X0, Y0), 3 * RAD, 7 690 PAINT(X0, Y0), 7 700 ANGLE = 0 710 FOR I% = 1 TO 6 720 ANGLE = ANGLE + PI / 3 730 X = X0 + 2 * RAD * COS(ANGLE) 740 Y = Y0 + 2 * RAD * SIN(ANGLE) 750 CIRCLE(X, Y), RAD, I% 760 PAINT (X, Y), I% 770 NEXT I% 800 T$ = "" 810 820 IF T$ = TIME$ THEN GOTO *ENDTIME 830 T$ = TIME$ 840 FOR I% = 1 TO 7 850 CCODE(I%) = CCODE(I%) + 1 860 IF CCODE(I%) > 7 THEN CCODE(I%) = 1 870 COLOR = (I%, CCODE(I%)) 880 NEXT I% 890 *ENDTIME 900 WEND 1000 END ################################################### ////////////////////////////////////////////////////////////////////////////// //////////////////////// To Be Continued............ ==============================================================================
N88互換BASIC for Windows95 1.02
Download[bas95102.lzh] 2,537kバイト
※16ビット版にくらべて約10%程度,処理が高速化しています。