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

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

Ruby | 21 | 表の応用

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



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文でLEFTRIGHTかを判断し、それに基づいてスペースを前に入れるか、後に入れるかを決めています。


出力結果です。

~/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




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