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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

2655閲覧

配列 平均

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2016/01/16 11:16

今,数値データが配列に格納されていて,その値の一例は次のようであるとする。
-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

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

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

count = 0
sum = 0.0
for i in ????

このループの中で if 構文を使ってデータを判定して集計する。

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

自分の回答
n = ar.size
count = 0
sum = 0.0
for i in 0 .. n-1
if n >=0
sum += ar[i]
end
end
puts"有効なデータの数 = #{n}"
puts"平均値= #{ar[0] + ar[n-1] / n}"

質問は負の数を含まない式がわからないです。
あと、どこが違うかわからないです。
返答お願いします。

DrqYuto👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

あなたのプログラムの問題点は配列を走査したのにも関わらず
そのデータを利用していないという点のようです。
count, sum という変数を利用してあげなければなりません。
せっかく計算したのに,最後にもとの配列から平均を出そうと
するのはよくわからないことです。

以下に動作したプログラムを載せます。参考にしてください
ar = [-7.1,10.0,-3.4,12.3] #適当なデータ

count = 0
sum = 0.0
for i in 0..ar.size-1
if ar[i] >= 0
sum += 1
count +=
end
end
puts "valid = #{count}"
puts "average = #{sum / count}"

ruby の配列から負の数を”除外”するというのが
よくわかっていないのではないでしょうか。
上記のコードでは実際に配列の内容を変更した
というわけではなく,除外して計算した結果を
変数に格納しているのだということをよく理解してください。

投稿2016/01/16 15:15

5ara5treamer

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

負の数を含まない式がわからないです。

「if n >= 0」で判定しようとしていますが、この場合nは配列の値の個数であって、0以下になる事はありません。nではなく配列の値を判定するようにするべきでしょう。

どこが違うかわからないです。

  1. まず初めにこれは試験問題か何かだと思いますが、こういものは「???」や「# このループの中...」の部分に記入すれば解けるようになっていると考えるのが一般的です。「n = ar.size」を使っても解けなくはないですが、余分なnを登場させない方向で解を考えるべきでしょう。

逆に「count」が宣言されているのに、回答の中で利用しておらず無意味な存在になっています。
「問題を解く」際にはそういう事も起きないはずなので、活用方法を考えるべきです。

  1. if文の中身

上で述べたように、この部分は間違っています

  1. 「"有効なデータの数 = #{n}"」

nは「n = ar.size」と配列のサイズが代入されておりこの場合は25で固定です。
有効なデータの数は、マイナスの値を省いたものなので、25以下になるはずです。
常に25(n)を出力するのはNGでしょう。

  1. 「"平均値= #{ar[0] + ar[n-1] / n}"」

平均なのだから、有効なデータの合計を有効なデータの数で割らないと正しい値になりません。
「ar[0] + ar[n-1]」は有効な値の合計ではなく、配列の最初と最後を足し合わせただけですね。
さらにこれだと「ar[n-1]/n」が先に計算されて、それを配列の最初の値に加えたものが出力されています。
また前述のように、nは有効なデータの数でもありません。
細かいことを言うと「有効なデータの合計/有効なデータの数」をそのまま出力すると、少数第三位で四捨五入された値にならないので、その点にも配慮すべきでしょう

投稿2016/01/16 11:55

編集2016/01/16 12:15
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問