質問<3700>2008/3/30
from=nanaya
「BASICプログラム」


次の問題をBASICプログラムで書きたいです。
問)10進法で表された数を2進法、16進法の表現に変換するプログラム
を書きなさい。
2進法に変換するプログラムは作れたのですが、16進法に変換するプログ
ラムの書き方が分かりません。よろしくお願いします

★希望★完全解答★

お便り2008/4/1
from=亀田馬志


高校数学の窓LaTeX版を参照して下さい。


お便り2008/4/1
from=nanaya


亀田さんありがとうございます。
  16進法で表すときに用いるA~Fのアルファベットを
  プログラム上でどのように表したらよいのでしょうか?
  "16で割ったときの余剰が10のときはAと表す"
というプログラムをつければよいのでしょうか?


お便り2008/4/3
from=亀田馬志


まあ、そう言う事です。
または、本編にも記述しましたが、「別にデータ構造を定義して」それを本体の計算用プログラムから
「参照する」と言う手もあります。
どちらでもお好きなように。

ただし、BASIC言語の場合、一応ANSI規格と言う「標準の」BASICの規格が制定されているのですが(日本
ではJIS)、かなり処理系によって実装が異なります。
よって、具体的に「どう書くのか?」と言う例を挙げる事は(Schemeでは簡単ですが)出来ません。処理系
依存になっちゃうんですね。
少なくとも、(BASICを一回もやったことがない)亀田が調べた限り、ネットで「BASIC入門」の検索かけた
んですが、「標準BASIC」入門は全然ヒットせず、「十進BASIC」(これもJIS準拠と書いていますが、ある
程度"実用の"プログラムを書く以上、「仕様範囲外の独自定義命令」を使わないといけません)入門とか、
あるいは「TinyBasic」入門であるとか、それこそMicrosoftの「VisualBasic」入門であるとか、そう言う
「特定の」実装に関しての解説ばっかりでしたね。
従って、「一般的にどれでも通用する」BASICでのプログラムがどうなるのか、は全く見当が付かない、と
言う事です。
(意外にこの辺はBASIC言語の弱みです)。
まあ、仮に「どれかの」BASICでプログラムを書けたとしても、メンド臭くてしゃーないワケですが(笑)。


↑
亀田のLinuxでEmacs(テキストエディタ)でBASICのプログラムを書いているトコロ。
Emacsの上段でBASICのソースコード、下段で端末(ターミナル)を走らせて、上段で書かれたプログラムが
どうやって走るかテストしながらプログラムを作る。
なお、Linuxでは若干十進BASICは不安定なので、Linux用でのyetanotherBASIC(yaBASIC、ANSI準拠)を走ら
せようとしている。
ちなみに、上段はBASICのソースには見えないかもしれないが、れっきとしたBASICのソース。現代のBASIC
は基本的に行番号はそれほど必要が無い。
また、一行目の

#! /usr/bin/env yabasic

と言うおまじないは「シェバング」と言われるモノでLinuxやFreeBSD等でお馴染みの流儀。この行を書く
ことで「このソースファイルから」特定のプログラミング言語へアクセス出来る。
この例では「yabasicにアクセスせよ」と言っている。
なお、ソースコードの例は「十進BASIC入門」にあるピタゴラス数の計算コードだが、見事バグとして引っ
かかってる。
下段端末に表示されている

Error in /home/cametan/pita.bas, line 6: syntax error at "then"

と言うのは、

「ソースコード(取りあえずpita.basと名づけた)6行目の"then"と言うのはシンタックスエラーです」

と言う表示。つまり「十進BASIC」で扱える「if~then」と言う形式は、他のANSI準拠のBASIC実装では
「動かない」と言う事。
こうなると全く手も足も出ない。制御構造まで違うと「全く違う言語」と言っても良く、「お手上げ」
である。

元々BASICは「実装依存」が大きい言語としては有名だったが、現代もその状況からは脱していないようだ。


お便り2008/4/5
from=亀田馬志


ええと、参考になるかどうか知りませんが、一応VBScriptで問題のコードを書いてみました。
Schemeヴァージョン程完璧じゃないんですが、こんな感じで。多少汚いかもしれませんが、大体一夜漬け
で勉強して作りましたし(笑)。

なお、知らない人もいるでしょうから簡単に紹介しておきますけど、VBScriptはMicrosoftのVisual
Basicの一種で、これはどんな(今主流の)Windowsパソコンにも入っています(新しくインストールしたり
買ったりする必要がない)。
久々に「この問題の為だけに」Windowsを起動しましたが(笑)、まあ、「どんなWindows機でも既に入って
る」上に「簡単に動く」と言う意味では、多分コンパティビリティとしては一番適切じゃないか、と。
純粋なBASICとすればどうだか知りませんが(笑)、まあ、コードをコピペすればすぐ動く、と言う意味では
確かめやすいでしょう。
以下のコードをWindowsのメモ帳(Notepad)にコピペして下さい。

'''ここからVBScript用ソース

dim a(36)
a(0) = 0: a(1) = 1: a(2) = 2: a(3) = 3: a(4) = 4
a(5) = 5: a(6) = 6: a(7) = 7: a(8) = 8: a(9) = 9
a(10) = "A": a(11) = "B": a(12) = "C": a(13) = "D": a(14) = "E": a(15) =
"F": a(16) = "G"
a(17) = "H": a(18) = "I": a(19) = "J": a(20) = "K": a(21) = "L": a(22) =
"M": a(23) = "N"
a(24) = "O": a(25) = "P": a(26) = "Q": a(27) = "R": a(28) = "S": a(29) =
"T": a(30) = "U"
a(31) = "V": a(32) = "W": a(33) = "X": a(34) = "Y": a(35) = "Z"

m = inputbox("mの値を入力して下さい", "mの入力")
n = inputbox("nの値を入力して下さい", "nの入力")

do while m <> 0
    i = m \ n
    j = m mod n
    ls = a(j) & ls
    m = i
loop

msgbox ls ,, n & "進数表示"

'''コピペはここまで。

これをメモ帳にコピペしてから、保存するんですが、例えば"decimal2npn.vbs"と言うように、拡張子に
".vbs"と付けてデスクトップ上に保存します。
Windowsで拡張子が見えない設定になってたりすれば困るんですが、もしそうだったら、

http://www.cdwavmp3.com/dl/extention/ext_hyouji.html

でも参考にして、拡張子を見えるようにWindowsを設定しておいて下さい。
メモ帳ではデフォルトで拡張子は".txt"なので、これじゃあマズいんで、名前は何でも構わないんで、
とにかく".vbs"とするようにするのが肝要です。

デスクトップ上に"decimal2npn.vbs"をセーブしたら、アイコンが出来てると思います。
それをダブルクリックすると、VBScriptが起動します。
VBScriptはWSH(Windows ScriptHost)と言うWindowsのアプリケーションを経由してブラウザ経由で動き
ます。まあ、そんなワケで、IE(InternetExplorer)が入ってるWindowsパソコンだったら簡単に動作を
確認できるでしょう。


↑
ソースはかなりScheme版のver4辺りに準拠するように苦労しましたが、かなりメンド臭かったですね(苦笑)。
DIM文で36要素を持つ配列を最初に宣言しているんですが、その要素を指定するのが結構大変でした。
ショートカットがあるのかもしれませんが、多分この辺は通常のBASICでも似たようなメンド臭さがある
のではないか、と。
配列番号を上手い具合に使って、計算本体から数字なり文字なりを参照させる、と言う構造は同じです。

なお、VBScriptはブラウザ経由で入出力を行うようになっているらしく、inputboxやmsgboxと言うのが
BASICで通常使われているinputやprintにあたる命令のようです。この辺りは「既に組み込みでのGUI
ツールの呼び出しが成される」前提で設計されているようで、簡易性で言うと確かに「通常のBASIC」
よりは使いやすいかも。

あとは繰り返し計算ですが、Schemeでは局所関数loopを定義して再帰呼び出ししていますが、似た感じで
使えそうなdo while loop構文を用いてVBScript版もロジックを構築しています。
iが0になった時点で計算を脱出する、って構造は同じですね。あとはSchemeでは局所関数loopの引数を
書き換える手段でしたが、VBScript版は、do while loop内で変数i , j , mを書き換えていく、と言う
構造になっています。やってることは同じですね。

まあ、参考にして下さい。