dポイントプレゼントキャンペーン実施中!

初歩的なC言語に関する質問です。
テストに出た問題なのですが、解答が開示されず悩んでいます。
以下問題です。

printf,scanf,if,switch,do,while,for
を用いて10進数を2進数に変換するプログラムを作ります。
(ビット変換などは範囲外です。)

整数の範囲で行います。
使わないものがあっても構いませんが、for文のみは必ず使わなくてはなりません。

よろしくおねがいします。

質問者からの補足コメント

  • 整数値をscanfで取り込みそれを10進数と見なし2進数に変換してprintfで表示させたいです。値はint型ですべて扱います。

    質問文「ビット~~」の一文は無視してください。授業中の発言をうろ覚えで書いたため誤りがあります。
    int b[100];
    のような鍵かっこを用いてはならないという意味のようですが、コレにも誤りがございましたら、無視してください。

    不足、誤りがあり申し訳ありません。よろしくおねがいします。

      補足日時:2016/11/17 14:47
  • 修正です。
    すべての整数ではなく正の整数と0でお願いします。

      補足日時:2016/11/17 16:46
  • 何度も補足すみません
    stdio.hのみinclude可能です。
    配列は用いては行けません。
    intのみ(%dのみ)です。
    各方への返事は後程行います。よろしくおねがいします。

      補足日時:2016/11/18 14:58

A 回答 (14件中11~14件)

以下のプログラムでどうでしょうか。



#include <stdio.h>

int main(void) {
int i, n, c = 4;
scanf("%d", &n);
for (i = 16; n >= i; i *= 16)
c += 4;
for (i = c - 1; i >= 0; i--)
printf("%lu%s", (1 << i) & n ? 1 : 0, ((i % 4) == 0 ? " " : ""));
return 0;
}
    • good
    • 0

「for を使う」というのが地味に面倒だなぁ. それがなければ再帰でさくっと終わるのに.



さておき, 入力のエラー処理を無視するとこんな感じかな:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

void printBinary(int x, int suppressZero)
{
int base;
for (base = (INT_MAX/2)+1; base > 0; base /= 2) {
if (x >= base) {
putchar('1);
x -= base;
suppressZero = 0;
} else if (! suppressZero) {
putchar('0');
}
}

if (suppressZero) {
putchar('0');
}
}

int main(void)
{
int x;
printf("Input nonnegative value: ");
scanf("%d", &x);
printf("The binary representation of %d is: ", x);
printBinary(x, 1);
putchar('\n');

return EXIT_SUCCESS;
}

なお, この「教えて!goo」では仕様上「半角空白でインデントできない」ことになっている (という答が返ってきている) ので, インデントについてはあきらめてください. あとあえてコメントは書かず.
    • good
    • 0

正の数 (と 0) だけであるなら表し方にさほどの紛れはないんですが (しいて言えば先頭に 0 をつけるかつけないか, くらいは考える必要がある), 負の数を許す場合にはそれをどのように表すのかも決めておく必要があります. 例えば -19 はどのように表せばいいのでしょうか?



あと, 「解答が開示されず悩んでいます」ということだけど, この「解答」というのは「あなたの解答」という意味じゃなくって「(出題者が想定した) 正答」という意味だよね? でそうだとすると, ここでプログラムを書いたとしてもその「(出題者が想定した) 正答」と違うものになってしまう可能性は高いんだけど, それはしょうがないってことでいいのかな?
    • good
    • 0
この回答へのお礼

ご指摘、ご確認ありがとうございます。
2進数上の負の値の扱いのことを知らずいってしまいました。
授業では特に習わず、定義されませんでしたが、以降正の整数と0という扱いにいたします。
私の答えたものではなく問題の正答という認識です。出題者の想定した正答と異なっていて構いません。

お礼日時:2016/11/17 16:45

本気で考えるといろいろ突っ込みどころがある. 例えば, 「10進数を2進数に変換する」といっても


・「10進数」をプログラムにどうやって与えるのか
・「2進数」はプログラムからどう取り出すのか
を決めないとプログラムにしようがない. さらにいうと
・「整数の範囲」というが符号はどう扱うのか
というのも不明瞭だし,
・「ビット変換などは範囲外です」
とかっこ書きしてあるけど「ビット変換」ってなんだよとか, 不明確なところもある.
    • good
    • 0
この回答へのお礼

不学なために不足、誤りがあり申し訳ありません。ご指摘ありがとうございました。いくつか補足を行いました。
また、正負は正負のまま基数変換、printfで表示を行います。

お礼日時:2016/11/17 14:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!