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がたくさん表示されてしまいます。。。
No.2ベストアンサー
- 回答日時:
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");
}
たしかにそうですね。
本問題のヒントでは、64や32といった数値に対応しきれないですね。
ありがとうございます、勉強になりました。
No.3
- 回答日時:
>ちなみに以下の警告がでましたので
あーごめんなさいそこの修正も必要でしたね、すみません
hhdなんて指定子があるんですね...逆に知りませんでした...
一般的ではないと思いますが、動くならいいでしょうw
>解説していただけるとありがたいです。
解説といってもたいしたことではないのですが
int型は4バイトです(実行環境で変わるので必ず4バイトではないのでここは注意です)
なので35と入力すると
質問者さんの想像だと00100011が変数に入っていると思ったかもしれませんが
実際には00000000000000000000000000100011
と頭に0が沢山入っている状態なのです
00100011が1バイトなので残りの3バイト分0で埋められている状態ですね
これをシフト演算して計算していった結果
頭の0が後ろについてしまったわけです
ちょっとざっくりした回答ですけど
これで分かりますかね?
No.1
- 回答日時:
変数の型をchar型もしくはunsigend char型にしてみてください
必要なら解説しますが
とりあえずそれでちゃんと動くか確認してみてください
ありがとうございます。
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 スキップ ==========
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C言語教えてください】sin波...
-
C言語についてです。 アスタリ...
-
C言語で四則演算を使って10を作...
-
分数を表示するプログラム(長...
-
C言語です このプログラミング...
-
strcmp
-
空白表示
-
改行について 1行に何個かづ...
-
2から120以下の素数を求める
-
カレンダー作成
-
縦の棒グラフ
-
C言語【おみくじプログラム】
-
hit&bolwのプログラミングがで...
-
ソースコードの確認をお願いし...
-
C言語で四則演算を使って結果が...
-
多項式のユークリッドの互除法...
-
位数を求めるプログラム
-
構造体配列をきれいに表示するには
-
台形の面積を求めるプログラム
-
C言語 素数判定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
コンパイルエラーについて
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報