🐣

中学生にAtCoderでプログラミングを教える記録 3回目 〜 初めての提出(前半) ABC086A - Product

2022/08/11に公開

この記事の内容

ソフトウェアエンジニアが中学生の子にプログラミングを教えていく様子を記録する。この記事は3回目。いよいよ子本人が自分のマシンを操作し、解答をひとつ提出する。前半。

【前回の記事】
2回目はAtCoderの説明と、環境した環境で過去問を1問解いて提出するデモをやった回。

3行で

  1. いよいよ過去問を1題解いてみよう。
  2. 先輩が「ここから始めるといいよ」という説明をしてくれている。これをやってみよう。
  3. スモールステップでひとつひとつ進め、提出までやる。(長くなったため後半に続く)

進め方の参考にした記事

先輩が「ここから始めるといいよ」という説明をしてくれている、というのはこの記事のことだ。記事の最初は前フリなので飛ばして、セクション5の「過去問精選 10 問!」から見る。

https://qiita.com/drken/items/fd4e5e3630d0f5859067#5-過去問精選-10-問

第 1 問、 ABC 086 A - Product を題材にやっていこう。

https://atcoder.jp/contests/abc086/tasks/abc086_a

スモールステップの手順

1. まず問題をよく読む。

入力は1行で、数値が2つ与えられる。空白で区切られている。この2数の積が奇数ならOdd, 偶数ならEvenと出力する。

さて、問題を読んだら、目的のコードを一気に書きたくなる。誰でもそう。でも、いったんそれは置いてくれるかな。これから大事な話をするよ。

📌 楽しくコードを書く方法

最初から正解のコードをズラーっと書いて、よしオッケー!みたいなコーディングはカッコいい。映画のハッカーはそうしてるように見える。でも、あれは映画だから。デバッグを詳しくやってたら時間足りないから(リアル)。全部書いて、直しもせずに正常に動作するプログラムなんて、ない。マジで。ガチで。そんなものはないんだ。ということを覚えておいてほしい。

じゃあどうやって書くかって?

命令をひとつ書いて、動かして、動いた。次、もうひとつ書いて、動いた。じゃあこうやって組み合わせて書いて、オッいい感じに動いたじゃん。こんなふうに、少しずつ動かして確認しながら書いていく。これを積み重ねて、目的の動作のコードができあがる。一歩一歩、地面を踏みしめて、よしいけるな、と確認しながら、歩いていくイメージ。そんな風に書くといい。

もし、全部一気に書いたとしよう。すべてを書き上げてから実行すると、たいていは思ったように動かない。予想外の結果が出るならマシなほう。たいてい、大量のエラーが出る。自分が一生懸命書き上げたばかりのコードに激しくダメ出しをされて、いったいどこがダメだったのかを詳しく見ていくことになる。考えただけでウンザリだな。

このやり方は挫折しやすい。理由は明白、ダメ出しされて直すことの繰り返しなんて、人間はそういうことにウンザリするようにできてるから。

小さい単位でやりたい動作を書いて、「動いた」を積み重ねるやり方だと、挫折しにくい。この方法でやっていこう。

2. 入力を1行取得するコードを書き、実行してみよう。

私「入力を取得するだけのコードを書いてみて」
子「ええ? 取ってきて終わり?」
私「そう」

solve_abc086_a.py
#!/usr/bin/env python
input()

子「こう…?」

不安げな顔。(なんのために?)って感じだろうな。動くかどうか確かめるためだよ。

私「このデバッグ実行で動かしてみよう。どうなると思う?」
子「何もなくただ終わる…?」
私「よし、じゃあそうなること確かめよう。動かすには、ここ選んで、ここを押す」
子「おお…動いた…無言で終わっただけだけど 笑」
私「これはエラーが出ずに正常終了したってことなんだよ。大事なんだよエラーが出ないのは! 笑ってるけどマジでw」

3. 取得した入力に関係ない適当な文字列を出力するコードを追加して、実行してみよう。

私「じゃあ次。今のコードの次の行に、適当にabcdでもHelloでもいい、何か出力してみようか」
子「入力取得して、それはシカトして、自分の言いたいこと言うの?」
私「そう」
子「おかしいでしょw」
私「全然おかしくない(真顔)。パソコンもツッコミ入れたりしてこないよ。まあやってみ」

solve_abc086_a.py
#!/usr/bin/env python
input()
print(Hello)

子「こう…?」
私「動かしてみ」
子「あれ、なんか怒られる」
私「波線出たね。これは文法がちょっと…って言われてる。ハッキリ言えよって思ったら、ここにマウスカーソル持ってきて少しジッとすると、言ってくれる」
子「変数…? 変数じゃないけど? ああこれ、文字列のチョンで囲まないといけないのか」
私「いいねー」

solve_abc086_a.py
#!/usr/bin/env python
input()
print('Hello')

子「怒られなくなった。これでいい…? って、動かしてみ、でしょ、動かすね」
私「わかってきた」
子「動いた!Helloきた」
私「できたなー」

4. 入力を1行取得して、取得したものを出力するように修正して、実行してみよう。

私「いまさあ、入力を取得しといて、捨ててもうてるやん? おかしいやん?」
子「え! さっき、全然おかしくない、って言ったじゃん!」
私「そっちだっておかしいって言ってたやんw まあだからこれを捨てないで、受け取ってそのままオウム返しするように変えてみようよ」
子「信じたのにひどい仕打ち。取ってきたやついっぺん変数に入れて、それを出力すればいい?」

solve_abc086_a.py
#!/usr/bin/env python
a = input()
print(a)

子「動いた! やまびこできてる。自分で入力したら返ってくる〜」
私「順調順調、やるねェ!」

【次の記事】
後半はいよいよ問題に沿ったコーディングに進み、提出する。

GitHubで編集を提案

Discussion