2021/05/15

16. 分数の掛け算の出題プログラムをスクラッチで

 分数の掛け算の出題プログラムをスクラッチで書いてみよう。

1. 表示画面とスプライトは以下のようにした。



2. プログラムの入り口は以下の通り。


 5問出題し、正答数を変数 p で数え、タイマーで経過時間を計り、表示する。

3. 掛け算の最初の分数 A=an/ad を乱数を用いて作る。
 n は分子 (numerator) を、d は分母 (denominator) を表す。


 まず 分母の数 ad を 2 から 20 までの乱数にし、
 分子 an は 1 から 30 までの乱数とする。
 このままでは、an/ad は約分できるかもしれないので、an と ad の最大公約数を求め、
 約分する。約分した結果、分母が 1 になってしまったら、やり直す。

4. 掛け算の2番目の分数 B=bn/bd を分数 A と同様に作る。


5. 掛け算の結果 AxB=(anxbn)/(adxbd)=cn/cd とし、これを約分し C=cn/cd とする。


6. 次に、解答 X=xn/xd を入力する。


7.  解答 X が掛け算の結果 C と等しいか判定する。合っているときは変数 p を1増やし、
 正答数を数える。



8. 上記 2. の繰り返しの部分に、3. から 8. までのコードをいれる。 

9. 最大公約数を求めるコードは前々回 「14. 分数の約分をスクラッチで」に示した
 以下のコードを用いる。


10. この分数の掛け算の練習問題を生成するプログラム multiplication_of_fraction を 

2021/05/09

15. スクラッチ「クローンりんご」で掛け算

九九の背後にある掛け算の概念をリンゴを数えることで理解しよう。


スプライト Apple のコードの前半は、次の通り。




1. 変数 [かず] はクローンのリンゴを作るときに使う作業用の変数。 
 初期値を0に設定。

2. 変数 [n] は変数の作成時に「このスプライトのみ」を指定して作成した変数。
 スプライト Apple のみ使うことのできる変数であり、
 スプライト Apple のクローンそれぞれが別々に値を持つ変数。
 まだクローンを作成していないが、初期値 0 に設定。

3. 変数 [A] と変数 [B] のそれぞれに 1 から 9 までの数をランダムに設定。

4. A x B の値を変数 [こすう] に設定。これがこの掛け算の答えになる。

5. A x B の値の個数のクローンは
  (自分自身) のクローンを作る
 を [こすう] 回繰り返すことによって作成する。

6. 「(自分自身) のクローンを作る」によって、次のコードが実行される。


7. 変数 [ばんごう] は変数の作成時に「このスプライトのみ」を指定して作成した変数。
 変数 [かず] は、クローンが作られるたびに1ずつふえる。
 クローンが作られたときの [かず] を、そのクローンの変数 [ばんごう] に記憶する。
 このようにして、クローンリンゴごとに番号が付けられる。
 左上が1番目のクローン、下方向に A 番目のクローンまで縦に並べ、
 その右側に A+1 番目から Ax2 番目までのクローンを縦に並べる。
 最後に Ax(B-1)+1 番目から AxB 番目までのクローンを縦に並べる。
 このように並べるために、 [ばんごう] によって、
 クローンリンゴを表示する位置を計算し、x 座標と y 座標を設定する。

8. クローンリンゴをクリックすると、 [ばんごう] を表示する。


9. 「(りんごはぜんぶでいくつある?) と聞いて待つ」を実行すると、
 数を入力する枠が表示される。キーボードから数を入力する。


 入力した値が (答え) に入る。その値と (こすう) が一致していれば正解。
 正解のときは ok! というメッセージを猫に送る。
 間違っているときは ng!  というメッセージを猫に送る。

10. 猫のスプライトのコードは以下の通り。


 正解のときは (せいかい) と2秒表示し、リンゴに せいれつ というメッセージを送る。
 違っているときはクローンリンゴをクリックして数えるよう促す表示する。
 猫をクリックすると答えが表示され、リンゴに せいれつ というメッセージを送る。

11. リンゴスプライトが せいれつ というメッセージを受け取ったときのコードは次の通り。


 横10個ずつに並び替えているので数えやすくなる。

このプログラムは AppleMultiplication として
にアップした。

2021/05/01

14. 分数の約分をスクラッチで

分数は、分子と分母の最大公約数で約分することによって、既約分数に表すことができる。
最大公約数を求める方法としてユークリッドの互除法がある。
これをスクラッチで再帰呼び出しを用いてプログラムしてみよう。

1 ユークリッドの互除法

 自然数 a と b の最大公約数を d とすると、
  a = u d,  b = v d 
 と表され、u と v の公約数は 1 である。

 a を b で割ったときの商を q、余りを r (0 ≦ r < b) とする。
  a = q b + r

 r = 0 のとき、a = q b であるので、
 a と b の最大公約数は b である。
 つまり、b は a と b の公約数であり、
 b より大きい公約数は存在しない。

 r ≠ 0 のとき、a = q b + r を変形すると
 余り r は最大公約数 d の倍数になる。
  a = u d = q v d + r
  r = u d - q v d = (u - q v) d

 したがって、d は b と r の公約数である。 

 以下、d が b と r の最大公約数であることの証明。
  もし、d より大きい b と r の公約数 d' があったとする。
   b = s d', r = t d', d' > d
  したがって、
   a = q b + r = q s d' + t d' = (q s + v) d' 
  と表され、d' は a の b 公約数になる。
  d は a と b の最大公約数であるので、
  d' が d より大きい公約数であることは矛盾。
  したがって、d は b と r の最大公約数である。

 以上から、
  a を b で割り、a = q b + r とし、
  r = 0 のとき、b が a と b の最大公約数、  
  r ≠ 0 のとき、b と r の最大公約数が a と b の最大公約数
 であることがわかった。

 例を見てみよう。
  a=15, b=10 とする。
  15 と 10 の最大公約数は 15=1x10+5 より
  10 と 5 の最大公約数 である。
  10 と 5 の最大公約数は 10=2x5+0 より 5 である。
  したがって、15 と 10 の最大公約数は 5 である。

 ユークリッドの互除法は、余りが 0 になるまで、
 以下のように割り算を繰り返す方法。
  a₁ = q₁ a₂ + a₃
  a₂ = q₂ a₃ + a₄
  ...

2. ユークリッドの互除法で最大公約数を求めるスクラッチのプログラム


 変数 a と変数 b に値を入れ、この定義 gcd を呼び出すと、
 変数 d に a と b の最大公約数が得られる。

 最大公約数を求める定義 gcd の中で、自分自身を呼び出している。
 これを再帰呼び出しという。

3. このユークリッドの互除法を用いて分数の約分の練習問題を生成するプログラム
 reduction を https://scratch.mit.edu/projects/491417958/ 置いてある。

20. 円錐の半分?

17-19 で三角形、四角形の面積を半分にする問題を解いた。 今回は円錐を半分にする実験をしてみよう。 まず、円錐を作るための図形をスクラッチで描いてみた。 プログラムはここ。 https://scratch.mit.edu/projects/561804896 これを実行すると...