本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

令和5年度 技術士第一次試験問題【専門科目】

V−1

次のC言語プログラムを2回実行することを考える。
#include <stdio.h>
void n (int c)
{
 if(c==0) return;
  ア 
 n(--c);
  イ 
}
int main(void)
{
 n(10);
 putchar('\n');
 return 0;
}

 プログラム片 printf("%d ", c); を、1回目は空欄 ア のみに挿入して実行し、2回目は空欄 イ のみに挿入して実行する。1回目と2回目で表示はどのようになるか。次のうち、適切なものはどれか。

@ 表示は変わらない。

A 1回目: 1 2 3 4 5 6 7 8 9 10
 2回目: 9 8 7 6 5 4 3 2 1 0

B 1回目: 10 9 8 7 6 5 4 3 2 1
 2回目: 0 1 2 3 4 5 6 7 8 9

C 1回目: 1 2 3 4 5 6 7 8 9 10
 2回目: 10 9 8 7 6 5 4 3 2 1

D 1回目: 10 9 8 7 6 5 4 3 2 1
 2回目: 1 2 3 4 5 6 7 8 9 10


正解

B


解説

n(--c) は cから1を引いた値を引数に渡す。
n(c--) は cを引数として渡してから、戻ってきたときに1を引く。

トレースすると次のようになる。
【1回目】
n(10);       ・・・10を引数として関数nを呼出す。
 if(c==0)      ・・・ c = 10だから次のステップへ。
 printf("%d ", 10);  ・・・10 を出力
 n(--10)       ・・・9を引数として関数nを呼出す。
  if(c==0)      ・・・ c = 9だから次のステップへ。
  printf("%d ", 9);  ・・・9 を出力
  n(--9)       ・・・8を引数として関数nを呼び出す。
  if(c==0)      ・・・ c = 8だから次のステップへ。
  ・・・
    printf("%d ", 1); ・・・1 を出力
    n(--1)      ・・・0を引数として関数nを呼出す。
     if(c==0)   ・・・ c = 0だからreturn。
putchar('\n');
return 0;

よって1回目は 10 9 8 7 6 5 4 3 2 1 を表示する。

【2回目】
n(10);       ・・・10を引数として関数nを呼出す。
 if(c==0)      ・・・ c = 10だから次のステップへ。
 n(--10)      ・・・9を引数として関数nを呼出す。
  if(c==0)     ・・・ c = 9だから次のステップへ。
  n(--9)      ・・・8を引数として関数nを呼出す。
  ・・・
   n(--2)     ・・・1を引数として関数nを呼出す。
    if(c==0)   ・・・ c = 1だから次のステップへ。
    n(--1)    ・・・0を引数として関数nを呼出す。
     if(c==0)     ・・・ c = 0だからreturn。
    printf("%d ", 0);  ・・・0 を出力
   printf("%d ", 0);   ・・・1 を出力
  ・・・
  printf("%d ", 8);  ・・・8 を出力
 printf("%d ", 9);  ・・・9 を出力
putchar('\n');
return 0;

よって2回目は 0 1 2 3 4 5 6 7 8 9 を表示する。

目次 V−2