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

Q1. ☆問題☆

次のうち、Swiftでの正しい関数の定義のしかたはどれかな。一つ選んでね。

正解

解説

Swiftで関数を定義(つくる)ためには、

func 関数の名前(){
 《関数の内容》
}

とすればよかったね。関数をつくるときには( )を忘れないようにしなければならない。だから、( )がない

func kansu{
 《関数の内容》
}

は不正解だ。

なお、ほかのプログラミング言語(プログラムを作るためのもの)では、関数の作り方がちがうものも多いよ。例えば、

def kansu():
 《関数の内容》
これは Python(パイソン) というプログラミング言語で関数を作るときの作り方。

void kansu(void){
 《関数の内容》
}
これは、C言語というプログラミング言語で関数を作るときの作り方。

kansuとは 関数
 《関数の内容》。
これは、Mind(マインド)というプログラミング言語で関数を作るときの作り方なんだ。

いま、これらを覚える必要はないよ。きみたちが「このプログラミング言語を身につけたい!」と思うものに出会ったとき、そのプログラミング言語での「関数の定義のしかたを覚えてね。

Q2. ☆問題☆

次のうち、Swiftの関数についての説明で正しくないものはどれかな。ひとつ選んでね。

  • 関数は定義しただけでは実行されない
  • 関数は一度だけしか使うことができない
  • 関数はいくつかの命令を組み合わせることができるが、1つの命令だけでも構わない
  • 関数の名前は自分で決めることができるが、使えない名前もある

正解

  • 関数は定義しただけでは実行されない
  • 関数は一度だけしか使うことができない
  • 関数はいくつかの命令を組み合わせることができるが、1つの命令だけでも構わない
  • 関数の名前は自分で決めることができるが、使えない名前もある

解説

関数が一度しか使えなかったら、関数を作ることの「よさ」は少なくなってしまうよ。

いくつかの命令を組み合わせて新しい命令として、そこに自分が好きな名前をつけることができ、それを何度も使うことができるのが「関数」のよさだね。

「いくつかの命令」とあるけれど、命令は1つだけでもOKだったね。ものすごく長い1つの命令に短い名前をつけると、そのあと使うときに楽だよね。

名前は自分で決めることができるけど、すでにある命令の名前などは使うことができなかった。そこに注意が必要だったよね。

関数を使いこなすことで、プログラミングのはばが広がるよ。

Q3. ☆問題☆

さいごのミッションで、turnRight()で回転する角度を「ジャイロセンサーではかった角度」になるようにプログラムを改造(かいぞう)したよね。
turnLeft() も同じように改造したいけれど、このときに問題になることはどれかな。もっともふさわしいものを1つ選んでね。

  • 同じkakudoという変数を、turnRight() と turnLeft() の両方で使うことができない
  • ジャイロセンサーは左回りの角度をはかることができない
  • ピック・アンド・プレイスのモデルでは、左回りにアームを動かすことができない
  • ジャイロセンサーで一度角度をはかると、プログラムが終わるまで角度をはかることができなくなる
  • ジャイロセンサーではかる角度がマイナスになるので、whileでくり返す条件の決め方が少し難しい

正解

  • 同じkakudoという変数を、turnRight() と turnLeft() の両方で使うことができない
  • ジャイロセンサーは左回りの角度をはかることができない
  • ピック・アンド・プレイスのモデルでは、左回りにアームを動かすことができない
  • ジャイロセンサーで一度角度をはかると、プログラムが終わるまで角度をはかることができなくなる
  • ジャイロセンサーではかる角度がマイナスになるので、whileでくり返す条件の決め方が少し難しい

解説

「同じ変数を両方の関数で使うことができない」ことはないよね。ごちゃごちゃするといけないので、別の名前の変数にしたほうがいいかもしれないけれども、両方で使うことはできる。

ジャイロセンサーは、左向きの角度は「マイナス」の角度としてはかることができる。一度しかはかれない、なんてこともない。

そして、ピック・アンド・プレイスは左回りにアームを回すこともできる。だから正解は「条件の決め方が難しい」だよ。

 

すこし難しい話だけど、興味がある人は読んでね。

 

turnLeftをジャイロではかった角度だけ動かそうとしたら、ミッション3で改造した2つ目のプログラムを参考にすることができるよね。

 func turnLeft(){
  ev3.resetGyro(on: .two)
  repeat{
    ev3.motorOn(on: .b, withPower: 10)
  } while ev3.measureGyroAngle(on: .two) ■■■■
 }

問題は、この■■■■の部分。turnRightのときには、「動きたい角度(kakudo)より小さい」とすればよかった。
たとえば30°回したいとして、ジャイロセンサーではかった角度が5°なら、まだ回し続ければいいんだよね。

これが、マイナスになったらどうすればいいんだろう?

-30°だけ回そうとしたら、-5°のときにはまだ回り続けていないといけない。
中学校の数学で習うことなんだけど、実は、-5は-30より「大きい」数なんだ
(温度で考えてみよう。-5℃と-30℃ではどちらのほうが『あたたかい』かな?)
だから、■■■■に入る不等号は  > でなければいけない。

また、多くの人が「左方向に45°回したい」という言い方をするよね。すると、kakudoには、例えば45という数字が入る。
これを-45にするにはどうすればいいのか?
これも中学校の数学で習うことだけど、 kakudo*(-1) としなければならない。
つまり、■■■■には > kakudo*(-1) が入る。

「負の数の大小」や「負の数の計算」に自信のある人は試してみてね。