No.17778![]() |
10進数から2進数 投稿者---かなみ(2004/11/04 18:00:23) |
||
10進数から2進数への変換をするソースを作りたいのですが、 途中でわからなくなってしまいました。特にfor文の中身がわかりません。 while文の中で2で割った余りを求めて、for文の中で順番を入れ替えて 並べたいのですが、どなたか教えてください。 #include <stdio.h> int main (void) { int i=0,n,m,c[100]; scanf("%d") while(m>0){ c[i]=m%2; i++; m=m/2; } for (j=i-1;j>=0;j--){ putchar(c[j]); } } |
No.17781![]() |
Re:10進数から2進数 投稿者---nop(2004/11/04 18:47:01) |
||
↓は参考になりませんか? http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+17693 |
No.17782![]() |
Re:10進数から2進数 投稿者---Hermit(2004/11/04 18:47:43) |
||
かなりいいとこまでいってますけど、 あともうちょいとですね。 scanf で、データーを取り込む領域がない j が宣言されてない putchar で文字を出力するのだから、文字型でデーターを入れないと (これは、一応、'1','0' の文字データを入れてますが、) (1,0 の数値データのままで、putchar(c[j]+'0') で) (文字型に変換してもいいかも。putchar(c[j]?'1':'0')でもいい) #include <stdio.h> int main (void) { int i=0,j,n,m,c[100]; scanf("%d",&m); while(m>0){ c[i]=m%2 ? '1': '0'; /* 又は c[i] = '0' + m%2; */ i++; m=m/2; } for (j=i-1;j>=0;j--) { putchar(c[j]); } return 0; } |
No.17791![]() |
Re:10進数から2進数 投稿者---かなみ(2004/11/04 21:42:07) |
||
エラーが出たのでこのように書きかえたのですが、 実行しても何もおこりません。 どこがいけないのでしょうか? #include <stdio.h> int main (void) { int i=0,j,m,c[100]; scanf("%d",&m); while(m>0){ c[i]=m%2; i++; m=m/2; } for (j=i-1;j>=0;j--) { putchar(c[j]); } return 0; } |
No.17792![]() |
Re:10進数から2進数 投稿者---OZ(2004/11/04 21:56:25) |
||
>c[i]=m%2; がHermitさんの記述と違うことを除けばちゃんと動作しますが。 |
No.17793![]() |
Re:10進数から2進数 投稿者---Hermit(2004/11/04 21:58:02) |
||
数値ではなく、文字を出力しましょう。 |
No.17794![]() |
Re:10進数から2進数 投稿者---かなみ(2004/11/04 22:08:21) |
||
>数値ではなく、文字を出力しましょう。 char型ってことですよね?間違いがわからないです。 |
No.17795![]() |
Re:10進数から2進数 投稿者---Hermit(2004/11/04 22:21:13) |
||
文字型って書いたのが悪いかな そっちの方がわかりやすいかと思った私がいけなかった(^^; putchar() に入れるのは、int でいいのですが、 文字コードの '0' は、数値で言うと 48 です。 ですから、0 を文字として出力したい時は、 putchar() に、48 を入れなくてはいけません。 しかし、それではプログラム中で何をやっているかわからないので 文字の数値をわかりやすいように変換できます。 0 をシングルクオーテーションで囲むと、勝手にコンパイラが 数値に変換してくれます。 '0' <- この様に囲みます。これで、'0' の文字コード 48 の数値になるのです。 |
No.17796![]() |
Re:10進数から2進数 投稿者---Hermit(2004/11/04 22:26:36) |
||
あ、それと シングルクオーテーションは、shift+7 です。 shift+@ ではありませんので、注意です。 |
No.17797![]() |
Re:10進数から2進数 投稿者---かなみ(2004/11/04 22:36:57) |
||
このようにしてみましたがあってますでしょうか? 実行すると000や00000とかしか出ないのですが・・・ #include <stdio.h> int main (void) { int i=0,j,m,c[100]; scanf("%d",&m); while(m>0){ c[i]=m%2; i++; m=m/2; } for (j=i-1;j>=0;j--) { putchar('0'); } return 0; } |
No.17798![]() |
Re:10進数から2進数 投稿者---Hermit(2004/11/04 22:42:15) |
||
前のところにも書きましたが、 '1' の文字は、49 ですので、'0' に 1 を増やせばいいです。 ですから、 putchar('0'+ c[j]); でいけるはずです。 |
No.17799![]() |
Re:10進数から2進数 投稿者---かなみ(2004/11/04 22:49:26) |
||
>前のところにも書きましたが、 > >'1' の文字は、49 ですので、'0' に 1 を増やせばいいです。 >ですから、 >putchar('0'+ c[j]); >でいけるはずです。 ありがとうございます。正確に実行されました。 例えばこれの逆ってできるのでしょうか?2進数から10進数の変換とか・・ その場合はどのようなソースになるのでしょうか? |
No.17801![]() |
Re:10進数から2進数 投稿者---Hermit(2004/11/04 23:05:13) |
||
順番にデーターを取り込んでいって、1 か、0 を加算 2をかけてデーターを取り込んで 1 か、0 を加算 その繰り返しで、後は、printf() などで表示が 簡単ではないでしょうか。 |
No.17802![]() |
Re:10進数から2進数 投稿者---nop(2004/11/05 08:57:47) |
||
>例えばこれの逆ってできるのでしょうか?2進数から10進数の変換とか・・ strtol()と言う標準関数で可能です。 |
No.17803![]() |
Re:10進数から2進数 投稿者---Hermit(2004/11/05 09:19:09) |
||
そうでした(^^; |
No.17800![]() |
Re:10進数から2進数 投稿者---Hermit(2004/11/04 23:00:05) |
||
ほかのやり方。 putchar(c[j] ? '1' : '0'); c[j] ? で、 0 以外の時、'1' 0 の時 '0' を、putchar() に渡します。 たまたま、'1' と、'0' しか出力しないので、これもありです。 |