- ベストアンサー
C言語で平均を求めるプログラム
- C言語の初学者が、参考書で紹介されている平均を求めるプログラムに関して疑問点があります。
- 疑問点1では、変数iとsumについて意味が分からないことを述べています。
- 疑問点2では、複合代入演算子+=とfor文の計算内容について質問しています。
- みんなの回答 (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])); となります。 どうですか?参考書とまったく同じになってませんか?
その他の回答 (5)
- chie65536(@chie65535)
- ベストアンサー率44% (8759/19874)
>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 平均は「合計を個数で割ったもの」の筈。 合計を出すにはどうすれば良いか、を考えれば何をしているか判る筈。
お礼
丁寧に教えていただき、ありがとうございました。 すっきりとしました。
- black2005
- ベストアンサー率32% (1968/6046)
#3です >・疑問点1 ごめんなさい、私が見間違えました・・・^^; int i,sum = 0;avg; に見えました int i ; int sum = 0 ; int avg ; と同じ意味です。
お礼
訂正いただき、ありがとうございました。
- black2005
- ベストアンサー率32% (1968/6046)
>・疑問点1 意味がわからないのは当たり前、何故なら、あり得ないコードだから・・・ あなたの見間違い、あるいは参考書のミスプリ。 >・疑問点2 >【+=】は複合代入演算子で【sum=sum+data】という意味でしょうか。 違います。 sum=sum+data[i] という意味([i]があるか否かで全く異なる) >また、for文で{sum += data[i];}が繰り返す文になっていますが、具体的に何の計算を繰り返しているのでしょうか。 平均を出す手順を考えればわかるでしょ?
お礼
ご回答いただき、ありがとうございました。 参考になりました。
- ponta1971
- ベストアンサー率30% (361/1191)
疑問点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]・・・、となるのが分かると思います。 もし分からなければ、参考書の配列の部分を確認してください。
お礼
ご回答いただき、ありがとうございました。 参考になりました。
- Tacosan
- ベストアンサー率23% (3656/15482)
うぅ~ん, 何をどう勘違いしているのかよくわからん.... 疑問点1: 違います. 「参考書」を確認してください. 疑問点2: 「+=」が複合代入演算子であることは正しいですが「sum += data[i]」と「sum=sum+data」とは違います. そして, 「また」以降は自分で「合計を求める」ときにどうするかを考えればわかるはずです.
お礼
ご回答いただき、ありがとうございました。 参考になりました。
お礼
丁寧に教えていただき、ありがとうございました。 すっきりとしました。