edu005 – The First Step of EduBlocks
edu005-0 EduBlocksの特長
- EduBlocks は、ブロック プログラミング ツールですが、Python コードをリアルタイムに出力します。(EduBlocks is a block programming tool that outputs Python code in real time.)
- Joshua Lowe氏による動画(Blocks to python with Edublocks)は、日本におけるプログラミング学習環境(ツール)にも大きな示唆を含んでいますね。
edu005-1 定数
- 代表的なデータ型
型 | 例 |
int | 123 |
float | 3.14 |
str | “A” “abc” “漢字” |
print()
関数
※コンマ(,)で区切られた引数の内容が空白で区切られて表示される。
※補足(やや高度):print() 関数の書式内の *objects は、parameter(仮引数)のうちの「可変長位置」引数です。つまり、複数の引数を並べることができることを示しています。
〔実行結果〕
〔プログラム〕
edu005-2 エラー
EduBlocks(Python)では、文字列内を除いて基本的に半角文字で記述します。
たとえば、数値として、半角文字で123と書くべきところを、間違って全角文字で123と書くとエラーになります。
SyntaxErrorは文法的なエラーで、半角文字がくるべきところに無効な文字(全角文字)が現れたと指摘しています。
〔実行結果〕
〔プログラム〕
edu005-3 改行しない表示
改行せずに表示するには、print()
関数の引数にend=””を追加する。
※補足(やや高度):endのデフォルト値は end=’\n’ となっていて、end=””と指定すると改行文字\nが出力されないため改行されなくなります。
※補足(やや高度):上の「引数」は、argument(実引数)のうちの「キーワード引数」です。
〔実行結果〕
〔プログラム〕
edu005-4 変数の宣言
EduBlocksは通常のPythonとは異なり変数の宣言が必要です。
また、キーワード(予約語)や組み込み関数には名前の末尾に「2」という文字が自動的に付加されされることに注意してください。
〔概要〕
左側の[Variables]の[Create variable…]で変数を作成します。またこの場所所に作成済の変数のブロックが表示されます。
中央のプロジェクトにブロックを配置してプログラムを作成すると右側の[Code]にPythonのコード(プログラム)が表示されます。
変数名 | ブロック | Code | 説明 |
a | a = 0 | a = 0 | aという名前の変数に0を代入する。ブロックと内部で生成されたCodeは同じ。 |
python | python = 0 | python = 0 | python という名前の変数に0を代入する。この例ではpythonという変数名に特に意味はなく「p」「y」「t」「h」「o」「n」という文字を並べた名前です。変数名は働きに応じた何らかの意味を持たせる方がプログラムの可読性が高まります。 |
hensu | hensu = 0 | hensu = 0 | hensuという名前の変数に0を代入する。「変数(へんすう)」という意味を持たせた例。 |
if | if = 0 | if2 = 0 | ifという名前の変数に0を代入する。ブロックと内部で生成されたCodeが異なる。ifが後述のキーワード(予約語)であるのでエラーの発生を防ぐためEduBlocksにより自動的に2が付加されている。 |
a b | a b = 0 | a_b = 0 | 「a b」という名前の変数に0を代入しようとしている。「a b」という名前は、「a」「(空白)」「b」として構成しようとしているが変数名に空白を含むことはできない。そのため自動的に空白が_(アンダーライン)に置き換えられている。 |
1variable | 1variable = 0 | my_1variable = 0 | 変数名の先頭に数字は使えない。そのため自動的に先頭に「my_」文字列が付加されている。 |
(エラー) | a b = 0 | (表示されない) | Customブロックを使って「a b」という名前の変数に0を代入しようとしている。文法エラー(SyntaxError: invalid syntax)となっている。 |
(エラー) | 1variable = 0 | (表示されない) | Customブロックを使って「1variable」という名前の変数に0を代入しようとしている。文法エラー(SyntaxError: invalid decimal literal)となっている。 |
補足 予約語
キーワード(予約語)は、通常の変数名(識別子)として使うことはできません。たとえば、前項のifはキーワード(予約語)です。
※補足(やや高度):EduBlocksの編集画面のImportsグループに表示されていなくても、importすると利用できるPythonモジュールもあります。その時はCustomブロックで直接Pythonコードとして記述します。次の例は、keywordモジュールを用いてキーワード(予約語)の一覧を表示します。
〔実行結果〕
〔プログラム〕
edu005-5 日本語の変数名
日本語の変数名も可能ですが、通常は推奨されません。
例えば、変数名「日本語」に文字列「漢字」を代入する例を示します。EduBlocksでは、自動的にUnicode(UTF-8)を16進数で表示したものを_(アンダーライン)でつないだ変数名に変換されます。
字 | UTF-8 | EduBlocksでの表現 |
日 | E697A5 | _E6_97_A5 |
本 | E69CAC | _E6_9C_AC |
語 | E8AA9E | _E8_AA_9E |
〔code〕
〔実行結果〕
補足 文字コード
encode関数を使って文字コードを確認します。
〔実行結果〕
〔プログラム〕
〔Code〕
edu005-6 演算子
算術演算子(二項算術演算)です。
演算子 | 説明 | 使用例 | 使用例の実行結果 |
+ | 和 | 5 + 3 | 8 |
– | 差 | 5 – 3 | 2 |
* | 積 | 5 * 3 | 15 |
/ | 商 | 5 / 3 | 1.6666666666666667 |
// | 整数除算 | 5 // 3 | 1 |
% | 余り(剰余) | 5 % 3 | 2 |
** | べき乗 | 5 ** 3 | 125 |
〔実行結果〕
〔プログラム〕
補足 文字列の演算
*(乗算: multiplication) 演算子は、引数同士の積を与えます。引数は、片方が整数で他方がシーケンスの場合、シーケンスの繰り返し操作が行われます。
+(加算) 演算は、引数同士の和を与えます。引数は双方とも数値型か、双方とも同じ型のシーケンスでなければなりません。後者の場合、シーケンスは結合 (concatenate) されます。
〔実行結果:エラーの例〕
※例外 (exception):実行中に検出されたエラー
「TypeError: can only concatenate str (not “int”) to str」は、型エラーで「str型は(int型ではなく)str型のみ結合できる」と示しています。
〔プログラム:エラーの例〕
〔実行結果〕
〔プログラム〕
edu005-7 整数除算 – うまい棒を1本買うと?
「//」(スラッシュ2つ)は、整数除算(商をもとめる、つまり小数点以下を切り捨てる)をおこなう演算子です。
税抜き価格10円のうまい棒を1本買うと、軽減税率(8%)において、実数計算では総額は10.8円になりますが、小数点以下を切り捨てる処理であれば、支払額は10円になります。
〔実行結果〕
〔プログラム〕
edu005-8 切り捨て計算 – セブンとそれ以外のコンビニでコーヒーを3杯買うと??
セブンイレブンとそれ以外のコンビニでコーヒーを3杯買ったときの支払額の違いです。
コーヒーは税抜で1杯93円で、税率は8%であるとします。また、小数点以下は切り捨てるものとします。
〔参考文献〕https://www.sej.co.jp/info201909.html
〔実行結果〕
〔プログラム〕
edu005-9 実数の精度 – ホールケーキを3人で分けると??
100gのケーキを3人で分けたときの一人当たりのグラム数を表示します。
実数(浮動小数点数)は、精度が有限です。
〔実行結果〕
※実数は、精度が有限であり、途中で打ち切られている。
〔プログラム〕
補足 浮動小数点数で正確に表示できる最大の10進数桁
〔実行結果〕
〔プログラム〕
edu005-10 誤差 – 0.01を100回足すと?
〔実行結果〕
※前例と同様に、誤差を生じる。
〔プログラム〕
edu005-11 平方根の精度
平方根の場合で、計算誤差の発生を確認してみましょう。
√2 = 1.414213562373095048…
なお、たとえばExcelの場合は補正がおこなわれます。
=SQRT(2) 1.41421356237310000000000
=SQRT(2)*SQRT(2) 2.00000000000000000000000
〔実行結果〕
〔プログラム〕
edu005-12 ラクダの分配
整数と実数との関係の例を試してみましょう。17頭のラクダを3人に1/2、1/3、1/9ずつに分けるという問題です。
【元の話】昔アラブ人が17頭のラクダを持っていて、遺産として長男へ1/2、次男へ1/3、三男へ1/9を分配することにした。しかし、割り切れず(分配が整数にならず)、うまく分けられないためにもめていた。そこに旅人がやってきて1頭を差し出してくれたため、めでたく解決したという話です。
※参考文献:科学・千夜一夜: 始祖鳥からフラクタルまで
〔実行結果〕
〔プログラム〕
【変形オリジナル問題】
長男は1/2、次男は1/3、三男は1/9 にうまく分配できるときに1頭あまる、ラクダの最小の数を求めるプログラムを作成してください。
(解答省略)
edu005-13 キーボード入力
input関数はキーボード(コンソール)から入力を文字列として読み込みます。
したがって、たとえば整数として使いたい場合にはint関数で整数に変換する必要があります。
〔実行結果〕
〔プログラム〕
応用 複数の値入力
1行で複数の値を入力する。
〔技法〕split関数
〔実行結果〕
〔プログラム〕
〔注意〕
「3, 5」ではなく、,(コンマ)に続く空白を入れずに「3,5」と入力すると、区切り文字”, “(コンマと1文字の空白)が見つからずにエラーとなる。
edu005-14 データの交換
2つのコップに入っている2種類の飲みものを入れ替える。この操作を模倣するプログラムである。なお、その際には空のコップが必要となる。
〔実行結果〕
〔プログラム〕
補足 リストの場合:練習問題
子どもが3人いて、それぞれ子ども部屋がある。このとき次のように部屋替えをして荷物を移動したい。なお、その際に空き部屋を使うものとする。
空き部屋 | 子ども部屋1 | 子ども部屋2 | 子ども部屋3 | |
部屋替え前 | 子どもA | 子どもB | 子どもC | |
部屋替え後 | 子どもB | 子どもC | 子どもA |
〔技法〕リスト(1次元配列)
〔実行結果〕
(省略)
〔プログラム〕
(省略)
Copyright (C) 2022 Easy Programming