↓↓クリックして頂けると励みになります。
【20 | 表】 << 【ホーム】 >> 【22 | StringBuffer】
前のセクションで作成した表のプログラムを、表示方法が選べるように改良してRubyプログラムの理解を深めます。
Visual Studio Codeで以下のプログラムを作ってみましょう。
新規作成 【hyou5.rb】
# hyou5.rb class Hyou5 def drawTable( data, flag ) max = maxWidth( data ) for i in 0..(data.length-1) do drawLine( data[i], max, flag ) end end def drawLine( line, max, flag ) if (flag == 0) then for j in 0..(line.length-1) do print '|' + (line[j]).to_s for k in (count( line[j] )+1)..max[j] do print ' ' end end elsif (flag == 1) then for j in 0..(line.length-1) do print '|' for k in (count( line[j]) +1)..max[j] do print ' ' end print line[j] end end puts '|' 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 left = 0 right = 1 data = [[ '1', '2', '3', '4', '5', '6' ], [ '田中', '木村', '佐藤', '鈴木', '高橋', '斉藤' ], [ '太郎', '二郎', '三郎', '四郎', '五郎','六郎' ], [ 'tanaka','kimura', 'satou', 'suzuki', 'takahashi','saitou' ]] h = Hyou5.new() h.drawTable( data, left ) h.drawTable( data, right )
Left
は左寄せの時のフラッグとして使います。
Right
は右寄せです。
if文でLEFT
かRIGHT
かを判断し、それに基づいてスペースを前に入れるか、後に入れるかを決めています。
出力結果です。
~/Desktop/Programming/RB $ ruby hyou5.rb |1 |2 |3 |4 |5 |6 | |田中 |木村 |佐藤 |鈴木 |高橋 |斉藤 | |太郎 |二郎 |三郎 |四郎 |五郎 |六郎 | |tanaka|kimura|satou|suzuki|takahashi|saitou| | 1| 2| 3| 4| 5| 6| | 田中| 木村| 佐藤| 鈴木| 高橋| 斉藤| | 太郎| 二郎| 三郎| 四郎| 五郎| 六郎| |tanaka|kimura|satou|suzuki|takahashi|saitou|
Visual Studio Codeで以下のプログラムを作ってみましょう。
新規作成 【hyou6.rb】
# hyou6.rb class Hyou6 def drawTable( data, flags ) max = maxWidth( data ) for i in 0..data.length-1 do drawLine( data[i], max, flags[i] ) end end def drawLine( line, max, flag ) if ( flag == 0 ) then for j in 0..line.length-1 do print '|' + (line[j]).to_s for k in count( line[j] )+1..max[j] do print ' ' end end elsif ( flag == 1 ) then for j in 0..line.length-1 do print '|' for k in count( line[j] )+1..max[j] do print ' ' end print line[j] end end puts '|' 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 left = 0 right = 1 data = [[ '1', '2', '3', '4', '5', '6' ], [ '田中', '木村', '佐藤', '鈴木', '高橋', '斉藤' ], [ '太郎', '二郎', '三郎', '四郎', '五郎','六郎' ], [ 'tanaka','kimura', 'satou', 'suzuki', 'takahashi','saitou' ]] flags = [ left, left, right, right ] h = Hyou6.new() h.drawTable( data, flags )
このプログラムでは、flagの配列を用意しています。
flags = [ left, left, right, right ]
drawTable()
メソッドには、flag
の配列を受け取るメソッドが増えています。
flag
の配列を受け取ったdrawTable()
メソッドは、flags[0]
から順番にdrawLine
メソッドにflag
を渡していきます。
これにより、ラインごとに右寄せか左寄せか違う表示になります。
実行結果です。
~/Desktop/Programming/RB $ ruby hyou6.rb |1 |2 |3 |4 |5 |6 | |田中 |木村 |佐藤 |鈴木 |高橋 |斉藤 | | 太郎| 二郎| 三郎| 四郎| 五郎| 六郎| |tanaka|kimura|satou|suzuki|takahashi|saitou|
Visual Studio Codeで以下のプログラムを作ってみましょう。
新規作成 【hyou7.rb】
class Hyou7 def drawTable( data, flags ) max = maxWidth( data ) for i in 0..(data.length-1) do drawLine( data[i], max, flags[i] ) end end def drawLine( line, max, flag ) if ( flag == 0 ) then for j in 0..(line.length-1) do print '|' + (line[j]).to_s for k in count( line[j] )+1..max[j] do print ' ' end end elsif ( flag == 1 ) then for j in 0..(line.length-1) do print '|' for k in (count( line[j] )+1)..max[j] do print ' ' end print line[j] end elsif ( flag == 2 ) then for j in 0..(line.length-1) do s=(max[j]-count(line[j])) if ((s%2)==0) then s1=s2=s/2 else s1=s/2+1 s2=s/2 end print '|' for k in 1..s1 do print ' ' end print line[j] for k in (max[j]-s2)..(max[j]-1) do print ' ' end end end puts '|' 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 left = 0 right = 1 center = 2 data = [[ '1', '2', '3', '4', '5', '6' ], [ '田中', '木村', '佐藤', '鈴木', '高橋', '斉藤' ], [ '太郎', '二郎', '三郎', '四郎', '五郎','六郎' ], [ 'tanaka','kimura', 'satou', 'suzuki', 'takahashi','saitou']] flags = [ center, center, center, left ] h = Hyou7.new() h.drawTable( data, flags )
中央寄せが出来るように書き足しました。
elsif ( flag == 2 ) then for j in 0..(line.length-1) do s=(max[j]-count(line[j])) if ((s%2)==0) then s1=s2=s/2 else s1=s/2+1 s2=s/2 end print '|' for k in 1..s1 do print ' ' end print line[j] for k in (max[j]-s2)..(max[j]-1) do print ' ' end end end
これが、中央寄せをさせる部分です。
文字列の最大数が割り切れる場合と割り切れない場合の処理に分けています。
if ((s%2)==0) then
count()
メソッドからこの文字列のカウント数を得ています。
count( line [j] )
出力結果です。
~/Desktop/Programming/RB $ ruby hyou7.rb | 1 | 2 | 3 | 4 | 5 | 6 | | 田中 | 木村 | 佐藤| 鈴木 | 高橋 | 斉藤 | | 太郎 | 二郎 | 三郎| 四郎 | 五郎 | 六郎 | |tanaka|kimura|satou|suzuki|takahashi|saitou|
【20 | 表】 << 【ホーム】 >> 【22 | StringBuffer】
↓↓クリックして頂けると励みになります。