プログラミング入門
ドックにあるLaunchpad をクリック エディタ – Emacsの起動 ドックにあるLaunchpad をクリック 赤枠で囲まれたEmacsをクリック 画像はみな640*480のサイズ
Emacs起動画面 赤枠で囲まれているFileをクリック ファイルの作成 Emacs起動画面 赤枠で囲まれているFileをクリック 出てきた選択肢の中からVisit New Fileをクリック
ファイルの作成 赤枠で囲んだボタンをクリック デスクトップをクリックしてからNew Folderをクリック
ファイルの作成 ファイル名を指定する rubyと入力して ここではhello.rbとする Createをクリック
ファイル作成 プログラムを入力(ここでは説明のため文字を大きくしている)
ファイル作成 赤枠で囲まれたボタンを押してファイルを保存 赤枠で囲まれているのが保存ボタン 青枠は別のファイル名にして新しいファイルを作る (前のファイルは元のファイル名で残る)
ファイル作成 Emacsを終了するためには赤枠で囲まれている場所を クリック
プログラムの実行 赤枠で囲まれたターミナルをクリック cdコマンドでrubyディレクトリへ移動する lsコマンドでrubyディレクトリ内のファイルを確認する
プログラムの実行 catコマンドでファイルの中身を確認 rubyコマンドでプログラムを実行
プログラムの間違い バグ たとえば,puts ”Hello, ruby!” の代わりに, プログラムの間違い バグ たとえば,puts ”Hello, ruby!” の代わりに, putx ”Hello, ruby!” としてプログラムを実行すると 次のようなメッセージが出る エラーの内容に従ってプログラムの間違いを修正する作業 (デバッグ)を行う
出力文 出力命令:puts puts の直後の項目が出力される number.rb puts 1 puts 2 puts 1+2
文字列 文字列:” ”で囲まれると文字列定数になる string.rb puts ”1+2” puts 1+2
型と演算 型:値の種類 整数型, 実数型, 文字列型などがある 整数型:整数(小数点を含まない数)を表す型 実数型:浮動小数点数を表す型 小数点を含む数を近似的に表現する 二項演算子:2つの値の間の計算を表す +(和), -(差), *(積), /(商), %(剰余) 演算子の優先順:*, /, %は+, -に優先する 左の演算子は右の演算子に優先する ()で囲まれた部分は優先される
型の演算 実数型と整数型で計算すると実数型になる operator.rb puts 5+3 puts 5/3 puts 5%3
文字列の結合 文字列型:文字の並びを表す型 文字列の結合演算子(+):2つの文字列を結合する 文字列+文字列 stringAdd.rb puts 12+34 puts 34+12 puts ”12”+”34” puts ”34”+”12”
文字列の結合 文字列と数値の結合はできない stringError.rb 実は Fixnum が整数型,String が文字列型で, puts ”12”+34 実は Fixnum が整数型,String が文字列型で, 両方とも文字列型になれば + で文字列を結合できるが,Fixmun を String に変換する方法が非明示的には わからないと文句を言っている
文字列への変換 明示的な文字列への変換 文字列変換(.to_s):数値を文字列に変換する 数値.to_s stringConvert.rb puts ”1+2=”+3.to_s puts ”12+34=”+(12+34).to_s .to_sの処理が優先される
変数と制御構造 変数:値を格納する名前付きの器 代入:変数に値を入れること 代入演算子:右辺の式を計算し, 結果の値を左辺の変数 に代入 変数名=式 制御構造:特定の条件に応じて実行を変える仕組み 真理値型:真偽(true, false)を表す型
変数と制御構造 関係演算子:2つの値の関係を判定し,真理値を返す a==b: a=bならば真, そうでなければ偽 a!=b: a≠bならば真, そうでなければ偽 a>b: a>bならば真, そうでなければ偽 a<b: a<bならば真, そうでなければ偽 a>=b: a≧bならば真, そうでなければ偽 a<=b: a≦bならば真, そうでなければ偽
変数と制御構造 while文:条件が成立する間, 反復実行する while 式 do 文 end 式が正しい場合は, 文を実行し, 再び式を評価する 式が正しくない場合には, 次に進む
1から10の和 sumUpTo10.rb sumには総和が入る (そのため0に初期化) sum=0 i=10 while i!=0 do i=i-1 end puts sum i=10として-1づつ減らし,10,9,8,7…1として足し算をしている sum=sum+iは代入を行い,sumの値を更新
階乗の計算 factorial.rb fact=1 i=1 while i<16 do fact=fact*i puts i.to_s+"! = "+fact.to_s i=i+1 end factには階乗の結果が入る (そのため1に初期化) iは階乗を求めたい数が入る (今回は初期値1から15まで)
階乗の計算
変数と制御構造 if文:条件が成立した/しなかったときに実行する if 式 then 文1 end 式が正しいときに文1が実行される if 式 then 文1 else 文2 end 式が正しいときに文1が実行され, 正しくない場合に文2が実行される
絶対値の計算 absolute.rb x = -5 if x>0 then y=x else y=-x end puts "absolute(" + x.to_s + ")= " + y.to_s x=-5をx=5に変更してプログラムを動かしてみよう
配列に対する計算 配列:複数個のデータ(要素)を数字で区別できる変数 サイズ:配列の全要素の個数 変数名.length 添字:配列の要素を区別するための数字(0から数字が 与えられる) 変数名[添字] 配列の初期化:配列の全要素への代入 変数名=[値, 値, …]
配列の代入と値の確認 array.rb a=[20, 12, 7, 10, 14, 40] puts a.length i=0 while i<a.length do puts "a["+ i.to_s + "]=" +a[i].to_s i=i+1 end
平均値の計算 average.rb sumには a=[20, 12, 7, 10, 14, 40] 総和が入り, sum=0.0 また小数点を扱いたい (そのため0.0に初期化) a=[20, 12, 7, 10, 14, 40] sum=0.0 i=0 while i<a.length do sum=sum+a[i] i=i+1 end puts "sum =" + sum.to_s puts "average =" + (sum/a.length).to_s
最小値と最大値の計算 minmax.rb minとmaxの初期値に関して a=[20, 12, 7, 10, 14, 40] while i<a.length do if a[i] < min then min=a[i] end if a[i] > max then max=a[i] i=i+1 puts "min =" + min.to_s puts "max =" + max.to_s minとmaxの初期値に関して minの初期値に配列に現れる要素のいずれよりも大きな数を入れておけば、if文の条件により配列の最初の要素が入り全要素を比較できる maxも同様に配列に現れる要素のいずれよりも小さい数を初期値に入れ、if文の条件により配列の最初の要素が入り、全要素を比較できる
最小値と最大値の計算
数値計算のアルゴリズム 教科書p.123~p.125に載っている平方根を求めるプログラムをRubyで実行する アルゴリズム1 反復による平方根の計算 アルゴリズム2 二分法による平方根の計算 アルゴリズム3 ニュートン・ラフソン法による平方根の計算
反復による平方根の計算 sqrtIteration.rb 擬似コード x=2.0 delta=0.0001 y=0.0 while (y+delta)*(y+delta)<x do puts y y=y+delta end 2の平方根を求めているのでx=2.0 精度を決めるdelta=0.0001とする while内のputs yでyを更新する前の値を途中経過として出力
反復による平方根の計算
二分法による平方根の計算 sqrtBisection.rb 擬似コード x=2.0 delta=0.0001 a=0.0 b=x while (b-a)>delta do puts a.to_s + " " + b.to_s c=(a+b)/2 if c*c > x then b=c else a=c end puts a x=2.0delta=0.0001は反復によるプログラムと同様 while内のputsで更新する前のaとbの値を途中経過として出力
二分法による平方根の計算
ニュートン・ラフソン法による平方根の計算 擬似コード 曲線との接線 接線と軸との交点はaについて式変形すると青矢印で示した式になる
ニュートン・ラフソン法による平方根の計算 sqrtNewtonRaphson.rb x=2.0 delta=0.0001 y=x while (x-y*y).abs / (2.0*y)>delta do puts y.to_s + " " + ((x-y*y).abs/(2.0*y)).to_s y = (y*y + x) / (2.0*y) end puts y 数値.absによって数値の絶対値に変換可能 x=2.0delta=0.0001は反復によるプログラムと同様 while内のputsで更新する前のyとwhileの条件の値を途中経過として出力
ニュートン・ラフソン法による平方根の計算