ITパスポート 擬似言語サンプル問題

ITパスポート 擬似言語サンプル問題
問1

関数 calcMean は,要素数が 1 以上の配列 dataArray を引数として受け取り,要素の値の平均を戻り値として返す。プログラム中の a,b に入れる字句の適切な組合せはどれか。ここで,配列の要素番号は 1 から始まる。

〔プログラム〕
○実数型: calcMean(実数型の配列: dataArray) /* 関数の宣言 */
 実数型: sum, mean
 整数型: i
 sum ← 0
 for (i を 1 から dataArray の要素数 まで 1 ずつ増やす)
  sum ←   a  
 endfor
 mean ← sum ÷   b   /* 実数として計算する */
 return mean



解答:ア
解説
アルゴリズムとプログラミング に関する問題です。

関数calcMeanは、引数で受け取った配列dataArrayのすべての要素の値の平均を計算して戻り値とします。
5行目のforの繰り返し条件は「i を 1 から dataArray の要素数 まで 1 ずつ増やす」なので、forの繰り返し処理で、すべての要素の値の合計を計算します。
すべての要素の値の合計は、dataArray[1]の値から順に足していき、結果を変数sumに代入します。

 sum ← sum + dataArray[1]
 sum ← sum + dataArray[2]
 sum ← sum + dataArray[3]
  :

snumの初期値は0です。配列dataArrayが(1, 2, 3)であった場合、

 sum ← 0 + 1 sumの値は1になる
 sum ← 1 + 2 sumの値は3になる
 sum ← 3 + 3 sumの値は6になる

となります。
よって、aは「sum + dataArray[i]」になります。

 for (i を 1 から dataArray の要素数 まで 1 ずつ増やす)
  sum ← sum + dataArray[i]
 endfor


forが終わったあと、iの値は最終的にdataArrayの要素数になっていて、変数sumにはすべての要素の値の合計数が入っています。
平均値はすべての要素の値の合計数sumを、要素数iで割ればいいので、bにはiが入るはずです。

配列dataArrayが(1, 2, 3)であった場合、sumは6、iは3なので、

 mean ← sum ÷ i
 mean ← 6 ÷ 3

meanの値は2となります。iはdataArrayの要素数なので、bには「dataArrayの要素数」が入ります。

 mean ← sum ÷ dataArrayの要素数

ポイント
そんな複雑なものは出ないはずなので、説明の順にプログラムを上から見ていくといい。
それでも面倒な場合は問題自体捨てる!
捨てなくても、時間がかかりそうならとりあえず保留にしておいて、時間があまれば解けばいい。



問2

手続 printStars は,“☆”と“★”を交互に,引数 num で指定された数だけ出力する。プログラム中の a,b に入れる字句の適切な組合せはどれか。ここで,引数 num の値が 0 以下のときは,何も出力しない。

〔プログラム〕
○printStars(整数型: num)    /* 手続の宣言 */
 整数型: cnt ← 0       /* 出力した数を初期化する */
 文字列型: starColor ← “SC1″ /* 最初は“☆”を出力させる */
   a  
  if (starColor が “SC1” と等しい)
   ”☆”を出力する
   starColor ← “SC2”
  else
   ”★”を出力する
   starColor ← “SC1”
  endif
  cnt ← cnt + 1
   b  



解答:エ
解説
アルゴリズムとプログラミング に関する問題です。

“☆”と“★”を交互に、引数 num で指定された数だけ出力するので、出力の繰り返し処理となります。
文字列型: starColorに’SC1’か’SC2’を交互にセットして、次のどちらを出力するのか決めておきます。

 starColorの値が’SC1’ ⇒ ”☆”を出力する
 starColorの値が’SC2’ ⇒ ”★”を出力する

この場合分けの処理を、引数 num で指定された数の文だけ繰り返します。よって、aとbには、繰り返しの種類(繰り返し開始と終了のセット)が入ります。

do~whileは繰り返し条件が後になるので、必ず一度は繰り返し処理が実行されます。
while~endwhileは繰り返し条件が先になるので一度も処理が実行されない場合があります。


引数 num の値が 0 以下のときもあるので、最初に条件式がくるため繰り返し回数が0の場合もありえるwhile~endwhileを使います。

整数型の変数cntは出力した回数が入ります。初期値は0です。
繰り返し処理の最後に変数cntは1ずつプラスされます。(最後から2行目、cnt ← cnt + 1)
変数numは関数の引数で、出力回数が入っています。

繰り返し処理では次のような結果になります。

[変数numが3のとき]
・繰り返し1回目
 cntの値は0で、starColorの値が’SC1’なので”☆”を出力する
 cntの値は「cnt ← cnt + 1」により1になる
・繰り返し2回目
 cntの値は1で、starColorの値が’SC2’なので”★”を出力する
 cntの値は2になる
・繰り返し3回目
 cntの値は2で、starColorの値が’SC1’なので”☆”を出力する
 cntの値は3になる

変数cntが0、つまり最初のとき、もし引数 num の値が 0だったら、繰り返し条件が「cnt が num 以下」では処理が実行されてしまうので、条件は「cnt が num より小さい」が正解です。

[変数numが0のとき繰り返し1回目]
 while (cnt が num 以下) ⇒ 0 ≦ 0
  条件を満たすので処理を行ってしまう!

 while (cnt が num より小さい) ⇒ 0 < 0
  条件を満たさないので処理は行わない

ポイント
◎擬似言語問題とかフローチャートの問題を解くときのコツ。

特に擬似言語問題は、プログラムに空白があって、その部分に入る処理を選ぶ問題がほとんど。繰り返し条件や代入文が出やすい。

・プログラム中のコメント文は良く読む
・問題文をよんだ時に、自分だったらこう作る!みたいな考えは頭から追い払う。
(自分の考えとサンプルプログラムの作りが違うと理解に時間がかかるから)
・プログラムと一緒に選択肢を見ておくといい
(1つにつき大抵二択なので楽)
・簡単なデータを用意してプログラム通り実行してみるといい。結果は紙に書き出す