• 締切済み

販売金額の合計などを求める問題

こんばんわ。 私はC/C++プログラミングの勉強をしていて、下記の会津大学のonline judgeを利用させて頂いています。 http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/problem.jsp?vol=0&id=0045&tle=1&mle=32768&title=Sum%20and%20Average&doc=1&lang=jp この問題を解いているのですが、以下のプログラムを提出するとWrong Answerとなってしまいます。 何度も試行錯誤したのですが、恥ずかしながらWrongAnswerとなってしまう理由がどうしてもわかりません。 どなたかこのプログラムの誤りを指摘して頂けないでしょうか? よろしくお願い致します。 開発言語はC++です。 --------------------------ここから-------------------------- #include <iostream> using namespace std; int main(){ int i,j=0; int sales_sum=0,amount_sum=0; double ave; int cost[1000],amount[1000]; //データを読み込む while(scanf("%d,%d",&cost[j],&amount[j]) != EOF){ j++; } //合計金額と合計数量を計算する for(i=0;i<j;i++){ sales_sum += cost[i] * amount[i]; amount_sum += amount[i]; } //数量の平均を計算する ave = (double)amount_sum / (double)j; //出力 printf("%d\n%.0lf\n",sales_sum,ave); return 0; } --------------------------ここまで--------------------------

みんなの回答

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.6

>%.0lfとすることで小数点以下第1位を四捨五入して出力されるので大丈夫かと思っていたのですが、 > 何か考え方が間違っているのでしょうか。 多分、C の規格上は小数点以下を「丸める」としか定めておらず、 必ずしも四捨五入した結果が得られるとは言い切れないと思います。 自前でコードを書いた方が処理の意図が明確になって良いと思いますよ。

maryu1112
質問者

お礼

回答ありがとうございます。 そうだったんですか。 今後気をつけようと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19409)
回答No.5

問題点10 >int cost[1000],amount[1000]; 問題文には「入力件数の上限」は特に設けられていないのに、勝手に「1000件まで」という上限が付けられてしまっている。 で、すべての問題点を改良したのが、以下のソース。 #include <stdio.h> int main(){ int i,count; int sales_sum,amount_sum,ave; int cost,amount; //データを読み込む for(count = 0,sales_sum = 0,amount_sum = 0;scanf("%d,%d",&cost,&amount) == 2;count++) { sales_sum += cost * amount; amount_sum += amount; } if (count) { //数量の平均を計算する ave = (amount_sum * 10 / count + 5) / 10; //出力 printf("%d\n%d\n",sales_sum,ave); } return 0; } 一応、これでAcceptedは取得出来ます。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19409)
回答No.4

問題点9 >ave = (double)amount_sum / (double)j; 1件も読み込まずに入力がEOFになると、jが0のままになり、0除算例外が発生する。 気付いてない問題点、まだまだありそう…。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19409)
回答No.3

問題点8 >while(scanf("%d,%d",&cost[j],&amount[j]) != EOF){ j++; } 入力が1001行以上あった場合、確保した配列を超えて読み込みが行われ、メモリを破壊する。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19409)
回答No.2

問題点1 >int cost[1000],amount[1000]; >while(scanf("%d,%d",&cost[j],&amount[j]) != EOF){ >j++; >} このwhileループは「入力が不正」だと終了しなくなる。 例えば、入力が 10,20 100,abc であった場合、永久にscanfを繰り返す。 問題点2 >double ave; >printf("%d\n%.0lf\n",sales_sum,ave); 出力の「販売数量の平均」が「整数」ではない。 問題文では「整数であること」が要求されている。 問題点3 >ave = (double)amount_sum / (double)j; 「販売数量の平均」が小数点以下第1位で四捨五入されていない。 問題点4 >#include <iostream> 不要なヘッダーファイルをインクルードしている。 問題点5 >using namespace std; 不要なusing文がある。 問題点6 >while(scanf("%d,%d",&cost[j],&amount[j]) != EOF){ j++; >printf("%d\n%.0lf\n",sales_sum,ave); scanf関数やprintf関数が使われているが、それらが宣言されていない。または、それらを宣言しているヘッダーファイル(stdio.h)をインクルードしていない。 問題点7 >何度も試行錯誤したのですが、恥ずかしながらWrongAnswerとなってしまう理由がどうしてもわかりません。 試行錯誤が足りない。

maryu1112
質問者

お礼

多くのご指摘ありがとうございます。 1.上記サイトの問題では多くの問題において不正な入力がされないため、このようなプログラムになってしまいました。実践では不正値に対処したいと思います。 2.出力時にdouble型の小数点以下を削って(四捨五入して)、整数値に見せかけて出力する方法ではAcceptedされないんですね。実際に整数型として出力すべきでしたね。 3.これも上と同様の理由です。出力時に四捨五入すれば良いと勘違いしていました。 4.完全に私の勘違いです。<stdio.h>をincludeすべきでした。申し訳ありません。 5.私の環境では、この一文がないとscanf,printfが使用できなくなってしまいます。そのため、iostreamをincludeした場合にでもscanf,printfを使用できるものだと思い込んでいました。素直にstdio.hを使用すれば良かったですね…。 6.了解です。ありがとうございます。 7.こんなにも多くの問題を指摘されるとは思いませんでした。お恥ずかしいです。今後とも努力したいと思います。 8,10.おっしゃる通りです。むしろここでは配列を使わなくても良かったんですね。forループ中でsumを計算していくので、cost[]やamount[]にデータを確保しておく意味がありませんよね。 9.不正値が入力される事はないという思い込みがありました。今後は不正値にも対処するプログラムを書くよう気をつけたいです。 chie65535さんが書かれたプログラムの四捨五入する方法は知りませんでしたね。今後も使う機会があるかと思いますので参考にさせて頂きます。 多くのご指摘ありがとうございます。 これらの問題点に注意しながら、もう一度プログラムを書いてみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

問題文には > ※販売数量の平均に端数(小数点以下の数)が生じた場合は小数点以下第1 位を四捨五入してください。 とありますが。 あと、なんで #include <iostream> なんです?

maryu1112
質問者

お礼

double型の平均値aveをprintfで出力する際に、 %.0lfとすることで小数点以下第1位を四捨五入して出力されるので大丈夫かと思っていたのですが、何か考え方が間違っているのでしょうか。 iostreamをincludeした場合でもコンパイルが通り、他のプログラムなどがAcceptedされていたので勘違いしていました。 scanf等を使用しているのでstdio.hをincludeすべきでした。 大変参考になりました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • 答えがおかしい

    配列と関数を使って教科ごとの平均点を求めるC言語のプログラムを 作りました。しかし、結果がおかしくいろいろ考えてみたのですが、 よくわからないので質問に出すことにしました。 作ったものは以下です。どうすればよいでしょうか? #include <stdio.h> #define NUMBER 3 /*--- 要素数noの配列の平均値を求める ---*/ double ave_of(int vb[], int no) { int i, sum, ave; for (i=1;i<no; i++) sum+=vb[i]; ave=(double)sum/NUMBER; return(ave); } int main(void) { int i; int a[NUMBER]; int b[NUMBER]; int c[NUMBER]; double ave_a, ave_b, ave_c; printf("%d人の点数を入力してください。\n",NUMBER); for(i=0;i<NUMBER; i++){ printf("[%d番]理科:",i+1); scanf("%d",&a[i]); printf("   数学:"); scanf("%d",&b[i]); printf("   社会:"); scanf("%d",&c[i]); } ave_a=ave_of(a, NUMBER); ave_b=ave_of(b, NUMBER); ave_c=ave_of(c, NUMBER); printf("【理科】平均点:%.1f\n", ave_a); printf("【数学】平均点:%.1f\n", ave_b); printf("【社会】平均点:%.1f\n", ave_c); return(0); } 結果は例えば45.2 というような感じで出したいです。

  • プログラム作成が出来ません

    プログラム作成の課題でエラーが出て進めません (1)~(3)までだけなら作成できるのですがどうしても(4) を表示させることができません^^; (1)3~99までの奇数を7*7の2次元配列に読み込み表示 (2)(1)の配列の行と列を入れ替えたものを表示 (3)全要素の平均 (4)要素の中から9の倍数を選び出し表示 添削よろしくお願いします。 #include <stdio.h> main() { int a[7][7]; int i,j,ave,sum; int c; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { a[i][j] =3+(j*2)+(i*14); } } for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { for(c=0; c<49; ++c) { if((3+(j*2)+(i*14))%9==0) { c=3+(j*2)+(i*14); } } } } sum=0; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { sum=sum+a[i][j]; } } ave=sum/7/7; for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { printf( "%2d ", a[i][j] ); } printf( "\n" ); } printf("\n"); for(i=0; i<7; ++i) { for(j=0; j<7; ++j) { printf( "%2d ", a[j][i] ); } printf( "\n" ); } printf("\n"); printf("average=%d\n",ave); printf("\n"); for(c=0; c<49; ++c) { printf("%d",c); } } 長々と失礼しました・・・

  • c++について

    以下のプログラムをコンパイルしてみたのですが、うまく作動しません。 どこかに欠陥があるのでしょうか? 分かる方、よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <math.h> #pragma warning(disable : 4996) #define N 3 typedef struct Shop { char name[10]; int sale; } Shop; void pp(Shop*a) { int i; printf("\n"); for(i=0; i<N; i++,a++) printf("Name , Sale = %s ,\t%d\n",a->name,a->sale); printf("\n"); } int main(void) { double sum; //売上高合計 double ave; //売上高平均 double hensa1; /* double hensa2; */ /* double sd; //標準偏差 */ Shop*data,*t; int i,j; data=t=malloc(sizeof(Shop)*N); for(i=0; i<N; i++,t++) { printf("店舗名を入力してください\n"); scanf("%s", &t->name); printf("売上高を入力してください。\n"); scanf("%d", &t->sale); sum += t->sale; } ave = sum/N; for(i=0; i<N; i++,t++) hensa1 += (pow(ave-t->sale, 2)); t=malloc(sizeof(Shop)); for(i=0; i<N-1; i++) { for(j=i+1; j<N; j++) { if(data[i].sale > data[j].sale) { t[0]=data[i]; data[i]=data[j]; data[j]=t[0]; } } } printf("\n"); printf("%g\t:Sum\n%g\t:Average\n%g\t:Standard deviation\n", sum,ave,sqrt(hensa1)/N); pp(data); return 0; }

  • 100x100行列の平均値を求めたい

    const int SIZE=100; for(int i=0; i< SIZE; i++){ for(int j=0; j< SIZE; j++){ fin >> array[i][j]; } } double sum=0.0; double ave=0.0; int J =3; for(int i=0; i< SIZE; i++){ sum += array[i][J]; } ave = sum / SIZE; cout << sum << endl; cout << ave << endl; 100x100行のファイルを読み込んで、すべての行の足し算および平均値を求めたいと思います。上のようある列(または行)を固定して求めることは出来るのですが、一度に0~99までの足し算および平均値を求めるやり方はどのようにしたらよろしいのでしょうか?たぶんfor文を使えば、できるのかなとは思うのですが、なかなか思うように行きません。 アドバイスよろしくお願いいたします。

  • C言語でmからnまでの合計を求めるプログラム

    これで動かないのですが、何が違っているのか、教えていただけますか。 #include <stdio.h> int main(void) { int m, n, sum, i, w ; printf("mからnまでの合計を求めます\n\n"); printf("m >> "); scanf(" %d", &m); printf("n >> "); scanf(" %d", &n); sum=0; if(m>n){ w=m; m=n; n=w; } sum=0; i=m; while(i<=n){ sum=sum+i; i=i+1; } printf("%d から %d の合計 = %d\n",m,n,sum); return 0; }

  • c言語

    n人の名前、と国数英の点数を読み込み各人の平均点、標準偏差を求め見やすく出力するぷろぐらむです osはlinuxでコンパイラはgccです。 変数が多くなってしまいよくわかりません。 もっと簡単になりますか? #include<stdio.h> #include<math.h> #define N 50 main() { int eng[N], jap[N], math[N], n=0, i=0; char name[N][12]; double sum[N], SUM, sum1, sum2, sum3, ave1, ave2, ave3, vari, s_devi; printf("名前 合計点"); while(scanf("%s %d %d %d",&name[n],&eng[n],&jap[n],&math[n]) != EOF) { sum[i] = eng[n]+jap[n]+math[n]; sum1 += eng[n]; sum2 += jap[n]; sum3 += math[n]; printf("%-12s%4d",name[n], sum[i]); n++; i++; } ave1 = sum1/n; ave2 = sum2/n; ave3 = sum3/n; for(i=0; i<n; i++) { SUM += (eng[i]-ave1)*(eng[i]-ave1); } vari = SUM/n; s_devi = sqrt(vari); printf("English\n average = %f\nstandard deviation = %f\n\n",ave1,s_devi); for(i=0; i<n; i++) { SUM += (jap[i]-ave2)*(jap[i]-ave2); } vari = SUM/n; s_devi = sqrt(vari); printf("japanese\n average = %f\nstandard deviation = %f\n\n",ave2,s_devi); for(i=0; i<n; i++) { SUM += (math[i]-ave3)*(math[i]-ave3); } vari = SUM/n; s_devi = sqrt(vari); printf("math\n average = %f\n standard deviation = %f\n\n",ave3,s_devi); }

  • 平均の問題(2)

    間違って前回の質問を締め切ってしまったので、もう一度お願いします。 申し訳ありません。 C言語の問題です。 1つの整数n(最大20)をキーボードから入力する。 続いてn人分の身長をキーボードから入力する。 平均身長、それぞれの身長、その身長と平均身長との差を1行ずつ出力せよ。 #include < stdio.h > int main(void) { int i, n; int s[20]; int sum; sum=0; scanf("%d", &n); for(i=0; i<n; i++){ if(n<=20){ scanf("%d", &s[i]); sum += s[i]; } } printf("平均:%f\n", (double)sum/n); for(i=0; i<n; i++){ printf("%d\n", s[i] ); printf("%f\n", s[i]-(double)sum/n); } return(0); } という風に考えたのですが、これだと結果が1行で表示されません・・・。 1行で表示するにはどうしたら良いのでしょうか? 初歩的な質問ですみません。 回答よろしくお願いします。

  • 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人目の氏名入力を飛ばさずに進行するのか教えてください。

  • javaでのプログラミング

    javaで平均と分散を求めるプログラムを作っているのですが、 分散の出力がうまくいきません。(出力が0になってしまいます) プログラミングとしておかしいところがあれば、教えていただけませんでしょうか 以下プログラムソースです。 public class test{ public static void main(String[] args){ int i,rand; double ave=0 double bun=0 double sum1=0 double sum2=0; int [] data = new int[10]; rand=(int)(Math.random()*100+0.5); for(i=0;i<10;i++){ data[i]=rand; } for(i=0;i<10;i++){ sum1+=data[i]; sum2+=data[i]*data[i]; } ave=sum1/10; bun=(sum2/10) - (ave*ave); System.out.println(ave); System.out.println(bun); } }

    • ベストアンサー
    • Java