はじめまして。
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];}が繰り返す文になっていますが、具体的に何の計算を繰り返しているのでしょうか。
どうか教えていただきたく、お願い致します。
No.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]));
となります。
どうですか?参考書とまったく同じになってませんか?
No.5
- 回答日時:
>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
平均は「合計を個数で割ったもの」の筈。
合計を出すにはどうすれば良いか、を考えれば何をしているか判る筈。
No.4
- 回答日時:
#3です
>・疑問点1
ごめんなさい、私が見間違えました・・・^^;
int i,sum = 0;avg; に見えました
int i ;
int sum = 0 ;
int avg ;
と同じ意味です。
No.3
- 回答日時:
>・疑問点1
意味がわからないのは当たり前、何故なら、あり得ないコードだから・・・
あなたの見間違い、あるいは参考書のミスプリ。
>・疑問点2
>【+=】は複合代入演算子で【sum=sum+data】という意味でしょうか。
違います。
sum=sum+data[i] という意味([i]があるか否かで全く異なる)
>また、for文で{sum += data[i];}が繰り返す文になっていますが、具体的に何の計算を繰り返しているのでしょうか。
平均を出す手順を考えればわかるでしょ?
No.2
- 回答日時:
疑問点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]・・・、となるのが分かると思います。
もし分からなければ、参考書の配列の部分を確認してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# プログラミング実行後に表示される値を答えよ #include <stdio.h> void main 4 2022/05/28 10:20
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
【Excel VBA】10進数を2進数に...
-
10個の実数に対する降順ソート...
-
(C言語・配列)date[i]の分散...
-
オセロゲーム 2次元配列で困...
-
C#でのswitch文
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
ビットスワップとバイトスワッ...
-
バイナリとBCDコード
-
異なるドメインのサイトでcooki...
-
全角半角を調べるライブラリ関...
-
バイト列とバイナリ列の違いが...
-
char str[256]の256の意味は?
-
1KBが1024byteな理由
-
ワイド文字のバイト数が取得で...
-
Excel VBA メール作成について ...
-
3バイト文字(UTF-8)をprintfで...
-
CGIを勉強しています。¥n(改...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
int型(2バイト)データの分割
-
c言語の多次元配列で1から100ま...
-
C#でのswitch文
-
【Excel VBA】10進数を2進数に...
-
途中経過も表示するプログラム
-
CreateProcessでの環境変数の設...
-
pythonでDBのカラム名で取得し...
-
C言語についてです! 同じ年の...
-
linuxのシェルでファイル名に先...
-
c言語 配列から数字だけをint型...
-
c言語での wavファイルの編集(...
-
matlabのソースコードをpython...
-
ビットデータのチェック方法
-
10個の実数に対する降順ソート...
-
python 気象データの取得
-
PINVOKEで構造体配列をマーシャ...
おすすめ情報