平均点の計算と判定について

このQ&Aのポイント
  • for文では10人分の平均点ではなく、それまでの人数分の平均点を計算します。
  • avgとcountの比較には意味があります。avgは平均値、countは平均値以上の人の人数を表します。
  • 全員の平均点ではなく、平均点以上かどうかの判定ができないので、ループ内での判定は意味がありません。
回答を見る
  • ベストアンサー

「> avg = (double)sum/10;

「> avg = (double)sum/10; この時点では、sumには「今まで入力した人数分の合計」が入っています。 10人になるのは最後の1回だけです。それ以外は10で割っても平均にはなりません。 また、それまでの人数(=i+1)で割っても、「それまでの人数分の平均」であって「10人分の平均」ではありません。」と書いてありますが、for文では10人分の平均点ではないのですか?そうでないのなら、ループ分の}から10人分の平均値を出したらいいのですか? あとそれと > if(avg<=count) > count++; 「avgは「平均値」、countは「平均値以上の人の人数」ですよね? この2つを比較する意味ってありますか? また、上に書いたように、このループでは「全員の平均点」は計算できないのですから、「平均点以上かどうか」なんて判定できませんよね。」とはどういう意味ですか?

  • aw345
  • お礼率2% (1/48)
  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

http://okwave.jp/qa/q6303484.html の続きですよね?そういうのは前の回答の補足とかでやってください。 新しい質問にしないように。 > for文では10人分の平均点ではないのですか?そうでないのなら、ループ分の}から10人分の平均値を出したらいいのですか? 現在のプログラムでは次のようになります。 ・i=0のとき→1番の点数は(例えば)47点→sum=0+47で47→avgはsum/10で4.7→点数が平均以上か判定(してるつもり?) ・i=1のとき→2番の点数は(例えば)53点→sum=0+53で100→avgはsum/10で10→点数が平均以上か判定(してるつもり?) では、この時点で「平均点は10だから2番は平均点以上だ」と言えますか? そもそも10点というのは平均点として正しいでしょうか? また、avgを現在までの平均と修正したとしも ・i=0のとき→1番の点数は(例えば)47点→sum=0+47で47→avgはsum/1で47→点数が平均以上か判定(してるつもり?) ・i=1のとき→2番の点数は(例えば)53点→sum=47+53で100→avgはsum/2で50→点数が平均以上か判定(してるつもり?) では、この時点で「平均点は50だから2番は平均点以上だ」と言えますか? このあとの8人全員が90点以上だったら、平均点は50よりずっと大きくなりますよね? 前回も書いたように、手計算でやるときのことをよく考えてみてください。こうなりませんか? ・(手計算では特に書かないけど)総得点の初期値は0 ・1番目の点数を総得点に加える ・2番目の点数を総得点に加える ...以下人数分繰り返す。 ・全員の総得点を人数で割ると平均点になる 上の手計算で、どこからどこまでが繰り返しになってるか、よく考えてみてください。 それは、そのままプログラムでのforループでの処理になります。 もしかして、for文の動作を理解できてない、ってことは無いですか? > (略)とはどういう意味ですか? このif文を日本語にしてみましょう 『もし 「平均点」が「(前の番号までの)平均点以上の人の人数」 以下だったら、「平均点以上の人の人数」を増やす。』 具体的な数字を入れてみましょう 『もし 「3点」が「5人」 以下だったら、「6人」に変更する。』 (会話では 「3点取った人が」を「3点が」という省略している場合もありますが、上の文ではそういう省略は一切無しです) これらの文に何の違和感も感じないようだと、日本語やりなおしてください、となってしまうのですが。 これも手計算するなら、こうなりますよね ・(手計算では特に書かないけど)人数の初期値は0 ・1番目の点数と平均点を比べて、平均点以上だったら 人数+1 ・2番目の点数と平均点を比べて、平均点以上だったら 人数+1 ...以下人数分繰り返す。 ・全員調べたら、最終的な人数が「平均点以上の人数」 比較したいのは何と何か、それが入っているのはどの変数なのか? それをよく考えてください。 後半は今回の前半に書いた通り。比較対象の平均点が求まってなければ、比較そのものができないってこと。 「これより大きいかどうか教えてください」と言われても「これ」がなんだかわからなければ答えられないですよね?

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

http://okwave.jp/qa/q6303484.html aw345さん「キーボードから10人分の点数を格納する配列を用意し、平均点および平均点...」への回答への補足要求っぽいので、そちらに続けたほうが良いかと。 >for文では10人分の平均点ではないのですか?そうでないのなら、ループ分の}から10人分の平均値を出したらいいのですか? ちょっと質問の意図が読み取れないですが、 >sumには「今まで入力した人数分の合計」が入っています。 これはそのとおりかと、aw345さんが書いたコードからはそのようにしか読みとれないかと。 なので、「ループ分の}から10人分の平均値を出したらいいのですか?」というのが、「forループの外にavgを求める式を記述すればよいのか?」という質問なら、YESかと。 >「avgは「平均値」、countは「平均値以上の人の人数」ですよね? これもそのとおりかと。たぶんそういう意図を込めた変数名ですよね。実際そういうメッセージをprintlnしてますし。 平均は、10件分のデータがそろわないと求めることができないので、1件目のデータを入れた時点で平均を利用した比較をしているのがおかしいと指摘しているのかと。 >ループの1順でなにが行われるのか変数が表している値はなにか >といったところを、よく考えなおしてください。 >紙とエンピツで手計算する時にどういう順番でやるかを考えてみるのも手です。 これをやってみたほうがよいかと。一番の勉強になります。

関連するQ&A

  • キーボードから10人分の点数を格納する配列を用意し、平均点および平均点

    キーボードから10人分の点数を格納する配列を用意し、平均点および平均点以上の人数と番号を表示するプログラムで、下記のプログラムを作成してみたんですけど、平均点以上の人数と番号がうまく表示されません。if文でも人数は0になるし、番号は1~10番まで表示されるし、なぜでしょうか? import java.io.*; class Hairetu2 { public static void main(String args[]) throws IOException { System.out.println("10人分の点数を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int s[]=new int[10]; int i; int sum=0,count=0; double avg=0; for(i=0; i<s.length; i++){ System.out.print((i+1)+"番は?"); String str = br.readLine(); int a = Integer.parseInt(str); s[i]=a; sum+=a; avg = (double)sum/10; if(avg<=count) count++; } System.out.println("平均点は"+avg); System.out.println("平均点以上の人は"+count+"人"); for(i=0; i<s.length; i++){ if(i>=avg) i++; System.out.print((i+1)+"番\t"); } } }

    • ベストアンサー
    • Java
  • osamuyさん、では「今まで入力した人数分のの平均」と「10人分の平

    osamuyさん、では「今まで入力した人数分のの平均」と「10人分の平均」とはどう違うのですか。やっぱりforループが関係しているのですか? ・「今まで入力した人数分の平均」 double avg=0; for(i=0; i<test.length; i++){ System.out.print((i+1)+"番は?"); String str = br.readLine(); int a = Integer.parseInt(str); test[i]=a; sum+=a;               avg = (double)sum/10; }          System.out.println("平均点は"+avg); ・「10人分の平均」          double avg=0; for(i=0; i<test.length; i++){ System.out.print((i+1)+"番は?"); String str = br.readLine(); int a = Integer.parseInt(str); test[i]=a; sum+=a; } avg = (double)sum/10; System.out.println("平均点は"+avg);

    • ベストアンサー
    • Java
  • mysql

    Accountテーブルに登録されている人数 count(*) --------- 4 ARTICLEテーブルに登録されている投稿数 count(*) ------------ 4 ARICLEテーブルのIDの合計値 sUm(ARTICLE_ID) -------------------- 10 ARICLEテーブルのIDの平均値 AVG(ARTICLE_ID) ------------------------- 2.5000 COLOR_MASTERのテーブルに登録されている色の数 counut(*) --------------- 5 お願いします。

  • C言語 平均を求めるプログラム

    はじめまして。 C言語初学者です。 参考書に、平均を求めるプログラムとして下記が紹介されていますが、疑問点があります。 #include <stdio.h> int main(void) { int data[] = {79,42,39,79,13,75,19}; int i,sum = 0,avg; for (i = 0;i < sizeof(data) / sizeof(data[0]);i++) { sum += data[i]; } avg = sum / (sizeof(data) / sizeof(data[0])); printf("%d\n",avg); return 0; } ・疑問点1 int i,sum = 0,avgの部分 変数【i,sum】に値【0,avg】をそれぞれ代入しているのかと思いますが、【i=0】はわかっても、【sum=avg】の意味が分かりません(合計=平均?)。 ・疑問点2 sum += data[i]の部分 【+=】は複合代入演算子で【sum=sum+data】という意味でしょうか。 また、for文で{sum += data[i];}が繰り返す文になっていますが、具体的に何の計算を繰り返しているのでしょうか。 どうか教えていただきたく、お願い致します。

  • C言語 入力した数値の平均値の近似値(関数を利用)

    double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素の平均を値として返す関数 double average(double a[], int n) および、double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素のなかで、それら n 要素の平均値と最も近い値を返す関数 double closest_to_average(double a[], int n) を作成して、main関数で、平均値と最も近い値を出力しろ という問題をやってみたのですが、私のプログラムでは実行して、数値を入力した後強制終了されてしまいます。 どこが間違えているのか教えていただけないでしょうか? 以下が私の作ったプログラムです。 ---------------------------------------------------------------------- #include <stdio.h> double average(double a[], int n) { int i; double sum,avg; sum=0; for(i=0;i<n;i=i+1){ sum=sum+a[i]; } avg=sum/n; return(avg); } double closest_to_average(double a[], int n) { int i; double avg,num1,num2,ans; avg=average(a,n); num1=avg-a[0]; if(num1<0){ num1=num1*(-1); } for(i=1;i<n;i=i+1){ num2=avg-a[i]; if(num2<0){ num2=num2*(-1); } if(num1>num2){ num1=num2; ans=a[i]; } } return(ans); } int main (void) { int i,n; double a[100]; double ans; scanf("%d",&n); for(i=0;i<n;i=i+1){ scanf("%d",a[i]); } ans=closest_to_average(a,n); printf("%f",ans); return(0); } ---------------------------------------------------------------------- ちなみに「3 3.0 5.0 11.0」と入力すれば「5.000」となるはずです。 よろしくお願いします。

  • java のfor文について質問です。

    問題7-1:次の配列データの合計と平均を求めるプログラムを作成してください。 double [] x = { 12.3, 45.4, 45.9, 3.56, 6.6, 8.9, 2.3, 0.5, 4.3, 1.2, }; (自分が書いたもの) public class Sample8_4 { public static void main(String[] args) { double[] x = { 12.3, 45.4, 45.9, 3.56, 6.6, 8.9, 2.3, 0.5, 4.3, 1.2, }; double sum = 0.0; for (int i = 0; i < x.length; i++) { ; sum += x[i]; double average = sum / x.length; System.out.println("平均:" + average + ",合計:" + sum); } } } (実行結果) 平均:1.23,合計:12.3 平均:5.7700000000000005,合計:57.7 平均:10.36,合計:103.6 平均:10.716,合計:107.16 平均:11.376,合計:113.75999999999999 平均:12.266,合計:122.66 平均:12.495999999999999,合計:124.96 平均:12.546,合計:125.46 平均:12.975999999999999,合計:129.76 平均:13.095999999999998,合計:130.95999999999998 (答え) 総計:130.95999999999998, 平均:13.095999999999998 for文についていまいち理解できていません(拡張for文も) 回答よろしくお願いします。

    • ベストアンサー
    • Java
  • プログラミングが分かりません。

    プログラミングが分かりません。 プログラミングの授業ではなくデータベースデザインの授業をとっていますがプログラミングに関係していると思いこのカテゴリーで質問させてもらいます。 具体的なC言語を使ってプログラミングはしてませんが構造化プログラムについて授業内で勉強しています。そこでこんな問題が出てきました。 一人のユーザーから適当な数を1つずつ与えられて最後に平均を出す(例えば、5,8,2,3,1,1 と数を一つずつ言ってその時の平均の値を求める) BEGIN SUM = COUNT = 0 DOWHILE There are more numbers in the set ACCEPT NUM FROM USER     SUM = SUM + NUM COUNT = COUNT + 1 ENDDO AVG = SUM/COUNT PRODUCE AVG TO USER END コレをヒントに一つ宿題が出されました。       Aさん 6 8 4 Bさん 9 7 6 Cさん 8 8 5 というように一人三種類の数字がありそれぞれA、B、Cさんの合計を出して一番数字が多い人を決める この場合Bさん(合計22) 最初に示したヒントから考えてどのようにすればBさんを答えとして導くことができますでしょうか? 最初に示した感じでどなたか教えていただけますか?よろしくお願いします。具体的なC言語も指定しないと説明しづらいと思いますのでそのときはこのカテゴリーで質問させてもらった通りにVisual Basic で答えて下さってもかまいません。 自分で考えたのも載せますがやっぱり途中で分からなくなってしまいました。 COUNT = 0, MAX = 0, SUM = 0 DOWHILE there are more people DOWHILE there are more numbers in the set  ACCEPT NUM FROM USER  SUM = SUM + NUM  COUNT = COUNT + 1

  • エクセルで関数を使った計算

    エクセルの質問ですが 異なる50個のデータ( C4:C53 )があります。 SUM,COUNT,SQRT,IFの関数だけを使って、合計・平均・分散・標準偏差・最大値・最小値・範囲を求める計算式を教えてくれませんか?? よろしくお願いします。

  • SUM関数について

    色々試したのですが、うまくいきません。 お分かりになる方、是非教えて下さい。 EXCEL2007で =SUM(Sheet1:Sheet2!A1)と数枚のシートの同じセルのトータルを 計算させています。 ところが対象セルに空白が1つでもあり、合計がゼロになる場合、ゼロと表示せず、 空白セルになってしまいます。 対象セルに空白があっても、合計が1以上の場合は答えが表示されます。 IF関数やISBLANK関数を使用してみても、うまくゼロ表示ができませんでした。 どのような数式にすれば、対象セルに空白があり、合計がゼロになる場合、ゼロと表示 してくれるのでしょうか? 是非教えて下さいお願いします。

  • c言語で3人分の合計と平均を出を出したいのですが・・・

    #include <stdio.h> void main (void) { int i; int sum = 0; int count[3]; char ss[3][30]; for (i = 0; i < 3; i++){ printf("氏名: "); gets(ss[i]); printf("得点: "); scanf("%d" , &count[i]); } for (i = 0; i < 3; i++){ sum = sum + count[i]; } printf("\n\n"); printf("合計 :%d point\n" ,sum); printf("平均点:%f point\n" ,(double)sum/i); } このようなものを作ったのですが、実行すると1人分を入力したあと2人目の入力部分の表示が「氏名:得点:」となってしまい、氏名入力を飛ばし得点入力になります。 どのようにすれば2人目の氏名入力を飛ばさずに進行するのか教えてください。