2

個人的な宿題として、「大きな」数字を表示するデジタル時計プログラムを試しています。

配列に格納された文字列に由来する時計の一部と、任意の数字を「大きな数字」として表示できるルーチン (まだ完全には作成されていません) を持つ ruby​​ プログラム。
これは、ハッシュの操作、配列の反復、文字列の連結などについて詳しく学ぶのに役立ちます。

私は今これで立ち往生しています:

all_nums=''
(0..3).each do |num|
    all_nums+= (line_parts[num][0].values).to_s
    #puts line_parts[num][0].values
end 
puts all_nums

文字列に変換できない配列要素を取得しているため、つまり

ruby digital_clock,rb
[" ==  "]["|  | "]["|  | "][" ==  "]

しかし、それらだけのputs場合(下から3行目をコメントアウト)は問題ありませんが、文字列が得られます。

ruby digital_clock.rb
 ==  
|  | 
|  | 
 ==  

文字列 (この場合は大きな 0) を構築できるようにしたいのですが、ピースを出すことしかできず、それらを変数に割り当てて出力することができませんでした。どうすればそれができますか?

完全なプログラムは次のとおりです。

top=          ' ==      |   ==    ==   |  |   ==   |      ==    ==    == '
top_middle=   '|  |     |   __|   __|  |__|  |__   |__      |  |__|  |__|'
bottom_middle='|  |     |  |        |     |     |  |  |     |  |  |     |'
bottom=       ' ==      |   ==    ==      |   ==    ==      |   ==      |'

number_parts=[{},{},{},{},{},{},{},{},{},{}]
line_parts=[[],[],[],[]]

['top','top_middle','bottom_middle','bottom'].each_with_index do |one_line, i|
  number_parts=[{},{},{},{},{},{},{},{},{},{}]
  (0..9).each do |the_num|
    number_parts[the_num] = {one_line.to_sym => eval(one_line)[the_num*5,5].to_s}
  end
  line_parts[i]= number_parts
end

all_nums=''
(0..3).each do |num|
    all_nums+= (line_parts[num][0].values).to_s
    #puts line_parts[num][0].values
end 
puts all_nums
4

1 に答える 1

1

これで当面の問題、つまり大きな「0」を印刷するという問題が解決すると思います。

all_nums = []
(0..3).each do |num|
  all_nums.push(line_parts[num][0].values)
end 
puts all_nums.join("\n")

それを行うためのより良い方法は次のmapとおりです。

all_nums = (0..3).map { |num| line_parts[num][0].values }
puts all_nums.join("\n")

別の問題: を使用する必要はありませんeval。実際、 を使用する必要はほとんどありませんeval

# Use variables rather than the strings 'top', 'top_middle', etc.
[top,top_middle,bottom_middle,bottom].each_with_index do |one_line, i|
    ...
    # Then the eval() is unnecessary.
    number_parts[the_num] = {one_line.to_sym => one_line[the_num*5,5]}
    ....

ただし、次の行に沿ってコードを本当に単純化できます。

# Use an array, not a set of specifically named variables.
# This makes it a lot easier to iterate over the data.
rows = [
  '  --     |  --   --  |  |  --  |     --   --   -- ',
  ' |  |    |  __|  __| |__| |__  |__     | |__| |__|',
  ' |  |    | |       |    |    | |  |    | |  |    |',
  '  --     |  --   --     |  --   --     |  --     |',
]

# Create an array-of-arrays.
# num_parts[NUMBER] = [an array of four strings]
width = 5
num_parts = (0..9).map { |n| rows.map { |r| r[n * width, width] } }

# Inspect.
num_parts.each do |np|
  puts
  puts np.join("\n")
end

と呼ばれる Unix コマンドも見てみるとよいでしょbannerう。これにより、曲線やその他のデザインのタッチを追加し始めることができます.

于 2013-06-16T14:19:50.837 に答える