質問<3700>2008/3/30
次の問題を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を書き換えていく、と言う 構造になっています。やってることは同じですね。 まあ、参考にして下さい。