質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

配列データを選別して平均する(each版)

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 545

sun_earth__

score 12

数値データが配列に格納されていて、今その値の一例は次のようであるとする。
-7.1,9.8,23.7,5.6,3.0,30.8,27.3,23.6,39.1,-8.9,24.0,-6.1,21.3,16.0,-2.6,22.3,4.4,2.2,9.3,24.5,-2.0,-8.7,0.0,15.5,4.2
ここには全部で25個の数値があるが、負の数は誤ったデータであると考えられるので、除外して集計するものとする。
そしてその集計結果は次のような形で集計したい。いずれの行の最後にも改行があることに注意。

有効なデータの数 = 19
平均値 = 16.14

これと同じ動作をするプログラムを、以下の方針で作りなさい

・あらかじめ配列 nums に複数のデータが格納される処理が, プログラムの最初で行われているものとする。 その部分については書く必要はない。 
・ただし,nums に格納されたデータのうち負のものは,誤りを含んだデータなので 集計しないようにしたい。 
・each イテレータを使って 配列の要素を読み込んでいく, 
・その要素がゼロ以上の値を持つデータであれば,データの数を数え上げるとともに, データを加算していく。 
・ループが終了したら,上の例のように出力する。いずれの行の最後にも改行がある。 
・プログラムのおよその構成は下の不完全なソースのようになっているので, 適当に補いなさい。 

nums = [
30.2,32.6,5.5,34.7,8.4,30.0,38.4,3.2,-0.6,44.3,0.0,16.0,44.8,41.7,10.8,
26.2,40.4,22.5,-2.0,17.1,1.3,31.9,13.7,34.8,24.8,41.8,-1.7,34.8,24.2,32.2,
14.8,18.5,38.4,10.3,11.0,24.5,30.5,42.1,7.6,41.0,19.3,31.2,22.6,34.0,29.2,
30.6,29.9,18.9,18.8,13.8,20.0,-2.5,39.3,23.3,27.4,42.6,40.5,-2.5,38.0,9.5,
9.2,32.5,31.4,36.6,28.9,29.7,-4.3,5.4,38.9,4.3,40.1,18.6,18.3,26.4,23.2,
4.1,29.5,13.8,3.9,23.7,-1.0,38.0,-2.5,40.8,3.6,37.6,37.3,29.2,-3.7,17.7,
24.7,21.8,0.2,26.4,39.8,0.7,6.3,7.4,34.6,34.6]

この上にある配列 nums の定義については省略すること。

以下の部分を適当に補って作成して,下のフォームに記入しなさい。

count = 0
sum  = 0.0

each を使って nums から要素を取り出して ブロック変数 num に渡していく。 

ここで if を使ってデータを調べ, count, sum を足しこむ。

end
puts ??????
puts ??????

この回の授業を休んでしまい、まったくわかりません。
以下に私が試した結果を記します。
count = 0
sum = 0.0
nums.each do |num|
sum = sum + k
if nums >= 0
end
end
print ar
puts
puts "有効なデータの数 = #{count}"
puts "平均値 = #{sum / count}"

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2019/05/18 19:15

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • otn

    2019/05/18 19:16

    何が分からないのですか?
    質問じゃなくて、命令?

    キャンセル

回答 1

+1

・その要素がゼロ以上の値を持つデータであれば,データの数を数え上げるとともに, データを加算していく。 

なので

nums.each do |num|
  if num >= 0
    # countを1増やす
    # sumをnumだけ増やす
  end
end

ですね


余談として「以下の方針で」以下をまるごと無視すると

nums = [] # 省略
filtered = nums.reject(&:negative?)
count = filtered.size
sum   = filtered.sum
avg   = sum.fdiv(count) # sum / countでは、sumが整数の時に整数除算されてしまう

puts "有効なデータの数 = #{count}"
puts "平均値          = #{avg}" unless count.zero?

こんな感じ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る