問題① 標準入力から 16進数の整数を受け取り、それを 8進数で出力するプログラムを作成してください。
たとえば、次のようになります。
#include <stdio.h>
int main(void)
{
char input_string[40];
("Please enter the hexdecimal integer." );
puts(input_string, sizeof(input_string), stdin);
fgetsunsigned int value;
(input_string, "%x", &value);
sscanf
("Octal: %o\n", value);
printf}
実行結果:
Please enter the hexdecimal integer.
0xf0 <-- 入力した内容
Octal: 360
16進数で入力された整数を取り出すために、sscanf関数の変換指定子を %x にしています。また、受け取り用の変数 value の型は unsigned int です。
8進数として出力させるには、%o 変換指定子を使います。
問題② 8・10・16進数の対応表を表示するプログラムを作ってください。値の範囲は、10進数で「0~16」とします。
printf関数の変換指定子を活用すれば簡単です。
#include <stdio.h>
int main(void)
{
for (int i = 0; i <= 16; ++i) {
("%o %d %x\n", i, i, i);
printf}
}
実行結果:
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
10 8 8
11 9 9
12 10 a
13 11 b
14 12 c
15 13 d
16 14 e
17 15 f
20 16 10
出力結果が、やや不揃いな感じで美しくありませんが、これは
printf関数の機能で調整することも可能です。変換指定子のところを、“%2d”
のように 2
を割り込ませると、「最低でも
2桁分のスペースを使う」という意味になります。
#include <stdio.h>
int main(void)
{
for (int i = 0; i <= 16; ++i) {
("%2o %2d %2x\n", i, i, i);
printf}
}
実行結果:
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
10 8 8
11 9 9
12 10 a
13 11 b
14 12 c
15 13 d
16 14 e
17 15 f
20 16 10
問題③ 次の式を手作業で計算してみてください。そして、答えを確認するためのプログラムを作成してください。
「0x3c5 × 26 - 0741」は 10進数でいくつ?
まずは手計算です。 異なる基数が混ざっている場合は、10進数にしてしまうのが簡単です。
まず、16進数の 0x3c5 は、「3*162 + c*161 + 5*160」ですから、「3*256 + 12*16 + 5*1」となり、結果は 965 です。
次に、8進数の 0741 は、「7*82 + 4*81 + 1*80」ですから、「7*64 + 4*8 + 1*1」となり、結果は 481 です。
したがって、「0x3c5 × 26 - 0741」は、 「965 × 26 - 481」となり、24609 が答えです。
続いて、この結果を確認するためのプログラムを作成します。これは単純に次のように作ればいいでしょう。
#include <stdio.h>
int main(void)
{
("%d\n", 0x3c5 * 26 - 0741);
printf}
実行結果:
24609
正しいことが確認できました。
問題④ 2進数の 0111101 を 10進数と 16進数に変換してください。
2進数から 10進数へ変換します。
「26 * 0 + 25 * 1 + 24 * 1 + 23 * 1 + 22 * 1 + 21 * 0 + 20 * 1」です。つまり、「32 + 16 + 8 + 4 + 1」なので、61 になります。
10進数に変換できれば、ここから 16進数へ変換できます。10進数から n進数への変換に際には、変換後の基数で割る操作を繰り返します。
16)61
16) 3・・・13(D) ) 0・・・3
余りを下から上へ向かって読んでいけば、結果は 3D だと分かります。
return 0;
を削除(C言語編全体でのコードの統一)第19章から移動してくる形で新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |