アルゴリズムとデータ構造

  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 の使い方

• データ型・リテラルと演算

• 代入手続き

• 出力の制御

2011年11月18日

  • 1.
  • 2.
    今日の内容 • 2.3 最もありふれた手続き(自己代入) • 2.4 文字出力を制御する(式展開, printf)
  • 3.
    代入と自己代入 • これまで ”=“を使って変数に値(もしくは式)を代入 する書き方を見てきました a = 25 b = 30 c=a+b
  • 4.
  • 5.
  • 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 メソッドと 適切な書式指定子を用いる
  • 32.
  • 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 の使い方 •データ型・リテラルと演算 • 代入手続き • 出力の制御