本日の内容 プログラミング言語第五回 担当 : 篠沢佳久櫻井彰人 平成 20 年 5 月 19 日 制御構造 条件式 論理式 ( 復習 ) if 式 繰り返し (1) 無限の繰り返し 1 2 Ruby vs. Excel 浮動小数点数の計算能力は同じ 整数の計算能力は Ruby が上 Ruby なら何桁でも計算できる Excel には 整数計算だけやって! ということができない欠点がある 使いやすさは Excel Excel には (Excel がもっている ) 関数を使うのが簡単という長所がある 拡張性は Ruby Ruby には 自分の必要な関数が定義できるという長所がある (Excelでも Visual Basic を使えば類似のことはできる ) プログラムと実行結果を MS-Word へ貼り付ける 1 エディター上で Alt キーを押しながら PrintScrn 3 4 MS-Word 上で右クリック 貼り付け プログラムと実行結果を MS-Word へ貼り付ける 2 実行結果 コマンドプロンプト上で Alt キーを押しながら PrintScrn メモ帳の画面が貼り付けられる 5 6
MS-Word 上で右クリック 貼り付け irb を終了して ruby コマンドを実行したい場合 exit と入力 コマンドラインの画面が貼り付けられる 7 8 irb を終了して ruby コマンドを実行したい場合 条件式 コマンドプロンプトに戻るので > ruby プログラム名 論理式 ( 復習 ) if 式 9 10 プログラムの構造 制御構造 基本的には上から順に実行される print( " 一番目の数値を入力してください : " ) line = gets.chop x1 = line.to_f print( " 二番目の数値を入力してください : " ) line = gets.chop x2 = line.to_f print( "#{x1 + #{x2 = #{ x1+x2 " ) 実行順番を変えることも必要 制御構造 実行順番 文の並び ( 連接 ) If 文 ( 分岐 ) 最初の文 条件次の文真のとき偽のとき最後の文 繰り返し i=1 条件 i<=10 処理処理 11 12
条件式 (if 式 ) プログラムを書いている際には ある条件式が成立した場合には, 処理 A を行ない, 成立しなかった場合には処理 B を行なうという要求が発生する if 式 1 if 論理式 then 式 1 if 論理式 then 式 1 # 論理式が のときの値 If 文 ( 分岐 ) 論理式式 1 13 14 if 式 1( 例 ) if 式 1( 例 ) ( 実行されるか考えなさい ) x = 5 if x < 0 then x = -5 if x < 0 then x = 0 if x < 0 then print(x) が実行されるのは? 15 x = -5 if x!= 0 then x = -5 if not x == 0 then x = -5 y = -10 if x < 0 and y < 0 then x = -5 y = 10 if x < 0 or y < 0 then 16 if 文の構造 if 文の構造 if a > 0 then if a < 10 then print( a ) if 式中に if 式を書くことも可能 同じ式 if a > 0 and a < 10 then print( a ) if a > 0 then if a < 10 then x = a*10 if a >= 10 then x = a*100 if 式中に if 式を書くことも可能 17 18
if 式 1( 例 ) (a の値を考えなさい ) 論理式 ( 復習 ) a =? if a > 0 then if a > 10 then a += 1 a += 1 print( a ) aの値はどうなるでしょうか a = -100 a = 0 a = 1 a = 10 a = 100 論理値 ( 真偽値 ) を計算する式を論理式と呼ぶことにします 論理式の基本は 数式または文字列式 ( の値 ) と数式または文字列式 ( の値 ) とを比較演算子を用いて比較する式です これを and/or/not で組み合わせます 19 20 比較演算子 演算子 用途 例 演算結果 == 等 3==2 > 大 4 > 2 < 小 4 < 2 >= 大 or 等 4>=2 <= 小 or 等 4<=2!= 非等 3!= 2 論理演算子 演算子 用途 例 演算結果! 否定! (3==2) && かつ 2==2 && 4>2 または 2==3 4>2 not 否定 not 3==2 and かつ 2==2 and 4>2 or または 2==3 or 4>2 21 22 if 式 2 if 式 2( 例 ) if 論理式 then 式 1 式 2 if 論理式 then 式 1 # 論理式が のときの値 式 2 # 論理式が のときの値 論理式式 1 式 2 if x % 2 == 0 then print( x, " は偶数です " ) print( x, " は奇数です " ) 2で割り切れるか偶数と表示奇数と表示 23 24
if 式 2( 例 ) if 式 2( 例 ) if x % 2!= 0 then print( x, " は奇数です " ) print( x, " は偶数です " ) 奇数と表示 2 で割り切れないか 偶数と表示 y=20 if x >=y then print( x, " は ", y, " 以上 " ) print( x, " は ", y, " 未満 " ) x は y 以上と表示 y=20 x>=y x は y 未満と表示 25 26 if 式 3 if 論理式 then 式 1 式 2 if 論理式 0 then if 論理式 1 then 式 11 式 12 if 論理式 2 then 式 21 式 22 正式には PAD 図といいますここでは 分岐図とでもいいましょうか 論理式 0 論理式 論理式 1 論理式 2 式 1 式 2 式 11 式 12 式 21 式 22 27 if 式 3( 例 ) if x % 2 == 0 then if x >= 10 then print( x, " は偶数で 10 以上 " ) print( x, " は偶数で 10 未満 " ) if x >= 10 then print( x, " は奇数で 10 以上 " ) print( x, " は奇数で 10 未満 " ) 10 以上か 2で割り切れるか 10 以上か 偶数で10 以上偶数で10 未満奇数で10 以上奇数で10 未満 28 if 式 3( 例 ) 80 以上か 70 以上か 60 以上か score = 75 grade = if score >= 70 then if score >= 80 then "A" "B" if score >= 60 then "C" "D" print( "Your score #{score corresponds to #{grade n" ) 成績はA 成績はB 成績はC 成績はD 29 複数の式からなる式 Ruby では 複数の式を並べたものも式となる score = 75 grade = if score >= 70 then if score >= 80 then "A" "B" if score >= 60 then "C" "D" print( "Your score #{score corresponds to #{grade n" ) 式 30
if 式 3( 例 ) if a > 10 then if a > 100 then a += 1 a -= 1 if a > -10 then a += 10 a -= 10 aの値はどうなるでしょうか a = -100 a = -10 a = 0 a = 10 a = 100 a = 1000 31 y = if Math.sin(Math::PI/4) >= 0.1 and ( if Math::E == 2.7 then 2 論理式の中にif 式を 書くことも可能 1 式の値は? ) > 1.5 then if Math.exp(0.5) >= 0.3 then 0.3 0.5 Math.log(23) 32 if 式 4 論理式 1 if 式 4( 例 ) 式 1 if 論理式 1 then 式 1 # 論理式 1 が のときの値 elsif 論理式 2 then 式 2 # 論理式 2 が のときの値 式 3 # 論理式 1,2 が のときの値 論理式 2 式 2 式 3 if x >= 10 then print( x, " は 10 以上 " ) elsif x >= 5 then print( x, "5 以上,10 未満 " ) print( x, " は 5 未満 " ) 10 以上か 10 以上 5 以上か 5 以上,10 未満 5 未満 33 34 if 式 4( 例 ) if x >= 10 then print( x, " は 10 以上 " ) elsif x >= 5 then print( x, " は 5 以上,10 未満 " ) elsif x >= 0 then print( x, " は 0 以上,5 未満 " ) print( x, " は 0 未満 " ) 10 以上か 10 以上 5 以上か 5 以上,10 未満 0 以上か 0 以上,5 未満 0 未満 練習 1 下記と同じプログラムを if 式 4(if~elsif~ ) の条件式で書きなさい score = 75 grade = if score >= 70 then if score >= 80 then "A" "B" if score >= 60 then "C" "D" print( "Your score #{score corresponds to #{grade n" ) 35 36
練習 1 成績が A ならば 80 点以上,B ならば 80 点未満 70 点以上,C ならば 70 点未満 60 点以上,D ならば 60 点未満と出力するプログラムを書きなさい grade = "A" if grade == "A" then print( "80 点以上 " ) 練習 2 x,y,z の大小を判定するプログラムの一部です. 途中の条件式を追加しなさい. x=12 y=23 z=5 if x >= y and y >= z then print( x, " >= ", y, " >= ", z ) elsif x >= z and z >= y then print( x, " >= ", z, " >= ", y ) 37 38 繰り返しの必要性 1 無限の繰り返し 1 から 10 の整数を出力したい print( "1 2 3 4 5 6 7 8 9 10 n" ) loop break 1 から 1000 の整数を出力したい print( "1 2 1000 n" ) と書けばよいが 39 40 繰り返しの必要性 2 繰り返しの必要性 3 プログラムを書いている際には 同じ処理をある回数だけ行ないたい ある条件が成立するまで 同じ処理を繰り返したい 値を変化させながら 同じ処理を繰り返したいという要求が発生する 繰り返しを行なう際に考えること 何を繰り返すのか 何回繰り返しを行なうのか どういう条件で繰り返しを停止するのか 41 42
繰り返しの必要性 4 1 から 1000 の整数を出力したい 何を繰り返すのか 出力を繰り返す どういう条件で繰り返しを停止するのか 1000 まで出力したら停止する 43 無限の繰り返し 1 式 式 break 条件式 次の式 式が永久に実行される停止するために break を用いる 条件式を満たした場合のみ停止する (loop ブロックの次の式を実行する ) 44 無限の繰り返し 2 print( " こんにちは n" ) 実行画面 無限の繰り返し の場合, 式が無限に繰り返される 停止させるためには,break 式と条件式で設定しなければならない 無限に こんにちは と表示される停止するにはCtrlキーを押しながらc 45 46 無限の繰り返し 3 無限の繰り返し 3 10 回で こんにちは の表示をやめるには? i = 0 print( i, " 回目のこんにちは n" ) break if i == 10 i=0 処理 iは10か 10 回で こんにちは の表示をやめるには? i = 1 print( i, " 回目のこんにちは n" ) break if i == 10 i=1 処理 iは10か 47 48
無限の繰り返し 4 無限の繰り返し 4 10 のべき乗を表示するプログラム i = 0 print( 10 ** i, " n" ) break if i == 10 i=0 処理 iは10か 10のべき乗を表示するプログラム i = 10 print( 10 ** i, " n" ) break if i == 1 i = i-1 i=10 処理 iは1か i=i-1 49 50 無限の繰り返し 5 無限の繰り返し 5 100 以下の偶数を表示するプログラム i = 1 if i % 2 == 0 then print( i, " n" ) break if i == 100 i=1 処理 iは100か 100 以下の偶数を表示するプログラム i = 100 if i % 2 == 0 then print( i, " n" ) break if i == 1 i = i-1 i=100 処理 iは1か i=i-1 51 52 無限の繰り返し 5'' 無限の繰り返し 6 i=1 total = 0 100 以下の偶数を表示するプログラム i = 2 print( i, " n" ) break if i == 100 i = i+2 i に 2 ずつ加算 i=2 iを出力 iは100か i=i+2 100 以下の整数の和を求めるプログラム i = 1 total = 0 total += i break if i == 100 print( " 合計は ", total ) total+=i iは100か total の表示 53 54
無限の繰り返し 6' i=1 total = 0 無限の繰り返し 6'' i=1 total = 1 どういうプログラムでしょうか i = 1 total = 0 total += i break if total > 10000 total+=i total>10000 どういうプログラムでしょうか i = 1 total = 1 total *= i break if total > 10000 total*=i total>10000 55 56 無限の繰り返しのまとめ 1 上記 を無限に繰り返す 無限個のコピーを作ると考えてもよい ただし いきなり作るのではなく 必要があったら作るのですが しかし いずれにせよ 無限に作られるのは困る 途中で止めなければ意味がない 途中で止める道具 ( これも式だが まったく式らしくない ) が break です i = 0 print( " やっほ ~ " ) if i>=10 then break puts( " Yee-ha! " ) i = 0 print( " やっほ ~ " ) break if i>=10 puts( " Yee-ha! " ) これを if 修飾子という式 if 論理式が一般形 無限の繰り返しのまとめ 2 a から b まで c ずつ加算しながら繰り返し処理を行なう i = a 式 break if i > b i += c i=a 式 i > b i=i+c 57 58 if 修飾子 1 if i==0 then break if a > b then print( " a は b よりも大きい " ) if 修飾子 2 if a!=b then a = a * 2 b = b + 5 break if i==0 print( " a は b よりも大きい " ) if a>b a=a*2 ; b = b+ 5 if a!= b 59 60
繰り返し入力できるようにするためには loop { print( "Enter your score: " ) line = gets.chomp break if line=="" score = line.to_f grade = if score >= 70 then if score >= 80 then "A" "B" if score >= 60 then "C" "D" print( "Your score #{score corresponds to #{grade n" ) G: Ruby>ruby -Ks sample0405.rb Enter your score: 90 Your score 90.0 corresponds to A Enter your score: 40 Your score 40.0 corresponds to D Enter your score: 61 キーボードからの入力 キーボードで Enter キーを入力した場合 line = gets.chomp break if line == "" print( line, " n" ) chomp で改行文字が削除されるため,line には空白文字が入る line には空白文字が入っているため break が実行され停止する 62 練習 3 練習 2 において, 比較する 3 個の整数をキーボードから入力できるようにしなさい で無限に繰り返しできるようにした後,3 個の整数ともに 0 を入力した場合のみ終了できるようにしなさい 練習 4 キーボードから複数個の整数を読み込み, その合計を求めることができるプログラムを を用いて書きなさい Enter キーを入力した場合, 読み込みを停止し, 合計を出力させるものとする 63 64 練習 4 練習 4 において, 合計値の他に平均値も求めることができるようにしなさい 練習 3 x,y,z の読み込み改行処理, 型変換 x,y,zが0か x,y,z の判定 ( 練習 2) 練習 4 total = 0 読み込み改行処理 空白か 型変換合計の計算 total の表示 65 66
本日の練習問題 練習問題 1~4 をできる限り試してみなさい 簡単な人は自習問題も試してみて下さい プログラムと実行結果をワープロに貼り付けて keio.jp の教育支援システムから提出して下さい ( 途中であったり, 実行できなくてもかまわないので書けた部分まで提出して下さい ) 67