試験対策【過去問題3】

平成11年秋

問12 次のCOBOLプログラムの説明及びプログラムを読んで、設問1、2に答えよ。

〔プログラムの説明〕
 ある学校の第2外国語選択科目別人数を棒グラフで出力する。
(1) 選択科目別人数は、呼ばれるプログラムKEISANによって得ることができ、
   次の順にSENTAKU-Tに格納される。
   フランス語(F)、ドイツ語(G)、中国語(C)、ロシア語(R)、スペイン語(S)
(2) 棒グラフの印字様式は、次のとおりである。
  @縦軸に科目、横軸に選択人数をとる。
  A選択人数の範囲は 0〜30 人であり、一人につき、“*”一つで表す。
  Bフランス語 30 人、ドイツ語 15 人、中国語 20 人、ロシア語 0 人、
   スペイン語 5 人の場合の出力例を図に示す。



プログラム〕←クリック


 棒グラフを横向きから縦向きへ変更するためにプログラムを修正する。データ部は次のように変更し、手続き部の 27 行目から 35 行目の変更を、表の a、b、cの 3通り考えた。

FILE SECTION.
FD  PRINT-F.
01  PRINT-R.
    03              PIC X(2).
    03  KOMOKU      PIC ZZ9.
    03  JIKU        PIC X.
    03  BO          OCCURS 5.
       05           PIC X(2).
       05  KAZU     PIC X(3).
    03              PIC X(2).
WORKING-STORAGE  SECTION.
01  YOKOJIKU.
    03              PIC X(6)  VALUE "  ---+".
    03              PIC X(27) VALUE ALL "-".
01  MEMORI          PIC X(33)
    VALUE    "         F    G    C    R    S   ".
01  SENTAKU-T.
    03  NINZU       OCCURS 5 PIC 9(2).
01  S               PIC 99.
01  T               PIC 99.
01  K               PIC 99.

   表 手続き部修正内容( 27 行目から 35 行目を置換)
       文    
PERFORM VARYING S FROM 1 BY 1 UNTIL S > 30
   MOVE SPACE TO PRINT-R
   
   MOVE ":" TO JIKU
   PERFORM VARYING T FROM 1 BY 1 UNTIL T > 5
      IF S <= NINZU(T) THEN MOVE "***" TO KAZU(T)  END-IF
   END-PERFORM
   WRITE PRINT-R
END-PERFORM.
PERFORM VARYING S FROM 1 BY 1 UNTIL S > 30
   MOVE SPACE TO PRINT-R
   COMPUTE K = 30 - S
   IF K = 10 OR 20 OR 30 THEN
      MOVE K TO KOMOKU  END-IF
   MOVE ":" TO JIKU
   PERFORM VARYING T FROM 1 BY 1 UNTIL T > 5
      IF K <= NINZU(T) THEN MOVE "***" TO KAZU(T)  END-IF
   END-PERFORM
   WRITE PRINT-R
END-PERFORM.
PERFORM VARYING S FROM 30 BY -1 UNTIL S < 1
   MOVE SPACE TO PRINT-R
   IF S = 10 OR 20 OR 30 THEN
      MOVE S TO KOMOKU  END-IF
   MOVE ":" TO JIKU
   PERFORM VARYING T FROM 1 BY 1 UNTIL T > 5
      IF S <= NINZU(T) THEN MOVE "***" TO KAZU(T)  END-IF
   END-PERFORM
   WRITE PRINT-R
END-PERFORM.

【設問1】
表中ので 囲まれた IF 文を“10 の倍数のとき”となるように変更する場合、正しい答えを解答群の中から選べ。

解答群

       ア COMPUTE K = S / 10
         IF K = 0 THEN MOVE S TO KOMOKU END-IF

       イ COMPUTE K = S / 10
         IF S = K * 10 THEN MOVE S TO KOMOKU END-IF

       ウ COMPUTE K = S / 10
         COMPUTE K = S / K
         IF K = 10 THEN MOVE S TO KOMOKU END-IF

       エ COMPUTE K = S / 10
         COMPUTE K = K * 10
         MOVE K TO KOMOKU

【設問2】
a、b、c それぞれで修正した結果、印字されるグラフはどうなるか、解答群の中から選べ。ここで、選択人数はプログラムの説明(2)の出力例と同じとする。

解答群





【解答】 設問1:イ   設問2 a:イ  b:エ  c:ウ


【解説】

まず問1は10の倍数にするように変更しろって事ですが、

このままだとSが10か20か30の場合のみSをKOMOKUへ転送します。設問からみてもただの算数問題です。じゃあひとつずつ見ていきますか。(鼻毛をブチブチ抜きながら)

ア COMPUTE K = S / 10
  IF K = 0 THEN MOVE S TO KOMOKU END-IF

こんなの小学生でもわかるでしょ。KがゼロになるのはSが10以下の場合だけ。論外。

イ COMPUTE K = S / 10
  IF S = K * 10 THEN MOVE S TO KOMOKU END-IF

おっコレはOKそうですね。まだ下の解答みてないけど、これ正解!

ウ COMPUTE K = S / 10
  COMPUTE K = S / K
  IF K = 10 THEN MOVE S TO KOMOKU END-IF

一見良さ気ですが、ちょっとまてよ。コレ端数が出ても切り捨てされるから…やっぱ私できない。ゴメン無理。私まだ気持ちの整理がつかないの。NG。

エ COMPUTE K = S / 10
  COMPUTE K = K * 10
  MOVE K TO KOMOKU

Sを転送しないでKを転送してます。しかも無条件で。これ毎回出力されますよ。Kは可変する計算領域であって出力しちゃまずいよ。コンピュータ通してデータを改ざんしてどうする気。アタシをどうする気?よってNG。



次〜設問2。変更したらどう出力結果が変わるかってことですね。楽勝です。こういう簡単な問題で点数稼ぎましょう。コボルのリスト出力は必ず左から右へ、上から下へ向って出力することを憶えておきましょう。<これかなり重要!
コボルに限った事ではありませんが、問題のツボさえ抑えればよいわけです。この問題では、プログラムの違いによる出力結果の違い、つまり30行の書き出し方の違いさえわかればいい。

aの場合から行きましょう。リスト出力はさっきも書きましたが上から下へ書くので、1行目のWRITE文でいきなり書き出してるのは『イ』しかありません。なので、aはイ以外ありえません。いちいち数式当てはめるまでもありませんよ。

b。これも簡単ですね。最初にK=30−Sというトンチンカンな計算式のせいで最初の『30』の書き出し時にKの値は、Sの初期値の1が30から減算されて『29』になってるために出力されません。完全なプログラムミス。全部の中で30が印字されてないのは『エ』だけ。これも他と比較する必要すらないわけ。わかりますか?

C。勘のいい人なら、もう正解に『ウ』と書いてるかもしれませんね。いくら何でも設問上、全部誤ったプログラム解答というのは如何なものか。なので出題者側でも正解プログラムを掲載したくなるのが筋ってもの。そうこれが正解例の問題です。なので『ウ』が正解。

という感じでツボがわからないと結構時間掛かる問題なのですが、要点さえわかっていれば、こんな問題はプログラム全体を見る必要もなく5分と掛かりません。なんか拍子抜けでしょ?リスト問題は私の中では点数稼ぎのサービス問題なわけです。学生さんもわかるまで問題と私の解説を読み比べ、自分のモノにしましょうね。

<< Back   Index   Next >>  < Top >