アプリ版:「スタンプのみでお礼する」機能のリリースについて

n個の整数データを入力し、最後に平均を出力
nは最初に入力する(nは自然数)
平均は小数部まで求める

実行例として
入力するデータ数は? 3
NO. 1 :12
NO. 2 :7
NO. 3 :4
以上3個の平均 :7.666667

こんな感じにしたいのですができません
どなたか教えてください。
お願いします。

A 回答 (5件)

☆#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 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0

確認はしていないですが、


----->
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文の終了条件を満たさなくなります。
    • good
    • 0

#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;
}
    • good
    • 0

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);

この回答への補足

言われたとおりにしてみましたができませんでした
そもそもデータ入力数を入力した後のNO.? :がずっと続きます

補足日時:2009/07/07 02:05
    • good
    • 0

ここの場合、課題の丸投げは禁止されているので、自分でここまでやったけどうまくいかなかったというソースを提示するのがルールです。



まぁ、数値の入力には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);
}
}

補足日時:2009/07/07 01:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!