狠狠撸

狠狠撸Share a Scribd company logo
アルゴリズムとデータ構造

  2011.11.18(WEB用)
今日の内容

? 2.3   最もありふれた手続き(自己代入)
? 2.4   文字出力を制御する(式展開, printf)
代入と自己代入
? これまで ”=“ を使って変数に値(もしくは式)を代入
  する書き方を見てきました

 a = 25
 b = 30
 c=a+b
代入と自己代入
? 次に、ある変数に5を足していく方法を考えましょう


 a=0
代入と自己代入
? 次に、ある変数に5を足していく方法を考えましょう


 a=0
 a=a+5   #a=5
 a=a+5   # a = 10
 a=a+5   # a = 15
 a=a+5   # a = 20
代入と自己代入
? 以下のように a = a ◇ b (◇は任意の算術演算子)
  の形になっている場合、 これを a ◇=b と表せる

 a=0
 a=a+5   #a=5
 a=a+5   a=0
         # a = 10
 a=a+5   # a =5
         a += 15    #a=5
 a=a+5   # a =5
         a += 20    # a = 10
         a += 5     # a = 15
         a += 5     # a = 20
スワップ - データの交換
1   # swap.rb
2   # 変数のデータを交換する
3   a = 12
4   b = 25
5   print “a = “, a, “, b = “, b, “?n”
6   tmp = a
7   a=b
8   b = tmp
9   print “a = “, a, “, b = “, b, “?n”


      変数 a と 変数 b に代入されている値を交換する手順
スワップ - データの交換
1   # swap.rb
2   # 変数のデータを交換する
3   a = 12
4   b = 25
5   print “a = “, a, “, b = “, b, “?n”   #=> a = 12, b = 25
6   tmp = a
7   a=b
8   b = tmp
9   print “a = “, a, “, b = “, b, “?n”   #=> a = 25, b = 12


            実際にどうやっているかを考えてみましょう
スワップ - データの交換
1   # swap.rb
2   # 変数のデータを交換する
3   a = 12
4   b = 25
5   print “a = “, a, “, b = “, b, “?n”
6   tmp = a
7   a=b                                  12   25
8   b = tmp
9   print “a = “, a, “, b = “, b, “?n”


    3行目で 変数”a” に 12 が代入され
    4行目で 変数”b” に 25 が代入されている。
スワップ - データの交換
1   # swap.rb
2   # 変数のデータを交換する
3   a = 12
                                              12
4   b = 25
5   print “a = “, a, “, b = “, b, “?n”
6   tmp = a
7   a=b                                  12        25
8   b = tmp
9   print “a = “, a, “, b = “, b, “?n”


    次に6行目で変数 ”tmp” に a を代入している
    つまり変数”tmp”に12を一時的に代入している
スワップ - データの交換
1   # swap.rb
2   # 変数のデータを交換する
3   a = 12
                                              12
4   b = 25
5   print “a = “, a, “, b = “, b, “?n”
6   tmp = a
7   a=b                                  25        25
8   b = tmp
9   print “a = “, a, “, b = “, b, “?n”


    更に7行目で変数 ”a” に b を代入している
    つまり変数”aに 25を代入している
スワップ - データの交換
1   # swap.rb
2   # 変数のデータを交換する
3   a = 12
                                                       12
4   b = 25
5   print “a = “, a, “, b = “, b, “?n”
6   tmp = a
7   a=b                                       25              12
8   b = tmp
9   print “a = “, a, “, b = “, b, “?n”   #=> a = 25, b = 12


    あとは一時的に変数”tmp”に代入してあった 12を変数”b”
    に代入すれば、交換完了(8行目)
    出力結果を見れば、それが確認出来る(9行目)
スワップ - データの交換
1   # swap.rb
2   # 変数のデータを交換する
3   a = 12                               ①       ③
4   b = 25
5   print “a = “, a, “, b = “, b, “?n”
6   tmp = a                                  ②
7   a=b
8   b = tmp
9   print “a = “, a, “, b = “, b, “?n”
    変数名はなんでも良いが、ここでは、一時的に必要な変数
    を用意するという意味で、 “tmp”(temporary)を使った。
    このように各変数名の役割がわかるように変数名を付ける
    ことは、プログラムの可読性(readability)を高める
スワップ - データの交換
1   # swap.rb
2   # 変数のデータを交換する
3   a = 12
4   b = 25
5   print “a = “, a, “, b = “, b, “?n”   ①
6   # tmp = a
7   a=b                                  ②
8   b=a
9   print “a = “, a, “, b = “, b, “?n”

    ちなみに”tmp”を使わずに、交換しようとすると???
スワップ - データの交換
1   # swap.rb
2   # 変数のデータを交換する
3   a = 12
4   b = 25
5   print “a = “, a, “, b = “, b, “?n”                 ①
6   # tmp = a
7   a=b                                       25       ②      25
8   b=a
9   print “a = “, a, “, b = “, b, “?n”   #=> a = 25, b = 25

    どちらも同じ数になってしまう
文字列出力の制御
? これまでプログラムの計算結果や文字を画面に出
  力するのに print メソッド を使ってきました。

? ここでは print メソッド以外の、使える出力メソッドを
  紹介していきます。
文字列出力の制御: puts
# print.rb
print “おはよう!”
print “こんにちは!”
print “おやすみ!”
> ruby print.rb




上のスクリプトを実行すると
文字列出力の制御: puts
# print.rb
print “おはよう!”
print “こんにちは!”
print “おやすみ!”
> ruby print.rb
おはよう!こんにちは!おやすみ!>

                  プロンプト



各文字列が数珠つなぎのように出力され、プロンプトも変な
位置にきてしまいます。
文字列出力の制御: puts
# print.rb
print “おはよう!?n”
                   (-_-) <??????????
print “こんにちは!?n”
print “おやすみ!?n”
> ruby print.rb
おはよう!
こんにちは!
おやすみ!
>
これを回避するためには、各文字列の末尾にいちいち改行
文字をつけなくてはなりません。
文字列出力の制御: puts
# puts.rb
puts “おはよう!”
puts “こんにちは!”
puts “おやすみ!”
> ruby puts.rb
おはよう!
こんにちは!
おやすみ!
>
出力する行が多いときはprintの代りに puts メソッドを
使うと便利。改行文字を自動で付けてくれる。
文字列出力の制御: 式展開
# who_is_age.rb
who = “私”
age = 20
print who, “は”, age, “歳です.?n”
> ruby who_is_age.rb




次に複数の変数やリテラルを同時に出力する場合を
考えましょう。
文字列出力の制御: 式展開
# who_is_age.rb
who = “私”
age = 20
print who, “は”, age, “歳です.?n”
> ruby who_is_age.rb
私は20歳です.
>



↑printをつかった場合。
 では代りにputsを使うとどうでしょう?
文字列出力の制御: 式展開
# who_is_age.rb
who = “私”
age = 20
puts who, “は”, age, “歳です.”
> ruby who_is_age.rb
私
は
20
歳です.
putsの場合、カンマごとに改行されるため注意が必要。
文字列出力の制御: 式展開
# who_is_age.rb
who = “私”
age = 20    (-_-) <??????????
puts who, “は”, age, “歳です.”
> ruby who_is_age.rb
私
は
20
歳です.
そもそもカンマをいちいち打つのが???????!
そういうときは???
文字列出力の制御: 式展開
# who_is_age.rb
who = “私”
age = 20
puts “#{who}は#{age}歳です.”
> ruby who_is_age.rb
私は20歳です.
>



文字列内(?????????????内)で #{ } を使って変数を囲む
と、その中は文字列として扱われず、変数として評価される
文字列出力の制御: 式展開
# who_is_age.rb
who = “私”
age = 20
puts “#{who}は#{age - 5}歳です.”
> ruby who_is_age.rb
私は15歳です.
>



更に #{ } 内で計算式を書くと、その結果が表示される。
つまり #{ } 内では式展開が行われている。
文字列出力の制御: 式展開
# who_is_age.rb
who = “私”
age = 20
puts ‘#{who}は#{age - 5}歳です.’
> ruby who_is_age.rb
#{who}は#{age-5}です.
>



ちなみに式展開は?????????????で囲んだ場合のみ行われ、
?????????????を用いた場合は機能しません。
文字列出力の制御: printf
 1   # puts2.rb
 2   n1 = 7
 3   n2 = 123
 4   n3 = 21
 5   a = 85.0
 6   s = “結果”
 7   puts “n1 = #{n1} 円”
 8   puts “n2 = #{n2} 円”
 9   puts “n3 = #{n3} 円”
10   puts “#{s}は #{a/n1} です.”
文字列出力の制御: printf
 1   # puts2.rb          putsの出力では数字の桁が
 2   n1 = 7              揃っていなくて見栄えが悪い
 3   n2 = 123            また、小数の計算結果をその
 4   n3 = 21             まま出力すると、下桁が長く
 5   a = 85.0            なってしまう。
 6   s = “結果”
 7   puts “n1 = #{n1} 円” > ruby puts2.rb
 8   puts “n2 = #{n2} 円” n1 = 7 円
 9   puts “n3 = #{n3} 円” n2 = 123 円
10   puts “#{s}は #{a/n1} です.”
                         n3 = 21 円
                   結果は 12.1428571428571 です.
文字列出力の制御: printf
 1   # puts2.rb          puts の代りに printf を使うと
 2   n1 = 7              以下のように出力を整形する
 3   n2 = 123            ことができる。
 4   n3 = 21
 5   a = 85.0
 6   s = “結果”
 7   printf(“n1 = %3d 円?n”, ruby puts2.rb
                         > n1)
 8   printf(“n2 = %3d 円?n”, n2) 7 円
                         n1 =
 9   printf(“n3 = %3d 円?n”, n3) 123 円
                         n2 =
10   printf(“%4sは %4.1f です. “, s, a/n1)
                      n3 =21 円
                      結果は 12.1 です.

                         数字の一の位で
                         揃っている
文字列出力の制御: printf
 1   # puts2.rb
 2   n1 = 7
 3   n2 = 123
 4   n3 = 21
 5   a = 85.0
 6   s = “結果”
 7   printf(“n1 = %3d 円?n”, n1)
 8   printf(“n2 = %3d 円?n”, n2)
 9   printf(“n3 = %3d 円?n”, n3)
10   printf(“%4sは %4.1f です. “, s, a/n1)


     細かい書式制御を行うには printf メソッドと
     適切な書式指定子を用いる
printf の使い方
printf は次のような形で使います。



printf(書式指定子, 引数1, 引数2, ???)
printf の使い方
printf は次のような形で使います。



 printf(“文字列”, 変数1, 変数2, ???)
printf の使い方
printf は次のような形で使います。



 printf(“文字列”, 変数1, 変数2, ???)


printf(“%4s は %4.1f です.“ , s , a/n1)

括弧の中は最初に文字列が置かれ、その中は
文字部分と書式指定子(青部分)に分かれている
printf の使い方
printf は次のような形で使います。



 printf(“文字列”, 変数1, 変数2, ???)


printf(“%4s は %4.1f です.“ , s , a/n1)

文字列の後はカンマ区切りで引数が置かれる
printf の使い方
printf は次のような形で使います。



 printf(“文字列”, 変数1, 変数2, ???)


printf(“%4s は %4.1f です.“ , s , a/n1)

書式指定子の順と変数の順が対応することに注意!
数値表現のための書式指定
1   # wrnumbers.rb
2   x = 123
3   pi = 3.14159265358979
4   e = 2.71828182845905
5   printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e)

    > ruby wrnumbers.rb
数値表現のための書式指定
1   # wrnumbers.rb
2   x = 123
3   pi = 3.14159265358979
4   e = 2.71828182845905
5   printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e)

    > ruby wrnumbers.rb
    / 123/ 3.14/ 2.718282/
数値表現のための書式指定
1   # wrnumbers.rb
2   x = 123
3   pi = 3.14159265358979
4   e = 2.71828182845905
5   printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e)

    > ruby wrnumbers.rb
    /   123/ 3.14/ 2.718282/
    まずは最初の引数である変数 x が %4d という書式指定子で
    出力されている。 これは
        「4桁の10進数(decimal number)で表現せよ」
                                  という意味である
数値表現のための書式指定
1   # wrnumbers.rb
2   x = 123
3   pi = 3.14159265358979
4   e = 2.71828182845905
5   printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e)

    > ruby wrnumbers.rb
    /   123/ 3.14/ 2.718282/
    与えられた引数が3桁の整数の場合、右詰で数字が入り、
    余った1桁分はスペースで補われる
数値表現のための書式指定
1   # wrnumbers.rb
2   x = 123
3   pi = 3.14159265358979
4   e = 2.71828182845905
5   printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e)

    > ruby wrnumbers.rb
    / 123/    3.14/ 2.718282/
    次の引数である変数 pi は %5.2f という書式指定子で出力
    されている。 これは
       「全部で5桁、小数点以下が2桁の
               小数(floating number)で表現せよ」
                                  という意味である
数値表現のための書式指定
1   # wrnumbers.rb
2   x = 123
3   pi = 3.14159265358979
4   e = 2.71828182845905
5   printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e)

    > ruby wrnumbers.rb
    / 123/    3.14/ 2.718282/
    小数の場合、小数点も1桁として数えられ、指定した小数桁以
    下の数字は切り捨てられる。またここでは整数部分が1桁なの
    で余った1桁はスペースで補われている。
数値表現のための書式指定
1   # wrnumbers.rb
2   x = 123
3   pi = 3.14159265358979
4   e = 2.71828182845905
5   printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e)

    > ruby wrnumbers.rb
    / 123/ 3.14/      2.718282/
    同様に変数 e についても %9.6f で
       「全部で9桁、小数点以下が6桁の
                小数(floating number)で表現せよ」
                         という書式指定で出力される
文字列のための書式指定
1   # wrstring.rb
2   name = “夏目漱石”
3   printf(“吾輩は%10sである.?n”, name)

    > ruby wrstring.rb
文字列のための書式指定
1   # wrstring.rb
2   name = “夏目漱石”
3   printf(“吾輩は%10sである.?n”, name)

    > ruby wrstring.rb
    吾輩は 夏目漱石である.
文字列のための書式指定
1   # wrstring.rb
2   name = “夏目漱石”
3   printf(“吾輩は%10sである.?n”, name)

    > ruby wrstring.rb
    吾輩は 夏目漱石である.

    ここでは name という変数に “夏目漱石” という文字列が代入
    されており、3行目で 書式指定子に当てはめて出力している。

         「全部で10桁の文字列(string)で表現せよ」

                                    という意味である
文字列のための書式指定
1   # wrstring.rb
2   name = “夏目漱石”
3   printf(“吾輩は%10sである.?n”, name)

    > ruby wrstring.rb
    吾輩は 夏目漱石である.
          1234567890
    日本語の場合1文字が2桁として扱われることに注意

    上の例では (漢字4文字) + (スペース2つ) = 10桁
printf についてまとめ
書式指定子の一般形は

         %[幅] [.精度] 型指定
型指定は必ず必要
 10進数 ? d(ecimal number)
 小数   ? f(loating number)
 文字列 ? s(ting)
printf についてまとめ
書式指定子の一般形は

      %[幅] [.精度] 型指定
幅は全体の桁数、精度は小数の桁数を指定

幅と精度は省略可能
 幅省略   ? デフォルトの幅(10?)が使われる
 精度省略 ? 小数で無い時は省略
第2章まとめ
? irb の使い方

? データ型?リテラルと演算

? 代入手続き

? 出力の制御

More Related Content

Viewers also liked (8)

2011年10月28日
2011年10月28日2011年10月28日
2011年10月28日
nukaemon
?
2012年1月13日
2012年1月13日2012年1月13日
2012年1月13日
nukaemon
?
2011年12月16日
2011年12月16日2011年12月16日
2011年12月16日
nukaemon
?
2011年12月2日
2011年12月2日2011年12月2日
2011年12月2日
nukaemon
?
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
nukaemon
?
2011年11月25日
2011年11月25日2011年11月25日
2011年11月25日
nukaemon
?
2012年1月20日
2012年1月20日2012年1月20日
2012年1月20日
nukaemon
?
公开键、秘密键ってなに?
公开键、秘密键ってなに?公开键、秘密键ってなに?
公开键、秘密键ってなに?
kenji4569
?
2011年10月28日
2011年10月28日2011年10月28日
2011年10月28日
nukaemon
?
2012年1月13日
2012年1月13日2012年1月13日
2012年1月13日
nukaemon
?
2011年12月16日
2011年12月16日2011年12月16日
2011年12月16日
nukaemon
?
2011年12月2日
2011年12月2日2011年12月2日
2011年12月2日
nukaemon
?
2011年11月11日
2011年11月11日2011年11月11日
2011年11月11日
nukaemon
?
2011年11月25日
2011年11月25日2011年11月25日
2011年11月25日
nukaemon
?
2012年1月20日
2012年1月20日2012年1月20日
2012年1月20日
nukaemon
?
公开键、秘密键ってなに?
公开键、秘密键ってなに?公开键、秘密键ってなに?
公开键、秘密键ってなに?
kenji4569
?

Similar to 2011年11月18日 (20)

巨大数スライド奥别产用
巨大数スライド奥别产用巨大数スライド奥别产用
巨大数スライド奥别产用
__sappy__
?
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
Nagi Teramo
?
驰补尘补诲补颈.搁デモンストレーションセッション
驰补尘补诲补颈.搁デモンストレーションセッション驰补尘补诲补颈.搁デモンストレーションセッション
驰补尘补诲补颈.搁デモンストレーションセッション
考司 小杉
?
正规表现で作るワンライナーライフゲーム
正规表现で作るワンライナーライフゲーム正规表现で作るワンライナーライフゲーム
正规表现で作るワンライナーライフゲーム
manaten
?
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
Shiqiao Du
?
贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料
時響 逢坂
?
6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子について6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子について
bc_rikko
?
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくAlgebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすく
Hiromi Ishii
?
オンライン学习 : Online learning
オンライン学习 : Online learningオンライン学习 : Online learning
オンライン学习 : Online learning
Daiki Tanaka
?
贵补肠迟辞谤型の注意点
贵补肠迟辞谤型の注意点贵补肠迟辞谤型の注意点
贵补肠迟辞谤型の注意点
Hiroki K
?
データサイエンスワールドから颁++を眺めてみる
データサイエンスワールドから颁++を眺めてみるデータサイエンスワールドから颁++を眺めてみる
データサイエンスワールドから颁++を眺めてみる
Shintaro Fukushima
?
窜贵厂のソースコードをチラ见してみる
窜贵厂のソースコードをチラ见してみる窜贵厂のソースコードをチラ见してみる
窜贵厂のソースコードをチラ见してみる
Koichi Suzuki
?
CVIM最先端ガイド6 幾何学的推定のための最適化手法 3.5 - 3.8
CVIM最先端ガイド6 幾何学的推定のための最適化手法 3.5 - 3.8CVIM最先端ガイド6 幾何学的推定のための最適化手法 3.5 - 3.8
CVIM最先端ガイド6 幾何学的推定のための最適化手法 3.5 - 3.8
Fujimoto Keisuke
?
R intro
R introR intro
R intro
yayamamo @ DBCLS Kashiwanoha
?
PRML復々習レーン#9 6.3-6.3.1
PRML復々習レーン#9 6.3-6.3.1PRML復々習レーン#9 6.3-6.3.1
PRML復々習レーン#9 6.3-6.3.1
sleepy_yoshi
?
プログラミング
プログラミングプログラミング
プログラミング
saireya _
?
搁耻产测绍介3(辫诲蹿)
搁耻产测绍介3(辫诲蹿)搁耻产测绍介3(辫诲蹿)
搁耻产测绍介3(辫诲蹿)
Gohryuh
?
尝颈蝉辫でやる记号微分
尝颈蝉辫でやる记号微分尝颈蝉辫でやる记号微分
尝颈蝉辫でやる记号微分
Keiichi Watanabe
?
ji-5. 繰り返し計算
ji-5. 繰り返し計算ji-5. 繰り返し計算
ji-5. 繰り返し計算
kunihikokaneko1
?
あまぁい搁肠辫辫生活
あまぁい搁肠辫辫生活あまぁい搁肠辫辫生活
あまぁい搁肠辫辫生活
Masaki Tsuda
?
巨大数スライド奥别产用
巨大数スライド奥别产用巨大数スライド奥别产用
巨大数スライド奥别产用
__sappy__
?
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
Nagi Teramo
?
驰补尘补诲补颈.搁デモンストレーションセッション
驰补尘补诲补颈.搁デモンストレーションセッション驰补尘补诲补颈.搁デモンストレーションセッション
驰补尘补诲补颈.搁デモンストレーションセッション
考司 小杉
?
正规表现で作るワンライナーライフゲーム
正规表现で作るワンライナーライフゲーム正规表现で作るワンライナーライフゲーム
正规表现で作るワンライナーライフゲーム
manaten
?
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
Shiqiao Du
?
贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料贰办尘别迟迟勉强会発表资料
贰办尘别迟迟勉强会発表资料
時響 逢坂
?
6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子について6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子について
bc_rikko
?
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくAlgebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすく
Hiromi Ishii
?
オンライン学习 : Online learning
オンライン学习 : Online learningオンライン学习 : Online learning
オンライン学习 : Online learning
Daiki Tanaka
?
贵补肠迟辞谤型の注意点
贵补肠迟辞谤型の注意点贵补肠迟辞谤型の注意点
贵补肠迟辞谤型の注意点
Hiroki K
?
データサイエンスワールドから颁++を眺めてみる
データサイエンスワールドから颁++を眺めてみるデータサイエンスワールドから颁++を眺めてみる
データサイエンスワールドから颁++を眺めてみる
Shintaro Fukushima
?
窜贵厂のソースコードをチラ见してみる
窜贵厂のソースコードをチラ见してみる窜贵厂のソースコードをチラ见してみる
窜贵厂のソースコードをチラ见してみる
Koichi Suzuki
?
CVIM最先端ガイド6 幾何学的推定のための最適化手法 3.5 - 3.8
CVIM最先端ガイド6 幾何学的推定のための最適化手法 3.5 - 3.8CVIM最先端ガイド6 幾何学的推定のための最適化手法 3.5 - 3.8
CVIM最先端ガイド6 幾何学的推定のための最適化手法 3.5 - 3.8
Fujimoto Keisuke
?
PRML復々習レーン#9 6.3-6.3.1
PRML復々習レーン#9 6.3-6.3.1PRML復々習レーン#9 6.3-6.3.1
PRML復々習レーン#9 6.3-6.3.1
sleepy_yoshi
?
プログラミング
プログラミングプログラミング
プログラミング
saireya _
?
搁耻产测绍介3(辫诲蹿)
搁耻产测绍介3(辫诲蹿)搁耻产测绍介3(辫诲蹿)
搁耻产测绍介3(辫诲蹿)
Gohryuh
?
尝颈蝉辫でやる记号微分
尝颈蝉辫でやる记号微分尝颈蝉辫でやる记号微分
尝颈蝉辫でやる记号微分
Keiichi Watanabe
?
あまぁい搁肠辫辫生活
あまぁい搁肠辫辫生活あまぁい搁肠辫辫生活
あまぁい搁肠辫辫生活
Masaki Tsuda
?

2011年11月18日

  • 2. 今日の内容 ? 2.3 最もありふれた手続き(自己代入) ? 2.4 文字出力を制御する(式展開, printf)
  • 3. 代入と自己代入 ? これまで ”=“ を使って変数に値(もしくは式)を代入 する書き方を見てきました a = 25 b = 30 c=a+b
  • 6. 代入と自己代入 ? 以下のように a = a ◇ b (◇は任意の算術演算子) の形になっている場合、 これを a ◇=b と表せる a=0 a=a+5 #a=5 a=a+5 a=0 # a = 10 a=a+5 # a =5 a += 15 #a=5 a=a+5 # a =5 a += 20 # a = 10 a += 5 # a = 15 a += 5 # a = 20
  • 7. スワップ - データの交換 1 # swap.rb 2 # 変数のデータを交換する 3 a = 12 4 b = 25 5 print “a = “, a, “, b = “, b, “?n” 6 tmp = a 7 a=b 8 b = tmp 9 print “a = “, a, “, b = “, b, “?n” 変数 a と 変数 b に代入されている値を交換する手順
  • 8. スワップ - データの交換 1 # swap.rb 2 # 変数のデータを交換する 3 a = 12 4 b = 25 5 print “a = “, a, “, b = “, b, “?n” #=> a = 12, b = 25 6 tmp = a 7 a=b 8 b = tmp 9 print “a = “, a, “, b = “, b, “?n” #=> a = 25, b = 12 実際にどうやっているかを考えてみましょう
  • 9. スワップ - データの交換 1 # swap.rb 2 # 変数のデータを交換する 3 a = 12 4 b = 25 5 print “a = “, a, “, b = “, b, “?n” 6 tmp = a 7 a=b 12 25 8 b = tmp 9 print “a = “, a, “, b = “, b, “?n” 3行目で 変数”a” に 12 が代入され 4行目で 変数”b” に 25 が代入されている。
  • 10. スワップ - データの交換 1 # swap.rb 2 # 変数のデータを交換する 3 a = 12 12 4 b = 25 5 print “a = “, a, “, b = “, b, “?n” 6 tmp = a 7 a=b 12 25 8 b = tmp 9 print “a = “, a, “, b = “, b, “?n” 次に6行目で変数 ”tmp” に a を代入している つまり変数”tmp”に12を一時的に代入している
  • 11. スワップ - データの交換 1 # swap.rb 2 # 変数のデータを交換する 3 a = 12 12 4 b = 25 5 print “a = “, a, “, b = “, b, “?n” 6 tmp = a 7 a=b 25 25 8 b = tmp 9 print “a = “, a, “, b = “, b, “?n” 更に7行目で変数 ”a” に b を代入している つまり変数”aに 25を代入している
  • 12. スワップ - データの交換 1 # swap.rb 2 # 変数のデータを交換する 3 a = 12 12 4 b = 25 5 print “a = “, a, “, b = “, b, “?n” 6 tmp = a 7 a=b 25 12 8 b = tmp 9 print “a = “, a, “, b = “, b, “?n” #=> a = 25, b = 12 あとは一時的に変数”tmp”に代入してあった 12を変数”b” に代入すれば、交換完了(8行目) 出力結果を見れば、それが確認出来る(9行目)
  • 13. スワップ - データの交換 1 # swap.rb 2 # 変数のデータを交換する 3 a = 12 ① ③ 4 b = 25 5 print “a = “, a, “, b = “, b, “?n” 6 tmp = a ② 7 a=b 8 b = tmp 9 print “a = “, a, “, b = “, b, “?n” 変数名はなんでも良いが、ここでは、一時的に必要な変数 を用意するという意味で、 “tmp”(temporary)を使った。 このように各変数名の役割がわかるように変数名を付ける ことは、プログラムの可読性(readability)を高める
  • 14. スワップ - データの交換 1 # swap.rb 2 # 変数のデータを交換する 3 a = 12 4 b = 25 5 print “a = “, a, “, b = “, b, “?n” ① 6 # tmp = a 7 a=b ② 8 b=a 9 print “a = “, a, “, b = “, b, “?n” ちなみに”tmp”を使わずに、交換しようとすると???
  • 15. スワップ - データの交換 1 # swap.rb 2 # 変数のデータを交換する 3 a = 12 4 b = 25 5 print “a = “, a, “, b = “, b, “?n” ① 6 # tmp = a 7 a=b 25 ② 25 8 b=a 9 print “a = “, a, “, b = “, b, “?n” #=> a = 25, b = 25 どちらも同じ数になってしまう
  • 16. 文字列出力の制御 ? これまでプログラムの計算結果や文字を画面に出 力するのに print メソッド を使ってきました。 ? ここでは print メソッド以外の、使える出力メソッドを 紹介していきます。
  • 17. 文字列出力の制御: puts # print.rb print “おはよう!” print “こんにちは!” print “おやすみ!” > ruby print.rb 上のスクリプトを実行すると
  • 18. 文字列出力の制御: puts # print.rb print “おはよう!” print “こんにちは!” print “おやすみ!” > ruby print.rb おはよう!こんにちは!おやすみ!> プロンプト 各文字列が数珠つなぎのように出力され、プロンプトも変な 位置にきてしまいます。
  • 19. 文字列出力の制御: puts # print.rb print “おはよう!?n” (-_-) <?????????? print “こんにちは!?n” print “おやすみ!?n” > ruby print.rb おはよう! こんにちは! おやすみ! > これを回避するためには、各文字列の末尾にいちいち改行 文字をつけなくてはなりません。
  • 20. 文字列出力の制御: puts # puts.rb puts “おはよう!” puts “こんにちは!” puts “おやすみ!” > ruby puts.rb おはよう! こんにちは! おやすみ! > 出力する行が多いときはprintの代りに puts メソッドを 使うと便利。改行文字を自動で付けてくれる。
  • 21. 文字列出力の制御: 式展開 # who_is_age.rb who = “私” age = 20 print who, “は”, age, “歳です.?n” > ruby who_is_age.rb 次に複数の変数やリテラルを同時に出力する場合を 考えましょう。
  • 22. 文字列出力の制御: 式展開 # who_is_age.rb who = “私” age = 20 print who, “は”, age, “歳です.?n” > ruby who_is_age.rb 私は20歳です. > ↑printをつかった場合。 では代りにputsを使うとどうでしょう?
  • 23. 文字列出力の制御: 式展開 # who_is_age.rb who = “私” age = 20 puts who, “は”, age, “歳です.” > ruby who_is_age.rb 私 は 20 歳です. putsの場合、カンマごとに改行されるため注意が必要。
  • 24. 文字列出力の制御: 式展開 # who_is_age.rb who = “私” age = 20 (-_-) <?????????? puts who, “は”, age, “歳です.” > ruby who_is_age.rb 私 は 20 歳です. そもそもカンマをいちいち打つのが???????! そういうときは???
  • 25. 文字列出力の制御: 式展開 # who_is_age.rb who = “私” age = 20 puts “#{who}は#{age}歳です.” > ruby who_is_age.rb 私は20歳です. > 文字列内(?????????????内)で #{ } を使って変数を囲む と、その中は文字列として扱われず、変数として評価される
  • 26. 文字列出力の制御: 式展開 # who_is_age.rb who = “私” age = 20 puts “#{who}は#{age - 5}歳です.” > ruby who_is_age.rb 私は15歳です. > 更に #{ } 内で計算式を書くと、その結果が表示される。 つまり #{ } 内では式展開が行われている。
  • 27. 文字列出力の制御: 式展開 # who_is_age.rb who = “私” age = 20 puts ‘#{who}は#{age - 5}歳です.’ > ruby who_is_age.rb #{who}は#{age-5}です. > ちなみに式展開は?????????????で囲んだ場合のみ行われ、 ?????????????を用いた場合は機能しません。
  • 28. 文字列出力の制御: printf 1 # puts2.rb 2 n1 = 7 3 n2 = 123 4 n3 = 21 5 a = 85.0 6 s = “結果” 7 puts “n1 = #{n1} 円” 8 puts “n2 = #{n2} 円” 9 puts “n3 = #{n3} 円” 10 puts “#{s}は #{a/n1} です.”
  • 29. 文字列出力の制御: printf 1 # puts2.rb putsの出力では数字の桁が 2 n1 = 7 揃っていなくて見栄えが悪い 3 n2 = 123 また、小数の計算結果をその 4 n3 = 21 まま出力すると、下桁が長く 5 a = 85.0 なってしまう。 6 s = “結果” 7 puts “n1 = #{n1} 円” > ruby puts2.rb 8 puts “n2 = #{n2} 円” n1 = 7 円 9 puts “n3 = #{n3} 円” n2 = 123 円 10 puts “#{s}は #{a/n1} です.” n3 = 21 円 結果は 12.1428571428571 です.
  • 30. 文字列出力の制御: printf 1 # puts2.rb puts の代りに printf を使うと 2 n1 = 7 以下のように出力を整形する 3 n2 = 123 ことができる。 4 n3 = 21 5 a = 85.0 6 s = “結果” 7 printf(“n1 = %3d 円?n”, ruby puts2.rb > n1) 8 printf(“n2 = %3d 円?n”, n2) 7 円 n1 = 9 printf(“n3 = %3d 円?n”, n3) 123 円 n2 = 10 printf(“%4sは %4.1f です. “, s, a/n1) n3 =21 円 結果は 12.1 です. 数字の一の位で 揃っている
  • 31. 文字列出力の制御: printf 1 # puts2.rb 2 n1 = 7 3 n2 = 123 4 n3 = 21 5 a = 85.0 6 s = “結果” 7 printf(“n1 = %3d 円?n”, n1) 8 printf(“n2 = %3d 円?n”, n2) 9 printf(“n3 = %3d 円?n”, n3) 10 printf(“%4sは %4.1f です. “, s, a/n1) 細かい書式制御を行うには printf メソッドと 適切な書式指定子を用いる
  • 33. printf の使い方 printf は次のような形で使います。 printf(“文字列”, 変数1, 変数2, ???)
  • 34. printf の使い方 printf は次のような形で使います。 printf(“文字列”, 変数1, 変数2, ???) printf(“%4s は %4.1f です.“ , s , a/n1) 括弧の中は最初に文字列が置かれ、その中は 文字部分と書式指定子(青部分)に分かれている
  • 35. printf の使い方 printf は次のような形で使います。 printf(“文字列”, 変数1, 変数2, ???) printf(“%4s は %4.1f です.“ , s , a/n1) 文字列の後はカンマ区切りで引数が置かれる
  • 36. printf の使い方 printf は次のような形で使います。 printf(“文字列”, 変数1, 変数2, ???) printf(“%4s は %4.1f です.“ , s , a/n1) 書式指定子の順と変数の順が対応することに注意!
  • 37. 数値表現のための書式指定 1 # wrnumbers.rb 2 x = 123 3 pi = 3.14159265358979 4 e = 2.71828182845905 5 printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e) > ruby wrnumbers.rb
  • 38. 数値表現のための書式指定 1 # wrnumbers.rb 2 x = 123 3 pi = 3.14159265358979 4 e = 2.71828182845905 5 printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e) > ruby wrnumbers.rb / 123/ 3.14/ 2.718282/
  • 39. 数値表現のための書式指定 1 # wrnumbers.rb 2 x = 123 3 pi = 3.14159265358979 4 e = 2.71828182845905 5 printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e) > ruby wrnumbers.rb / 123/ 3.14/ 2.718282/ まずは最初の引数である変数 x が %4d という書式指定子で 出力されている。 これは 「4桁の10進数(decimal number)で表現せよ」 という意味である
  • 40. 数値表現のための書式指定 1 # wrnumbers.rb 2 x = 123 3 pi = 3.14159265358979 4 e = 2.71828182845905 5 printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e) > ruby wrnumbers.rb / 123/ 3.14/ 2.718282/ 与えられた引数が3桁の整数の場合、右詰で数字が入り、 余った1桁分はスペースで補われる
  • 41. 数値表現のための書式指定 1 # wrnumbers.rb 2 x = 123 3 pi = 3.14159265358979 4 e = 2.71828182845905 5 printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e) > ruby wrnumbers.rb / 123/ 3.14/ 2.718282/ 次の引数である変数 pi は %5.2f という書式指定子で出力 されている。 これは 「全部で5桁、小数点以下が2桁の 小数(floating number)で表現せよ」 という意味である
  • 42. 数値表現のための書式指定 1 # wrnumbers.rb 2 x = 123 3 pi = 3.14159265358979 4 e = 2.71828182845905 5 printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e) > ruby wrnumbers.rb / 123/ 3.14/ 2.718282/ 小数の場合、小数点も1桁として数えられ、指定した小数桁以 下の数字は切り捨てられる。またここでは整数部分が1桁なの で余った1桁はスペースで補われている。
  • 43. 数値表現のための書式指定 1 # wrnumbers.rb 2 x = 123 3 pi = 3.14159265358979 4 e = 2.71828182845905 5 printf(“/%4d/%5.2f/%9.6f/?n”, x, pi, e) > ruby wrnumbers.rb / 123/ 3.14/ 2.718282/ 同様に変数 e についても %9.6f で 「全部で9桁、小数点以下が6桁の 小数(floating number)で表現せよ」 という書式指定で出力される
  • 44. 文字列のための書式指定 1 # wrstring.rb 2 name = “夏目漱石” 3 printf(“吾輩は%10sである.?n”, name) > ruby wrstring.rb
  • 45. 文字列のための書式指定 1 # wrstring.rb 2 name = “夏目漱石” 3 printf(“吾輩は%10sである.?n”, name) > ruby wrstring.rb 吾輩は 夏目漱石である.
  • 46. 文字列のための書式指定 1 # wrstring.rb 2 name = “夏目漱石” 3 printf(“吾輩は%10sである.?n”, name) > ruby wrstring.rb 吾輩は 夏目漱石である. ここでは name という変数に “夏目漱石” という文字列が代入 されており、3行目で 書式指定子に当てはめて出力している。 「全部で10桁の文字列(string)で表現せよ」 という意味である
  • 47. 文字列のための書式指定 1 # wrstring.rb 2 name = “夏目漱石” 3 printf(“吾輩は%10sである.?n”, name) > ruby wrstring.rb 吾輩は 夏目漱石である. 1234567890 日本語の場合1文字が2桁として扱われることに注意 上の例では (漢字4文字) + (スペース2つ) = 10桁
  • 48. printf についてまとめ 書式指定子の一般形は %[幅] [.精度] 型指定 型指定は必ず必要 10進数 ? d(ecimal number) 小数 ? f(loating number) 文字列 ? s(ting)
  • 49. printf についてまとめ 書式指定子の一般形は %[幅] [.精度] 型指定 幅は全体の桁数、精度は小数の桁数を指定 幅と精度は省略可能 幅省略 ? デフォルトの幅(10?)が使われる 精度省略 ? 小数で無い時は省略
  • 50. 第2章まとめ ? irb の使い方 ? データ型?リテラルと演算 ? 代入手続き ? 出力の制御