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

1997年1月20日実施

1.あるオフィスに勤める花子さんは、昼休みに昼食を食べに行きました。いつもは、安くてうまい定食屋で450円の定食を食べます。でも、人気なので並ばなくてはなりません。今日は忙しいので、10人以上ならんでいるなら、隣のちょっと高いレストランのランチにしようと思います。コーヒー付きで800円です。そうそう、安い定食屋で済むなら110円の缶コーヒーも買おうと思います。ちなみに、忙しくない日なら20人までの行列なら我慢して待ちます。

以上の文より花子さんの昼休みの行動と消費金額を if - then - else を使ったアルゴリズムの形で書き表しなさい。

2.次は自然数 N が平方数であるかどうかを判定する BASIC 言語によるプログラム (1997年入試センター試験)をそのまま C 言語に書き直したものである。

 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) goto line80;
13:     }
14: line80:
15:     if (k < 0) goto line110;
16:     printf("YES %d is %d * %d\n",n,i,i);
17:     goto line120;
18: line110:
19:     printf("NO\n");
20: line120:
21:     exit(0);
22: }

(1)ここでは BASIC の文番号への参照を lineXXX というラベルを使って表しているが、ラベルとgotoを使わずに書き直しなさい。(何行目から何行目をこのように書き直すという解答でよい)

(2)自然数 N の入力のところで 16, 13, -1 を入力すると、それぞれどのような出力が得られるか。

3.以下の2つのプログラムで使われているデータバッファのことを何と呼ぶか。また、それぞれのプログラムの実行で得られる出力を書きなさい。

プログラム1

#include <stdio.h>
#define N 10
static int buffer[100];
static int *bp = buffer;
void push(int n) {
    *bp++ = n;
}
int pop(void) {
    return(*--bp);
}
main() {
    int i;
    for ( i = 0; i < N ; i++ ) push(i*i);
    for ( i = 0; i < N ; i++ ) printf("%d ",pop());
}

プログラム2

#include <stdio.h>
#define N 10
static int buffer[100];
static int *bh=buffer, *bt=buffer;
qput(int n) {
    *bh++=n;
}
int qget() {
    if (bh > bt) return(*bt++);
    else { printf("Error!\n"); exit(1);}
}
main() {
    int i;
    for (i = 0; i < N; i++) qput(i*i);
    for (i = 0; i < N; i++) printf("%d ",qget());
}

4.リスト構造とはどのようなデータ構造か。また、リストの追加、削除に必要とされる操作を書きなさい。


解答例