プロが教えるわが家の防犯対策術!

C言語 勉強始めた所で、まだ良く解りません、教えてください!
このプログラムを実行すると、5,5と表示されると思うのですが?

/*****************************************************************************/
#include <stdio.h>

int average( int *data, int count )
{
int i, sum=0;
for( i=0; i<count; i++ ) sum+=data[i];
return sum/count;
}

int main(void)
{
int numbers [] = { 2, 3, 5, 7, 9, 11, 13, 15, 17,19 };
printf("%d\n",average(numbers,5));

return 0;
}
/*******************************************************************************/
5、だけしか表示されません、これでよいのでしょうか?

A 回答 (7件)

トレースモードの真似事です。

計算の途中経過はタブブレで一段落として出力されますので、計算の流れをつかんでください。
--- 計算出力内容 ---
  sum + data[0] = 0 + 2 = 2
  sum + data[1] = 2 + 3 = 5
  sum + data[2] = 5 + 5 = 10
  sum + data[3] = 10 + 7 = 17
  sum + data[4] = 17 + 9 = 26
  return sum/count (26/5 = 5)
5
--- ここまで ---
 「5」だけが表示されます。要は、int型の計算においては、少数は切り捨てられることを示しています。そしてあなたは「 printf("%d\n", ... 」のように、1つの整数値を出力するようにプログラムした。
 ...当然の結果です。↓のプログラムを起動して、確認してみてください。



/* A sample program by gcc on Mac OSX
* file name: racc.c
* compile: gcc racc.c
* execution: ./a.out
*/

#include <stdio.h>

int average( int *data, int count )
{
int i, sum=0;
for( i=0; i<count; i++ ) {
printf("\tsum + data[%d] = %d + %d", i, sum, data[i]); //トレース追加
sum+=data[i];
printf("\t = %d\n", sum); //トレース追加
}
printf("\treturn sum/count (%d/%d = %d)\n", sum, count, sum/count); //トレース追加
return sum/count;
}

int main(void)
{
int numbers [] = { 2, 3, 5, 7, 9, 11, 13, 15, 17,19 };
printf("%d\n",average(numbers,5));

return 0;
}
    • good
    • 0

平均値をaとして、平均値を取った数値の個数をnとすると


n, s
または
s, n
のように出力したい
ということでしょうか?
だとすると
printf("%d, %d\n",5,average(numbers,5));
または
printf("%d, %d\n",average(numbers,5),5);
のようにしなければなりませんが…。
    • good
    • 0

>このプログラムを実行すると、5,5と表示されると思うのですが?


なぜそう思うのでしょうか?
2,3,5,7,9の平均値なら、5.2ですし・・・???
    • good
    • 0

> 5、だけしか表示されません、これでよいのでしょうか?



はい。
プログラムに記述された通りの「正しい」動作です。

1)int型同士の四則演算はint型になります。
int / int = int です。小数点以下は切り捨てになります。
2)関数averageの戻り値がint型です。(小数を扱える)double型等であってもint型に変換して返します。
3)printfの書式「%d」は(int型の)整数表示専用です。

小数以下まで表示したいのなら、浮動小数点型にする必要があります。
floatとdoubleがあります(コンパイラによってはlong doubleとかもあります)が、現在ではdoubleを使うのが一般的です。
1) キュスト(型変換)でint→doubleの変換をしてdouble型の演算にする
2) 戻り値をdoubleにする
3) double型に対応した小数点以下のできる書式設定にする。

実際のコードは前の方のを参照のこと

>このプログラムを実行すると、5,5と表示されると思うのですが?
(2+3+5+7+9)/5 = 26/5 = 5.2 ですが。
    • good
    • 0

intは整数型ですので、小数点以下は切り捨てになってしまいます。


小数点以下を残したいのであれば、double型を使うようにしてください。

あと、処理系不明なので正確なことはいえませんが...

> 5,5と表示されると思うのですが?

全角で出力したいのであれば、自分で変換処理を書かなければなりません。
半角でよい場合でも、小数点をピリオドではなくコンマにしたいのであれば、ドイツ語ロケールに設定するなどの対応が必要です。

ちなみに、printfでdoubleの値を出力するための書式は、%lfではなく%fです。ただし、お使いの処理系がC99であれば、%lfでもOKです。
    • good
    • 0

あ、違う。



double average( int *data, int count )
{
/* 中略 */

return (double)sum/count; /* return sum/count;の代わり*/
}

も追加で
    • good
    • 0

%d → %lf

    • good
    • 0

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