プログラミング演習i · 2019-05-28 · 小林裕之(工大rd 学部s 科)...
Post on 11-Aug-2020
0 Views
Preview:
TRANSCRIPT
プログラミング演習IExercise on Programming I
http://bit.ly/OITprog1
小林裕之
大阪工業大学ロボティクス&デザイン工学部システムデザイン工学科
7 of 14
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 1 / 32
今日の主な内容
game.rb更新
前回の復習
整数と文字列の変換
文字列メソッドいくつか小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 2 / 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
game.rbバージョン 7
while true dobuf.unshift(" " * rand(40) + "#" * (score / 15))buf = buf[0, 9]
ここを修正
何が起こるか予想してから実行しよう
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 4 / 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
復習
復習
データには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
前回の課題の解答と解説《棒グラフのパタン》、《数 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
独力でできないとまずい復習の練習問題 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
独力でできないとまずい復習の練習問題 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
整数↔文字列
wareki.rbの更新こんな簡単なことなのに。
令和の年の表示が数字だけだと寂しいので
reiwa 2 nen
のように表示したい。どうする?
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 12 / 32
案 1: 3つに分ける
puts("seireki?")y = gets.to_iw = y - 2018puts("reiwa")puts(w)puts("nen")
ちょっと思ってたのと違う…。小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 13 / 32
案 2: 『+』でつなげる
puts("seireki?")y = gets.to_iw = y - 2018puts("reiwa" + w + "nen")
これはエラー。(理由わかる?)小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 14 / 32
案 2のエラーの理由とても重要なところ
文字列 文字列puts("reiwa" + w + "nen")
整数puts("reiwa" + w + "nen")
第5回でやったようにデータの種類 (クラス)によってできる演算とできない演算がある。文字列と整数の足し算 (+)はできない。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 15 / 32
整数を文字列に《変換》する。
整数の後に.to_sをつけると文字列になる!
123.to_s(22 * 170 * 170 / 10000).to_s
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 16 / 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
整数を文字列に《変換》する。逆もありました。
整数の後に.to_sをつけると文字列になる!
文字列の後に.to_iをつけると整数になる!
"123".to_i→ 123"abc".to_i→ 0"123abc".to_i→ 123
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 18 / 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
「変換」と言っても、そのものを変えるわけではない件言葉としては「破壊的」メソッドではない、と言います。
a = 123b = a.to_sputs(a * 2)puts(b * 2)
“a”, “b”はそれぞれ整数? それとも文字列?
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 20 / 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
文字列のメソッドをいくつか
逆さ文字列を得る reverse
playstr.rb
s = gets.chompputs(s.reverse)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 23 / 32
大文字・小文字の文字列を得る upcase/downcase
playstr.rb (続き)
s = gets.chompputs(s.reverse)puts(s.upcase)puts(s.downcase)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 24 / 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
ヒントよーく読めばきっと理解できると思います。
整数どうしの計算結果は整数になることを使う。
12345秒を 60で割れば(整数どうしの割り算なので)、それだけで正しい答えの 205分が得られる。
この 205を使って、12345 − 205 × 60 = 45のように秒の値が得られる。
要するに、コンピュータとかプログラムとか関係なく『12345秒は何分何秒でしょう?』という小学生の算数の問題を解く手順と全く同じことをすればいい。(その際、整数どうしの計算結果が整数になるという性質を使う。)小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 26 / 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
次回予告
条件判断
待望のifついに登場! これでコンピュータが判断するプログラムが書ける!
if hp < 1puts(name + "はしんでしまった! ")
end
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 29 / 32
このページ以降はヒント集なのでできれば見ないでください。どうしてもわからない人向け。(わかりそうな人は先に見ても何も良いことはありません。自分で考えて、すべて自分で書くのが一番。)
もっとヒント 1できればこのページは見ないで解いてください。
sec = gets.chomps0 = ? # こんなふうにして整数の秒(s0)を得る。m = ? # s0 を使って分を求める。s = ? # 205分45秒でいうところの45秒を求める。# 結果を表示する。
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 31 / 32
もっとヒント 2
sec = gets.chomps0 = sec.to_im = s0 / 60s = ? # 205分45秒でいうところの45秒を求める。# 結果を表示する。(文字列・整数に注意)
小林裕之 (工大 RD 学部 S 科) プログラミング演習 I 7 of 14 32 / 32
top related