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

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

Rubyプログラミング入門その19 表示方法が選べる表のプログラム

<<前  [TOP]  次>>


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


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


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


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


【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を渡していきます。
これにより、ラインごとに右寄せか左寄せか違う表示になります。


実行結果です。
f:id:MrRadiology:20180122163215p:plain


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


【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] )



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


<<前  [TOP]  次>>