分数の四則演算が出来る計算機をスクラッチで作ってみます。
作る過程の考え方がプログラミングではとても大切なので、ぜひ挑戦してみて下さい。
分数の足し算と引き算を振り返る
以前の記事では「分数の足し算ツール」と「分数の引き算ツール」を作成する方法を解説しました。
順を追って考えながら作るという大切な内容になっていますので、まだ読んでいない方は「分数の足し算をスクラッチで解いてみる」の記事を読んでから本記事を読み進めてみて下さい。
余裕があれば「分数の引き算をスクラッチで解いてみる」の記事も読んでくださいね(*^▽^*)
しかし、どちらのツールもスクリプトが長くなってしまった上に、答えがマイナスになるような計算では正しく表示されないという問題がありました。
そこで今回は完全版の計算機を作ると同時に、プログラミングで大切な考え方となる、まとめて使いまわすというテクニックを紹介します。
今の時点で「まとめる?」「使いまわす?」と思っても全く問題ありません!
この記事を読み終わった時にはブロック定義マスターになっていますよ(^_-)-☆
計算機のスプライトとスクリプトを作る
計算機のスプライト
冒頭でも紹介した、足し算ツールの時に作ったものをそのまま使います。
マネしてもらっても、あなたのオリジナルを作ってもらっても、どちらでもOKです!
計算機のスクリプト
6色ブロックのスクリプト
「赤(左)」と「紫(左分子)」と「緑(右)」と「オレンジ(右分子)」はこのように設定してください。
(以下は赤の例です)
紫、緑、オレンジにはそれぞれの変数名を割り当てて下さい。
「黄色(左分母)」と「水色(右分母)」は分母にマイナスの数字が入力されるのは、一般的ではないと思うので「0以上の数字」を入力してもらうために、以下のように設定しましょう。
(以下は黄色の例です)
演算子ブロックのスクリプト
演算子ブロックのスクリプトは簡単!これだけです。
「-」「×」「÷」にも同様のスクリプトを設定してください。
計算結果ブロックのスクリプトを作る
さて、ここからがいよいよ本題です。
既にお気づきの方もいらっしゃるかもしれませんが、ここまで作成したスクリプトの中には計算を行う命令が一切ありませんでした。
そして残っているスプライトは「計算結果」だけです。
(Paddle(緑の横線)は区切りに使っているだけなのでスクリプトは設定しません)
つまり、この「計算結果」スプライトに全ての計算機能を担ってもらうスクリプトを設定していくことになります(*^-^*)
まずはスプライトが押されたときの処理を設定します。
ちなみに、プログラミングでは「+」と「-」はそのままの記号でいいのですが、「×」と「÷」は違う記号を使いますので覚えましょう。
- 「×」→「*」(読み方:アスタリスク)
- 「÷」→「/」(読み方:スラッシュ)
まとめられる処理を考える
足し算と引き算の計算ツールを作っていく中で、同様に登場する処理がありました。
掛け算や割り算でも使うことが出来るように、それらを書き出してみます。
- 入力された数字を計算しやすいように仮分数にする
- 計算結果を約分する
- 答えが「マイナス分のマイナス」の場合はプラスに変換する
- 答えの表示を帯分数にする
この4つの処理をブロック定義していきます。
ちなみに、仮分数は「7/5」のような状態、帯分数は「1と2/5」のような状態のことですからね(^_-)-☆
「仮分数に変換」を定義する
仮分数に変換しなければいけない場合は、「+」か「-」かに関わらず整数部分に数字が入力された場合、つまり「0以外」の時に行いますので、このようなスクリプトになります。
一番下の「答え(整数)を0にする」仮分数とは関係ないのですが、後のトラブル防止のために設定しておいてください。
「約分」を定義する
約分をするためには分母と分子の最大公約数を見つける必要があります。
「5/10」は「5」のみでしか割り切れないので、一発で分かるのですが「50/125」のような場合には「5」でも「25」でも割り切れてしまうので、一発では分かりません。
そこで、ユークリッドの互除法という難しい名前の手法を使って何度か計算して、最大公約数を求めていく必要があります。
それをスクリプトにしたものがこちらです。
簡単に説明すると、はじめの「もし~でなければ」は分母と分子いずれかの大きい数字を「a」小さい数字を「b」の変数に代入します。
この時「絶対値」を使っているのは「+」「-」に関係なく、数字のみの大小を判断するためです。
次の処理は「a/b」の余り「r」が「0」になるまで繰り返します。
「50/125」で解説するとこのようになります。
- 「125(a)/ 50(b)= 2(q)あまり25(r)」
- 「50(b)を(a)にする、25(r)を(b)にする」
- 「50(a)/ 25(b)= 2(q)あまり0(r)」
- 「(r)が0になったので、25(b)が最大公約数」
こんな感じです、、。
難しいですね(´・ω・`)
Scratch星人も理解するまでに時間が掛かりました(‘◇’)ゞ
「演算子整理」を定義する
こちらは約分のスクリプトに比べたら簡単です!
「かつ」のブロックを使って「分子分母ともにマイナス」なら、としている部分がポイントです!
「答え(分子)と答え(分母)< 0」でも大丈夫だと思います(^_-)-☆
「帯分数に変換」を定義する
さっそくスクリプトをご覧ください。
(小さく見づらくてすみません・・)
ひとつひとつ説明するとだいぶ長くなってしまうので、作成時のScrach星人の行動を以下に記載します。
- 様々な計算結果を考えて、それに見合うスクリプトを「もし」で作成
- これで完成した!と思っても、もう一度例外が無いかを考える
- ひたすら根気のいる作業を行って、スクリプトを完成させる(^▽^;)
上のスクリプトを写すだけでもいいですが、余裕があればひとつひとつの意味を考えてみて下さいね(^_-)-☆
これでブロック定義は全て完成です!
残すはそれぞれの演算のスクリプトです。
四則演算のスクリプトを考える
ここまでブロック定義を頑張ったので、四則演算のスクリプト自体はとてもシンプルですよ(^^♪
足し算のスクリプト
引き算のスクリプト
足し算と引き算は「通分」が共通するので定義しても良かったのですが、掛け算と割り算では通分の必要が無いのでこのようにしました。
掛け算と割り算のスクリプトはもっとシンプルですよ!
掛け算のスクリプト
割り算のスクリプト
完成したスクリプト
お疲れさまでした(*^▽^*)
スクリプトが完成したので見てみましょう!
こうして見てみるとすごい量のスクリプトですね。
しかし、ブロック定義を使ったおかげでこの量で済んでいます(^_-)-☆
まとめ
分数の計算機の作り方について書いてみました。
すごく大変でしたね。
お疲れ様です。
実際のプログラミングでも「まとめて使いまわす」ことを行います。
そのようにする背景には、書くコード(スクリプト)が少なく済むだけではなく、何らかのトラブル(エラーやバグ)が生じた際にその部分だけを修正すればいいというメリットもあります。
今回の記事では、それを伝えたいばかりにここまで長くなってしまいました。
ただ、この考え方はとても重要なので、ぜひ覚えて下さい。
そして自分の作品に活かしてみて下さいね(*^▽^*)
コメント