平成26年度 技術士第一次試験問題【専門科目】
【16】情報工学部門
V−8
次の命令を持ったスタックマシンを想定する。

push x スタックにデータxをプッシュする。
dup  スタックの最上部のデータを複製してスタックにプッシュする。
swap  スタックの最上部の2つのデータの位置を交換する。
add  スタックから2つのデータをポップし、その和をスタックにプッシュする。
sub  スタックから2つのデータをポップし、その差をスタックにプッシュする。
    (スタック最上部2番目のデータから最上部のデータを引く。)
mul  スタックから2つのデータをポップし、その積をスタックにプッシュする。
div  スタックから2つのデータをポップし、その商をスタックにプッシュする。
   (スタック最上部2番目のデータを最上部のデータで割る。)

このとき、(a - b)2 / (c + a - b) を計算した結果をスタック最上部に
残す最も少ないプログラムの命令数はいくつか。


 @ 7  A 8  B 9  C 10  D 11



【正解】 C
最も少ないプログラム」ということで、 a - b が 分母にも分子にもあることに
着目する。
以下の順に命令すると命令数は10になる。
なお、スタックは
後入れ先出し (LIFO = Last In First Out)であることに注意する。

push a ・・・スタックに a が入る。
push b ・・・スタックの上から順に b, a が入る。
sub   ・・・スタックから b, aをポップし、a - b の値(xとする)がスタックにが入る。
dup   ・・・データ x を複製し、スタックの上から順に x, x が入る。
dup   ・・・データ x を複製し、スタックの上から順に x, x, x が入る。
mul   ・・・スタックから x, xをポップし、x * xの値(yとする)がスタックに入り、
       スタックの上から順に y, xが入る。 (
y = (a - b)2である。)
swap  ・・・スタックの位置が変わり、スタックの上から順に x, yが入る。
push c ・・・スタックの上から順に c, x, y が入る。
add   ・・・スタックから c, xをポップし、c + x の値(zとする)がスタックに入り、
       スタックの上から順に z, y が入る。 ( z = c + a - bである。)
div   ・・・スタックから z, yをポップし、 y / z の値がスタックに入る。


EXCELのマクロのご相談なら ファーストマクロ 



V−7 目次 V−9
ファーストマクロ TOPページ