10進数を2進数に変換するプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sir

10進数を2進数に変換するプログラム

#1

投稿記事 by sir » 15年前

基本的なことの質問で申し訳ないです。
以下のプログラムは入力された正の10進数を2進数に変換するプログラムです。
見ればすぐわかると思いますが自作した関数を使用して処理しています。
関数部分でどのような処理しているのか解説していただけませんか?
よろしかったらお願いします。

#include<stdio.h>
void binary(int);

int main(void)
{
  int nu;

  printf("Input Decimal:");
  scanf("%d",ν);

  if(nu>0){
    printf("Binary:");
    binary(nu);
    printf("\n");
  }
  else if(nu==0){
    printf("Binary:0\n");
  }
  else{
    printf("Input error\n");
  }

  return 0;
}

void binary(int n) /*ここの部分からです。*/
{
  int mod,div;

  if(n>0){
    mod=n%2;
    div=n/2;
    binary(div);
    printf("%d",mod);
  }
}

初級者

Re:10進数を2進数に変換するプログラム

#2

投稿記事 by 初級者 » 15年前

自作関数の内容は、ご自分がいちばんわかっているはずです。
他の人に解説を求める理由が全くわかりません。

Eeel

Re:10進数を2進数に変換するプログラム

#3

投稿記事 by Eeel » 15年前

例として、二進数で 1011 という数があったとして

mod=n%2;

一番右の桁が mod に代入されます。
二進数で ~0(1010など)は全て2で割り切れ、 ~1(1011など)は全て2で割り切れません。


div=n/2;

n進数をnで割ると数字が一桁シフトします。
例えば、10進数 1230 を 10 で割ると 123 になります。
今回の場合、変数が整数型なので小数点以下は切り捨てられ、1011 は 0101 になります。
切り捨てられますが、このプログラムではその値は mod=n%2; で確保されています。

binary(div);

再び自作の関数を呼び出しています。
最初は 1011 で呼び出しましたが、今回は 0101 で呼び出されています。
 自作関数(1011)の中で
  自作関数(0101)が呼ばれその中で
   自作関数(0010)が呼ばれその中で
    自作関数(0001)が呼ばれその中で
     自作関数(0000)が呼ばれます

最後は0なので if(n>0) の条件を満たさず何もせずに終了します。そして

    自作関数(0001)に戻り、その mod を表示し、
   自作関数(0010)に戻り、その mod を表示し、
  自作関数(0101)に戻り、その mod を表示し、
 自作関数(1011)に戻り、その mod を表示し、
mainに戻ります。

ポイントは2進数と再帰呼び出しです。

sir

Re:10進数を2進数に変換するプログラム

#4

投稿記事 by sir » 15年前

> 自作関数の内容は、ご自分がいちばんわかっているはずです。
> 他の人に解説を求める理由が全くわかりません。

自作といっても問題集のものです。
どのように処理されて出力されているのか理解できなかったため質問させてもらいました。

sir

Re:10進数を2進数に変換するプログラム

#5

投稿記事 by sir » 15年前

Eeel様
丁寧な解説ありがとうございました。
自分の理解力が足りないせいでまだぼんやりといった感じですがとても参考になりました。
よく読んでちゃんと理解できたらと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る