【発展編】20-a コードで感じよう(1)

Q1. ☆問題☆

次のプログラムにはまちがいがあるよ。どこがまちがっていて、どうすれば正しいプログラムになるか、最も考えられるものを次の中からひとつ選んでね。

if ev3.measureUltrasonicCentimeters(on: .four) > 10{
ev3.motorOn(on: .a, withPower: 50)
} else { }
ev3.motorOff(on: .a)
}

  • 1行目の ev3.measureUltrasonicCentimeters(on: .four) がちがう。
    ここを ev3.measureSuperCentimeters(on: .four) とすればよい。
  • 2行目の ev3.motorOn(on: .a, withPower: 50) がちがう。
    ここを ev3.motorOn(on: .a, withPower: 150) とすればよい。
  • 3行目の } else { } がちがう。ここを } else { とすればよい。
  • 4行目の ev3.motorOff(on: .a) がちがう。ここを ev3.motorOff(on: .four) とすればよい。
  • どこにもまちがいはない。

正解

  • 1行目の ev3.measureUltrasonicCentimeters(on: .four) がちがう。
    ここを ev3.measureSuperCentimeters(on: .four) とすればよい。
  • 2行目の ev3.motorOn(on: .a, withPower: 50) がちがう。
    ここを ev3.motorOn(on: .a, withPower: 150) とすればよい。
  • 3行目の } else { } がちがう。ここを } else { とすればよい。
  • 4行目の ev3.motorOff(on: .a) がちがう。ここを ev3.motorOff(on: .four) とすればよい。
  • どこにもまちがいはない。

解説

if や else のあとには、必ず { } が必要だよね。でも、ただ { } を書けばいいのではなく、このかっこの中に実行したい内容を書くんだったよね。

このプログラムでは、else のあとに { } があるけど、その中には何も書いていない。それに、最後の行に } が書かれている。そう考えると、3行目の } がよぶんだったのではないか、と考えられるね。Swift Playgrounds では、{ を書くと、 } もいっしょに入力されるから、こうしたまちがいをした人もいるかもしれないね。

1行目はまちがっていないし、「ev3.measureSuperCentimeters」という命令はないよ(超音波という言葉から super という単語を思いうかべる人もいるかもしれないけど、英語で超音波は ultrasonic というんだ)。

2行目もまちがっていないよ。withPower で指定できるパワーは、-100から100の間だよ。

4行目もまちがっていないよ。モーターは A から D につなぐよね。1 から 4 につなぐのはセンサーだよ。だからここは、.four とすることはないよね。

Q2. ☆問題☆

Swift では、「等しい」の意味で「==」を使うんだったよね。それでは、次のような「条件」を書くことはできるかな(ワークブック6ページのプログラムを少し変えてみたよ)。できる/できない、その理由の組み合わせとしてもっともふさわしいものを、次の中から選んでね。

if ev3.measureUltrasonicCentimeters(on: .four) == 100{
ev3.playSound(file: .start, atVolume: 100, withStyle: .waitForCompletion)
} else {
ev3.stopSound()
}

  • できる。目の前にあるものとのきょりが100cmのときに音がなるが、80cm〜120cmの間で反応するので、ぴったり100cmでないことに気をつけなければならない。
  • できる。目の前にあるものとのきょりが100cmのときに音がなるが、ぴったり100cmにするのはむずかしいので、あまりよい書き方ではない。
  • できない。このような書き方をしたければ、「==」ではなく、「=」にすればよい。
  • できない。超音波センサーは100cmをはかることができないので、エラーになってしまう。
  • エラーになることもあるし、ならないこともあるので、これだけではわからない。

正解

  • できる。目の前にあるものとのきょりが100cmのときに音がなるが、80cm〜120cmの間で反応するので、ぴったり100cmでないことに気をつけなければならない。
  • できる。目の前にあるものとのきょりが100cmのときに音がなるが、ぴったり100cmにするのはむずかしいので、あまりよい書き方ではない。
  • できない。このような書き方をしたければ、「==」ではなく、「=」にすればよい。
  • できない。超音波センサーは100cmをはかることができないので、エラーになってしまう。
  • エラーになることもあるし、ならないこともあるので、これだけではわからない。

解説

「パターン1」でも == を使うことができるよ。「==」の意味は「等しい」だから、このプログラムだと、「ぴったり100cmのとき」という意味になるね。

でも、超音波センサーで「ぴったり100cm」とするのは難しい。書き方には何の問題もないけど、この書き方では、思ったようには動いてくれないかもしれないよ。

なお、「=」にしてしまうとエラーになる。これはvol.22で扱うけど、「代入」という別の意味になってしまうので、この場面では使えない。また、超音波センサーは250cmまでをはかることができるから、100cmは問題なくはかれるよ。

Q3. ☆問題☆

repeat – while の使い方のところで、「true」も条件を書いたものである、ということを知ったよね。それでは、次のような書き方はできるのだろうか。もっともふさわしいものを次の中から選んでね。

if true {
ev3.playSound(file: .start, atVolume: 100, withStyle: .waitForCompletion)
} else {
ev3.stopSound()
}

  • できる。「条件をみたしている」ならば、という意味なので、必ず音がなる。
  • できる。これだけでは条件をみたしているかわからないから、音がならない(else の中身が実行される)。
  • できない。if のあとにはこれ以外の条件を書かなければならない。
  • できない。true はダメだけど、false にすればできる。
  • エラーになることもあるし、ならないこともあるので、これだけではわからない。

正解

  • できる。「条件をみたしている」ならば、という意味なので、必ず音がなる。
  • できる。これだけでは条件をみたしているかわからないから、音がならない(else の中身が実行される)。
  • できない。if のあとにはこれ以外の条件を書かなければならない。
  • できない。true はダメだけど、false にすればできる。
  • エラーになることもあるし、ならないこともあるので、これだけではわからない。

解説

「true」はこれだけで「条件をみたしている」という意味になる「条件」だよ。上のプログラムは

「もしも条件をみたしているならば、音をならし、そうでないときには、音をならさない」

というものだから、 いつでも必ず条件を満たしている=いつでも必ず音がなる ことになる。

だから、絶対に else の中身が実行されることはない。true ではなく false と書くと、今度は「条件をみたしていない」という意味になるので、音が鳴ることはなくなってしまう。

この例だけ見るとあまり意味のある書き方ではなさそうだけれども、true や false を条件として使うこともあるから、「こんなこともできるんだ」と知っておくといいよ。