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

はじめまして。

C言語初学者です。

参考書に、平均を求めるプログラムとして下記が紹介されていますが、疑問点があります。




#include <stdio.h>

int main(void)
{
int data[] = {79,42,39,79,13,75,19};
int i,sum = 0,avg;

for (i = 0;i < sizeof(data) / sizeof(data[0]);i++) {
sum += data[i];
}

avg = sum / (sizeof(data) / sizeof(data[0]));

printf("%d\n",avg);

return 0;
}



・疑問点1
int i,sum = 0,avgの部分
変数【i,sum】に値【0,avg】をそれぞれ代入しているのかと思いますが、【i=0】はわかっても、【sum=avg】の意味が分かりません(合計=平均?)。

・疑問点2
sum += data[i]の部分
【+=】は複合代入演算子で【sum=sum+data】という意味でしょうか。
また、for文で{sum += data[i];}が繰り返す文になっていますが、具体的に何の計算を繰り返しているのでしょうか。

どうか教えていただきたく、お願い致します。

A 回答 (6件)

ついでだから疑問2も解説しよう。



個数が6個だと判ってて普通に平均を求めるなら、

int data[6] = {79,42,39,79,13,75,19};
int sum,avg;

sum = 0;
sum = sum + data[0];
sum = sum + data[1];
sum = sum + data[2];
sum = sum + data[3];
sum = sum + data[4];
sum = sum + data[5];

avg = sum / 6;

で良い。

sum = sum + data[0];



sum += data[0];

と書けるから、そう書き変えると

int data[6] = {79,42,39,79,13,75,19};
int sum,avg;

sum = 0;
sum += data[0];
sum += data[1];
sum += data[2];
sum += data[3];
sum += data[4];
sum += data[5];

avg = sum / 6;

となる。

sumにdataの0番から5番までを順に足す

sum += data[0];
sum += data[1];
sum += data[2];
sum += data[3];
sum += data[4];
sum += data[5];

は、for 文でループに出来るから、そう書き換えると

int data[6] = {79,42,39,79,13,75,19};
int i,sum,avg;

sum = 0;

for (i=0;i < 6;i++) {
sum += data[i];
}

avg = sum / 6;

になる。

sumを0にするのは宣言文で宣言と同時に行えるので、そう書き換えると

int data[6] = {79,42,39,79,13,75,19};
int i,sum=0,avg;

for (i=0;i < 6;i++) {
sum += data[i];
}

avg = sum / 6;

になる。

配列宣言の時に、要素の個数を書かないと、要素の個数は、初期化の為に並べた「初期化子の個数」になる。

初期化子の個数によって要素の個数を決める場合、個数を「5」とか「6」とか固定にしておくと後で困るので、ちょっと工夫します。

「sizeof(data)」と書くと、配列全体の大きさ(バイト数)を返します。

「sizeof(data[0])」と書くと、要素1つ分の大きさ(バイト数)を返します。

配列全体の大きさは、要素全部の分の大きさです。

「要素全部の分」を「要素1個の分」で割れば、要素の個数が判ります。

つまり sizeof(data)/sizeof(data[0]) の式で、要素の個数が求まります。

100バイトのメモリが6つあったら、全体は600バイトで、1つは100バイト。600÷100=6で、無事に個数の「6」が求まります。

要素数が5に減っても、7に増えても、式は変わりません。

コードの中に「6」と直接に書いてあったのを、上記の式に書きかえると

int data[] = {79,42,39,79,13,75,19};
int i,sum = 0,avg;

for (i = 0;i < sizeof(data) / sizeof(data[0]);i++) {
sum += data[i];
}

avg = sum / (sizeof(data) / sizeof(data[0]));

となります。

どうですか?参考書とまったく同じになってませんか?
    • good
    • 0
この回答へのお礼

丁寧に教えていただき、ありがとうございました。

すっきりとしました。

お礼日時:2012/07/11 14:41

>int i,sum = 0,avg;


>int i,sum = 0,avgの部分
>変数【i,sum】に値【0,avg】をそれぞれ代入しているのかと思いますが、【i=0】はわかっても、【sum=avg】の意味が分かりません

int data[] = {79,42,39,79,13,75,19};

が、data[0]を79に、data[1]を42に、data[2]を39に、順に初期化していくから

int i,sum = 0,avg;

を、iを0に、sumをavgに順に初期化していくと思ったんですね?

宣言文の「,」は、そういう意味ではありません。

宣言文は int i; int j, int k; のように1つづつ書いても良いです(改行はあってもなくてもよい)が、面倒なので、3つを int i,j,k; のように「,」で区切って1つの宣言文で済ます事が出来ます。

同じ型の変数なら「,」で区切って、たくさん並べられるのです。

また、それぞれに「初期化部分」を書く事も出来ます。例えば int i=1,j=5,k=10,m=50,n=100,o=500,p=1000,q=2000,r=5000,s=10000; と書く事も出来ます。

>・疑問点2

平均は「合計を個数で割ったもの」の筈。

合計を出すにはどうすれば良いか、を考えれば何をしているか判る筈。
    • good
    • 0
この回答へのお礼

丁寧に教えていただき、ありがとうございました。

すっきりとしました。

お礼日時:2012/07/11 14:42

#3です



>・疑問点1

ごめんなさい、私が見間違えました・・・^^;

int i,sum = 0;avg; に見えました

int i ;
int sum = 0 ;
int avg ;

と同じ意味です。
    • good
    • 0
この回答へのお礼

訂正いただき、ありがとうございました。

お礼日時:2012/07/11 14:43

>・疑問点1



意味がわからないのは当たり前、何故なら、あり得ないコードだから・・・
あなたの見間違い、あるいは参考書のミスプリ。


>・疑問点2
>【+=】は複合代入演算子で【sum=sum+data】という意味でしょうか。

違います。
sum=sum+data[i] という意味([i]があるか否かで全く異なる)

>また、for文で{sum += data[i];}が繰り返す文になっていますが、具体的に何の計算を繰り返しているのでしょうか。

平均を出す手順を考えればわかるでしょ?
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

参考になりました。

お礼日時:2012/07/11 14:45

疑問点1


変数の宣言はカンマで区切られています。

int a,b,c;



int a;
int b;
int c;

は書式が違うだけで同じことを表しています。

「int i,sum = 0,avg;」もカンマでバラしてみると分かりやすいかと思いますよ。

疑問点2

for文でiが0から順に増えていってるのはわかりますか?
これが変わればdata[i]はdata[0]、data[1]・・・、となるのが分かると思います。
もし分からなければ、参考書の配列の部分を確認してください。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

参考になりました。

お礼日時:2012/07/11 14:46

うぅ~ん, 何をどう勘違いしているのかよくわからん....



疑問点1: 違います. 「参考書」を確認してください.

疑問点2: 「+=」が複合代入演算子であることは正しいですが「sum += data[i]」と「sum=sum+data」とは違います. そして, 「また」以降は自分で「合計を求める」ときにどうするかを考えればわかるはずです.
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

参考になりました。

お礼日時:2012/07/11 14:46

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