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

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Ruby | 20 | 表

↓↓クリックして頂けると励みになります。



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という記述もあります。
このijには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 | 表の応用




↓↓クリックして頂けると励みになります。