- ベストアンサー
構造体から平均点を求める方法
構造体が(名前、数学の点数、英語の点数、理科の点数)という形で、100人分のデータがあった場合。 この構造体を関数で受け取り、各科目の平均点をパラメタで返し、全体の平均を復帰値にするにはどのような関数にすれば良いのでしょうか。参考のソースを示していただけると助かります。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
がるです。 > このような場合、関数の呼び出しと関数内部ではどのようなプログラムにすれば良いのでしょうか。初心者でわからないのでよろしくお願いします。 んっと…どのあたりが分からないのでしょうか? 基本的には「ここまで分かる」部分を提示していただけると、以降のお話がしやすくなるのですが。 ただまぁ、今回の場合概ね予測はできるのですが。多分「構造体の配列の作り方」と「受け取った関数でどうやって"構造体の配列"から"構造体"を取り出すか」の2点だと思われます。 構造体の配列は、「事前にデータ量が明確に分かっている」場合、 構造体名 構造体配列[サイズ]; で固定的に宣言が可能です。 で、もうちょっと高度な手法ですと、 構造体名 *構造体配列; // これは「ポインタ用の変数」を規定します 構造体配列 = (構造体名 *)malloc( sizeof(構造体名) * サイズ ); // または 構造体配列 = (構造体名 *)calloc( sizeof(構造体名), サイズ ); で、動的にサイズを確保します。 アクセス自体は int i; for(i = 0; i < サイズ; i ++) { 構造体配列[i].数学の点数 = XX; } みたいな感じでOKです。 で、前述の「nullつかって最後をあらわす」場合。 まず構造体の確保サイズを「サイズ+1」にして、後はデータを全部入れた後に 構造体配列[サイズ] = null; としておくと、判定が楽かと思います。 で、call先の関数内では、 int i; for(; 構造体配列[i] != null; i++) { 構造体配列[i].数学の点数 } とかって感じのループにするとよろしいかと。 かな~り大雑把にはしょってますが、欠けている部分は少し調べれば色々出てくるかと思います。 また分からなくなったら質問してください ^^
その他の回答 (2)
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 こういったものには色々なパターンがあるので。#1さんが提示された「以外」の方法をひとつ。 typedef struct { 名前 数学の点数 英語の点数 理科の点数 } 一人分のデータ; typedef struct { 数学の平均点数 英語の平均点数 理科の平均点数 } 平均結果用; int 処理関数( 一人分のデータの配列へのポインタ, 平均結果用へのポインタ) まぁ大して変わってませんが。配列のポインタの、最後にnullを入れて置くようにすると、簡単にfor文でまわせます。 ちなみに、C++でやっている場合ですと、構造体よりもクラスにして、配列はvectorで処理(iteratorを使う)と、より楽に作成できるかと思います。
補足
typedef struct { 名前 数学の点数 英語の点数 理科の点数 } 一人分のデータ; ご回答ありがとうございます。さらに教えていただきたいのですが、構造体を上記のもの1つだけ使用して作っています。 このような場合、関数の呼び出しと関数内部ではどのようなプログラムにすれば良いのでしょうか。初心者でわからないのでよろしくお願いします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
double ave(*構造体の配列(の先頭)のポインタ, int データ数, double *数学の平均を返すポインタ, double *英語の平均を返すポインタ, double *理科の平均を返すポインタ)
お礼
参考になりました。ありがとうございます。