試し読みできます
h20a6_hex.c
/** @file h20a6_hex.c
* @brief 整数値を4桁区切りの16進数で表示するプログラム
*
* - 負数の場合、先頭にマイナス符号を付ける。
* - 数値の下位から4桁ごとに空白を挿入する。
* - LONG_MIN(-2147483648)の表示に対応する。
* - 64ビットの整数値(LLONG_MAX, LLONG_MIN)に対応する。
*
* @see 平成20年度秋期 午後試験 問6
*/
#include <stdio.h>
#include <limits.h>
/** 数字列バッファサイズ (64ビット対応) */
#define BUFSIZE 27
void convert(long long num, char str[]);
/**
* @brief 整数値から4桁区切りの16進数字列を生成する。
*
* @param [in] num 桁区切りしたい整数値
* @param [out] str 桁区切りされた数字列
* @return なし
*/
void convert(long long num, char str[])
{
const char table[] = "0123456789ABCDEF";
int minus = 1; /* フラグの使い方を変更 */
int i = 0, j = 0;
char tmp;
/* 負数の場合、フラグを立てておく。 */
if( num < 0 )
{
minus = -1;
}
do
{
/* 最下位桁を取り出し、16進数で1桁右シフトする。 */
str[j++] = table[(num % 16) * minus]; /* 負数の対策 */
num /= 16;
/* 4桁ごとに空白を挿入する。 */
i++;
if( i % 4 == 0 && num != 0 )
{
str[j++] = ' ';
}
} while( num != 0 );
/* 負数の場合、マイナス符号を付ける。 */
if( minus != 1 )
{
str[j++] = '-';
}
str[j--] = '\0';
/* 逆向きに出来上がった数字列を並べ直す。 */
for( i = 0; i < j; i++, j-- )
{
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
/**
* @brief エントリポイント
*
* @param [in] argc コマンドライン引数の数
* @param [in] argv コマンドライン引数
* @return 終了ステータス
*
* @par 実行方法:
* cmd> h20a6_hex.exe
*/
int main(int argc, char *argv[])
{
char buffer[BUFSIZE];
long long test_data[] = {
1234567L,
-57482L,
63L,
-999999L,
0L,
LONG_MAX,
LONG_MIN,
LLONG_MAX,
LLONG_MIN
};
int t, tests = sizeof(test_data) / sizeof(*test_data);
/* テストデータでconvert()を実行する。 */
for( t = 0; t < tests; t++ )
{
convert(test_data[t], buffer);
printf("%lld => %s\n", test_data[t], buffer);
}
return 0;
}
試し読みできます
ソースコードの解説
convert()
与えられた整数値num
を16進数に変換するために関数convert()
のループ処理を変更します。まず10進数で1桁ずつ取り出すための処理「
str[j++] = table[(num % 10) * minus];
」を「str[j++] = table[(num % 16) * minus];
」に、「num /= 10;
」を「num /= 16;
」に書き換えました。 16進数に変換するなら「num % 16
」、8進数に変換するなら「num % 8
」、2進数に変換するなら「num % 2
」を計算します。 これは午前試験レベルの知識ですので、プログラミングにも応用できるようにしておきましょう。あとは数値と数字の変換テーブル
table[]
を16進数に対応できるように「const char table[] = "0123456789ABCDEF";
」と拡張し、3桁ずつコンマを挿入していた処理を4桁ずつスペースを挿入する処理に書き換えれば変更は完了です。
試し読みできます
課題1 「多倍長整数型を作る」
多倍長整数の加算
を行うプログラム
[出典] 平成21年度 秋期 午後試験 問9
課題1 「多倍長整数型を作る」
C言語では整数型の変数に格納できる値に上限があります。 その上限を超える正の整数(正の多倍長整数)を処理するプログラムを作るため、次に示す構造体MP
を定義しました。 多倍長整数はlong型に納まる範囲(9桁ごと)で区切り、下位9桁から順にメンバ変数data[]
に格納します。手始めに構造体
MP
の値を表示する関数print()
と、数字列を構造体MP
に変換する関数set()
を作成してください。
試し読みできます
ソースコードの雛形
#include <stdio.h>
#include <string.h>
/** 内部整数の最大桁数 (9桁) */
#define NUM_DIGIT 9
/** 内部整数の桁上がり (10^9) */
#define NUM_DIGIT_TH_POWER_OF_TEN 1000000000
/** 内部整数配列のサイズ (9*7=63桁) */
#define ARRAY_MAX 7
/**
* @brief 多倍長整数型
*/
typedef struct {
int length; /**< 内部整数配列の長さ */
long data[ARRAY_MAX]; /**< 内部整数配列 (9桁区切り) */
} MP;
void print(const MP *num);
void set(MP *num, const char str[]);
/**
* @brief 多倍長整数値を出力する。
*
* @param [in] num 多倍長整数値
* @return なし
*/
void print(const MP *num)
{
/** @todo 実装してください。 */
}
/**
* @brief 数字列から多倍長整数値に変換する。
*
* @param [out] num 変換された多倍長整数値
* @param [in] str 数字列
* @return なし
*/
void set(MP *num, const char str[])
{
/** @todo 実装してください。 */
}
int main(int argc, char *argv[])
{
MP num;
/* テストデータでset()、print()を実行する。 */
set(&num, "46284059827463859201283844157134007652918723147641");
print(&num);
return 0;
}
試し読みできます
課題1 「重複のない4桁の乱数を生成する」
数当てゲーム
を行うプログラム
[出典]平成18年度 秋期 午後試験 問6
課題1 「重複のない4桁の乱数を生成する」
プログラムが生成した目標数をユーザーが推測する数当てゲームを作成します。 手始めに目標数をランダムに生成する関数createRandomNumber()
と、ユーザーから入力された推測数がルールに違反していないかチェックする関数isValidNumber()
を作成してください。
目標数と推測数のルールは「各桁の数字がすべて異なる4桁の数字列」です。 プログラム内ではこれらの数字をint
型でなくchar
型の配列に格納します。
