0

ご容赦ください...基本的な概念が必要です...高度なプログラムの概念についてはまだ知りません。

初期化して計算するCircleというクラスがありますarea

class Circle
   def initialize (radius)
     @radius = radius
   end


   def area
     3.14*@radius*@radius
   end
end

ユーザー入力を取得して、Circleオブジェクトとその側面のインスタンスをいくつでも作成したいと考えています。

p "How many Circles"
i = gets.to_i
j = 1

while j != i+1
p "Enter radius of Circle #{j}"
$s << Circle.new(gets.to_i)
j = j +1
end

は、$s[]作成したオブジェクトの配列を保持するようになりました。

今、私は次のようなことをしたい、

area_array[] = 0
area_array[Circle1] = Circle1.area
area_array[Circle1] = Circle2.area  

など...ここで、Circle1 と Circle2 は、前に while ループで作成したオブジェクトです....

作成された各オブジェクトを別の配列に配置し、それに面積値を割り当てる方法を教えてもらえますか?

4

4 に答える 4

2

最初の配列の円のプロパティを変更または破棄するため、別の配列が必要ですか? その場合、配列内の円の順序が同じままであることを信頼できる場合は、インデックス値を使用して値を関連付けます。

circle_area_hash = $s.reduce{|a, c| a[c.object_id] = c.area }

また、分析では、オブジェクト自体よりも値に関心がある場合があることを考慮してください。それで、あなたは作成することができます

circle_area_hash = $s.reduce do |a, c| 
  a[c.area] = (a[c.area].nil?) ? [c] : a[c.area] << c 
end

これにより、ハッシュキーがエリア値になり、ハッシュ値はそれぞれ、そのエリアを持つオブジェクトの配列になります。

次に、キー(最大領域) を取得するには、次のことができます。

circle_area_hash.max_by{|k,v| v.count}

また、考えとして:

puts "How many Circles"
$s = (1...gets.to_i).each |j|
  puts "Enter radius of Circle #{j}"
  $s << Circle.new(gets.to_i)
end

$s[3].area
于 2013-09-20T20:34:49.120 に答える
1

これは非常に簡単です。$s各要素をハッシュキーとして使用し、その結果をarea対応する値として使用して、 を反復処理する必要があります。

あなたに役立つはずの別のいくつかのポイント:

  • Math::PI代わりに使用できます3.14

  • pデバッグにのみ使用してください。そのパラメーターのメソッドの結果を出力inspectしますが、これは整然とした出力が必要になることはめったにありません。print文字列内で改行を明示的にする場合、またはputs改行がまだない場合は追加する場合に使用します

  • whileRubyで使用するのが適切であることはめったにありません。この場合、あなたはただ欲しいi.times do { ... }

 

class Circle

  def initialize (radius)
    @radius = radius
  end

  def area
    Math::PI * @radius * @radius
  end

end

print 'How many Circles: '
i = gets.to_i

shapes = []
i.times do |n|
  print "Enter radius of Circle #{n+1}? "
  shapes << Circle.new(gets.to_i)
end

area_hash = {}
shapes.each do |shape|
  area_hash[shape] = shape.area
end

areaただし、ここでメソッドをメモ化して、次のように記述する方が適切なようです。

def area
  @area = Math::PI * @radius * @radius unless @area
  @area
end

その後、メソッドを繰り返し使用でき、計算は 1 回だけ行われます。

于 2013-09-20T20:58:01.963 に答える
0

NewAlexandriaの回答に対するコメントを読んだ後、おそらく次のようなものがうまくいくでしょう:

p "How many Circles"
(1..gets.to_i) do |j|
  c = Circle.new
  p "Enter radius of Circle #{j}"
  s[c] = c.area(gets.to_i)}
end

wheresは、他の円、四角形などのインスタンスのキーを含むことができる定義済みのハッシュです。

ただし、これは、 のキーで参照するシェイプ クラスに追加の定数またはメソッドを追加する場合にのみ意味がありますs

上記のコメントを組み込むには、質問を編集する必要があります。

于 2013-09-20T21:10:04.360 に答える