演習指針
最近では,社会のどのような分野に於いてもコンピュータ (computer) の必要性を否定する人はほとんどいなくなった。しかしながら,その利用法となると人それぞれの考え方があり,その人の置かれている立場,どのような仕事をしているかにより千差万別である.職域の広い薬学の分野は例外ではない.もっとも見解の分かれる典型的な分野といっても過言ではない.ワープロや表計算だけできればそれ以上は必要ないと本気で主張する人もいれば,簡単なプログラムくらいは書けないと仕事ができないと主張する人もいる.
ところで,文部省大学審議会は,21世紀に向けた大学の使命として問題提起能力,問題解決能力など創造的な仕事ができる人材を育成することを提言してい る.一方,薬剤師の職能として医薬品に関する様々な情報の提供や薬歴管理など薬剤師が情報を収集,加工,蓄積し患者や医療従事者に向けて積極的に情報発信することが求められて久しいが,人材不足のため機能していない.
熊本大学薬学部では,全国の薬系大学に先駆けて,プログラミング(programming)演習を実施してきた(昭和59年~).我々の長年の経験では,簡単なプログラムを理解することで「コンピュータの仕組み」,「データ(ファイル)構造」,「処理の流れ」や「データの精度」等を効率的に理解することができるなどその波及効果はきわめて大きいことを実感した.さらに,コンピュータを搭載した測定器や機器類の理解,ネットワーク (network)等を介した情報資源の有効利用を通して限られた地球資源を節約するという観点からもきわめて意義が大きいものと確信する.
崇城大学薬学部の情報処理演習においては,プログラミング言語としてBASIC (Beginner's All-purpose Symbolic Instruction Code) を用いたアルゴリズムの演習を行う.処理言語としては,Windows用に開発された十進BASICを使用する(本実習ではMacintosh PC上でWIndows OSを操作する).十進BASICはインターネットを利用して無料で入手できるフリーソフトウエア (freeware) である.十進BASICはインタプリタ( interpreter)であるが,基本仕様のBASICであるため初心者向きであり,複雑な翻訳手続を理解する必要がなくプログラムを完成させることができる.
プログラミングの能力は年齢に反比例する.国の「第五世代コンピュータプロジェクト」では35才が定年と言われている.実習の過程で,プログラミング経験の無い先輩,年寄りの影響を受けないこと(既成品を使うことに満足している).プログラミングの「独特の思考パターン」は君たちの年齢でしか対応できない.数学などと同じで,生きていくために必須なものではないが,柔軟に対応できる能力を持った年齢で対応しておくことの大切さを認識してほしい.
1)フローチャートの作成
プログラムを作る前に必ず処理の流れ図(flowchart , フローチャート)を作り,それにそってBASIC言語を当てはめプログラムを完成させる.
2)プログラム作成
BASIC言語の場合,描画の命令語(グラフィックコマンド)はBASIC言語の種類によって異なるので,必ずマニュアルを参照すること.
3)プログラムの実行
実行 (RUN)するとプログラム全体がチェックされる.文法上不都合な点があると,簡単なコメントが英文で表示されるので修正する.作成したプログラムはテキストで保存する.実行結果は記録する.画像として保存する場合は切り出しソフト(グラブ)を用いる.
1)予習、復習
コンピュータと流暢に対話するためには、予習、復習が必須であることは言うまでもない.毎年「予習、復習なしの実習はまったく意味がない」と注意を喚起しているが,無視する学生が多いのが実情である.
2)英語との関連
他のコンピュータ言語と同様にBASICは外国生まれである.したがって,マニュアル (manual) 等はほとんどは英語である.それなりの努力が必要なことは言うまでもない.本年度の実習で用いる十進BASICでは日本語マニュアル(オンライン)が利用できる.しかし,コンピュータを深く理解しようとすると,英語の資料を読む必要があり英語の読解力が必要である.
3)国家試験との関連
薬剤師業務でコンピュータが必要であることは言うまでもない.しかし,薬剤師国家試験ではコンピュータの知識・技能を問う問題は出題されないので,重要ではないという誤った考えが存在する.コンピュータの勉強は,卒業してからでは遅すぎることを明言しておきたい.
これらの問題点が大学教育における共通の課題であることを近い将来理解することになるはずである.
人間がプログラミング言語(ここではBASIC言語)で記述したソフトウェアの設計図 (ソースコード)を,コンピュータが実行できる形式(オブジェクトコード)に変換しながら,そのプログラムを実行するソフトウェアにはインタプリタとコンパイラがある.インタプリタ型の言語はプログラムの実行時に変換を行なうため,その分だけコンパイラ型言語よりも遅い.
コンパイラ型言語ではソースコードは翻訳時にまとめて変換され,実行時にはオブジェクトコードを直接実行するため,インタプリタ (interpreter)型言語に比べて実行速度が大幅に速い.そのため,音声や動画の再生を可能にしている.BASIC言語は,インタプリタ方式が多いが,コンパイラ(商用,高価)も開発されている.一方,FORTRAN, Cなどの高速処理を必要とする言語はコンパイラ方式である.
文教大学の白石和夫氏により数学教育用に開発されたBASIC言語であり,Windowsマシン上で実行可能である.高校や大学のプログラミング教育用に採用されている.インターネット経由でダウンロードできるフリーウエアであるので,自分のパソコンにも容易にインストールできる.
十進BASICのホームページ
David Gillespieが基本インタプリタを開発(1990),Ron Nicholsonによってファイル,グラフィックス,UNIX対応へと成長し,現在の形となり,Power Machintoshへの対応が実現した(1998).インタプリタ本体のエディタが使いにくい難点があるが,前年度実習では簡易エディターとしてBBEdit Liteを使用することによってワープロ感覚でプログラムを編集し,実行させる方式を採用した.Ron's BASIC Programming and Chipmunk Basic Home Page
現在では,統計処理などの問題解決に市販のプログラムを用いればかなりのことが解決できる.そのような高価なプログラムに代わって,いろいろな問題解決に役立つ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
文法に誤りがあると,実行を中止し,修正すべき個所(もっとも可能性の高い)を示してくれる.それを頼りにプログラムの問題点を修正し,再実行する.
プログラムの際は文番号を付ける.
多重文が使えるBASICでは,次のような書き方ができる.
10 a=2: b=3: c=a+b:
20 print c
予約語 (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言語の種類によって異なるので,注意が必要である.
上記のプログラムは「足し算」する値をプログラムの中に書き込んで実行した例である.キーボードから任意の数値を入力する場合は 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を起動すると
が自動的に表示される.
質問内容(例えば数学の点数は?)を画面に表示させるには次のようにする.
10 input "Math score:":a
演習 上記のプログラムをコメント付き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
プログラムは下記のように対話形式(英語)にすること.
身長 (body height) を入力 (input) してください?
体重 (body weight) を入力してください?
あなたのBMI値は24です.
あなたの標準体重は62です.
演習 不快指数の算出プログラムを作成せよ.不快指数Dは,気温T,相対湿度Uから,次式で定義される.
D=0.81T+0.01U(0.99T-14.3)+46.3
不快指数の感覚的目安としては,
不快指数75以上・・・・・やや暑い.
不快指数80以上・・・・・暑くて汗が出る.
不快指数85以上・・・・・暑くてたまらない.
データを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
70 end
10行と20行を合体させて,read a,bでもよい.
演習 プログラムを入力し実行せよ.
いままでコンピュータにデータを入力するには変数を用いてきた.例)a=2
では「a」という文字そのものを表示するにはどうすればよいだろうか.答えは簡単. a$="a" である.
BASICでは,通常の変数は「数値変数」として扱われ,初めは値にゼロが入っている.変数を文字として取り扱うときには変数名の最後に「$:ダラー」をつけると「文字変数」になる.文字は"(ダブルクォーテーション)でくくる.
文字列の加算(連結)
10 READ A$
20 READ B$
30 C$=A$+B$
40 PRINT C$
50 DATA SOJO
60 DATA UNIVERSITY
70 END
A$="SOJO",B$="UNIVERSITY"の場合,C$は"SOJO 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, Sojo 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
演習 上記プログラムを入力,実行し,コマンドを理解せよ.
実行結果はそれぞれ
a$の文字数,"Mol"が表れる位置,15文字目から25文字目までを切り出したものである.
演習 対話形式で年齢を入力し,画面に「私の年齢は○○歳です」と表示するプログラムを作成せよ.
文字変数の詳細にについては別項で詳述する.また文字列の取扱いには awk, perl, ruby などのスクリプト系言語がよく用いられる.これらについては5年次開講予定の「UNIX入門」で学習する.
次に示す例は関数を用いて平方根 ( 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)が用意されている.
初心者のうちは,ここに紹介した程度の関数の知識で十分である.
数値は15桁の浮動小数点10進数
JISが定める数値組込み関数はすべて用意されている。詳細はオンラインヘルプを参照。
ABS(x)
ACOS(x)
ANGLE(x,y)
ASIN(x)
ATN(x)
CEIL(x)
COS(x)
COSH(x)
COT(x)
CSC(x)
DATE
DEG(x)
EPS(x)
EXP(x)
FP(x)
INT(x)
IP(x)
LOG(x)
LOG10(x)
LOG2(x)
MAX(x,y)
MAXNUM
MIN(x,y)
MOD(x,y)
PI
RAD(x)
REMAINDER(x,y
RND
ROUND(x,n)
SEC(x)
SGN(x)
SIN(x)
SINH(x)
SQR(x)
TAN(x)
TANH(x)
TIME
TRUNCATE(x,n)
絶対値
逆余弦
偏角
逆正弦
逆正接
x以上の最小の整数
余弦
双曲線余弦
余接
余割(cosecant)
日付
ラジアンを度に変換
直前直後の数との差
指数関数
小数部分
xを超えない最大の整数
整数部分
自然対数
常用対数
2を底とする対数
大きい方
最大の有限数
小さいほう
剰余
円周率π
度をラジアンに変換
剰余
乱数
小数点以下n桁に丸める
正割(secant)
符号(sign)
正弦
双曲線正弦
平方根(SQuare Root)
正接
双曲線正接
時刻
切り捨て
OPTION ANGLE DEGREES 三角関数の角の大きさの単位を度(°)にする。
OPTION ANGLE RADIANS 三角関数の角の大きさの単位をラジアンにする。
ANGLE DGREESを選択すると,COS(90),SIN(180)などは正確に0になる。
演習 三角関数プログラムを入力し,度(°)およびラジアンモードで実行せよ.
次の例は,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までの偶数の数値すべての合計値を求めなさい..
積分値 ∫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 def fn(x)=x*x
15 t=0
20 for i=0 to 1 step 0.01
30 l=fn(i)
35 t=0.01*l
40 s=s+t
50 next i
60 print s
70 end
このプログラムは、y=x2の0から1までの面積を求めるプログラムである。step 0.01は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
以下略
ヒント
演習
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
プログラムは行番号順にコンピュータが理解できる機械語 (machine language) に翻訳され実行させる.その流れを変えるにはif文やgoto文を用いる必要がある.if文で指定した条件,ここでは変数Dが負の場合 (D<0)は ,90行へ飛ぶ.
10 input a
20 input b
30 input c
40 d=b^2-4*a*c →b^2はb*bと同じ.b^nはbのn乗
50 if d<0 then 90 →dがゼロより小さいならば,90行へ飛ぶ
60 x1=(-b+sqr(d))/2/a
70 x2=(-b-sqr(d))/2/a
80 print x1,x2
85 goto 95
90 print "kyokon"
95 end
2次関数の根を求めるプログラムである.√の引数が負の場合は虚根であることを表示させている.平方根処理が不能である.
演習 上記プログラムを入力し,実行せよ.
すっきりした構文で,込み入った条件が記述できる.ここでは,入力された点数に応じて,優,良,可,不合格の4段階に仕分けして,その結果を表示する.条件が二重になっている点に注意すること.
10 input a
15 if a>100 then
16 print"再入力!"
18 goto 10
19 end if
20 if a<=100 and a>=80 then !’80<= a <=100
30 print"優"
40 elseif a<80 and a>=70 then !’70<= a <80
50 print"良"
60 elseif a<70 and a>=60 then !’60<= a <70
70 print"可(但しレポート提出)"
80 else !’a <60
90 print"再試験"
100 end if
110 goto 10
120 end
(1)
IF 論理式1 THEN
………1
ELSEIF 論理式2 THEN
………2
ELSE
………3
END IF
は,次の構文(二重IF文)と等価である.
IF 論理式1 THEN
………1
ELSE
IF 論理式2 THEN
………2
ELSE
………3
END IF
END IF
論理式1が真であるとき………1が実行され,
論理式1が偽であるときは,
論理式2が真であれば………2が実行され,
論理式2も偽であれば………3が実行される。
例 2次方程式の解のプログラム
INPUT a, b, c
LET D=b^2-4*a*c
IF D>0 THEN
PRINT (-b+sqr(D))/(2*a),(-b-sqr(D))/(2*a)
ELSEIF D=0 THEN
PRINT -b/(2*a)
ELSE
PRINT "no solution"
END IF
END
(2) 一般的な構文
IF 論理式1 THEN
………1
ELSEIF 論理式2 THEN
………2
ELSEIF 論理式3 THEN
………3
~~~
~~~
ELSEIF 論理式n-1 THEN
………n-1
ELSE
………n
END IF
論理式1が真であるとき………1が実行され,
論理式1が偽であるとき,
論理式2が真であれば………2が実行され,
論理式2も偽であるとき,
論理式3が真であれば………3が実行され,
~~~,すべての論理式が偽であるとき………nが実行される。
演習 上記プログラムについて,いろいろな値を入力,実行し,構文を理解せよ.
GOTO文を多用して,あっちこっちに飛ぶような書き方は極力避けるべきである.ブロックIF文はFORTRAN言語などの高級言語でも使用される.
演習 前出のBMIプログラムを,性別を入力し,区別して計算できるように改造しなさい.
その際,下記の判定結果も表示しなさい..
○大量データの処理
コンピュータ処理の典型例を示そう.今何百枚,何千枚のデータがあるとする.何かの点数でもよいし,物の個数でもよい.平均値を求めるには10行程度のプログラムが書ければ十分である.データの数も予め知る必要もない.データを読み込みながらカウントすればよい.本プログラムでは繰り返し構文にFOR--NEXTを用いていない. GOTO文とカウンターと呼ばれるN=N+1を実行することで繰り返し処理を行う.最後に「異常な値」を付け加えることでデータの最後であることを判断させる.
5 s=0
8 n=0
10 read a
20 if a<0 then 60
30 s=s+a
40 n=n+1
50 go to 10
60 h=s/n
70 print n,h
75 data 60,70,65,85,43,91,56,81,75,61,35,54,90
78 data 21,66,78,91,36,56,---途中略---,80,-9999
80 end
プログラムの説明
5, 8 Sの初期値,Nの初期値を宣言
10 3の DATA文からデータを読み込む
20 読み込んだデータが負の場合読み込みを止め, 60行へ飛び平均値を計算する.
30 データの合計(前回の値に読込値を加算)
40 データ数を数える(30行を実行した回数)
50 くり返し読み込み処理のため10行へ飛ぶ
60 平均値の計算
70 結果の表示
75 一連のデータとは関係のない数値を最後に付けた大量のデータ群(直前までのデータが処理対象になる)
演習 上記プログラムを入力せよ.また,「---途中略---」のところに適当な値を追加後,実行し,構文を理解せよ.
select_case文(追加)
条件文のひとつである. SELECT CASE行に書かれた式の値と一致するCASE項目に続くブロックを実行する。 一致する項目がないと,CASE ELSE以降を実行する。
クラス番号を入れると部屋割り等が表示される.1, 2, 3クラスはそれぞれ201, 202, 203号室で講義,4, 5, 6クラスはコンピュータ実習である.いろいろな使用法が考えられる.
10 do
input "Your class number (1-6)?";x
if x>6 then 10
select case x
case 1
print "room number 201"
case 2
print "room number 202"
case 3
print "room number 203"
case else
print "computer room"
end select
loop
プログラムのはじめの部分に,DIM a(8) と書くと,a(1),a(2),a(3),a(4),a(5),a(6),a(7),a(8)の計8個の変数が用意される.a(1),a(2),…,a (8)は,それぞれ,普通の変数として使用できる.これらの変数全体をまとめて配列とよぶ.個々の変数は添字付き変数,括弧内を添字という. 単純にaと書いた変数とは異なり,a(1), a(2)・・a(n)で表される変数である.括弧内の整数値で何番目の変数かを指定することができる.
演習 以下のDATA文を読み込み,最小値と最大値を求めるプログラムをつくれ.
DATA 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
下記のプログラムを実行すると,ランダムに列んだn個の数値データを読み込んで,小さい順に並べ替える.そのためには,まずdimension文を使用して,n個の番号のついた記憶場所をメモリー上に用意する.
10 read n →データの個数を100行のdata文から読み込む
20 dim x(n) →変数xはx(1), x(2), x(3), ・・, x(n)のように番号を付けられ,n個のデータの記憶場所が確保される
30 for i=1 to n → iは1からnまで変化しながら次行でデータx(i)を110行のdata文から読み込む
40 read x(i)
50 next i →30行と繰り返し文を構成している
55 rem ----- sorting ----- →コメント行(実行とは関係ないメモ)
60 for i=1 to n →90行と繰り返し構文
65 for j=i+1 to n →85行と繰り返し構文
70 if x(j)<x(i) then →80行と判断文を構成(もし条件が成立すれば以下を実行)
72 kari=x(i) →kariにx(i)の値を代入
74 x(i)=x(j) →x(i)にx(j)の値を代入
76 x(j)=kari → x(j)にkariの値を代入,x(j)とx(i)の入れ替えが実行される,
80 end if
85 next j →
90 next i →
91 rem ----- output of result ----- →結果の表示(メモ)
92 for i=1 to n
94 print x(i);
96 next i
100 data 10
110 data 6,2,5,4,10,9,1,8,3,7
120 end
実行すると
1 2 3 4 5 6 7 8 9 10
が得られる.
演習 上記プログラムを入力,実行し,構文を理解せよ.
参考資料(関連コマンド)
SWAPによる配列の入れ替え (swap operation)
ほとんどのBASICでは配列の値を直接交換する "SWAP"が利用できるが、コマンドとして準備されていないBASICもあるので仮変数を用いる前例を理解しておくこと。
60 for i=1 to n
65 for j=i+1 to n
70 if x(j)<x(i) then
75 swap x(i),x(j) →前出のプログラムの72,74,76行を一行で実行する
80 end if
85 next j
90 next i
演習 前のプログラムの「データ入替え部分」をswap文を用いる方式に書き直し,実行して構文を理解せよ.
<2次元配列について>
2次元配列の概念を理解する.まず,下記のプログラムを実行して理解してほしい.九九算の値を9行9列の配列 [A(i,j)]に記憶させ,逆順に取り出して表示する.
<参考にするプログラム>
10 dim ij(9,9)
15 for i=1 to 9
20 for j=1 to 9
25 ij(i,j)=i*j
30 next j
35 next i
40 for i=9 to 1 step -1
50 for j=9 to 1 step -1
60 print using "###": ij(i,j);
70 next j
75 print
80 next i
90 end
<演習問題1>
有機化合物を構成する炭素、水素、窒素等の比を求めるために、元素分析を行う。分析センターに試料を提出すると、有機物を完全燃焼させることにより得られる生成物(炭酸ガス、水等)から計算した値(各元素のパーセント)が返される。元素分析値から組成式を計算するプログラムを作りなさい。
○炭素,水素,窒素以外は酸素とすること.
したがって,酸素%=100-(炭素%+水素%+窒素%)である.
○最終的には,分子量が与えられたとして,分子式を求めること.
1.電卓で計算するとしたらどのような手順で計算するか考える.
2.その手順に沿ってフローチャート(メモでもよい)を考える.
1)配列変数を確保する
2)データを読み込む
3)データを合計する
4)酸素の%を求める
以下,C, H, O, N比を求め,これに分子量をかけることで,各原子の比が得られる.
その他の方法として,C, H, O, N比を求め,その最小値を求める. さらに最小値を1とする相対値を求める.
得られた値を整数化する.
3.フローチャートにBASIC言語をあてはめる.
4.テストデータ
ニトロベンゼン
炭素 58.54%:水素 4.09%: 窒素 11.38%
分子量 123.11
5.計算結果はC6H5NO2のように表示させる.(下付きにはしなくてよい)
<データ>
炭素 69.19%:水素 6.07%: 窒素 7.61% 分子量 366.41
炭素 68.15%:水素 5.00%: 窒素 3.34% 分子量 419.43
炭素 77.15%:水素 5.03%: 窒素 0% 分子量 358.12
<演習問題2>(予定)
最小二乗法(直線のあてはめ)を用いて回帰式と相関係数を算出する。
作成手順:
テストデータと計算結果
データ数: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
注意して作ったプログラムでも,データを変えて実行しているうちに,予想しなかったエラーが発生し,実行できなくなることがある.このような「バグ」を見つけだし,改善することをデバッグとよぶ.プログラム内に潜む虫を退治することを意味する.演算過程で発生するエラーは,計算式の後にprint文を挿入し途中結果を書きだすことにより発見できることが多い.十進BASICでは,このような場合に対応するための機能が準備されている.
画像を描くコマンドは言語の種類によって異なるので,プログラムを作成する際はマニュアルを調べる必要がある.
ディスプレイは小さな点の集合体 (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文で次の関数が使える.
<演習問題>
先に作った最小二乗法プログラムのグラフィック表示を行え.
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)で表す.文字にはキャラクターコード番号が付けられている.
例
キャラクターコード実例
十進数と16進数で表した場合
である.大文字,小文字も区別できる.漢字も同じようにコードが存在する.
コード表はいろいろな参考書に出ているので詳しい説明は省略する.
文字配列
文字にはキャラクターコード番号が付けられているので,文字列の比較も可能である.以下のプログラムは氏名をアルファベット順に並びかえるプログラムである.コンピュータは第一文字目のコードを比較してその順に並びかえる.第一文字目が同じ場合は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メニューや実例を参考にしてほしい.
ゲノム創薬研究者や情報処理に精通した薬剤師になるために問題解決手法(アルゴリズム)の一つとしてプログラミング技法をぜひ修得しておいてほしい.
卒業したら年齢的に柔軟性が減少し,プログラミング対応力が減退するので,何でも吸収できる今が絶好のチャンスである.
崇城大学薬学部版(平成20年6月2日) 修正責任者 原野一誠