C言語関係掲示板

過去ログ

No.1322 10進数から2進数

[戻る] [ホームページ]
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' しか出力しないので、これもありです。