Entries

スポンサーサイト
[EDIT]
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

-件のコメント

コメントの投稿

新規
非公開にする

-件のトラックバック

トラックバックURL
http://harukazehajime.blog115.fc2.com/tb.php/128-444659e8
この記事に対してトラックバックを送信する(FC2ブログユーザー)
非構造化プログラミング
[EDIT]
非構造化プログラミング言語がどのようなものか、非構造化プログラミング言語の代表格、BASICで見てみましょう。
BASICは1964年に米ダートマス大学で産声を上げました。コンピュータの教育用としてジョン・ケメニーとトーマス・カーツが開発し、同大学のコンピュータに組み込まれました。このBASICはコンパイラを通して実行されるよう設計されていて、ダートマスBASICと呼ばれるようになります。
1970年代には自作の8ビットコンピュータ、1980年代には8~16ビットパソコンで爆発的に普及します。とくに当時のパソコンにはOSが存在せず、代わりに大幅に機能を削ったBASICを利用していた関係で広く使われ、インタープリタやコンパイラも多数販売されていました。その中の筆頭となるのがMicrosoftで、MS-BASIC、GW-BASIC、QuickBASICといった製品が同社の飛躍に繋がります。後者ふたつはやがてVisual Basicへの足がかりにもなっています。
BASICはFORTRANやCOBOLに次いで標準規格が策定されましたが、将来性をまったく考慮しない限定的なものでした。パソコンの成長は目覚ましく、標準規格はあっけなく陳腐化し、各社で独自の拡張を施すことが流行り、様々なバリエーションが存在します。
その中でも無料で、makeなどすることなくすぐに利用できる、マルチプラットフォームのChipmunk Basic(以下cbasと略)を使ってみます。Mac版は歴史的な経緯でGUIバージョンが存在しますが、コマンドラインバージョン前提で解説します。もちろん中身はほぼ同じどころかGUI用に機能が拡張されているくらいですので、GUIバージョンのコマンドラインウィンドウで実行しても構いません。ターミナル.appから利用する場合はCarbon_window_versionフォルダかcommand-line-versionフォルダにあるbasicというファイルをインストールします。
まずHello,world!の次くらいに定番であろう練習プログラム、階乗を求めます。

5 LET FLAG = 0 : LET FAC = 1 : LET I =1
10 INPUT Please input factorial number >", NUM$
20 IF NUM$ = "" THEN 105
30 LET MAX = VAL(NUM$)
40 IF MAX <= 1 THEN LET MAX = 1 ELSE GOTO 50
45 GOTO 210
50 LET FAC = FAC * I
55 LET I = I + 1
60 IF I > MAX THEN GOTO 210 ELSE GOTO 50
100 REM エラー処理
105 LET FLAG = 1
110 PRINT "ERROR: No input."
120 INPUT "Please input any key to retry >", K$
125 IF FLAG = 1 THEN 5
130 QUIT
200 REM 計算終了
210 PRINT NUM$ + " factorial is " + MAX
220 GOTO 120

テキストエディタで入力し終えたら、アルファベットのファイル名に拡張子.basを付けて保存します。今回はfactor.basとでもしましょう。実行はxtermやターミナル.appなどから
basic factor.bas
でreturnキー。すると10行目(1行目ですが10を指定したため)のPlease input factorial number.が表示され、入力を求めてきます。半角で階乗を求めたい値を適当に入力してください。ただしあまり大きな値は入力しないように。
returnキーを押すと結果が返ってきます。

その前にある5行目は変数の初期化(初めて変数に値を代入すること)です。
LETはLet's GO!などでもおなじみの「~しよう」、「~しなさい」という命令です。つまるところLET FLAG = 0は「変数FLAGと0を等しくしなさい」という意味で、プログラミングでは代入といいます。
実はこのLET、省略することが可能で、FLAG = 0だけでもかまいません。何で省略できるのにわざわざ付けたかというと、プログラミングに慣れていないとFLAG = 0だけでは「変数 FLAGと0は同じである」と勘違いして混乱してしまいます。「変数 FLAGと0は等しくないかもしれないのに同じなのか。等しくなかったらどうなるんだ?」といった感じですね。LET FLAG = 0なら「変数FLAGと0を同じにしなさい」と読むことができ、すんなり理解できるわけです。この辺は教育向けに設計されたゆえのおせっかいというわけです。
BASICは1行1命令といいましたが、コロン : を使うことで1行にまとめることができます。ただし、古いBASICだと1行何文字、と決まっていることが多いので、今回のような短い命令をまとめる程度にしましょう。
というわけで、ここでは変数FLAGは0、残りの変数FACとIは1を代入します。

20行目は入力が空だった(returnだけを押した)場合にエラーとして処理させます。そのときはTHENに続く行番号、ここでは105行目に飛びます。入力が空の場合、変数に格納された文字は空(空文字)になっています。空文字は""と、ダブルクオート2つ「だけ」で表現されます。入力が空かどうかの判定は、変数と空文字が同じであるという比較 IF NUM$ = "" THEN で行います。
NUM$ = "" は一見「変数NUM$を""にする」と思ってしまいますが、手前にあるIFが続く式を比較するという意味を持っているので「変数NUM$と""は等しい」と読むことができるわけです。IFは文字通り「もしも」、THENも「ならば」という意味ですから、「もしも変数NUM$と""が等しいならば」と読みます。すっかり英文になってしまいました。これがBASICのよいところです。
THENの後の数字は、移動する行を指定しています。つまり105行目(実際に105行なくても、頭に付けた数字が行番号です!)に移動する(ジャンプする、飛ぶ)ということになります。入力が空でなかった場合、THENの後の数字は無視して次の行を実行します。

30行目は数値を受け取る変数に、入力された文字を数値に変換してから代入します。入力された数字は文字であり、数値変換しないと数学的な演算が正しくできなくなることがあります。これはプログラムを実行するプログラムが、文字で受け取ったものは文字であり、数字でも計算に使うものではない、数値として受け取ったものは数値であり計算のために使う、というように区別しているからです(実際のところは全然違うんですが、そういうものだと思ってください。ややこしい話ですので)。
VAL(NUM$) というのが文字を数値に変換する関数です。()の中に与えた文字列変数(引数=ひきすうといいます)を数値に変換して、= の左側(左辺)の数値変数に代入します。

40行目に再びIFが出てきました。ここでは変数 MAXが1以下(未満ではない)かどうかを調べます(大小・等不等を比較することを比較演算といいます)。数学では以下を表す不等号として≦がありますが、これは古いコンピュータで使用することができなかったた、また他言語かが進んだ現在でも手軽に入力できるようにするため、<=で代用しています。
閑話休題。比較演算でMAXが1未満とわかったらTHENの後ろが実行されます。前回出てきたIF~THENでは行番号を指定していましたが、今回は LET MAX = 1 ELSE GOTO 50 と書かれています。古いBASICではこのように、行番号を指定して実行する行を移動したり、なんらかの処理を行わせることも可能になっています。
つまりMAXが1以下であれば LET MAX = 1 が実行されてMAXは1を保持し(0および1の階乗は1)、ELSE以降を無視して次の行に移ります。
ELSE以降はMAXが1以上のときに初めて効力を発揮します。THENとELSEの間を無視してELSEに続く1つの命令を実行します。GOTOはBASIC最大の汚点と言われた命令で、指定の行番号かラベルに飛びます。ここでは行番号をしていしているので50行目に飛ぶわけです。

45行目はあとから50行目の前に挿入したのでこうなっています。行番号を2桁以上、通常は10とか100単位で増えるようにして、挿入時は1や5単位で行番号を割り当てておくと、何処に修正を加えたかが分かりやすくなります。ここには40行目でMAXが1以下だったときに、ELSEで飛ばされてくる場所です。GOTO 210と書いてあるので210行目に飛んでいきます。

50行目はいよいよ階乗を求める部分です。階乗の数学的な式は、たとえば4の階乗を求めたいなら1×2×3×4=24です。乗算を繰り返し行うのでループを使います。
まず、階乗の途中計算を入れておくFACに、FACとIを乗じた値を代入します。5行目でFACとIを1に初期化しているので、LET FAC = 1 * 1をやっていることになります。たいていのプログラミング言語は、≦と同じ理由で、×のかわりにアスタリスク * を使います。
55行目でLET I = I + 1を行ってIは2になります。
60行目はIがMAXを超えたかを調べ、等しければ210行目へ抜け出し、そうでなければ50行目に戻ります。この場合LET FAC = FAC + 2なのでFACは1 * 2の結果が代入され、55行目でIが3になります。
MAXを4とすれば、Iはまだ3なので50行目に戻り、LET FAC = 2 * 3が実行されます。55行目でIがMAXと同じ4になりますが、このままではFACは6で、まだ1×2×3までしか計算していないことになります。60行目でIがMAXを超えたかを調べているのはこのためです。50行目と55行目を入れ替えればIとMAXが等しくなったかを調べるようにすることができます。
さて、IはまだまだMAXを超えていないので、再び50行目に飛ばされます。LET FAC = 6 * 4を実行して晴れてFACが24になりました。55行目でIもMAXを超えることになり、ループを抜け出します。

100行目はREMの後ろに「エラー処理」と書かれています。REMはreminderの略で、コメントとか注釈という意味です。Cをご存知なら/* エラー処理 */ですし、HTMLなら<!-- エラー処理 -->と書いたのと同じで、cbasはREMより後ろを無視して次の行に進みます。つまりcbasにとっては何が書いてあるかなど知ったことではないので、日本語を書いても問題ありません。その時はUTF-8Shift-JISで保存しましょう。

105行目はフラグを立てます。フラグというのは、簡単に言えばプログラムの状態を表すものです。例えばエラーが起きているか正常か、といった状態です。105行目には20行目で入力が空だったときに飛んでくる場所でした。つまりエラーが起きたということなので、フラグ変数FLAGに1を入れます。別に1じゃなきゃいけないわけではないのですが、フラグにはたいてい何もなかった(フラグが立っていない)ときは0、何かしらあった(フラグが立った)ときは1を入れます。
110行目はエラーが起きたことを画面に表示します。
120行目はメッセージを確認したかどうかを調べるため、キー入力を待つことでプログラムが勝手に進まないように防いでいます。
125行目はエラーが発生したかどうかを調べています。ここではとりあえず入力が空であることを再度調べています。何度も同じことを調べるのは変な話ですが、あとで理由がわかるでしょう。
エラーが発生していた場合は5行目まで戻ってもう一度計算するチャンスを与えています。

130行目を飛ばして200行目です。コメントとして「計算終了」とあります。つまり階乗の計算が終わったらここに来て色々行うわけです。
210行目では入力された値に対する階乗の結果を表示します。実は文字同士も一応足し算はできます。ただし足し算といっても、文字と文字とを繋ぎ合わせるだけですが。こうすることでいくつもの変数の内容を1つの命令だけで表示させることができます。
220行目はGOTOで120行目に飛ぶよう指定しています。120行目はメッセージを確認するまで待つ処理を入れていました。計算結果を表示したら、やはり一旦実行が止まってほしいですからね。
その次の125行目も存在意義が発揮されます。200番台の行に飛んできた場合、FLAG変数は5行目で0に初期化したままなので、THENの後ろは無視されて130行目に移動します。
130行目のQUITはアプリケーションを終了させる命令です。

いかがでしたか?プログラミングがどのようなものかを理解できる一助になれば幸いです。
非構造化と構造化の違いは次の記事で理解することができるはずです。お楽しみに。
関連記事

0件のコメント

コメントの投稿

新規
非公開にする

0件のトラックバック

トラックバックURL
http://harukazehajime.blog115.fc2.com/tb.php/128-444659e8
この記事に対してトラックバックを送信する(FC2ブログユーザー)

Appendix

プロフィール

さくらゆーな

Author:さくらゆーな
鉄道熱が再燃して、撮影に模型にいろいろやってます。
最近反核運動に偏ってるのを反省したいけど
知れば知るほど極悪非道な界隈で止まらない…

カレンダー

05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

+ アーカイブ
 

最近の記事

カテゴリー

検索フォーム


キーワード

カウンター

トータルカウンター
現在の閲覧者数:

ads3

Mac ソフトのことなら act2.com

Make a donate

もしこのブログを気に入っていただけたら上記アフィリエイトプログラムか下のPayPalでブログ・サイトの維持にご協力ください。

donationPrice

ブロとも申請フォーム

この人とブロともになる

ブログランク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。