<<前 [TOP] 次>>
メモ帳を開いて次のプログラムを作ってみましょう。
【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に与える文字列の文字数が多いと、うまく'|'
が揃わないところにあります。
出力結果です。
メモ帳を開いて次のプログラムを作ってみましょう。
【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()メソッドでは、文字列の最大数分スペースを表示させています。
このプログラムの欠点は、必ず左寄せになってしまうことです。
出力結果です。
メモ帳を開いて次のプログラムを作ってみましょう。
【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()メソッドは、各列ごとの最大文字数に対してスペースの数を決めています。
列の大きさは文字数の大きさによって違ってきます。
出力結果です。
メモ帳を開いて次のプログラムを作ってみましょう。
【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]+$/
スラッシュ「/」で囲まれた部分は正規表現として扱われます。
出力結果です。
↓↓クリックして頂けると励みになります。