こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

プログラミング 十進BASIC

はじめまして。
パソコン超初心者のものです。
十進BASICで10進法を16進法に変換するプログラムを以下のように作成したとき、文字の表している意味がわからず、120から表現しているようなことはわかる気がするのですがいまいちはっきりわかりません。わかるかた教えていただけないでしょうか。よろしくお願いいたします。


10  !16進法に変換する    
20  DIM hex(4)
30 LET dec=65535
40 LET p=1
50 DO WHILE 16<=dec
60 LET hex(p)=MOD(dec,16)
70 LET dec=INT(dec/16)
80 LET p=p+1
90 LOOP
100 LET hex(p)=dec
110 ! hex(p) ~ hex(1)
120 FOR i=p TO 1 STEP -1
130 LET y=hex(i)
140 PRINT mid$( "0123456789ABCDEF", y+1 ,1 );
150 NEXT i
160 END

(1)「!」の意味は何ですか?日本語を入力するときに使うのかな?なんて思っていますが・・
(2)hexは何ですか。Dimは配列なのはわかります。Aとかでも問題ないのでしょうか?
(3)decは何ですか。代入する数値のことだと思うのですが、nとかではダメなのでしょうか。
(4)140の意味。11をA、12をB・・と書くためのものですか?
詳しく教えていただけないでしょうか。

投稿日時 - 2008-06-25 14:07:54

QNo.4128114

すぐに回答ほしいです

質問者が選んだベストアンサー

#6です。訂正っ!

hex(1)=2   16進数の1桁目
hex(2)=B   16進数の2桁目
hex(3)=A   16進数の3桁目
hex(4)=4   16進数の4桁目

じゃなくて

hex(1)=2   16進数の1桁目
hex(2)=11   16進数の2桁目
hex(3)=10   16進数の3桁目
hex(4)=4   16進数の4桁目

投稿日時 - 2008-06-25 16:38:41

ANo.7

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

>"0123456789ABCDEF"と y+1 ,1 は別の関係なのでしょうか?

あう~・・・。

10進数の"19122"を16進数に変換することを考えて見ると、ですねえ。

30 LET dec=19122

からスタートすれば「120」の直前で

hex(1)=2   16進数の1桁目
hex(2)=B   16進数の2桁目
hex(3)=A   16進数の3桁目
hex(4)=4   16進数の4桁目

になってますでしょ? で、「130」で y=hex(4)=4 ですから

mid$( "0123456789ABCDEF", y+1 ,1 )

は、"0123456789ABCDEF"の「y+1」番目、即ち「4+1」番目の文字から
1文字を引っ張り出すんですから、"4"ですよね。
「y」番目を引っ張っちゃうと"5"になっちゃいますよ。

ですので「FOR」のループの1回目の「PRINT」命令は

140 PRINT "4";

になります。これを4回繰り返すと

140 PRINT "4";   16進数の4桁目を印刷する

140 PRINT "A";   16進数の3桁目を印刷する

140 PRINT "B";   16進数の2桁目を印刷する

140 PRINT "2";   16進数の1桁目を印刷する

になって、結果的に「4AB2」と印刷されるわけです。

投稿日時 - 2008-06-25 16:36:44

お礼

たびたびのご回答ありがとうございます。
丁寧に教えてくださったので、この問題に関してはきちんと理解できました。
マイナスと少数は・・・・次に置いておきます。

本当にありがとうございました!!

投稿日時 - 2008-06-25 21:08:01

ANo.5

ANo.4です。
>すみません、よくわかりません・・
>"0123456789ABCDEF"と y+1 ,1 は別の関係なのでしょうか?
mid$は第1引数の先頭から第2引数の位置にある文字から第3引数分文字を切り出す関数です。
例えばmid$("ABCDEFGHIJKLMNOPQRSTUVWXYZ",10,1)の場合は、Jが切り出され、mid$("ABCDEFGHIJKLMNOPQRSTUVWXYZ",8,2)だとHIが切り出されます。

今回の場合では"0123456789ABCDEF"の先頭からy+1番目の文字から1文字切り出します。
yには16進数の各桁の値(0~15)が入っています。
y+1から文字を切り出すことによって16進表記の値が表示されるようになります。

投稿日時 - 2008-06-25 16:28:02

お礼

これも理解できました!
mid$("ABCDEFGHIJKLMNOPQRSTUVWXYZ",8,2)てのは、
前から8番目を二文字切り出す、ということですよね。
ご丁寧にありがとうございます。

投稿日時 - 2008-06-25 21:04:39

ANo.4

>16のところを2に、140を、01にすると10進数から2進数へ変換する
>プログラムになるでよかったでしょうか?

まぁ140行目は変えなくても動きます。
ただし20行目は配列数を変更する必要があります。
30行目でdecに16ビットの最大値を入れていますから配列の要素は16必要です。

プログラムはこんな感じです。

10 !2進数に変換する
20 DIM bin(16)
30 LET dec=65535
40 LET p=1
50 DO WHILE 2<=dec
60 LET bin(p) = MOD(dec,2)
70 LET dec = INT(dec/2)
80 LET p=p+1
90 LOOP
100 LET bin(p) = dec
110 !bin(p) ~ bin(1)
120 FOR i=p TO 1 STEP -1
130 LET y=bin(i)
140 PRINT mid$("0123456789ABCDEF",y+1,1);
150 NEXT i
160 END

投稿日時 - 2008-06-25 16:13:20

お礼

ありがとうございます。理解しました!
140は"01"でも大丈夫ですよね?

投稿日時 - 2008-06-25 21:03:03

ANo.3

>mid$は何のことで、かっこ内の,y+1,1は何を表しているのでしょうか。

Excelと同じです。
初めから「y+1」番目の文字から「1」文字切り出すという関数です。

"012・・・"の1番目の文字は"0"なので、「y+1」番目を切り出さないと
「変換した16進数」と合いませんよね。

>この50は、入力する数値が16以上、ということでしょうか?

decが16以下ならば、余りと(mod関数で出てきますね)商を引っ張り
出すという処理が入ってるだけですよ。例えば15なら、余り15と商0
が出て、ループを1回も回らず飛び出しますよね。

逆に言えば、この処理ではマイナスや小数の処理は出来ません。
たぶん次のステップで、そういう場合にどう処理するかが問われますよ。
ご自分で考えて見てください。

>16のところを2に、140を、01にすると10進数から2進数へ変換する
>プログラムになるでよかったでしょうか?

検証してませんが、なりそうな気はします。

投稿日時 - 2008-06-25 15:40:03

お礼

>Excelと同じです。
初めから「y+1」番目の文字から「1」文字切り出すという関数です。

"012・・・"の1番目の文字は"0"なので、「y+1」番目を切り出さないと
「変換した16進数」と合いませんよね。

すみません、よくわかりません・・
"0123456789ABCDEF"と y+1 ,1 は別の関係なのでしょうか?

>decが16以下ならば、余りと(mod関数で出てきますね)商を引っ張り
出すという処理が入ってるだけですよ。例えば15なら、余り15と商0
が出て、ループを1回も回らず飛び出しますよね。

こちらは理解しました。

>逆に言えば、この処理ではマイナスや小数の処理は出来ません。
たぶん次のステップで、そういう場合にどう処理するかが問われますよ。
ご自分で考えて見てください。

確かに・・ということはこの流れプログラミングではダメということですよね。
実際このプログラムも実行できるプログラムを理解する、といった形なので、はじめから自分で作成するとなると、困りました、ツライです・・

投稿日時 - 2008-06-25 16:05:21

ANo.2

「30」が変換する元の10進数ですね。

「50」~「90」で、「30」の値を16で割った余りを順に出しています。
これって「下の桁から16進数に変換」していることになりますよね。
ですので「hex(i)」はi=1から順に「16進数の各桁の値」が入っています。

ただし、このままでは[10]~[16]の値が[A]~[F]では表示できません。
こいつを変換するのが「120」~「150」です。要は「前から何番目」
で単純に「文字」を与えているだけです。PRINT命令に改行コードが
入っていませんので、値は行を変えずにそのまま次々打ち出されると
言うわけです。

投稿日時 - 2008-06-25 14:41:30

お礼

ただし、このままでは[10]~[16]の値が[A]~[F]では表示できません。
こいつを変換するのが「120」~「150」です。要は「前から何番目」
で単純に「文字」を与えているだけです。PRINT命令に改行コードが
入っていませんので、値は行を変えずにそのまま次々打ち出されると
言うわけです。

なるほど!ご丁寧にありがとうございます。
mid$( "0123456789ABCDEF", y+1 ,1 ); の
mid$は何のことで、かっこ内の,y+1,1は何を表しているのでしょうか。

もう一点、この50は、入力する数値が16以上、ということでしょうか?
プログラミングは16以下の数値を入れても動きます。

ちなみに、16のところを2に、140を、01にすると10進数から2進数へ変換するプログラムになるでよかったでしょうか?

投稿日時 - 2008-06-25 15:05:18

ANo.1

(1):10からの推測になりますがコメント行と思われます。

(2):Aでも問題ないと思います。

(3):nでも問題ないと思います。

(4):ご推測の通りと思います。

(3)(4)に関してですが、配列や変数名はなんでもかまわないと言えばかまわないと思いますが、後で見て分かりやすい名前が好ましいと思います。特にnといった変数名はループ文中で使うことがあると思われますので。

投稿日時 - 2008-06-25 14:32:04

お礼

迅速にありがとうございます。
プログラミングに慣れておらず、臨機応変できないので、
hex、decは、文字自体が何かを表しているのかと思っていました。
ありがとうございます。

投稿日時 - 2008-06-25 14:57:07

あなたにオススメの質問