- 締切済み
C言語でのソースファイル
n個の整数データを入力し、最後に平均を出力 nは最初に入力する(nは自然数) 平均は小数部まで求める 実行例として 入力するデータ数は? 3 NO. 1 :12 NO. 2 :7 NO. 3 :4 以上3個の平均 :7.666667 こんな感じにしたいのですができません どなたか教えてください。 お願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- yama5140
- ベストアンサー率54% (136/250)
☆#1 補足ソースの重要な誤りは、for 文をいつまでループするかの「条件式」が、「代入」になっていることです。 「入力するデータ数『まで』入力を繰り返す」とすべきところが、「 y は、入力するデータ数」となっている。 for文の書式。 for( 式1; 条件式; 式2 ){ 文 } 式1 → 条件式 → 文 → 式2(閉じ波括弧部分で)→ 条件式 → 文 → 式2・・・の順番 式1「のみ」が、一度だけ実行。 式2は、1回のループ「毎」の最後に実行(そして、「条件式」へ)。 このことから、補足ソースの for 文内の「文」としての y++; は不要です。 (注:No.3 さんのソースで、2バイト文字から「数」を取り出す部分では、2バイト目を指定するためソースのとおり i++; が必要) 蛇足 >入力するデータ数は? 3 この"3"は、もちろん、本チャンでは半角の 3 で「入力する」のですよね。 ( No.3 さんは、質問本文どおりに『全角』として回答) #include<stdio.h> void main( void ) { int x, y, z, sum = 0; double ave = -99.9; printf( "入力するデータ数は? " ); scanf( "%d", &x ); for( y = 1; y <= x; y++ ){ // 動作の根幹に関わる誤りのあった行( = → <= ) printf( "No.%2d ", y ); scanf( "%d", &z ); sum += z; } if( x ) ave = (double)sum / (double)x; printf( "以上 %d 個の平均は: %.6lf", x, ave ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
- mk48a
- ベストアンサー率56% (1133/2007)
確認はしていないですが、 -----> int x,y,z,sum; double ave;/*平均値*/ y=1; ※1 これの意図が不明。単なる初期化? sum=0; printf("入力するデータ数は? "); scanf(" %d", &x); ※2 変数xを入力データ数とする if(x>1) ※3入力データ数が1の場合計算されない(x>0)とするべきか?あと、1>xの場合の処理も記述すべき { for(y=1; y=x; y++){ ※4 yはループのカウンター?一般的にカウンターにはi,j,kを用いた方がわかりやすい printf("No .%d",y); y++; ※5 この行はいらないと思われる。for文でy++しているのでfor文を回るとy=y+2になってしまう。 scanf("%d", &z); sum=sum+z; } ave=sum/x; ※6 このままではintの割り算になっているので、sum、xをdoubleにキャストする printf("以上%d個の平均は:%.6f",x,ave); ※7 aveはdoubleなので、%.6lfのほうが良いはず <----- ※5が原因で、入力するデータ数を奇数にするとfor文の終了条件を満たさなくなります。
- ssk38
- ベストアンサー率44% (22/49)
#include <stdio.h> #include <stdlib.h> #include <string.h> int input_integer(char buf[1024]) { fgets(buf, 1024, stdin); if (buf[strlen(buf)-1] == '\n') { buf[strlen(buf)-1] = '\0'; } return atoi(buf); } int input_integer_SJIS(char buf[1024]) { int i,j=0,len; char ascii[1024] = {0}; char SJIS[10]; char tmp[3]; strcpy(SJIS, "0"); len = strlen(fgets(buf, 1024, stdin)); if (buf[strlen(buf)-1] == '\n') { buf[strlen(buf)-1] = '\0'; len--; } for (i=0; i<len; i++) { i++; ascii[j++] = buf[i] - SJIS[1] + '0'; } return atoi(ascii); } int main(int argc, char *argv[]) { int i; int num,sum = 0; char bufnum[1024]; char bufsum[1024]; printf("入力するデータ数は? "); fflush(stdout); num = input_integer_SJIS(bufnum); if (num < 0) { /* エラー処理 */ return 1; } for (i=0; i<num; i++) { printf("NO.%2d :", i); fflush(stdout); sum += input_integer(bufsum); } printf("以上%s個の平均 :%lf\n", bufnum, 1.0*sum/num); return 0; }
- redfox63
- ベストアンサー率71% (1325/1856)
ave=sum/x; printf("以上%d個の平均は:%.6f",x,ave); とした場合 aveには sum/xの整数部しか代入されないでしょう sum も x も intで宣言されていますので sun/xという式もintで評価されます ave = sum; ave = ave / x; または ave /= x; キャストをするなら ave = (double)sum / x; または ave = (double)sum / (double)x; といった具合でいいでしょう printfでdoubleを出力する際は lfのほうがいいかもしれません > printf("以上%d個の平均は:%.6lf", x, ave);
- mk48a
- ベストアンサー率56% (1133/2007)
ここの場合、課題の丸投げは禁止されているので、自分でここまでやったけどうまくいかなかったというソースを提示するのがルールです。 まぁ、数値の入力にはscanfを使い、計算結果の小数部まで求めるので、doubleの変数に代入すれば良いかと。(計算時にキャストしてもよいけど面倒そうなので) まずは自分の書いたソースを不完全でも良いから出してください。
補足
すいません。出すつもりでしたが途中で投稿してしまいました。 #include<stdio.h> void main(void) { int x,y,z,sum; double ave; y=1; sum=0; printf("入力するデータ数は? "); scanf(" %d", &x); if(x>1){ for(y=1; y=x; y++){ printf("No .%d",y); y++; scanf("%d", &z); sum=sum+z; } ave=sum/x; printf("以上%d個の平均は:%.6f",x,ave); } }
補足
言われたとおりにしてみましたができませんでした そもそもデータ入力数を入力した後のNO.? :がずっと続きます