【発展編】23-b つかんで運ぼう(4)

Q1. ☆問題☆

ミッション2では、読んだ色のデータを覚えておくために、配列に「動く角度」を記録したよね。動く角度ではなく、「読んだ色を記録する」ではダメなのだろうか。次の中からもっともふさわしいと考えられるものを選んでね。

  • 「読んだ色を記録する」でもよい。ugoki:[Float] の配列に .blue や .yellow を代入すればよい。
  • 「読んだ色を記録する」でもよい。ただし、「色」を記録する配列の型にしなければならないことと、アームを動かすときにも色の情報を角度の情報に変えなければならないので、プログラムが複雑(ふくざつ)になってしまう。
  • 「読んだ色を記録する」ではダメ。色を記録しても、勝手に「30」や「45」に変わってしまう。
  • 「読んだ色を記録する」ではダメ。そもそも、「読んだ色を記録する」ことはできない。

正解

  • 「読んだ色を記録する」でもよい。ugoki:[Float] の配列に .blue や .yellow を代入すればよい。
  • 「読んだ色を記録する」でもよい。ただし、「色」を記録する配列の型にしなければならないことと、アームを動かすときにも色の情報を角度の情報に変えなければならないので、プログラムが複雑(ふくざつ)になってしまう。
  • 「読んだ色を記録する」ではダメ。色を記録しても、勝手に「30」や「45」に変わってしまう。
  • 「読んだ色を記録する」ではダメ。そもそも、「読んだ色を記録する」ことはできない。

解説

.blue や .yellow という「色」の情報を記録しようとすると、少し特別な型を使わなければならないんだ。
つまり、やろうと思えば「読んだ色を記録する」ことはできる。
そして、その型で記録したデータは、「色」の情報として記録されるから、勝手に数字に変わってしまうことはない。

だから「読んだ色を記録する」でもよい。
ただし、問題文にもあるように、アームを動かすときにも色の情報を角度の情報に変えなければならないので、プログラムが複雑になってしまう。

そう考えると、ワークブックにあるように、最初から「動く角度」を記録するプログラムにするのがよさそうだね。

Q2. ☆問題☆

次のようなプログラムを作ったよ。このとき、配列 hairetsu[2] の中身は何かな。次の中から選んでね。

var hairetsu:[Float] = [2, 4, 3, 6]
hairetsu.append(9)
hairetsu.removeFirst()
hairetsu.removeLast()

  • 2
  • 4
  • 3
  • 6
  • 9

正解

  • 2
  • 4
  • 3
  • 6
  • 9

解説

まず、配列は「0番目」から始まるということを思い出してね。
そして append は「最後に要素を付け加える」、removeFirst は「最初の要素を消す」、removeLastは「最後の要素を消す」ために使うよ。

それでは、プログラムを見ていこう。

一番最初のhairetsuの中身は [2, 4, 3, 6] だ。

hairetsu.append(9) とすることで、hairetsuの中身は [2, 4, 3, 6, 9]となる。

さらにhairetsu.removeFirst() とすると、最初の要素を消すから、[4, 3, 6, 9] となる。

最後にhairetsu.removeLast() とすることで、最後の要素を消すから、[4, 3, 6] となる。

つまり、hairetsu[0]は4、hairetsu[1]は3、hairetsu[2]は6だね。
だから、正解は「6」だよ。

Q3. ☆問題☆

次のプログラムを実行したときの結果として、正しいものを一つ選んでね。
なお、kazu.isEmptyは「kazuに要素がひとつもないかどうか」を確かめるもの、.f5は「ファ」の音、.c5は「ド」の音だよ。

var kazu:[Float] = []

while !kazu.isEmpty{
ev3.playSound(note: .f5, forSeconds: 0.1, atVolume: 100)
kazu.removeLast()
ev3.waitFor(seconds: 0.5)
}
ev3.playSound(note: .c5, forSeconds: 0.1, atVolume: 100)

  • kazuには要素がないので、while の中身は実行されない。だから、ドの音だけ再生されてプログラムが終わる。
  • kazuには要素がないので、while の中身は実行されない。だから、ファの音とドの音が再生されてプログラムが終わる。
  • kazuには要素がないので、while の中身は一度だけ実行される。だから、ファの音とドの音が再生されてプログラムが終わる。
  • kazuには要素がないので、while の中身は一度だけ実行される。しかし、要素がないのにremoveLastを実行しようとして、エラーが出てしまう。
  • kazuには要素がないので、ドの音もファの音もならずにプログラムが終わる。

正解

  • kazuには要素がないので、while の中身は実行されない。だから、ドの音だけ再生されてプログラムが終わる。
  • kazuには要素がないので、while の中身は実行されない。だから、ファの音とドの音が再生されてプログラムが終わる。
  • kazuには要素がないので、while の中身は一度だけ実行される。だから、ファの音とドの音が再生されてプログラムが終わる。
  • kazuには要素がないので、while の中身は一度だけ実行される。しかし、要素がないのにremoveLastを実行しようとして、エラーが出てしまう。
  • kazuには要素がないので、ドの音もファの音もならずにプログラムが終わる。

解説

まず、while !kazu.isEmpty について考えよう。
kazu.isEmptyは「kazuの要素がないかどうか」だよね。「!」は「〜でない」だから、「!kazu.isEmpty」で「kazuに要素がある」となる。
だから「kazuに要素がある間」は、whileの中身を実行することになるんだ。

この問題では、kazuには要素がないから、whileの中身は実行されない。当然、whileの中に書いてある「ファの音を出す」は実行されない。

そして、このプログラムの最後に「ev3.playSound」があるよね。

つまり、このプログラムを実行すると「ドの音だけが再生される」が正解。

なお、このプログラムを while ではなく、repeat – while にすると、一度は{ }の中身が実行されてしまう。
だから、要素がないのにremoveLastを実行しようとして、エラーが出てしまうよ。