↓↓クリックして頂けると励みになります。
【19 | 二次元配列】 << 【ホーム】 >> 【21 | 表の応用】
表を出力するプログラムを作成して、Rubyプログラミングの理解を深めます。
Visual Studio Codeで以下のプログラムを作ってみましょう。
新規作成 【hyou1.rb】
# hyuoou1.rb class Hyou1 def drawTable( data ) for i in 0..(data.length-1) do for j in 0..(data[0].length-1) do print "|" + data[i][j] + "\t" end puts '|' end end end data = [ [ '1', '2', '3', '4', '5', '6' ],[ 'apple', 'banana', 'orange', 'peach', 'tomato', 'melon' ],[ '100', '50', '70', '200', '80', '400' ] ] h = Hyou1.new() h.drawTable( data )
二次元配列を使用しています。
エスケープ記号の"\t"
を使って'|'
の位置を揃えています。
このプログラムの欠点は、dataに与える文字列の文字数が多いと、うまく'|'
が揃わないところにあります。
出力結果です。
~/Desktop/Programming/RB $ ruby hyou1.rb |1 |2 |3 |4 |5 |6 | |apple |banana |orange |peach |tomato |melon | |100 |50 |70 |200 |80 |400 |
Visual Studio Codeで以下のプログラムを作ってみましょう。
新規作成 【hyou2.rb】
# hyou2.rb class Hyou2 def drawTable( data ) max = maxWidth( data ) for i in 0..(data.length-1) do for j in 0..(data[0].length-1) do print '|' + (data[i][j]).to_s for k in (data[i][j].length)..(max-1) do print ' ' end end puts '|' end end def maxWidth( data ) max = 0 for i in 0..(data.length-1) for j in 0..(data[0].length-1) do if ( data[i][j].length > max ) then max = data[i][j].length end end end return max end end data = [ ['1', '2', '3', '4', '5', '6' ],[ 'apple', 'banana', 'orange', 'peach', 'strawberry', 'melon' ],[ '100', '50', '70', '200', '10','400' ] ] h = Hyou2.new() h.drawTable( data )
最大文字数にあわせてスペースを入れて表を表示するプログラムです。
表の大きさが一定になります。
文字数が多くなっても列が合わなくなることはありません。
maxWidth()
メソッドを見てください。
def maxWidth( data ) max = 0 for i in 0..(data.length-1) for j in 0..(data[0].length-1) do if ( data[i][j].length > max ) then max = data[i][j].length end end end return max end
data[0].length
という記述がありますが、これはdata[0]
の大きさを示します。
ここでのdata[0]
とは、['1', '2', '3', '4', '5', '6' ]
を示しますので、data[0].length = 6
となります。
data[i][j].length
という記述もあります。
このi
と j
には0〜5
の数字が入ります。
例えば、data[1][4].length
なら、strawberry
の文字数なので、10
になります。
単にdata.length
とすると、文字列の固まりの数、今回は3
になります。
drawTable()
メソッドでは、文字列の最大数分スペースを表示させています。
このプログラムの欠点は、必ず左寄せになってしまうことです。
出力結果です。
~/Desktop/Programming/RB $ ruby hyou2.rb |1 |2 |3 |4 |5 |6 | |apple |banana |orange |peach |strawberry|melon | |100 |50 |70 |200 |10 |400 |
Visual Studio Codeで以下のプログラムを作ってみましょう。
新規作成 【hyou3.rb】
# hyou3.rb class Hyou3 def drawTable( data ) max = maxWidth( data ) for i in 0..(data.length-1) do for j in 0..(data[0].length-1) do print '|' + (data[i][j]).to_s for k in (data[i][j].length)..(max[j]-1) do print ' ' end end puts '|' end end def maxWidth( data ) max = Array.new(data[0].length) for j in 0..(data[0].length-1) do max[j] = 0 for i in 0..(data.length-1) do if ( data[i][j].length > max[j] ) then max[j] = data[i][j].length end end end return max end end data = [ ['1', '2', '3', '4', '5', '6' ],[ 'apple', 'banana', 'orange', 'peach', 'strawberry', 'melon' ],[ '100', '50', '70', '200', '10','400' ] ] h = Hyou3.new() h.drawTable( data )
maxWidth()
メソッドを見てください。
この部分が今までのプログラムと違うところです。
max = Array.new(data[0].length)
この記述は、maxに配列を格納する箱を用意しています。
各列ごとの文字数を調べ、maxに格納していきます。
それを受けたdrawTable()
メソッドは、各列ごとの最大文字数に対してスペースの数を決めています。
列の大きさは文字数の大きさによって違ってきます。
出力結果です。
~/Desktop/Programming/RB $ ruby hyou3.rb |1 |2 |3 |4 |5 |6 | |apple|banana|orange|peach|strawberry|melon| |100 |50 |70 |200 |10 |400 |
Visual Studio Codeで以下のプログラムを作ってみましょう。
新規作成 【hyou4.rb】
# hyou4.rb class Hyou4 def drawTable( data ) max = maxWidth( data ) for i in 0..(data.length-1) do for j in 0..(data[0].length-1) do print '|' + (data[i][j]).to_s if (data[i][j].match(/^[a-z]+$/)) then for k in (data[i][j].length+1)..(max[j]) do print ' ' end elsif (data[i][j].match(/^[0-9]+$/)) then for k in (data[i][j].length+1)..(max[j]) do print ' ' end else for k in (data[i][j].length+1)..(max[j]-data[i][j].length) do print ' ' end end end puts '|' end end def maxWidth( data ) max = Array.new(data[0].length) for j in 0..(data[0].length-1) do max[j] = 0 for i in 0..(data.length-1) do count = count( data[i][j] ) if ( count > max[j] ) then max[j] = count end end end return max end def count( str ) count = 0 a = str.split(//) for i in 0..(str.length-1) do if (a[i].match(/^[a-z]+$/)) then count+=1 elsif (a[i].match(/^[0-9]+$/)) then count+=1 else count+=2 end end return count end end data = [ [ '1', '2', '3', '4', '5', '6' ],[ '田中', '木村', '佐藤', '鈴木', '高橋', '斉藤' ],[ '太郎', '二郎', '三郎', '四郎', '五郎','六郎' ],['tanaka','kimura', 'satou', 'suzuki', 'takahashi','saitou' ] ] h = Hyou4.new() h.drawTable( data )
日本語の表示を認識してスペースの数を決めるプログラムです。
日本語一文字を半角スペース一つとして数えています。
count()
メソッドを見てください。
これは、文字の種類によって文字の大きさをカウントしていくメソッドです。
ここではspilt()
を使用しています。
a = str.split(//)
split(//)
とすると与えられた文字列str
を、一文字ずつに分けて配列 a
に格納できます。
for i in 0..(str.length-1) do if (a[i].match(/^[a-z]+$/)) then count+=1 elsif (a[i].match(/^[0-9]+$/)) then count+=1 else count+=2 end end
1文字ずつに分けられた文字は、それが英数字なのかどうか判別されます。
mach()
を使用して、正規表現の内容と合っていればtrue
を返します。
文字が英数字なら1つカウントし、それ以外なら(全角なら)2つカウントするようにしています。
このカウントをもとに、各列ごとの最大文字数に対応するスペース数を決めています。
正規表現の内容です。
# 小文字アルファベットと一致 /^[a-z]+$/ # 0-9の数字と一致 /^[0-9]+$/
スラッシュ「/
」で囲まれた部分は正規表現として扱われます。
出力結果です。
~/Desktop/Programming/RB $ ruby hyou4.rb |1 |2 |3 |4 |5 |6 | |田中 |木村 |佐藤 |鈴木 |高橋 |斉藤 | |太郎 |二郎 |三郎 |四郎 |五郎 |六郎 | |tanaka|kimura|satou|suzuki|takahashi|saitou|
【19 | 二次元配列】 << 【ホーム】 >> 【21 | 表の応用】
↓↓クリックして頂けると励みになります。