電卓プログラムを作ろう1~競技プログラミングに向けて~

2024年10月11日(金)は、5割ほどの出席でした。

  • 18時00分~18時30分 タイピング練習
  • 18時30分~19時50分 電卓を例にプログラムの要素を学習
  • 19時50分~20時00分 あとかたづけ

タイピング練習

タイピングの練習は、「寿司打」です。

ここ何回か、わたしのスコアを超えたメンバーのことばかり書いてきました。それ以外のメンバーも、結構速いのです。

日常的に補助業務としてパソコンを触る会社なら、十分即戦力として通用するくらいにタッチタイピングできるメンバーがたくさんいます。そのうち可視化します。 

電卓プログラムを作ろう

これまで写経をメインに、プログラムを学習してきた光都ICTクラブのメンバーです。

ぼちぼちみずからプログラムを組めるようになってほしいので、そのトレーニングを開始します。題材は電卓です。

まずは、電卓の機能を洗い出します。下は、ブレインストーミングの様子と結果です。

最初に出てきたのは、機能ではなくて電卓にあるボタンをメンバーがあげてきました。間違いではないですが、画面に表示するのはボタンにはありません。ヒントを出すと、出てきました。

当たり前過ぎて、なかなか出てこなかったのが「数字の入力」です。数字を入力する機能は、電卓には必須です。

面白いなと思ったのは、「消費税」と「住民税」です。消費税計算機能は、実際に搭載した電卓があります。これまで写経で学習してきた内容でできそうです。

住民税計算機能は、実際に搭載した電卓を、わたしはみたことがありません。さて、言ったからにはそのうち作ってもらいます。国税庁の確定申告書等作成コーナーみたいな機能になるのかなあと想像しています。いまから楽しみです。

電卓として最低限の機能は、四則演算ができればOKとしましょう。写真でいうと、○で囲んだ機能(要素)から作り込んでいくこととします。

まずは標準出力printと標準入力input

電卓といっても、いわゆるスマホアプリのようなプログラムを作るのはハードルが高すぎます。まず、コマンドラインで計算できればOKとします。

そこで、プログラムを学ぶお作法としてHello, World!からいきましょう。

もちろん、答えのコードは教えません。メンバーそれぞれに考えてもらいます。

ただ、学校のテストではないので、覚えておく必要ありません。調べてもいいし、隣にきいてもいいし、AIにきいてもOKです。

2つくらいは違う答えが出てくるかなと期待していたら、3つくらい出てきました。出てきたうち、記憶に鮮明なのは以下のとおりです。

print("Hello, World!")
print('Hello, World!')
print("Hello,", "World!")

1行目と2行目は、あらかじめ期待していたとおりです。3行目は、考えてもみませんでした。たしかにこれでもOKです。多くの場合、あまり意味がないのでこのような書き方をしません。しかし、このように書けることを知っておくのは大切です。

つぎに、出力があるなら、入力もあるということで、標準入力inputを使った課題です。

コマンドラインで、以下のように表示するプログラムを書きます。○は任意の数字です。

>数字を入力してください:○
>あなたが入力した数字は:○

こちらはあまり違った回答はなかったように思います。わたしが誘導して、1行で書いたコードがあったくらいです。

a = input("数字を入力してください:")
print("あなたが入力した数字は:", a)

print("あなたが入力した数字は:", input("数字を入力してください:"))

もっと苦戦するかと考えていたので、比較的メンバーみんながかんたんに答えにたどり着いたのを嬉しく思います。

プログラムに計算をさせる

標準入出力ができたので、四則演算プログラムを作ります。まず以下のように、足し算プログラムを作ります。

>1つ目の数字を入力してください:○
>2つ目の数字を入力してください:△
>足し算:○+△の答え

よくある間違った結果は、以下のとおりです。

>1つ目の数字を入力してください:1
>2つ目の数字を入力してください:2
>足し算:12

1と2の足し算の答えは、3と表示してほしいので、これでは間違いです。数字の足し算ではなく、文字列を結合していますね。このときの間違ったコードは以下のとおりです。

x = input("1つ目の数字を入力してください:")
y = input("2つ目の数字を入力してください:")

print("足し算:", x + y)

ねらったとおりの間違いをしてくれるメンバーに喝采です。いやみではありません。人から教えてもらった答えに、値打ちはないのです。自分でたどり着いた答えにこそ、真の値打ちがあります

さて、正解はこちら。

x = int(input("1つ目の数字を入力してください:"))
y = int(input("2つ目の数字を入力してください:"))

print("足し算:", x + y)

inputで得られるのは、文字列です。計算には、文字列を使えません。そこで、文字列を数値に変換します。それが、型変換(キャスト)です。この課題は、キャストがミソです。

ここまでできたら、下のような四則演算はかんたんにクリアできます。

>1つ目の数字を入力してください:○
>2つ目の数字を入力してください:△
>足し算:○+△の答え
>引き算:○-△の答え
>掛け算:○✕△の答え
>割り算:○÷△の答え

答えは書かないので、各自やってみてください。

おまけでルート(平方根)を計算してみる

考えていたよりはやく課題をクリアしてしまったので、もう少し頭に汗をかいてもらいましょう。以下のようなプログラムを考えましょう。

>数字を入力してください:○
>平方根:○の平方根

平方根は、中学校3年生の数学で学習します。中学校2年生以下のメンバーには、かんたんに概要だけ説明してプログラムを考えてもらいます。

さきに答えを書くと、以下のコードです。

import math
x = int(input("数字を入力してください:"))

print("平方根:", math.sqrt(x))

ここで重要なのは、1行目のimportと3行目の関数です。いままで写経でさんざん書いてきたこの形です。importするライブラリをmathのかわりに、numpyを使っても同様の結果が得られます。

Web検索で、numpyにたどり着いたメンバーもいました。ただ、違いはわかっていなさそうなので、それは今後の課題です。

次回以降も、内容をオーバーラップさせながらプログラム学習を進めていきます。