プロが教える店舗&オフィスのセキュリティ対策術

C言語初心者です。作成し実行した結果、問題の答えと異なる表示がされてしまいました。
どこを修正すればいいか、教えていただけると助かります。
環境は、Windows10、Visual Studio 2017です。



(問題)キーボードから、0から255までの整数を入力させ、その数値を二進数に変換するプログラムを作りなさい。なお、手順は、以下の通り行うこと。
(ヒント)
(1)入力された数値を、変数nに代入する。
(2)nと0x80の論理積を求める。
(2)(2)の計算の結果が0ならば、0を、それ以外なら、1を表示する。
(3)nの値を、左シフトする。
(4)nが0でなければ、(2)に戻る。
(5)nが0ならば、改行し、終了。

(期待される実行結果)
Input Number(0-255):35  ←キーボードから入力
00100011


(私が作成したもの↓)
#include<stdio.h>

void main(){
int n,ans;
printf("Input Number(0-255):");
scanf_s("%d", &n);

while (1) {
ans = n & 0x80;
if(ans==0){
printf("0");
}
else {
printf("1");
}
n <<= 1;
if (n == 0) {
printf("\n");
break;
}
}
}

(実行結果↓)
Input Number(0-255):35
00100011000000000000000000000000

※0がたくさん表示されてしまいます。。。

A 回答 (4件)

No1の方の指摘でchar型にかえたとしても、このロジックでは正しく動作しません。


例 64を入力すると
01
と表示されるだけです。

そもそも、ヒントの(5)nが0ならば、改行し、終了。の部分が間違っています。
ヒントはようにあるべきです。
(1)入力された数値を、変数nに代入する。
(2)以下の処理を8回繰り返す。
(2-1)nと0x80の論理積を求める。
(2-2)(2-1)の計算の結果が0ならば、0を、それ以外なら、1を表示する。
(2-3)nの値を、左シフトする。
(3)改行を表示する。

上記に従って作成したソースです。
#include <stdio.h>
void main(){
int n,ans;
int i;
printf("Input Number(0-255):");
scanf_s("%d", &n);

for(i=0;i<8;i++) {
ans = n & 0x80;
if(ans==0){
printf("0");
}
else {
printf("1");
}
n <<= 1;
}
printf("\n");
}
    • good
    • 1
この回答へのお礼

たしかにそうですね。
本問題のヒントでは、64や32といった数値に対応しきれないですね。
ありがとうございます、勉強になりました。

お礼日時:2017/11/24 19:07

No2です。


ヒントはようにあるべきです。・・・は間違いでした。

正しくは、
ヒントは以下のようにあるべきです。
です。
    • good
    • 1

>ちなみに以下の警告がでましたので


あーごめんなさいそこの修正も必要でしたね、すみません
hhdなんて指定子があるんですね...逆に知りませんでした...
一般的ではないと思いますが、動くならいいでしょうw

>解説していただけるとありがたいです。
解説といってもたいしたことではないのですが
int型は4バイトです(実行環境で変わるので必ず4バイトではないのでここは注意です)
なので35と入力すると
質問者さんの想像だと00100011が変数に入っていると思ったかもしれませんが
実際には00000000000000000000000000100011
と頭に0が沢山入っている状態なのです
00100011が1バイトなので残りの3バイト分0で埋められている状態ですね

これをシフト演算して計算していった結果
頭の0が後ろについてしまったわけです

ちょっとざっくりした回答ですけど
これで分かりますかね?
    • good
    • 1
この回答へのお礼

なるほどですね、分かりやすいです。
理解することができました。
ありがとうございます。

お礼日時:2017/11/24 19:04

変数の型をchar型もしくはunsigend char型にしてみてください



必要なら解説しますが
とりあえずそれでちゃんと動くか確認してみてください
    • good
    • 1
この回答へのお礼

ありがとうございます。
char型に変更したところ、動かすことができました。
ちなみに以下の警告がでましたので、それも含めて変更したところ、正常に動かすことができました。(%hhdのところです。)
恐縮ですが、習得したいと考えています。差し支えなければ、解説していただけるとありがたいです。

1>------ ビルド開始: プロジェクト: Project13, 構成: Debug Win32 ------
1>probex3-3.c
1>c:\users\watan\source\repos\project13\probex3-3.c(6): warning C4477: 'scanf_s' : 書式文字列 '%d' には、型 'int *' の引数が必要ですが、可変個引数 1 は型 'char *' です
1>c:\users\watan\source\repos\project13\probex3-3.c(6): note: 書式文字列に '%hhd' を使用することをお勧めします
1>Project13.vcxproj -> C:\Users\watan\source\repos\Project13\Debug\Project13.exe
1>プロジェクト "Project13.vcxproj" のビルドが終了しました。
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

お礼日時:2017/11/24 17:15

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