ここから本文です

C言語のプログラムについて #include<stdio.h> #include<math.h> #include<st...

gan********さん

2014/8/320:00:30

C言語のプログラムについて

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

/*

関数名:平均値の計算仮引数:int data[], int n
戻り値:average
*/
double ave(int data[], int n){
int i, total=0;
double average;
for(i = 0; i < n; i++){
total = total + data[i];
}
average = (double)total / n;
return average;
}

/*
関数名:標準偏差の計算
仮引数:int data[], int n
戻り値:s
*/
double sd(int data[], int n){
int i;
double sigma, x, s;
for(i = 0; i < n; i++){
x = (double)data[i] / n;
sigma = ((double)data[i] - x) * ((double)data[i] - x);
}
s = sqrt( (1/(double)n) * sigma);
return s;
}

main(){
int n, i, *data, total;
printf("データの個数 = ");
scanf("%d", &n);
data = (int*) calloc(n, sizeof(int));
if(data != NULL){
for(i = 0; i < n; i++){ /*data[0]からdata[n]までの値を要求*/
printf("data[%d] = ", i);
scanf("%d", &(data[i]) );
}
double ave(int data[], int n);
double sd(int data[], int n);
free(data); /*領域の開放*/
data = NULL; /*領域の空白化*/
printf("平均 = %0.6f\n", ave);
printf("標準偏差 = %0.6f\n", sd);
}
}

データ個数とデータを入力した後に平均と標準偏差を出力するというプログラムなんですが、平均と標準偏差の値が0.000000と出力されます。ずっと原因を考えていたのですが、間違いがわかりません。おそらく関数の中身が間違えていて0を返しているようなんですが、どうでしょう。

聞いてばかりで考えない人間のようで嫌なんですが、どうしても原因が分かりません。間違いの確認方法と間違いを指摘していただけないでしょうか。どうかよろしくお願いいたします。

<実行例>
[adminuser@localhost b]$ ./kadai9b-2
データの個数 = 5
data[0] = 1
data[1] = 2
data[2] = 3
data[3] = 4
data[4] = 5
平均 = 0.000000
標準偏差 = 0.000000

補足インデントが汚くて誠に申し訳ないです。

閲覧数:
120
回答数:
3
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

cd6********さん

2014/8/320:22:32

main の中で、
double av, sdiv;
av = ave(data, n);
sdiv = sd(data, n);
して、printf の中も、av、sdiv を使うものに変えると良いと思います。
今の状態は、main 関数の中で、プロトタイプ宣言したような感じで、関数を使っていません。関数ポインタを "%.6f" で出力しています。
ここで、ave、sd という変数名は、関数名とかぶるので、使うことができないことに注意します。

  • 質問者

    gan********さん

    2014/8/322:07:41

    そこでしたか...
    平均と標準偏差の関数の中が間違っているとばかり思い込んでいて全然目がいきませんでした...
    こんな単純なことでお手を患わせて申し訳ないです。
    ありがとうございました。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

2014/8/320:51:00

とりあえず、こんな感じです。
0.0 しか出てこないのは、main() の部分が変だからです。
sdは、計算が違っていたので、適当に作りました。
とりあえずsを返すようにしています。
σだったらコメントの方を使ってください。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

/*
関数名:平均値の計算仮引数:int data[], int n
戻り値:average
*/
double
ave (int data[], int n)
{
int i, total = 0;
double average;
for (i = 0; i < n; i++)
{
total = total + data[i];
}
average = (double) total / n;
return average;
}

/*
関数名:標準偏差の計算
仮引数:int data[], int n
戻り値:s
*/
double
sd (int data[], int n)
{
int count;
double x = 0.0, f = 0.0;
for (count = 0; count < n; count++)
{
x += data[count];
f += data[count] * data[count];
}
x /= n;
x *= x;
f /= n;
return sqrt (f - x);
//return sqrt((f-x)*n/(n-1));
}

main ()
{
int n, i, *data, total;
printf ("データの個数 = ");
scanf ("%d", &n);
data = (int *) calloc (n, sizeof (int));
if (data != NULL)
{
for (i = 0; i < n; i++)
{ /*data[0]からdata[n]までの値を要求 */
printf ("data[%d] = ", i);
scanf ("%d", &(data[i]));
}
printf ("平均 = %0.6f\n", ave (data, n));
printf ("標準偏差 = %0.6f\n", sd (data, n));
}
free (data); /*領域の開放 */
}

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

k03********さん

2014/8/320:34:48

gandam_doublexさん

double ave(int data[], int n){
int i, total=0;
double average,t,n2;
for(i = 0; i < n; i++){
total = total + data[i];
}
t=total;
n2=n;
average = t/n2;
return average;
}
double sd(int data[], int n,double ave){
int i;
double sigma, x, s,n2;
sigma = 0.0;
for(i = 0; i < n; i++){
sigma += (data[i] - ave) * (data[i] - ave);
}
n2=n;
s = sqrt(sigma/n2);
return s;
}
int main(){
int n, i, *data, total;
double ave2;
double sd2;
printf("データの個数 = ");
scanf("%d", &n);
data = (int*) calloc(n, sizeof(int));
if(data == NULL){
return 0;
}
for(i = 0; i < n; i++){ /*data[0]からdata[n]までの値を要求*/
printf("data[%d] = ", i);
scanf("%d", &data[i]);
}
ave2 = ave(data,n);
sd2 = sd(data,n,ave2);
free(data); /*領域の開放*/
data = NULL; /*領域の空白化*/
printf("平均 = %10.6f\n", ave2);
printf("標準偏差 = %10.6f\n", sd2);
return 0;
}

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる