学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Rubyプログラミング入門その18 表を作成するプログラム

<<前  [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に与える文字列の文字数が多いと、うまく'|'が揃わないところにあります。


出力結果です。
f:id:MrRadiology:20180120103738p:plain


メモ帳を開いて次のプログラムを作ってみましょう。


【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()メソッドでは、文字列の最大数分スペースを表示させています。
このプログラムの欠点は、必ず左寄せになってしまうことです。


出力結果です。
f:id:MrRadiology:20180120110022p:plain


メモ帳を開いて次のプログラムを作ってみましょう。


【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()メソッドは、各列ごとの最大文字数に対してスペースの数を決めています。
列の大きさは文字数の大きさによって違ってきます。


出力結果です。
f:id:MrRadiology:20180120111343p:plain


メモ帳を開いて次のプログラムを作ってみましょう。


【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]+$/

スラッシュ「/」で囲まれた部分は正規表現として扱われます。


出力結果です。
f:id:MrRadiology:20180122143250p:plain


<<前  [TOP]  次>>