実力試験I 問題


注意事項


問1:総合問題

List 1 の空欄部(// ...)に適切なコードを補い, 九九の練習のためのプログラムを完成せよ.

答案には,完成した 99.c のソースコード全体を記述すること. [配点:10]

List 1. 未完成な 99.c のソースコード
#include <stdio.h>

// r の段の練習
int row(int r)
{
	int score = 0;		// 正解した回数
	int c;			// 列のカウンタ
	int a;			// 回答

	printf("%d の段:\n", r);
// ...
	return (score);
}

// 成績の表示
int print(int *result)
{
	int score = 0;		// クリアした段の個数
	int r;			// 段のカウンタ

	printf("==== 現在の成績 ====\n");
// ...
	printf("====================\n");
	return (score);
}

int main()
{
	int result[10] = {0};	// 各段の成績状況(result[0] は不使用)
	int r;

	printf("*** 九九の練習 ***\n\n");
	while (1) {
		if (print(result) == 9) break;
		printf("何の段を練習?(1〜9)> ");
		scanf("%d", &r);
		if (r < 1) continue;
		if (r > 9) continue;
		if (row(r) == 9) {
			result[r] = 1;		// クリア
		} else {
			result[r] = -1;		// 要再挑戦
		}
	}
	printf("すべてクリア!!");
	return (0);
}

実行例:

$  ./99
*** 九九の練習 ***

==== 現在の成績 ====
1 の段:未挑戦
2 の段:未挑戦
3 の段:未挑戦
...
9 の段:未挑戦
====================
何の段を練習?(1〜9)> 2
2 の段:
2 * 1 = ? > 2
OK!
2 * 2 = ? > 4
OK!
2 * 3 = ? > 6
OK!
...
2 * 9 = ? > 18
OK!
==== 現在の成績 ====
1 の段:未挑戦
2 の段:クリア
3 の段:未挑戦
...
9 の段:未挑戦
====================
何の段を練習?(1〜9)> 3
3 の段:
3 * 1 = ? > 3
OK!
3 * 2 = ? > 5
NG...
3 * 3 = ? > 7
NG...
...
3 * 9 = ? > 27
OK!
==== 現在の成績 ====
1 の段:未挑戦
2 の段:クリア
3 の段:要再挑戦
...
9 の段:未挑戦
====================
...
==== 現在の成績 ====
1 の段:クリア
2 の段:クリア
3 の段:クリア
...
9 の段:クリア
====================
すべてクリア!!
$

問2:関数定義問題

「非負整数 x の自乗 x2 を 加減算の繰り返しだけで計算する関数 int sqr(int x) について, 次の2問に答えなさい. [配点:10]

(1) 反復によって定義せよ.(5点)

ヒント:x2 = 0 + x + x + x + ... x.(x 回の加算の繰り返し.)
(2) 再帰によって定義せよ.(5点)

ヒント:x2 = (x - 1)2 + 2*x - 1, 02 = 0.

動作テストのために List 2 を利用してよい. ただし答案用紙には, 定義した関数 sqr() のソースコードだけを記述すること.

List 2. テスト用ソースコード断片 sqr.c
#include <stdio.h>

int sqr(int x)
{
// ...
}

int main()
{
	int	x;

        printf("非負整数 x > ");
        scanf("%d", &x);

        printf("%d^2 = %d\n", x, sqr(x));
        return (0);
}

問3:メモリ関連問題

次の3問に答えなさい. [配点:10]

(1) 各自のユーザ ID の数字部分を 256倍した整数値を 8桁(4バイト)の 16進数として リトルエンディアン形式で表わせ. (3点)

(2) 配列 double a[10] の先頭アドレスを 0x0123ABCD とする. 要素 a[6] のアドレスを求めよ. (3点)

(3) List 3 のコードは,文字列を縦書き表示しようとした失敗例であり, 実行時にセグメントエラーが発生する. 問題点を指摘し,解決策を提案せよ. (何行目の何がどうしてエラーとなるか? 何行目の何をどのように変更するべきか?明記すること.) (4点)

List 3. 問題のあるソースコード ttgk.c
L01:	#include <stdio.h>

L02:	int main()
L03:	{
L04:		char a[] = "tategaki";

L05:		while (*a != '\0') {
L06:			printf("%c\n", *a);
L07:			a++;
L08:		}
L09:		return (0);
L10:	}

(c) 2015, yanagawa@kushiro-ct.ac.jp