BASICプログラミング
BASICプログラミング
4年制薬学部で行っていたプログラミング教育資料です.
1)フローチャートの作成
プログラムを作る前に必ず処理の流れ図(flowchart , フローチャート)を作り,それにそってBASIC言語を当てはめプログラムを完成させる.
2)プログラム作成
BASIC言語の場合,描画の命令語(グラフィックコマンド)はBASIC言語の種類によって異なるので,必ずマニュアルを参照すること.
3)プログラムの実行
実行 (RUN)するとプログラム全体がチェックされる.文法上不都合な点があると,簡単なコメントが英文で表示されるので修正する.作成したプログラムはテキストで保存する.実行結果は記録する.画像として保存する場合は切り出しソフト(グラブ)を用いる.
人間がプログラミング言語(ここではBASIC言語)で記述したソフトウェアの設計図 (ソースコード)を,コンピュータが実行できる形式(オブジェクトコード)に変換しながら,そのプログラムを実行するソフトウェアにはインタプリタとコンパイラがある.インタプリタ型の言語はプログラムの実行時に変換を行なうため,その分だけコンパイラ型言語よりも遅い.
コンパイラ型言語ではソースコードは翻訳時にまとめて変換され,実行時にはオブジェクトコードを直接実行するため,インタプリタ (interpreter)型言語に比べて実行速度が大幅に速い.そのため,音声や動画の再生を可能にしている.BASIC言語は,インタプリタ方式が多いが,コンパイラ(商用,高価)も開発されている.一方,FORTRAN, C などの高速処理を必要とする言語はコンパイラ方式である.
(仮称)十進BASIC
文教大学の白石和夫氏により数学教育用に開発されたBASIC言語であり, WindowsおよびMacマシン上で実行可能である.高校や大学のプログラミング教育用に採用されている.インターネット経由でダウンロードできるフリーウエアであるので,自分のパソコンにも容易にインストールできる. 注)Macの64ビットOS上で実行可能(2021/3/12).
その他のBASIC
N88-BASIC(Windows) NEC系 (Windows95 以上で動作する N88BASIC互換BASIC)
FBASIC(Windows (富士通系(サポート終了)
Chipmunk BASIC (Macintoshフリーウェア, 最新64ビットOSで実行可能)
現在では,統計処理などの問題解決に市販のプログラムを用いればかなりのことが解決できる.そのような高価なプログラムに代わって,いろいろな問題解決に役立つBASIC言語によるプログラミングの世界を体験してほしい.
プログラミングの前に:フローチャートについて
フローチャート(流れ図)は「建築」に例えれば設計図にあたる.簡単なプログラムはフローチャートが無くても作れるが,ちょっと複雑になると予め「手順」を決めておかないと,何をやっているか判らなくなってしまう. 初心者の頃からフローチャートを書くことを心掛けよう(毎年,無視される).
1)流れ図の基本型
プログラムを作る際はフローチャートの上部から下部に向かって文法にしたがって書いていく.まず身近な例で,それぞれの記号の意味を理解してほし い.
理想的に書かれたフローチャートはBASIC以外の高級言語にも適用できる.
フローチャート記号
フローチャートを作成する場合は JIS (日本工業規格)で定められている記号を使用 する.
2)右のフローチャートは後半の部でも紹介する「大量データの処理プログラム(平均値を求める)」の流れ図である.
このフローチャートをもとに3種のコンピュータ言語でプログラムを書いてみた.
BASIC言語,FORTRAN言語,C言語の順である.今は理解できなくてもよい.
各言語がなんとなく似ていることを見てほしい.
10 READ A
20 IF A<0 THEN 60
30 S=S+A
40 N=N+1
50 GOTO 10
60 H=S/N
70 PRINT N,H
75 DATA 60,70,65,85,43,91,56,81,75,61,35,54,90,80,-999
N=0
S=0.0
READ(5,10) A
10 FORMAT(5F5.0)
IF(A.LT.0.0) THEN GO TO 60
S=S+A
N=N+1
GO TO 10
H=S/N
WRITE(6,20) N,H
20 FORMAT(2F5.2)
STOP
END
DATAは別のファイルから読み込む 60 70 65 85 43 91 56 81 75 61 35 54 90 80 -999
#include <stdio.h>
int main(void)
{
int x[ ] = {60,70,65,85,43,91,56,81,75,61,35,54,90,80};
int n = sizeof x / sizeof x[0];
int i, total;
float average;
for (i= 0, total = 0; i<n; ++i)
total += x[i];
average = (float)total / (float)n;
printf("Total=%d\n", total);
printf("Average=%6.2f\n", average );
return 0;
}
上記の例から,なんとなく分かる(?)ように,フローチャートができると,いろいろな言語に変換できる.ここで必要なのは手続きを順序たてて考えることである.
かなりのベテランになると,フローチャートを頭の中でイメージしながら,いきなりキーボードから打ち込みプログラムを完成させることができるが,初心者には無理である.必ずフローチャートを作ってからプログラミングを行うよう心掛けること.
プログラムを書く際,以下に示す文字は誤りやすいので,注意が必要である.
C と ((括弧)
D と P,O(オー), 0(ゼロ)
I (アイ) と 1(いち),l(小文字のLエル),/, i (小文字)
Z と 2
U と V
: と ;
空白にも注意する.日本語入力モードの「空白」の1文字は半角文字の2文字で表現されている.
プログラム行の中に空白がある時,注意が必要である.詳細は後述する.
などである. 紛らわしい場合は「かさ」や「ネクタイ」を使う.D,Zは縦線にネクタイを付ける.O,Vは上部にかさを付ける.Iは上下に横線を付ける.
中括弧,大括弧は使わない.(a-b/(c-d))のようにすべて小括弧で書く.
BASIC言語にもいろいろな種類があるが,グラフィック機能を除くと基本はほとんど同じである.まず,加減乗除プログラムを入力し,実行することを手始めにBASIC言語の仕組みを理解してほしい.
フローチャートとプログラムを比較してみよう.
10 a=2
20 b=3
30 c=a+b
40 print c
50 end
コンピュータ内部の数値の記憶場所 (memory location) のことを「変数, variable」という(非常にあらっぽい表現であるが).変数名には,a, ATOM,CORDなどの英綴りを用いる.英字は,大文字と小文字のいずれも使用できるが,大小の違いは無視される(文字変数, character variableについては後述).
変数に数値を記憶させることを「代入」という.変数に新たな数値を代入すると,それ以前に記憶されていた数値は消され入れ替わる.
文頭の数字は「行番号」,イコールは右辺を左辺の変数に「代入」することを意味する.変数に数値を代入するのにlet文を用いる.例えば,上記のプログラムの最初の行で,a=2は2を変数aに代入することを意味する.let a=2の略である.b=3も同じように考える.
10 let a=2
20 let b=3
30 let c=a+b
c=a+bは変数aの値と変数bの値を「足し算」した演算結果をcという変数名を用いて計算機に記憶させることを意味する.
演算結果を表示させるにはprint文を用いる.ここでは、cの値を表示させるために、print c(? cでもよい)を実行させている.
出来上がったプログラムを実行 (execution) するにはRUNと打ち込み,リターンキーを押し下げる.十進BASICではメニューから「実行」を選ぶ.
演習 30行を下記のように書き換えるとそれぞれの演算ができる.実行せよ.
引き算 30 c=a-b
掛け算 30 c=a*b
割り算 30 c=a/b
文法に誤りがあると,実行を中止し,修正すべき個所(もっとも可能性の高い)を示してくれる.それを頼りにプログラムの問題点を修正し,再実行する.
予約語 (reserved word) 以下の綴りは予約語(命令などのために使用される)のため,変数名や関数名として使えない.
NOT,ELSE,PRINT,REM,PI(π),RND,MAXNUM,TIME,DATE,EXTYPE,EXLINE,ZER,CON,IDN,TRANSFORM
I=A+Bのように足し算の演算結果をPIという変数に入れることはできない.PIは3.141592をコンピュータに記憶させるために予約されている.予約語はBASIC言語の種類によって異なるので,注意が必要である.
PRINT文は画面に出力をする命令である.PRINTの後に表示したい変数名や文字列を記載する.
10 PRINT a
文字変数を表示するときは”(ダブルクォーテーション)で文字列を囲む.
10 PRINT "abc"
文字変数は数値変数と区別するため,変数名の後に$マークを付ける.
10 a$="SOJO"
20 PRINT a$
演習 華氏を摂氏に変えるプログラムを作成せよ.
上記のプログラムは「足し算」する値をプログラムの中に書き込んで実行した例である.キーボードから任意の数値を入力する場合は INPUT文を用いる.対話型処理ができる.パソコンがA, Bの値を入力するように促すので,それぞれの値を入力する.
10 input a
20 input b
30 c=a+b
40 print c
50 end
下記の例は,半径を与えて面積を求めるプログラムである.
10 input r
20 s=3.14*r^2
30 print s
40 end
このフローチャートには入力を意味するキーボードの記号が使われている.
○BASICプログラムを書き込み編集,実行するメニュー画面
○INPUT文が実行されると入力を促す質問画面
○答えを表示する画面
が自動的に表示される.
演習 気温と湿度をINPUT文で入力し,不快指数を表示するプログラムを作成せよ. 不快指数Dは,気温T,相対湿度Uから,次式で定義される.
D=0.81T+0.01U(0.99T-14.3)+46.3
不快指数の感覚的目安としては,
不快指数75以上・・・・・やや暑い.
不快指数80以上・・・・・暑くて汗が出る.
不快指数85以上・・・・・暑くてたまらない.
質問内容(例えば気温は?)を画面に表示させるには次のようにする.
10 INPUT "Temperature":T
演習 上記の不快指数プログラムをコメント付きINPUT文に変え実行しなさい.
演習 標準体重算出プログラムを作成せよ.
太り過ぎは,高血圧症,糖尿病,高脂血症などの成人病の温床となっている.
標準体重は,一般に
(身長-100)× 0.9
によって算出することができる.
最近では,BMI法が一般化しつつある(製薬会社のホームページなどに掲載されている).
BMIとは,Body Mass Indexのことで,体重÷身長÷身長で算出した体格指数である.
1980年代以降に肥満度の指標として国際的に用いられている.
日本肥満学会は,最も疾病の少ないBMI22を基準としている.
したがって,標準体重の計算式は次のようにあらわされる.
身長(m)の2乗×22(女性は21をかける).
例えば,身長1.75mの男性の場合は,
1.75×1.75×22=67.4
で,67kgが標準体重となる.
そこで,
標準体重(BMI)を計算するプログラムを作ってみよう.
●BMI= 体重(Kg)÷ 身長(m)÷ 身長(m)
●標準体重(Kg)= 身長(m)× 身長(m)×22
次に示す例は関数を用いて平方根 ( square root, 略 SQRT) を求めるプログラムである.括弧内に変数が入る.実行すると次々に値を要求してくる.10行と40行で「くり返し(ループ)」を構成している.
10 input a
20 b = sqr(a)
30 print b
40 goto 10
50 end
演習 プログラムを入力し実行せよ.また,20行のsqrの代わりに以下の関数を用いて実行せよ.
abs(x) 絶対値
int(x) 整数値
log(x) 自然対数
exp(x) eのx乗 e=2.7182818...
SIN(X), COS(X), ATN(X)の三角関数のXはコンピュータではラジアンである.十進数を変換する場合は,3.141592/180を乗じる.
十進BASICでは,十進数のオプション(OPTION ANGLE DEGREES)が用意されている.
OPTION ANGLE DEGREES 三角関数の角の大きさの単位を度(°)にする。
OPTION ANGLE RADIANS 三角関数の角の大きさの単位をラジアンにする。
ANGLE DGREESを選択すると,COS(90),SIN(180)などは正確に0になる。
数値は15桁の浮動小数点10進数
JISが定める数値組込み関数はすべて用意されている。詳細はオンラインヘルプを参照。
一般にFOR--NEXT文を用いる. 実例で理解してほしい.
10 for i=1 to 10 → iは1から10まで1ずつ変化する.Iが10になったら40行へ飛び,実行を終了する.
20 print i → iを表示
30 next i → 10行に戻り、iに1を加えて実行
40 end
演習 iの二乗値を表示するように変更しなさい.
for_next構文をおぼえる
次の例は,1から10までの数値を合計するプログラムである.合計値はSに入る."10 S=0"文はSの初期値である.
10 s=0
20 for i=1 to 10 →1から10まで変化する.iが10になったら50行へ飛ぶ.
30 s=s+i →加算処理 sに1を足したものをあらためてsとおく
40 next i →20行に戻り次の iへ
50 print s
60 end
for i=10 to 1 step -1 などの処理も可能,カウントダウンである.
for i=0 to 10 step 0.05 なども指定できる,iは0.05ずつ増えていく.
演習 上記プログラムを入力し,stepの値を変えて実行せよ.
1から100までの奇数の数値すべての合計値を求めなさい..
○区分求積法 (sectional measurement)
積分値 ∫ab f(x)dxを計算する
図で x=a から x=b まで N 等分して、その幅を v=(b-a)/n とすると、
面積 s は、
s = f(a)v + f(a+h)v + … + f(a+(n-1)v)v
で近似される。
分割数 N を増やしていけば、より正確な積分値に近づく。
10 T=0 長方形(短冊)の面積を初期化
15 FORi=0 TO 1 STEP .01 0から1までを0.01刻みに分ける
20 L=i*i 長方形の高さ(L)
30 T= .01*L 長方形の面積
35 S=S+T 長方形の面積の和
40 NEXT i
50 PRINT S
END
このプログラムは、y=x2の0から1までの面積を求めるプログラムである。step .01は1を100等分することを意味している。
演習 上記プログラムを入力せよ.STEP値をいろいろ変えて(0.1, 0.05, 0.01など)実行し、数学の公式で求めた値 と比較せよ.それぞれの結果を「テキストエディット」に貼りつけ,値を比較する.
二重ループ処理と演算結果の表示法を学ぶ.下記のプログラムを打ち込み実行する.
10 for i=1 to 9
20 for j=1 to 9
30 k=i*j
40 print k
50 next j
60 next i
70 end
10行と60行が外側でループを作り,20行と50行が内側でループを作っている.まず,I=1の時Jは1から9へ変化しながらI*Jを計算する.次の段階では,I=2になりJは1から9へ変化する.I, Jが9になるまで続く.
プログラムを「ステップ実行」すると各段階の値が確認でき,理解しやすい.
プログラムの中味が理解できたら次へ進む
演習
九九算の表示結果が整然とした行列を構成するように工夫せよ.
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
以下略
ヒント
1)print 変数 を実行すると計算結果を表示する毎に改行する.したがって結果は縦に表示される.
2)計算結果を水平方向へ表示させるにはセミコロンを付加する(PRINT K;).
3)決められた位置に表示するには,次の構文を用いる.
print using "####”:k;
4)printだけを実行すると,「改行(カーソルは次行の始めに移動)」のみを行う.
演習 1)九九算を逆順に書き出すようにプログラムを書き換えよ(81 72 63 54 … ).
2)print using "##.##":k;を用いて実行せよ.
for--next文以外にもいろいろな構文が利用できる.
for variable = start to end [ step increment ] 例 for I=0 to 10 step 0.5:a=a+i: next i
commands
next
do
commands
loop
while condition 例 while x<12
commands
wend
do while condition 例 do while x<12
commands
loop
データをDATA文で与えることもできる.下記のプログラムを実行すると,まず10行を実行し,aを読み込む.その際,50行のDATA文で与えられた"2"が読み込まれる.20行では60行のDATA文の"3"が読み込まれる.
10 READ A
20 READ B
30 C=A+B
40 PRINT C
50 DATA 2
60 DATA 3
END
10行と20行を合体させて,READ A, B でもよい.DATA文も 50 DATA 2, 3 というようにカンマで続けることもできる
演習 data 2, 3, 5, 10, 20 を読み込んで合計を出力するプログラムをつくりなさい.
データ数が増えると,データ毎に変数を割り当てることが面倒になってくるので,繰り返し文を使いデータを読み込むと便利である.
演習 data 2, 3, 5, 10, 20, 30, 40, 50, 60, 100 (データ数10個)を繰り返し文で読み込み,合計を出力するプログラムをつくりなさい.
演習 上記プログラムを改良し,平均も求めなさい.
プログラムは行番号順にコンピュータが理解できる機械語 (machine language) に翻訳され実行される.その流れを変えるにはIF文やGOTO文を用いる必要がある.IF文で指定した条件,ここでは変数Dが負の場合 (D<0)は ,80行へ飛ぶ.
10 INPUT A,B,C
20 D=B^2-4*A*C →B^2はB*Bと同じ.B^nはBのn乗
30 IF D<0 THEN 80 →Dがゼロより小さいならば,80行へ飛ぶ
40 X1=(-B+sqr(D))/2/A
50 X2=(ーBーsqr(D))/2/A
60 PRINT X1,X2
70 GOTO 90
80 PRINT "解なし"
90 END
2次関数の根を求めるプログラムである.√の引数が負の場合は虚根であることを表示させている.
数値演算の条件記述法
a=b 等しい場合 = Equal To
a>b より大きい場合 > Greater Than
a>=b より大きいか等しい場合 ≧ Greater than or Equal to
a<b より小さい場合 < Less Than
a<=b より小さいか等しい場合 ≦ Less than or Equal to
a<>b 等しくない場合 ≠ Not Equal to
GOTO文を多用して,あっちこっちに飛ぶような書き方は極力避けるべきである.最近では GOTO文を用いない「ブロックIF文」が使用される.
IF文は「もし○○ならば××しなさい」といった分岐に用いられるが, 場合によっては「もし○○ならば××しなさい,そうでなく△△ならば□□しなさい.それ以外は★★しなさい」といった複数条件の分岐も可能である. 複数条件の分岐に対応したIF文を「ブロックIF文」という.
(1)
IF 論理式1 THEN ← もし論理式1ならば 1 の処理をする
………1
( ELSEIF 論理式2 THEN ) ←論理式1ではなく論理式2ならば 2 の処理をする
………2
ELSE ←それ以外ならば 3 の処理をする
………3
END IF ←IF文の終わり
演習 先程の2次方程式の解のプログラムをブロックIF文で書きなさい.
ヒント:平方根の中を先に計算し,その値が「正」ならば値を表示,「負」ならば「解なし」と表示させる.
演習 前出のプログラムを参考に,男か女かを尋ね,どちらかの標準体重を表示するプログラムをつくれ.
ヒント:もし男ならば「1」を,女ならば「2」を入力するなど,数値による分岐がわかりやすい.
演習 入力された点数に応じて,優,良,可,不合格の4段階に仕分けし,
80点以上100以下は「優」,70点以上80点未満は「良」,60点以上70点未満は「可」,それ以下は「不合格」と表示させる.
ヒント:もし点数が80点以上ならば「優」,それ以外で70点以上ならば「良」,それ以外で60点以上ならば「可」,それ以外は「不可」,IF文の終わり,とする.
演習 BMIプログラムを改良し,BMI値と共に下記の判定結果を表示するプログラムをつくれ.
18.5未満 やせ
18.5~25未満 標準
25~30未満 肥満
30以上 高度肥満
条件文のひとつである. SELECT CASE行に書かれた式の値と一致するCASE項目に続くブロックを実行する。 一致する項目がないと,CASE ELSE以降を実行する。
学年を入れると部屋割りが表示されるプログラムである.
10 do
input "何年生ですか? (1-3)?";x
if x>3 then 10
select case x
case 1
print "ホームルームはXXX"
case 2
print "ホームルームは000"
case else
print "ホームルームは---"
end select
loop
演習 各学年のホームルームを表示するプログラムをつくれ.
1年 PH409,2年PH205,3年309,4年PH306,5年PH208,6年PH406
データをまとめて読み込むには繰り返し文を用いた.ではデータ数がいくつあるかわからない時にはどうすればよいだろうか.
データ数が不明の場合,データを読み込みながら別の変数でカウントすればよい.本プログラムでは繰り返し構文にFOR--NEXTを用いていない. GOTO文とカウンターと呼ばれるN=N+1を実行することで繰り返し処理を行う.最後に「異常な値:ストップデータ」を付け加えることでデータの最後であることを判断させる.
10 S=0
20 N=0
30 READ A
40 IF A<0 THEN 80
50 S=S+A
60 N=N+1
70 GOTO 30
80 PRINT N,S
90 DATA 60, 70, 65, ---途中略---, 90, -1
END
プログラムの説明
10,20 Sの初期値,Nの初期値を宣言
30 DATA文からデータを読み込む
40 読み込んだデータが負の値のときは読み込みを止め, 80行へ飛び合計を計算する.
50 データの合計(前回の値に読込値を加算)
60 データ数をカウントする(40行を実行した回数)
70 くり返し読み込み処理のため30行へ
80 データ数,合計の表示
90 ストップデータを最後に付けたデータ(ストップデータは計算には使われない)
演習 上記プログラムを入力し,「---途中略---」のところに適当な値を追加し,データ数に関係なく合計が表示できることを確認せよ.
演習 上記プログラムを「データ数」,「合計」,「平均」を求めるよう改良せよ.
コンピュータにデータを読み込む際は,各データに変数名を与える.変数 a,b,c...といった具合である.しかし連続するデータを読み込むときには「何番目のデータ」か知りたい時がある.
一連のデータに番号をつけて並べた変数を配列変数といい,変数名(番号)で表す.
配列変数を使うには,最初に使うデータの数を指定する必要がある.(配列の宣言)
つぎの例は,成績データ10人分を読み込んでその平均を表示するプログラムである.
READ N → データ数の読み込み
DIM SEISEKI(N) → 配列の宣言
FOR I=1 TO N
READ SEISEKI(I)
→ 配列の合計 LET S=S+SEISEKI(I) → 配列の合計
NEXT I
LET HEIKIN=S/N → 平均値
PRINT HEIKIN
DATA 10 → データ数
DATA 80, 90, 100, 85, 75, 80, 65, 90, 98, 87,82 → 成績データ
END
プログラムのはじめの部分に,DIM A(10)と書くと,A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9),A(10)の計10個の変数が用意される.
A(1),A(2),…,A(10)はそれぞれの変数として使用できる.
これらの変数を配列変数とよぶ.個々の変数は添字付き変数,括弧内を添字という.単純にAと書いた変数とは異なり,A(1),A(2),…,A(10)で表される変数である.括弧内の整数値で何番目の変数かを指定することができる.
配列変数で用いた変数名は一般の変数としては使えない.(この場合,変数Aは使えなくなる)
データの合計や平均を表示するプログラムは配列を使わなくとも作ることができる.ではなぜ配列を使うのだろうか.
配列変数にする理由は,読み込んだデータを通し番号ともにそれぞれ記憶することができるからである.
演習 最初と最後の人の成績を表示せよ.
演習 読み込んだデータから「最高点」を表示せよ.
ヒント:はじめに1番目のデータを「変数MAX」とし,次に条件文を用いて「もしi番目のデータがMAXより大きい」ならば,それをMAXとする.これをn番目まで繰り返す.
○並べ替えプログラム (Sorting)
下記のプログラムを実行すると,ランダムに列んだn個の数値データを読み込んで,小さい順に並べ替える.そのためには,まず DIM文を使用して,配列の宣言をする.
READ n →データの個数をDATA文から読み込む
DIM x(n) →変数xはx(1), x(2), x(3), ・・, x(n)のように番号を付けられ,n個のデータの記憶場所が確保される
FOR i=1 to n
READ x(i) → iは1からnまで変化しながらデータx(i)をDATA文から読み込む
NEXT i
rem ----- sorting ----- →コメント行(実行とは関係ないメモ)
FOR i=1 to n
FOR j=i+1 to n
IF x(j) <x(i) then →ブロックIF文(もし条件が成立すればENDIFまでを実行)
kari =x(i) →kariにx(i)の値を代入
x(i)=x(j) →x(i)にx(j)の値を代入
x(j)=kari → x(j)にkariの値を代入,x(j)とx(i)の入れ替えが実行される,
ENDIF
NEXT j →
NEXT i →
rem ----- output of result ----- →結果の表示(メモ)
FOR i=1 to n
PRINT x(i);
NEXT i
DATA 10
DATA 6,2,5,4,10,9,1,8,3,7
END
実行すると
1 2 3 4 5 6 7 8 9 10
が得られる.
演習 上記プログラムを入力,実行し,構文を理解せよ.
参考資料(関連コマンド)
SWAPによる配列の入れ替え (swap operation)
ほとんどのBASICでは配列の値を直接交換する "SWAP"が利用できるが、コマンドとして準備されていないBASICもあるので仮変数を用いる前例を理解しておくこと。
SWAP文:swap A, B 変数AとBの値を入れ替える. SWAP文を用いると仮変数を使う必要がなくプログラムを簡素化できる.
演習 前のプログラムの「データ入替え部分」をSWAP文に変え,実行せよ.
演習 次の成績データを読み込み,平均を表示するプログラムをつくれ.
科目A: DATA 80,90,100,85,78
演習 上記プログラムで「最高点」と「最低点」を表示するよう変更しなさい.
2次元配列の概念を理解する.下記のプログラムを実行して理解してほしい.九九算の値を9行9列の配列 [A(i,j)]に取り込み,表示する.
<参考にするプログラム>
10 dim A(9,9)
20 for i=1 to 9
30 for j=1 to 9
40 A(i,j)=i*j
50 next j
60 next i
70 for i=1 to 9
80 for j=1 to 9
90 print using "###”,A(i,j);
100 next j
110 print
120 next i
end
演習 20x20の九九算表を表示するプログラムをつくり,任意のデータ(例えば15x15番目)を表示しなさい.
<演習問題1>
有機化合物を構成する炭素、水素、窒素等の比を求めるために、元素分析を行う。分析センターに試料を提出すると、有機物を完全燃焼させることにより得られる生成物(炭酸ガス、水等)から計算した値(各元素のパーセント)が返される。元素分析値から組成式を計算するプログラムを作りなさい。
○炭素,水素,窒素以外は酸素とすること.
したがって,酸素%=100-(炭素%+水素%+窒素%)である.
○最終的には,分子量が与えられたとして,分子式を求めること.
1.電卓で計算するとしたらどのような手順で計算するか考える.
2.その手順に沿ってフローチャート(メモでもよい)を考える.
1)配列変数を確保する
2)データを読み込む
3)データを合計する
4)酸素の%を求める
5)C, H, O, Nの組成比を求める
組成比=重量%÷100÷原子量×分子量
6)各値を四捨五入する
3.フローチャートにBASIC言語をあてはめる.
4.テストデータ
ニトロベンゼン
炭素 58.51%:水素 4.07%: 窒素 11.39%:分子量 123.11
5.計算結果はC6H5N1O2のように表示させる.(数字を下付きにする必要はない)
炭素 40.00%: 水素 6.71%: 窒素 53.29% : 分子量:180.16
炭素 68.51%: 水素 5.00%: 窒素 3.34% : 分子量: 419.43
<アドバンス課題>
1. 元素名の後の数が1の時の表示を工夫せよ. ヒント:係数が1の場合,元素名のみを表示する.
2. 元素名の後の数が0の時の表示を工夫せよ. ヒント:係数が0の場合,その元素は表示しない.
3. 元素と数字の間の空白をなくす.C 6H12 → C6H12 ヒント:PRINT USINGをつかう.
<演習問題2>
最小二乗法(直線のあてはめ)を用いて回帰式と相関係数を算出する。
作成手順:
1. READ~DATA 文によるデータの配列変数への読み込み
2. Xi の和、Yi の和、Xi の平均値 (Xav) 、Yi の平均値 (Yav) の算出
3. (Xi -Xav)^2 の和、(Yi -Yav)^2 の和、(Xi -Xav)(Yi -Yav) の和の算出
4. y=a*x+bのa, b, r(相関係数) の算出
テストデータと計算結果
データ数:4
X Y Xの平均 2.5
1 5 Yの平均 8 傾き a=1.6
2 8 Xの分散 1.25 切片 b=4
3 9 Yの分散 3.5 相関係数 r=0.956
4 10 共分散 2
画像を描くコマンドは言語の種類によって異なるので,プログラムを作成する際はマニュアルを調べる必要がある.
ディスプレイは小さな点の集合体 (800x600, 1024x768など) である.任意の点を指定した色で光らせることにより,どんな図形でも描くことができる.以下に示すプログラムでは,曲線,サインカーブや円などを画面に表示させる. まず,WINDOWで画面の範囲を指定する.線を描くには PLOT LINES文を用いている.
○関数のグラフを描く
下記のプログラムを実行し,各行の意味を理解してほしい.
10 OPTION ANGLE DEGREES
20 DEF f(x)=sin(x)
30 SET WINDOW -360,360,-2,2
40 DRAW GRID(90,1)
50 FOR x=-360 TO 360
60 PLOT LINES: x,f(x);
70 NEXT x
80 END
10行:角の単位は標準ではラジアンであるが,OPTION ANGLE DEGREESをプログラムのはじめに書くことにより,単位を度(degrees)に変えることができる.SIN関数が実行する前に書く.
20行:DEF文は関数を定義する命令
30行:SET WINDOW文は,画面上の描画領域に,x座標の範囲が-360から360,y座標の範囲が-2から2となるような座標系を設定する.
40行:grid(a,b)は,横軸方向a間隔,縦軸方向b間隔の格子を描く.
60行:PLOT LINES命令は,点[x , sin(x)]を順に結び線を描く.
演習 上記プログラムを入力,実行し,構文を理解せよ.
演習 -4≦x≦4,-4≦y≦4の範囲で関数y=x^3-3*x+1のグラフを描きなさい.
上記プログラムの10,20,30,40,50行を修正する.
○円,楕円を描く
-PI から PI まで STEP 0.002で計算した座標を結んで図を描く.
10 SET WINDOW -5,5,-5,5
20 FOR T=-PI TO PI STEP 0.002
30 PLOT LINES: T,SIN(T);
40 NEXT T
50 END
30行を PLOT LINES: SIN(T),COS(T); に代えると円を描く.ここでは省略するが,線の色や塗りつぶす色なども指定できる.
演習
指導者に質問する前に努力すること.
1)半径を変えて円を描きなさい.
2)楕円を描きなさい.
3)線の色を変えて円を描きなさい(ヘルプで調べる).
JISに従い,問題座標系によるグラフィック機能を提供している。詳細はオンラインヘルプを参照。
SET WINDOW
SET LINE COLOR
SET POINT COLOR
SET AREA COLOR
SET TEXT COLOR
SET COLOR MIX
SET LINE STYLE
SET POINT STYLE
SET TEXT JUSUTIFY
ASK WINDOW
PLOT LINES
PLOT POINTS
PLOT AREA
PLOT TEXT (動作上の非互換がある)
GET POINT
その他
色番号 0白, 1黒, 2青, 3緑, 4赤, 5水色, 6黄色, 7赤紫,8 灰色,9 濃い青, 10 濃い緑,11 青緑, 12 えび茶,13 オリーブ色,14 濃い紫,15 銀色
図形変形関数:DRAW文で次の関数が使える.
<演習問題>
先に作った最小二乗法プログラムのグラフィック表示を行え.
1)入力データをプロットする.
2)最小二乗線を描く.
3)最後に,どのような入力データにも適応するように改造すること.そのためには,入力データX, Yそれぞれの最小値,最大値を求め,その幅に合わせてWINDOW幅を変える必要がある.
4)グラフ上にタイトル,相関係数などのデータを表示させる.
BASIC言語には文章の処理を対象にしたコマンドが用意されている.文字列は変数の後に$マークを付ける.
文字列の加算(連結)
10 READ A$
20 READ B$
30 C$=A$+B$
40 PRINT C$
44 DATA KUMAMOTO
46 DATA UNIVERSITY
50 END
A$="KUMAMOTO",B$="UNIVERSITY"の場合,C$はKUMAMOTO UNIVERSITYである.
演習 上記プログラムを入力,実行し, 構文を理解せよ.
文字処理のため,数値ー文字変換 (STR$),文字数 (LEN) 関数等が用意されている. 但し,一般のBASICで使用される文字列検索 (INSTR),部分文字列を切り出す関数(LEFT$, MID$, RIGHT$)については, 十進BASICでは形式の異なる下記の関数を使用する. FORTRAN言語と同じ方法を採用している.
文字列検索 :POS(a$,b$) a$ における b$ の位置を返す.
部分文字列指定:文字列変数 s$(a:b) は s$ のa文字目からb文字目までの部分文字列を表す.
文字列の長さ,位置,切り出し
10 LET a$="Department of Computational Molecular Design, Faculty of Pharmaceutical Sciences, Kumamoto University"
20 LET n=len(a$)
30 PRINT n
40 LET b=pos(a$,"Mol")
50 PRINT b
60 LET d$=a$(15:25)
70 PRINT d$
80 END
演習 上記プログラムを入力,実行し,コマンドを理解せよ.
実行すると
101
29
Computation
が表示される.a$の文字数,"Mol"が表れる位置,Computationは15文字目から25文字目までを切り出した結果である.
キャラクターコード
文字の内部表現
BASICでは変数に$が付くと文字変数と判断する.
abcABC 12345, などは1バイト(8個の0,1).漢字は2バイト(16個の0,1)で表す.文字にはキャラクターコード番号が付けられている.
例 01010000:P
10110001:
0011000000100110:愛
0010011000100001:A(漢字)
キャラクターコード実例
十進数と16進数で表した場合
Aは65,41
aは97,61
Kは75,4B
kは107,6B
である.大文字,小文字も区別できる.漢字も同じようにコードが存在する.
コード表はいろいろな参考書に出ているので詳しい説明は省略する.
文字配列
文字にはキャラクターコード番号が付けられているので,文字列の比較も可能である.以下のプログラムは氏名をアルファベット順に並びかえるプログラムである.コンピュータは第一文字目のコードを比較してその順に並びかえる.第一文字目が同じ場合は2文字目を比較する.
10 dim a$(10)
20 for i=1 to 10 →配列(データを記憶させる場所)を10個確保する.
30 read a$(i)
40 next i
50 for i=1 to 9
55 for j=i+1 to 10
56 if a$(i) < a$(j) then 70
57 qqq$=a$(i)
58 a$(i)=a$(j)
59 a$(j)=qqq$
70 next j
80 next i
90 for i=1 to 10
92 print a$(i);
94 next i
96 data watanabe,kojima,yamada,suzuki,murakami,simada,nakamura,kimura,yasuda,imai
98 end
演習 上記プログラムを入力, 実行し,構文を解析せよ. 数値の並べ替えプログラムと比較せよ.また, 医薬品名やクラスメートの氏名(漢字)などを入力し, 実行せよ.
文字列組込み関数(JISが定める組込み関数はすべて用意されている)。詳細はオンラインヘルプを参照。
部分文字列指定
s$を文字列変数,a,bを数値式とするとき,s$(a:b)はs$のa文字目からb文字目までの部分文字列を表す.
LET s$(a:b)=文字列式 の形式で,部分文字列の置換も可能.
BASIC 言語は,1965年米国ダートマス大学のJ. G. KemenyとT. E. Kurtzによって開発された. 当時,大学1年生に4時間程度の集中講習で修得させたとのことである.
今回はファイルの入出力の詳細を紹介できななかった.BASIC言語を実用的に利用するには必須である.これらの利用法についてはプログラム中の HELPメニューや実例を参考にしてほしい.
ゲノム創薬研究者や情報処理に精通した薬剤師になるために問題解決手法(アルゴリズム)の一つとしてプログラミング技法をぜひ修得しておいてほしい.
卒業したら年齢的に柔軟性が減少し,プログラミング対応力が減退するので,何でも吸収できる今が絶好のチャンスである.
崇城大学薬学部版(平成25年5月28日修正) 医薬品化学研究室