• ベストアンサー

関数の使い方が分りません

あらかじめ人数がわかっている集団で、科目A、科目B、科目Cの点数を入力後、各々の平均を求めるプログラムを作成したいです。人数も最初に入力してもらいます。 実行例は以下の通りです 人数? 3 科目Aの成績 1人目の点数: 50 2人目の点数: 40 3人目の点数: 90 ・ ・ ・ 科目Aの平均:60.0 科目Bの平均: 科目Cの平均: この実行例から、 1、人数-ninzuを取り込む 2、main関数の前に平均を求めるためのaverage関数を書く。ninzu分の配列tensu[]を定義し、for文で点数を取り込む。平均を計算し、その値を返す。 と考えました。 main関数の中でninzuを取り込んで、関数averageに飛んでninzu分の配列-tensu[ninzu]をつくったんですが、エラーの嵐です(泣) なんか、根本的に違う気がして本で調べてみたんですが、分りませんでした。 main中で取り込んだninzuを関数の中で使う事は出来ませんか? あとmain中で printf("科目Aの成績\n");をかき、このあとに関数を呼び出せれば実行例どおりに作れると思うんですが、どうやったら関数を呼び出せますか? もう手が付けられないです…。助けてください また、「こうしたら?」みたいなアドバイスもありましたらぜひお願いします! なにぶん超初心者ですので、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.2

取りあえずサンプルを作ってみました。 #include <stdio.h> double average(int ninzu) { int i,j,sum ; sum = 0 ; for (i=0 ;i<ninzu ;i++){ printf("%d人目の点数:",i+1); scanf("%d",&j); sum += j ; } return (double)sum/ninzu ; } int main() { int ninzu,kamoku ; double heikin[3] ; printf("人数?\n"); scanf("%d",&ninzu); if ( ninzu < 1 ){ return 0 ; } for (kamoku=0 ;kamoku<3 ;kamoku++){ printf("\n科目%cの成績\n",'A'+(char)kamoku); heikin[kamoku] = average(ninzu); } for (kamoku=0 ;kamoku<3 ;kamoku++){ printf("\n科目%cの平均:%5.1f",'A'+(char)kamoku,heikin[kamoku]); } return 0 ; }

ZZR1200
質問者

お礼

ありがとうございます!! とても参考になりました

その他の回答 (3)

回答No.4

関数averageにmain中で取り込んだninzuの値を教えてあげないといけませんよね。 例えば以下のような関数を書いて void average(int ninzu) {   float tensu[100]; int i; for(i=0;i<ninzu;i++) { 平均計算 }   ・・・ } main関数の中で average(ninzu); と書いて呼び出せば良いんじゃないでしょうか float tensu[100]; の100の部分は取り込みたい人数の最大値を指定しとけばとりあえず動くものになるとおもいます

ZZR1200
質問者

お礼

なんか、mainと他の関数の値の関係が分った気がします。 とても勉強になりました。 ありがとうございました きっとまたこのカテゴリで質問する事があると思いますが、その時はまた宜しくお願いします

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>「こうしたら?」 あらかじめ集団の人数(の上限)がわかっているのだったら、 #define MAXninzu 50 とかして tensu[MAXninzu]; として、配列を確保すればいいです。 あと、機械的に平均をだすのだったら unsigned tensu[3][MAXninzu]; double ave[3]; とでもしておいた方が 単純にループで回せるので計算が楽です。 1人1人の組とか名称がとくに重要なら struct seiseki { unsigned a; unsigned b; unsigned c; }; とか使うのもありだと思いますが、 実行例のようにするなら、面倒くさいですね。 mainで取り込んだninzuをaverageに渡すには、 average(ninzu); の様に、引数として渡すか あるいは、 main の外で変数を定義するかしないと スコープの関係で、そのままでは、averageで使えない場合があります。

ZZR1200
質問者

お礼

#define でやればいとは盲点でした。 使う事にします。 ありがとうございました

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

コンパイラにもよりますが、 Cで 変数による 配列の確保 float tensu[ninzu]; みたいな配列の定義はできません。 mallocかcallocでメモリを切り出して使うことはできます。 関数の呼出は 例えば void average(void); なら average(); と書けば呼び出せます。

ZZR1200
質問者

お礼

変数個の配列は出来ないんですね。また一つ勉強になりました! #defineで最大個数を指定しておく事にしました。 ありがとうございます。

関連するQ&A