• 締切済み

8進数と16進数で表示するプログラム

int型変数bに10進数として数値を入力し、その値を実行結果のように8進数と16進数で表示するプログラムを作成しなさい という問題にとりかかっているのですが、いまいち理解できません scanfで値を入力させる項目は必要とわかるのですが、その他がどうしてもわかりません、ご教授して頂ければ幸いです

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★追記。 ・8進数と16進数ってどんな数か分かりますか? ・8進数とは 0 ~ 7 までの数で 1 桁を表して 8 になったとき、桁上げされます。  16進数とは 0 ~ 9、A ~ F までの数で 1 桁を表して 16 になったとき、桁上げされます。 ・また、int 型の整数はコンピュータの内部では 2 進数で格納されています。  入力が 10 進数であろうが、8進数、16進数であろうが内部表現では 2 進数で格納されています。  これを利用すれば 8進数、16進数の表示はすごく簡単になりますよ。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

●10進数で 123 は 2進数で 1111011 です。 8進数の場合は 3 ビットずつに区切り 001 111 011 となります。 16進数の場合は 4 ビットずつに区切り 0111 1011 となります。 上記の区切られた 3 ビットや 4 ビットがそのまま 0~7 や 0~15 の数値になります。 その数値を文字の '0'~'7' や '0'~'9'、'A'~'F'で出力すればよい。 参考サンプル: static unsigned char table[] = "0123456789ABCDEF"; int b = 123; ←10進数で入れる変数(scanfなどで入力するように) /* 8進数の場合 */ putchar( table[ (b >> 3*10) & 0x7 ] ); ←最上位1桁 putchar( table[ (b >> 3*9) & 0x7 ] );  : putchar( table[ (b >> 3*2) & 0x7 ] ); putchar( table[ (b >> 3*1) & 0x7 ] ); putchar( table[ (b >> 3*0) & 0x7 ] ); ←最下位1桁 /* 16進数の場合 */ putchar( table[ (b >> 4*7) & 0xF ] ); ←最上位1桁 putchar( table[ (b >> 4*6) & 0xF ] );  : putchar( table[ (b >> 4*2) & 0xF ] ); putchar( table[ (b >> 4*1) & 0xF ] ); putchar( table[ (b >> 4*0) & 0xF ] ); ←最下位1桁 解説: ・上記のサンプルではビットの上位から 3ビット(4ビット)ずつを 8/16進数の数値として  1桁ずつの数字文字で出力しています。分かりやすくするために繰り返し文は使って  いません。また、『3*0』~『3*10』の 3 が 8 進数を表すビット長の 3 ビットです。  『4*0』~『4*7』の 4 も 16 進数を表すビット長の 4 ビットとなります。 ・あと『0x7』や『0xF』というのは 3ビット、4ビットでマスクして 1 桁を取り出すビット  演算です。上記のサンプルを理解するには『ビット』や『ビット演算』をちゃんと理解  する必要があります。 ・もし、ビット演算が分からない場合は、  8 進数なら 8 で割ったあまりを取り出していけば 0~7 で取り出せます。  16 進数なら 16 で割ったあまりを取り出していけば 0~15 で取り出せます。  この出てきた数を数字文字(0~9)、英字文字(A~F)に変換すればよいだけです。 ・以上。おわり。

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec14.html
全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

すでに指摘されているように、「実行結果のように」の実行結果が示されていないので正確なことは分かりません。 この問題のポイントは負の数をどう扱うかと、処理系が特定されていないので、規格厳密合致プログラムにするところですかね。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <errno.h> int main() {  long a;  int b;  char s[sizeof(int)*CHAR_BIT/3+2];  char *endptr;  if (fgets(s, sizeof(s), stdin) == NULL)   goto fail;  errno = 0;  a = strtol(s, &endptr, 10);  if (errno != 0 || *endptr != '\n' || a < INT_MIN || INT_MAX < a)   goto fail;  b = a;  if (b < 0)  {   unsigned int c = -(unsigned int)b;   printf("-%#o -%#x\n", c, c);  }  else  {   printf("%#o %#x\n", b, b);  }  return EXIT_SUCCESS; fail:  fputs("error\n", stderr);  return EXIT_FAILURE; } エラー処理は手抜きですが、こんな感じでしょうか? もし学校の課題なら、このまま提出すればすぐにばれると思いますけど。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

「実行結果のように」はどのような結果かわからないので、 近いだろうとおもうプログラムを記述します。 printfの第一引数をごらんください。 %oが8進数、%xが16進数です。%Xにすると16進数のA~Fが大文字になります。 #include <stdio.h> int main(int argc, char* argv) { int n; scanf("%d", &n); printf("8進数=%o 16進数=%x\n", n, n); }

全文を見る
すると、全ての回答が全文表示されます。
  • zone29
  • ベストアンサー率53% (71/133)
回答No.1

printfの変換指定子を調べてみてはいかがでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 素因数分解プログラムで、5は5と表示するのは?

     練習問題 5-15  2以上の数値を入力し、素因数分解した結果を表示しなさい。 1) int n, x; 2) scanf("%d", &n ); 3) for( x = 2 ; n > 1 ; x++ ){ /*for解説コメントをお願いします。*/ 4) while( ( n % x ) == 0 ){ 5) printf( "%d ", x ); 6) n /= x; } }  以上のプログラムですが、100と入力すると→2 2 5 5と表示されます。  5と入力すると→5と表示されます。どこのプログラムで5は5しか割り切れないと  判断しているのでしょうか?  宜しくお願いします。

  • 3つほどプログラムをおしえてください。

    (1)100までの整数をいくつか入力し、10刻みでの個数を表示し、負の数が入力されると整数の入力を終わるプログラムです。各範囲の個数は配列に格納する。 実行結果 65 30 21 95 5 -1 0--- 9 : 1 10--- 19 : 0 20--- 29 : 1 30--- 39 : 1 40--- 49 : 0 50--- 59 : 0 60--- 69 : 1 70--- 79 : 0 80--- 89 : 0 90---100 : 1 (2)数字の文字列を入力し、その文字列に含まれる各数字(文字)'0','1',~'9'の個数を表示するプログラムの作成。 実行結果 1231234567 0: 0 1: 2 2: 2 3: 2 4: 1 5: 1 6: 1 7: 1 8: 0 9: 0 (3) 変数xは、0~1までの0.01刻みの値(101個)を取るとする。このとき、2次関数 f(x)=3x^2+2x+1の値が2.0<f(x)<3.0となるxの値をの個数を求めるプログラムの作成。ただし、xを引数としf(x)の値を返す関数を作成して、それを使用する。 実行結果 number=21 やってるうちにわけがわからなくなってしまいます。どなたかよろしくおねがいします。

  • プログラムがうまく動作しない

    int型変数aとbにそれぞれ値を入力し、それらをかけた結果を出力するプログラムをつくりました。もし文字が入力されたら yarinaoshi と表示し再びaに値を入力するように指示します。しかしこのプログラムはデバグしても何のエラーもないのですが、実際に実行し文字を入力すると Microsoft C++ Debug Library というダイアログボックスが出てきて Abort, Retry, Ignore の三つのボタンがでてきます。どれを選んでも作業は止まってしまい、思ったような結果が得られません。一体どうすればいいのでしょうか?  以下がそのプログラムのソースコードです。 #include <stdio.h> #include <ctype.h> #include <stdlib.h> int kakezan(int a, int b); int main(void) { int dt= 1; int a, b; while(dt !=0){ printf("Int1:"); scanf("%d", &a); if(isalpha(a) != 0) { printf("yarinaoshi"); scanf("%d", &a); } printf("Int2:"); scanf("%d", &b); dt = kakezan(a, b); printf("Result:%d\n", dt); } return 0; } int kakezan(int a, int b) { int dt; return dt = a*b; }

  • 九九を表示させるプログラム

    掛け算の九九、和の九九、差の九九を表示するプログラムを組むという問題ですが、コメント文の所のプログラムが分からないので教えてください。プログラムは以下の通りに与えられています。 #include<stdio.h> main(){ int x,y,z; int yn,op; do{ do{ printf("[*(1),+(2),-(3)]"); scanf("%d",&op); }while( 1 > op || op > 3 ); //ここに、九九を計算し表示するプログラムを入れる //変数opの値が1なら、掛け算の九九 //変数opの値が2なら、和の九九 //変数opの値が3なら、差の九九 を計算し表示 do{ printf("Continue[1/0]?"); scanf("%d",&yn); }while( 0 > yn || 1 < yn ); }while( yn == 1 ); }

  • 2進数の1の数を数える問題

     次の問題に対して、以下のソースを考案し、実行したところ、以下のようになりました。 【問】 ◆◆◆◆◆  与えられた10進数の整数Nを2進数に変換したときの1の個数を答えよ。  整数の10進数を2進数に変換するには、変換したい10進数を商が0になるまで2で割り続け、求めた余りの部分を逆順に並べる。 例) 13が入力として与えられた場合、以下のように2で割り続け2進数を求める。 13 / 2 = 6 ・・・余り 1 6 / 2 = 3 ・・・余り 0 3 / 2 = 1 ・・・余り 1 1 / 2 = 0 ・・・余り 1  求められたそれぞれの余りを逆順に並べたものが2進数への変換結果となる。  よって入力が13ならば2進数への変換結果は 1101 になり、1は3個あるので出力は3になる。 [入力例1] 13 [出力例1] 3 [入力例2] 45 [出力例2] 4 ◆◆◆◆◆ (自分の解答、□はタブ) ◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS */ int main(void) { □int n, bit, s; □scanf("%d", &n); □ □bit = n % 2; □n /= 2; □s = 0; □while(n) { □□if (bit) □□□s++; □bit = n % 2; □n /= 2; □} □printf("%d", s); □return EXIT_SUCCESS; } ◆◆◆◆◆ (実行結果1) ◆◆◆◆◆ [入力] 13 [出力] 2 ◆◆◆◆◆ (実行結果2) ◆◆◆◆◆ [入力] 45 [出力] 3 ◆◆◆◆◆ となり、正解となりません。  自分の考えとしては、入力された数値を変数nに収め、これをどんどん2で割っていき、そのときの余り(0か1)を変数bitに収めていき、nが0になるまで処理を繰り返し、bitが0でないとき、変数s(初期値0)に1ずつ加算していき、最後にsを出力する、という方針です。  初期値の設定辺りが間違っているのだと思いますが、これ以上いくら考えても正解が得られません。どこがどう間違っているのでしょうか。どなたかご教授頂きたく、お願い致します。

  • 素因数プログラムで、間違えて因数4で割らない

    練習問題 5-15  2以上の数値を入力し、素因数分解した結果を表示しなさい。    疑問ですが、素因数分解なので割る数字は、2.3.5.7.・・・の自分の数字しか割りきれない数字で  割ります。それでは、以下のプログラムはどこでそれを判断しているのでしょか?  4で割ろうとしないのは、どこのプログラムが司っているのでしょうか  もし!見えない取り組みがあれば宜しくお願いします。  以下プログラムです。 1) int n, x; 2) scanf("%d", &n ); 3) for( x = 2 ; n > 1 ; x++ ){ 4) while( ( n % x ) == 0 ){ 5) printf( "%d ", x ); 6) n /= x; } }

  • プログラムの組み方が分かりません。

    ある課題で以下の問題が出題されました。 >>>> 2つのint型変数x,yにキーボードから値を入力し、その大小を判定する関数funcを作成せよ。この課題では、大きいと判定された数が代入された変数のアドレスがmain関数に戻されるものとする。 ============ #include<stdio.h> int *func(int *a,int *b) { /* 2つの値の大小判定を行い、アドレスを返す */ } main(void) { int x, y, *z; /* 変数 x,yにキーボードからデータを入力する */ /* 関数funcの呼び出し */ /* 変数zを用いて値の出力を行う */ } ============ <<<< 2行目の*funcというように、関数の頭に*が付くプログラムは初めてで、 どういう意味かもさっぱりわかりません。 それも含め、この問題はどういう風解けばいいのか、教えてください。 お願いします。

  • 二進数にするプログラム

    C言語の問題なんですが、なかなかできません。 途中までやったんですがこれからどうすればいいか分かりません。 1、まず、整数をどんどん入力し、最後に負の数を入力する。負の数が入力されると、これまで入力された数を逆順で表示するプログラムを作成する。 2、1でできたものを利用して、何か数字が入力されたら、それを二進数に直すプログラムを作成する。ただし、二進数の桁数は1000桁以内とする。 ここまでやったんですがこれからどうすればいいか分かりません。 どなたか知恵を貸してくれませんか? #include<stdio.h> int main() { int z[1000],Z,i; printf("正の整数を入力してください:\n"); for(i=0;1<1000;i++); { scanf("%d",&z[i]); if(z[i]<0) break; } Z=i; for(i=0;i<Z/2;i++) { int temp=z[i]; z[i]=z[Z-1-i]; z[Z-1-i]=temp; } printf("入力した要素を逆順に並べると:\n"); for(i=0;i<Z;i++) printf("%d\n",z[i]); return(0); }

  • 素数を判定するプログラム

    素数を判定するプログラムをC言語で作れという問題があったのですが、以下のものをビルドして実行したら途中で止まってしまいました。(例えば5と入力する)しかし、1以下の場合は正常にif文が評価されました。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n; int i; printf("1より大きい整数を入力してください: "); scanf("%d", &number); if (number <= 1) { printf("1より大きい整数を入力してください\a: "); scanf("%d", &number); } for (n = 2; n = number - 1; n++) { i = number % n; if (i = 0) { printf("%dは素数ではありません", number); break; } } printf("%dは素数です", number); return 0; } 自分ではどこがおかしいのかさっぱりわかりません。よろしくお願いします。

  • 2進数を10進数にするプログラム作成について

    10進数から2進数に変換するプログラムはできたのですが2進数から10進数に変換するプログラムが作れません。。 値を入力してください:1111←と入力(例) 10進数では15です。 もう一度実行しますか?(1…yes/2…no) というプログラムを作ろう思っています。 うまく作れずエラーばかり起きてしまいます。 どうか教えて下さい。お願いします。