1996年度「計算機基礎論II」期末試験

解答例

1.

begin
    if 忙しい
    then if 定食屋の行列は10人未満
        then 定食を食べ、缶コーヒーを飲む。合計 560円
        else レストランでランチを食べる。800円
    else if 定食屋の行列は20人以下
        then 定食を食べ、缶コーヒーを飲む。合計 560円
        else レストランでランチを食べる。800円
end
2.

(1)

 1: #include <stdio.h>
 2: main() {
 3:     int i,j,k,n;
 4:     char buf[20];
 5:     printf("N = ");
 6:     fgets(buf,18,stdin);
 7:     n = atoi(buf);
 8:     for (i = 1; i <= n; i++ ) {
 9:         j = i * i;
10:         k = n - j;
11:         printf("K = %d\n",k);
12:         if (k <= 0) break; // goto line80;
13:     }
14: //line80:
15:     if (k >= 0) // if (k < 0) goto line110;
16:         printf("YES %d is %d * %d\n",n,i,i);
17: //    goto line120;
18: //line110:
19:     else printf("NO\n");
20: //line120:
21:     exit(0);
22: }
別解1
 8:     i=0; do { i++; //for (i = 1; i <= n; i++ ) {
 9:         j = i * i;
10:         k = n - j;
11:         printf("K = %d\n",k);
12:     //    if (k <= 0) goto line80;
13:     } while (k > 0);
14: //line80:
別解2
 8:     i=0; k=n; while (k > 0) { i++; //for (i = 1; i <= n; i++ ) {
 9:         j = i * i;
10:         k = n - j;
11:         printf("K = %d\n",k);
12:     //    if (k <= 0) goto line80;
13:     }
14: //line80:
(2)
N = 16
K = 15
K = 12
K = 7
K = 0
YES 16 is 4 * 4

N = 13
K = 12
K = 9
K = 4
K = -3
NO
N = -1 の場合はループを通るかどうか、そのときに k の値が決まっているか、 決まっていない場合、処理系によってどのような値が入っているかなどによって 結果が異なる。for ループを使った場合 k の値は確定しないが、処理系によって 0 となる場合には
N = -1
YES -1 is 1 * 1
のような結果となる。別解1の場合、k は -2 になるので、
N = -1
K = -2
NO
別解2の場合には、while ループに入らないがそれまでに k の値が -1 に確定しているので、
N = -1
NO
となる。

3.

プログラム1. スタック (LIFO バッファ)
81 64 49 36 25 16 9 4 1 0
プログラム2. キュー (FIFO バッファ)
0 1 4 9 16 25 36 49 64 81

4.

同じ型のリストへのポインタをメンバに持っているような構造をしている。

リストの追加:
新しいリストに必要なメモリーを確保する。
新しいリストのポインタ部に次のリストへのポインタを格納する。
前のリストのポインタ部に新しいリストへのポインタを格納する。
リストの削除:
削除するリストの前のリストのポインタ部に次のリストへのポインタを格納する。
削除するリストが使っていたメモリー領域を解放する。

問題へ