※この記事は「FizzBuzz・・・聞いたことあるけどよくわからんぞ」「とりあえず繰り返しとかifとかはなんとなくやったやで」「プロゲートの初級編は一応一周したけど自信全く無いやで」というあたりのガチ初学者向けです。
こんにちは。以前も初学者の分際で初学者向け記事を書きましたが、大器晩成型なのでまた初学者向けの記事を書いています。
せっかくプログラミングを始めたなら、やっぱ人の役に立ちたい!日本社会の発展に貢献したい!
ということで九九の勉強に四苦八苦してる子のために超シンプルプル九九勉強アプリケーションを作りました。
puts "九九のおべんきょうをはじめよー!!"
puts "一桁の掛け算の問題を10問出すよ"
puts "答えの数字を入力してエンターキーを押してね!"
puts "じゃあいくよー!"
sleep(0.5)
puts "3"
sleep(1)
puts "2"
sleep(1)
puts "1"
sleep(1)
count = 0
wrong_questions = Array.new
10.times do
x = rand(9) + 1
y = rand(9) + 1
puts "#{x} × #{y} = "
user_answer = gets.chomp.to_i
true_answer = x*y
if user_answer == true_answer
puts "正解!"
count += 1
puts ""
else
puts "ちがうよ!"
puts "正解は#{true_answer}"
wrong_questions << [x, y, true_answer]
puts ""
end
end
puts "おつかれさまー!"
puts ""
puts "正解数:#{count}"
puts "間違えた問題は・・・"
if count == 10
puts "なし!全問正解!すごい!!天才!!!!!!"
else
wrong_questions.each do |w|
puts "#{w[0]} × #{w[1]} = #{w[2]}"
end
end
できる人から見たらこれをアプリと呼ぶのか・・?というレベルだと思いますが、勉強始めたてのころの僕が見たらわけがわからなさすぎて白目むく程度には複雑だと思うので簡単に解説していきます!
【解説】
流れとしては
①1~9からランダムに数字を一つ選んで、x
とy
とする
②内部でx × y
を計算して、答えをtrue_answer
とする
③ユーザーが入力した数字をuser_answer
として、user_answer
とtrue_answer
が一致しているかを確認する
④一致してたら正解とし、count
を1増やす。このcount
が最後にそのまま正解数になる
⑤一致してなかったらその時のx
とy
とtrue_answer
を配列wrong_questions
に追加、つまり保存して、最初に戻る
⑥10回繰り返したらループが終わり、正解数count
を表示。全問正解ならそのまま終わり、間違えていたらwrond_questions
に値が残ってるのでそれを九九の問題になるように表示
こんな感じです。
10.times do
これは「10回以下の内容を繰り返してね」というコマンドです。使いやすいのでサクッとググったら覚えちゃいましょう。
x = rand(9) + 1
y = rand(9) + 1
ここでは「0~8からランダムな数字をひとつ得る」というrand()
に1を足すことで、「1~9からランダムな数字をひとつ得る」ようにしています。
answer = gets.chomp.to_i
これは「ユーザーから入力(標準入力)を受け付ける」というgets.chomp
に、得た値をinteger(整数型)に変換するというto_i
をくっつけたものです。
ユーザーから整数の入力を受付ける時のテンプレです。詳しくはググれば出てくると思いますが、この部分は全体のロジックには全然関わらないので、まずは「こういうもの」と覚えてしまった方がいいと思います。
if user_answer == true_answer
puts "正解!"
count += 1
puts ""
else
puts "ちがうよ!"
puts "正解は#{x*y}"
wrong_questions << [x, y, true_answer]
puts ""
end
ここが九九アプリのキモになっている部分、つまり「答えが合ってるか否かの判断」と「正解数のカウント」と「間違えた問題の保存」をやってます。
まず
if user_answer == true_answer
で一致しているかを確認し・・・
もし一致してる、つまりユーザーの入力が合ってたら
"正解!"と表示し、count
を1増やします。
このcount
はこのループの外側にあるので、この10.times do
のループが最初に戻ってもcount
はリセットされません。
こうやって「正解数」をcount
という変数に「保存」と言えます。
また、wrong_questions
も同じです。間違えた問題のx, y, true_answerの組み合わせを、ループの外側にある配列wrong_questinos
に入れておくことで「保存」してます。
あとは、ループが終わったら正解数count
をそのまま表示し、wrong_questions
に保存されている間違えた問題をいい感じに表示するだけです。
wrond_questions
は二重配列で入っています。
例えば2 x 3 = 6
という問題と5 x 8 = 40
という問題を間違えたならば
wrong_questions = [[2, 3, 6], [5, 8, 40]]
という形で入っているはずです。
これを順番に取り出していきたいので・・・
wrong_questions.each do |w|
とすることで「配列から配列を順番に取り出して」、wに入れています。
x, y, true_answerの順番は決まっているので、あとは普通に配列から取り出すように
x = w[0]
y = w[1]
true_answer = w[2]
として表示していくだけです。
以上です!Qiitaはデキるプログラマの方が多いので、ほんとうに初学者向けの記事が少ないように感じます。
僕も詰まったことがあるし、ほんとうに初学者の人が詰まりそうなところを解説できれば・・・!と思って書きました。
ではでは、ちょうど春休みですし、さっそく九九アプリを作って近所の小学生相手にイキり倒し、ご近所の算数力向上に貢献しましょう!!!!!!!