この記事の目的
- 「プログラミング学習につまずいている」
- 「基礎的な式や文は覚えたけど、応用できずに悩んでいる」
そんな人達に、「自分がうまくいかない原因が何なのか」を考えるきっかけにしてほしいです。
特に、「プログラミングで何か問題を解く」的なことが苦手な人に、少しでも参考になればと思います。
「プログラミングができない」をもっと細かく切り分けてみる
「プログラミング難しい、向いてないかも...。」と思う前に、「自分が何につまずいているのか」を分析してみましょう。
実は、難しいのはプログラミングじゃない?
プログラミング自体は、あくまでコンピュータに何かを実行させるための命令でしかありません。
なので、そのやりたい「何か」自体が難しい場合、自ずとそれをプログラミングするのも難しくなります。
ただ、目の前で取り組んでいるものが「プログラミング」なので、その状態を「プログラミングが難しい」と考えてしまう人も多いのではないでしょうか。
例: 「うるう年判定プログラム」がうまく書けないケース
スクールの課題でもよくある(らしい)、「うるう年判定プログラム」を作る問題を例にとって見ていきたいと思います。
なお、言語はPythonを使用しますが、重要なのは考え方であり、その点は他の言語(JavaでもRubyでも)と共通です。
※あくまで解くこと優先なので、「うまい」「きれいな」書き方ではないことはご了承ください。
問題の概要
- ある西暦(整数)を入力すると、それがうるう年か、そうでない(平年)か、を判定するプログラムを作成せよ。
- うるう年と判定する条件は、以下のとおりである。
- A: 4の倍数の年は、うるう年
- B: ただし、100の倍数の年は、うるう年ではない(平年)
- C: ただし、400の倍数の年は、うるう年
必要なプログラミングスキル
この問題を解く時に最低限必要なスキルは、大きく分けると
- 変数への代入
- 条件分岐(Pythonなら、
if - elif - else
文) - (標準入力・標準出力)
のみです。
逆に言えば、「これらの書き方がわかるのにこの問題ができない場合、それはプログラミングができなくてつまずいているわけではない」のかもしれません。
主なハマりポイントとしては、
- 倍数の判定方法がわからない
- 条件が多すぎて、どうやって考えたらよいかわからない
あたりだと思います。
典型的な、「考える内容が難しい」問題であり、実は求められるプログラミングスキル自体は、それほど高くありません。
必要な要素・考え方
入力される西暦を、year
という変数に代入する前提で進めていきます。
「〇〇の倍数」の判定
- 「〇〇倍数」は「〇〇で割り切れる(割った時に余りが0である)数」と言い換えることができます。
- 例えば「2022を4で割った時の余り」は、
2022 % 4
で求められます。 - なので、
- 「
year
が4の倍数かどうか」という条件は、「year % 4 == 0
」 - 「100の倍数かどうか」は、「
year % 100 == 0
」 - 「400の倍数かどうか」は、「
year % 400 == 0
」
- 「
条件同士の関係を考える
これが一番重要です。
条件が複数あるときは、その条件同士の関係をしっかり理解しましょう。
与えられた条件をもう一度整理すると、
- A: 4の倍数ならばうるう年
- B: 100の倍数ならば平年
- C: 400の倍数ならばうるう年
になります。
ここで、AとBの条件に注目して、
- 100の倍数ならば、4の倍数である
ことに気づくと、
- 100の倍数は平年。そして100の倍数でない4の倍数はうるう年。
という形で、AとBの関係を整理することができます。
同様に、BとCについても、
- 400の倍数ならば、100の倍数である
ので、
- 400の倍数ならばうるう年。そして400の倍数でない100の倍数は平年。
という形で、BとCの関係を整理することができます。
まとめると、ある西暦に対して、
- 400の倍数ならば、うるう年
- 400の倍数でない、100の倍数ならば、平年
- 100の倍数でない、4の倍数ならば、うるう年
- 4の倍数でないならば、平年
ということになります。
ここまで整理できれば、上から順にif-elif-else
文で書いていくだけになります。
year = int(input())
if year % 400 == 0: # 400の倍数なら「うるう年です。」
print("うるう年です。")
elif year % 100 == 0: # 100の倍数なら「うるう年ではありません。」
print("うるう年ではありません。")
elif year % 4 == 0: # 4の倍数なら「うるう年です。」
print("うるう年です。")
else: # どれにも当てはまらなければ、「うるう年ではありません。」
print("うるう年ではありません。")
※簡略化のため、main
関数とか書いてないのはごめんなさい。
振り返り
この問題では、
- 倍数についての知識
- 条件間の関係性を考察する論理的思考力
が必要になります。
特に後者については、高校数学の「論理と集合」の考え方を理解しているかが大きな分かれ目になってます。
※勉強していないとできないわけではもちろんなくて、この考え方自体が自然にできるならば問題なく解けるはずです。
このように複数の条件を扱うときに、その条件同士の関係を整理できるかどうかは非常に重要で、一般的に、プログラミングには数学が必要と言われる背景の一つはこれではないかと考えています。
まとめ:あなたに足りないのは、本当にプログラミングスキルなのか
以上、うるう年判定を例に上げて、「プログラミングの問題を切り分け」してみました。
ここでは高校数学の話に少し触れましたが、決して「数学やってなかったらプログラミングできない」と言うつもりはありません。
今回お伝えしたかったのは、以下の2点です、
- 現実の問題に立ち向かうためには、数学に限らず幅広い知識や感覚が必要になることがある。
- これらの知識・感覚が自分に有るのか・無いのかを自覚して、無いならそれを補っていくことが重要。
「プログラミング向いてない」と諦めてしまう前に、自分がなんで詰まってしまったのか、しっかり振り返って前に進んでもらえると良いな、と思います。
おわりに
弊社では、経験の有無を問わず、社員やインターン生の採用を行っています。
興味のある方はこちらをご覧ください。