Scratch(半角全角変換・入力値の指定)

プログラム

Scratchでプログラムをつくっているとぶち当たる問題、それが半角・全角問題。こちらは半角の数字を入れてほしいのに、全角の数字を入力されるために正しく処理が行われないということが多々あります。ちゃんと理解している人ならいいけど、普通の人はそこまで知りません。今回は半角全角の違いと、Scratchでその問題を回避する方法の1つを説明したいとおもいます。

 

半角・全角とは

そもそも、半角はんかく全角ぜんかくとはなんでしょうか? それは簡単にいうと文字のサイズが、こんなふうに縦横1:1で正方形の中に納まっているのが全角、1:1/2で長方形の中に納まっているのが半角です。

input-value001

なんでこういうものがあるかというと、元々コンピュータというものは欧米から発達したものなので、欧米で使う数字とアルファベットだけ表現できればよかったんですね。つまり、0~9、A~Zが表現できればよかったんです。これには、1バイト(=8ビット、これは0が8つで表現できる単位)もあれば数字とアルファベット全てを表現できたのでことたりたんだよね。なので最初に1:1/2の長方形のサイズで文字が作られました。

しかし、時代が流れるとコンピュータを英語圏以外の国、日本や中国、アラビア、インドネシアなどでも使われるようになると、その国の言葉、日本なら漢字をコンピュータの上で表すためには1バイト(0が8個)だけでは足りなくなったんだよね。なのでその倍の2バイトを使って漢字などを表現するようになりました。これが全角がうまれた理由です。

そして、移行期において半角カタカナという、ちょっと変なものもうまれました。日本語の中でなぜかカタカナだけ半角が存在します。これは、データをたくさん伝送・保存できない時代に、なんとかして少ない容量(1バイト文字)で日本語を表そうとした先人達の苦労の証なんでしょうね。

input-value002

Shift-JISコードについてはこちらのサイトが役にたちました。

半角と全角が違うと何が問題

では、半角と全角があると何が問題となるのでしょう?それは人間の目からみたら、半角の英数字も全角の英数字も同じに見えますが、コンピュータからすると両者は違うものだからです。たとえば、日本語文字コードの1つであるShift-JIS(Windowsで主につかわれている)で半角の8と全角の8を表すと以下のようになります。

input-value003

では、これが実際のプログラミングではどう影響するのかと、3(半角)が入力された時だけ処理を行うというプログラムを書いてみましょう。これを実行したときに、人間は3(半角)ではなく、3(全角)を入力してしまうと、コンピュータとしては別物と判断するため、思い通りの分岐処理をしてくれません。人間からすると、ちゃんと3を入力したぞー と思うのに、違う結果になってしまうのです。

input-value004

回避策(Scratchで実装)

そのため、この問題を解決してやる必要があります。でも、他の言語、Pythonなどはstr.maketrans( ) や str.translate( )などの関数で半角になおすことができるのですが、Scaratchでは・・・、この変換させる関数がなさそうです。

うーん、これは困ったどうしよう。

ここは発想の変換をするしかなさそうです。つまり、あらかじめ決めておいた値以外は入力できないようにするというものです。

Scaratchでは、リストとこのブロックをつかいます。つまり入力した文字がリストの中に存在するかどうかをチェックする条件式をつくるのです。

input-value005

 

Scratchで実装

では、これを使って、単純に1~3の数を入れた場合にオウム返し、1から3以外の数をいれた場合は違うよと訂正を促すようにしゃべるプログラムを作ってみましょう。

結果はこちらです。

中身をみたい場合はこちら

https://scratch.mit.edu/projects/560316998

では中身の説明です。

クラゲくん

Jellyfish

今回のスプライトはこのクラゲくんのみです。クラゲくんに書いてあるコードはこちらです。

input-value006

 

このプログラムのポイントはさっきも話をしたとおり、入力を許可する値を最初にリストの中にいれておき、入力された値がリストの中に存在しているかをチェックして、OKであれば処理実行。NGなら再度入力を促す処理に分岐させるところだよ。

ここで、全角の1でも半角の1でも入力されたらOKとするため、リストには全角・半角両方の数字をいれてあるよ。それから、条件がOKだった場合にメッセージ1を飛ばして、別処理(サブルーチン)にしているのは、判定OKの後にプログラムをダラダラ書くと見にくくなるから、あえてメッセージを飛ばして別で記載することにしました。つまり、このメッセージを飛ばす前の部分が様々なケースで使いまわせる、入力制御の判定プログラム部分ということだね。

なお、この方法だと、大きな数字を入れるというプログラムでは実装が難しいけれど、1~10など決められたせまい範囲の数字を入れるというケースでは有効かとおもいます。

まとめ

さて、今回は半角・全角と、Scaratchにおけるその対策について書きました。これからプログラミングをしていくと、特に他言語では、半角・全角以外にも文字コードと呼ばれるものにも気をつけないといけないです。日本語を表す文字コードだけでも、パッと思いつくものにShift-JIS、SJIS、EUC-JP、UTF-8などがあります。違う文字コードで変換してしまうと、日本語が「菴墓腐縺薙l縺瑚ェュ繧√k?」などの全く読めない文字になってしまうので、正しい文字コードで変換するという作業が必要になります。まぁ、これは今後、プログラミングを進める上での話なので、今日は、細かく触れませんね。

では、また次回。

コメント

タイトルとURLをコピーしました