- 締切済み
C言語 勉強始めた所で、まだ良く解りません、教えてください!
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、だけしか表示されません、これでよいのでしょうか?
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
トレースモードの真似事です。計算の途中経過はタブブレで一段落として出力されますので、計算の流れをつかんでください。 --- 計算出力内容 --- 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; }
- tsukasa-12r
- ベストアンサー率65% (358/549)
平均値をaとして、平均値を取った数値の個数をnとすると n, s または s, n のように出力したい ということでしょうか? だとすると printf("%d, %d\n",5,average(numbers,5)); または printf("%d, %d\n",average(numbers,5),5); のようにしなければなりませんが…。
- titokani
- ベストアンサー率19% (341/1726)
>このプログラムを実行すると、5,5と表示されると思うのですが? なぜそう思うのでしょうか? 2,3,5,7,9の平均値なら、5.2ですし・・・???
- kmee
- ベストアンサー率55% (1857/3366)
> 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 ですが。
- jacta
- ベストアンサー率26% (845/3158)
intは整数型ですので、小数点以下は切り捨てになってしまいます。 小数点以下を残したいのであれば、double型を使うようにしてください。 あと、処理系不明なので正確なことはいえませんが... > 5,5と表示されると思うのですが? 全角で出力したいのであれば、自分で変換処理を書かなければなりません。 半角でよい場合でも、小数点をピリオドではなくコンマにしたいのであれば、ドイツ語ロケールに設定するなどの対応が必要です。 ちなみに、printfでdoubleの値を出力するための書式は、%lfではなく%fです。ただし、お使いの処理系がC99であれば、%lfでもOKです。
- himajin100000
- ベストアンサー率54% (1660/3060)
あ、違う。 double average( int *data, int count ) { /* 中略 */ return (double)sum/count; /* return sum/count;の代わり*/ } も追加で
- himajin100000
- ベストアンサー率54% (1660/3060)
%d → %lf