プログラミング演習i · 2019-05-28 · 小林裕之(工大rd 学部s 科)...

32
プログラミング演習 I Exercise on Programming I http://bit.ly/OITprog1 小林 裕之 大阪工業大学 ロボティクス&デザイン工学部 システムデザイン工学科 7 of 14 小林 裕之 (工大 RD 学部 S ) プログラミング演習 I 7 of 14 1 / 32

Upload: others

Post on 11-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

プログラミング演習IExercise on Programming I

http://bit.ly/OITprog1

小林裕之

大阪工業大学ロボティクス&デザイン工学部システムデザイン工学科

7 of 14

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 1 / 32

Page 2: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

今日の主な内容

game.rb更新

前回の復習

整数と文字列の変換

文字列メソッドいくつか小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 2 / 32

Page 3: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

game.rbバージョン 6 (これまでの全ソースコードまとめ)

require "timeout"k = ""x = 5score = 0buf = []while true do

buf.unshift(" " * rand(40) + "#")buf = buf[0, 9]puts(buf[0])print("\x1b7\x1b[10A\x1b[#{x}CO\x1b8")beginTimeout.timeout(0.1) do

while true dok = STDIN.getchx = (x + (k == "h" ? -1 : 1)) % 40

endendrescue

endbreak if buf[-1][x] == "#"score = score + 1

endputs(score)

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 3 / 32

Page 4: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

game.rbバージョン 7

while true dobuf.unshift(" " * rand(40) + "#" * (score / 15))buf = buf[0, 9]

ここを修正

何が起こるか予想してから実行しよう

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 4 / 32

Page 5: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

ひまつぶし 8行プログラムgame.rb更新が終わって暇な人向け

bounce.rb...........................x, y, vx, vy = 30, 20, 0.8, -1.5while true doprint("\b \x1b[#{y.to_i};#{x.to_i}Ho")sleep(0.02)x, y = x + vx, y + vyvy = y < 20 ? vy + 0.1 : -vyvx = -vx if x > 70 || x < 2

end小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 5 / 32

Page 6: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

復習

Page 7: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

復習

データにはS t r i n g

文字列とI n t e g e r

整数がある。

データの種類によって演算のルールが異なる。variable

変数は、整数や文字列を指し示すことができる。

変数は指し示すモノを変えられる。

str = gets.chompとすると文字列を入力できる。

val = gets.to_iとすると整数を入力できる。小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 7 / 32

Page 8: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

前回の課題の解答と解説《棒グラフのパタン》、《数 1》,《数 2》,《数 3》の順で入力すると、そのパタンで 3本のグラフ表示を行う bars_w19???.rbを作成せよ (例によって w19???の部分は自分の学生番号。wxは小文字)。下記の実行例参照。

e1w19123@edu1:˜$ ruby bars_w19???.rb= ← 棒グラフのパタン4 ← 数12 ← 数29 ← 数3===============

この辺が『グラフ』のイメージ…

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 8 / 32

Page 9: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

独力でできないとまずい復習の練習問題 1 (5分)

適正体重w(kg)と身長 h(cm)の間にはw = 22h2/10000の関係がある(らしい)。次の仕様のプログラムhealthyweight.rbを作成せよ。

1 キーボードから身長を入力すると、(例 170)2 適正体重を出力する (例 63)。

e1919123@edu1:˜$ ruby healthyweight.rb170 # ←キーボードから入力63 # ←63 (kg) を表示e1919123@edu1:˜$

※この授業ではまだ整数しかやっていないので体重は整数でしか表示されませんが、プログラム中の 22 を 22.0 とすると小数点以下も表示されるようになると思うのでやってみたい人はご自由にどうぞ。

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 9 / 32

Page 10: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

独力でできないとまずい復習の練習問題 2 (5分)

西暦を令和に変換するwareki.rbを作成せよ。ただし以下のように動作すること。

1 “seireki?”と聞いてくる(表示する)。2 人間がキーボードから整数で西暦を入力する。(例 2020)3 令和の年が表示される。

e1919123@edu1:˜$ ruby wareki.rbseireki? # ←最初このように表示2020 # ←キーボードから入力2 # ←2(令和2年)を表示e1919123@edu1:˜$

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 10 / 32

Page 11: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

整数↔文字列

Page 12: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

wareki.rbの更新こんな簡単なことなのに。

令和の年の表示が数字だけだと寂しいので

reiwa 2 nen

のように表示したい。どうする?

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 12 / 32

Page 13: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

案 1: 3つに分ける

puts("seireki?")y = gets.to_iw = y - 2018puts("reiwa")puts(w)puts("nen")

ちょっと思ってたのと違う…。小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 13 / 32

Page 14: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

案 2: 『+』でつなげる

puts("seireki?")y = gets.to_iw = y - 2018puts("reiwa" + w + "nen")

これはエラー。(理由わかる?)小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 14 / 32

Page 15: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

案 2のエラーの理由とても重要なところ

文字列 文字列puts("reiwa" + w + "nen")

整数puts("reiwa" + w + "nen")

第5回でやったようにデータの種類 (クラス)によってできる演算とできない演算がある。文字列と整数の足し算 (+)はできない。

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 15 / 32

Page 16: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

整数を文字列に《変換》する。

整数の後に.to_sをつけると文字列になる!

123.to_s(22 * 170 * 170 / 10000).to_s

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 16 / 32

Page 17: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

以上を踏まえて練習問題 (5分)

西暦を令和に変換するwareki.rbを更新せよ。ただし以下のように動作すること。

1 “seireki?”と聞いてくる(表示する)。2 人間がキーボードから整数で西暦を入力する。(例 2020)3 令和の年がわかりやすく表示される。

e1919123@edu1:˜$ ruby wareki.rbseireki? # ←最初このように表示2020 # ←キーボードから入力reiwa 2 nen # ←わかりやすい!e1919123@edu1:˜$

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 17 / 32

Page 18: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

整数を文字列に《変換》する。逆もありました。

整数の後に.to_sをつけると文字列になる!

文字列の後に.to_iをつけると整数になる!

"123".to_i→ 123"abc".to_i→ 0"123abc".to_i→ 123

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 18 / 32

Page 19: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

to_iメソッドをもう少し詳しく

文字列 (など)を整数値に変換するメソッド。その他だいたい to_sと似たようなもの。どう考えても整数にならない文字列 (例: "foo","bar")はゼロになる。(エラーにはならない。)

微妙なものの例1: "500万円".to_i→500になる。微妙なものの例1: "12+34".to_i→12になる。(計算まではしてくれない。)

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 19 / 32

Page 20: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

「変換」と言っても、そのものを変えるわけではない件言葉としては「破壊的」メソッドではない、と言います。 

a = 123b = a.to_sputs(a * 2)puts(b * 2)

“a”, “b”はそれぞれ整数? それとも文字列?

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 20 / 32

Page 21: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

整理する問題復習ようにどうぞ。

Q.このプログラムを実行した後、最終的にa, b, c, d, eはそれぞれなにになるでしょう?

a = 12b = "3"c = a.to_sd = b.to_i * ae = a.to_s * b.to_i

答:aは整数の12,bは文字列の”3”,cは文字列の”12”,dは整数の36,eは文字列の”121212”

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 21 / 32

Page 22: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

文字列のメソッドをいくつか

Page 23: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

逆さ文字列を得る reverse

playstr.rb

s = gets.chompputs(s.reverse)

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 23 / 32

Page 24: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

大文字・小文字の文字列を得る upcase/downcase

playstr.rb (続き)

s = gets.chompputs(s.reverse)puts(s.upcase)puts(s.downcase)

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 24 / 32

Page 25: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

課題

sec = gets.chomp# この先を自分で考える。今回の内容の理解度を試すため敢えて文字列で入力。

秒を入力すると分と秒に分けて表示するプログラム作成せよ。(下記実行例参照)ファイル名は sec2minsec_x19???.rb (例によって x19???の部分は自分の学生番号。xwは小文字)とする。 先頭 1行は上記の通り一切変更しないこと。

x19123@edu1:˜$ ruby sec2minsec_x19???.rb12345 ← 12345 (秒)とキーボードから入力205:45 ← このように出力 (205分 45秒の意味)x19123@edu1:˜$

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 25 / 32

Page 26: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

ヒントよーく読めばきっと理解できると思います。

整数どうしの計算結果は整数になることを使う。

12345秒を 60で割れば(整数どうしの割り算なので)、それだけで正しい答えの 205分が得られる。

この 205を使って、12345 − 205 × 60 = 45のように秒の値が得られる。

要するに、コンピュータとかプログラムとか関係なく『12345秒は何分何秒でしょう?』という小学生の算数の問題を解く手順と全く同じことをすればいい。(その際、整数どうしの計算結果が整数になるという性質を使う。)小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 26 / 32

Page 27: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

課題提出方法(締め切りは金曜正午)

sec2minsec_x19???.rbをそのままサーバに保存しておく。

実行結果のスクリーンショットをGoogleclassroomに提出。

ファイル名・実行結果が正確であること。

提出の自己チェックはhttps://edu1.rd.oit.ac.jp/prog1/selfcheck.rbからどうぞ。

https://classroom.google.com

selfcheck.rb

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 27 / 32

Page 28: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

次回予告

Page 29: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

条件判断

待望のifついに登場! これでコンピュータが判断するプログラムが書ける!

if hp < 1puts(name + "はしんでしまった! ")

end

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 29 / 32

Page 30: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

このページ以降はヒント集なのでできれば見ないでください。どうしてもわからない人向け。(わかりそうな人は先に見ても何も良いことはありません。自分で考えて、すべて自分で書くのが一番。)

Page 31: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

もっとヒント 1できればこのページは見ないで解いてください。

sec = gets.chomps0 = ? # こんなふうにして整数の秒(s0)を得る。m = ? # s0 を使って分を求める。s = ? # 205分45秒でいうところの45秒を求める。# 結果を表示する。

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 31 / 32

Page 32: プログラミング演習I · 2019-05-28 · 小林裕之(工大RD 学部S 科) プログラミング演習I 7 of 14 7/32 前回の課題の解答と解説 《棒グラフのパタン》、《数

もっとヒント 2

sec = gets.chomps0 = sec.to_im = s0 / 60s = ? # 205分45秒でいうところの45秒を求める。# 結果を表示する。(文字列・整数に注意)

小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 32 / 32