• ベストアンサー

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

あらかじめ人数がわかっている集団で、科目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

  • 以下のプログラムについて教えてください

    #include<iostream.h> int main() { int i; int ninzu=0; int tensu[6]; int rakudai[6]; cout<<"6人の点数を入力!\n"; for(i=0; i<6;i++) { cout<<i+1<<"番:"; cin>>tensu[i]; if(tensu[i]<60) { rakudai[ninzu]=i; ninzu++;} } cout<<"60点未満は"<<ninzu<<"人です。\n"; for(i=0; i<ninzu; i++) cout<<rakudai[i]+1<<"番:"<<tensu[rakudai[i]]<<"点\n"; return(0); } というテストの点数が60点未満の学生の一覧表を出力するというプログラムなんですが、12行目からの rakudai[ninzu]...以降が よくわかりません。配列の数を指定するところに数字以外のものが来るというのはいったいどういうことなのでしょう?どなたか教えてください。

  • 力を貸してください

    7人の点数を格納する配列 tensu[i] の値をmain関数内で キーボード入力させ、その配列を関数 hairetsu() に引数 として与え、関数 hairetsu 内で配列の値をforと printfを 使い、表示させてください。

  • Excel IF関数とAVERAGE関数

    定期考査の成績をExcelで作ってみようと思うのですが、関数の打ち方を忘れてしまいました。 IF関数を使い、点数の所がどこも記入されていなかった場合空白にして、一つでも入っていたらその平均を出そうと思っているのですが、出来ますよね? 平均を出したいところは、下の写真の範囲指定してあるところなのですが、覚えている感じで関数を入力すると、「VALUE」と出てしまいます。 関数は =IF(B3:J3="","",AVERAGE(B3:J3)) にしていますが、関数のせいならば、正しい関数を教えて下さい。 お願いします。

  • エクセルの関数

    60人位のあるテストの点数で平均を求めた後、平均点以上と平均点以下の集団に分けて、おのおのの平均を求めたいのですが、良い方法はありませんか?平均は、アベレージで求められアベレージの数はわかるのですが、アベレージ以下の人数とかは、求め方がわかりません。宜しくお願いします。

  • 関数がかかっているセルの数値に関数を・・・

    以前、下記の「平均の出し方を教えて下さい」で質問したものですが、 対象のセルA1~A10には、それぞれ C1-B1 のような関数(計算式) がかかっています。 これに「AVERAGE」をかけるとただしく出ません。 数値だけを認識させて、AVERAGEを出すにはどうしたらいいのでしょうか? よろしくお願いいたします。 --------------------------------------------- (以前の質問) エクセルでの関数を教えてください。 セルa1からa10に順に数値を記入します。 入力がa3やa7までの途中であっても=残りが未入力であっても a11に平均を自動的に(一つ入力が増えるたびに)出したいです。 a11にどのような式を入れたらいいのでしょうか? よろしくお願いいたします。 投稿日時 - 2014-05-02 18:52:39

  • この関数に対して、多すぎる引数・・・の対応

    どなたかご教授下さい。 ゴルフコンペの成績表を作り続けています。 参加者の成績(スコア)を入力したセルをCOUNTで参加回数として表示、平均スコアをAVERAGEで表示させていました。 30回を超えて「この関数に対して、多すぎる引数が入力されています」が出たので参加回数は =COUNT(●●10、・・・●●30)+COUNT(●●40、・・・●●50)で30回以上表示できるようになり解消できたのですが、平均スコア(AVERAGE)の数式変更ができません。 今は=AVERAGE(●●10、・・・●●30)で●●31から対応できなくなりました。 この場合どのような式を当てはめればいいのでしょうか? 宜しくお願い致します。

  • 5つの要素を持つ配列から最高点を出力する

    1,5つの要素を持つ配列を受け取り、その最大値を返すint main(int x[])関数を定義してください。max()関数を使い、キーボードから学生の数とテストの点数を入力させ、最高点を出力うするコードを記述してください。 テストの点数を入力してください。 50 49 35 68 75 最高点は75点です、 みたいな感じの例題を作るまとめの練習ですが、ちょっと頭がこんがらがってしまいました。 とりあえず私が、途中まで記述したソースです。 #include<iostream> using namespace std; int max(int x[]); int main() { int tensu[5]; for (int i = 0; 0 < 5; i++) { cout << "テストの点数を入力してください。\n"; cin >> tensu[i]; } return 0; } int max(int x[]) { } 関数を使ってそれでif判定だとは思うのですが、関数を使ってifを使う方法が解りません。 ご教示よろしくお願いします。

  • プログラミング分からないので教えてください

    【演習1】 コマンド引数で台形の上底、下底、及び高さを指定して実行すると、台形の面積を算出し表示するプログラムを作成せよ。ただし、以下の条件を満たすこと。 条件: (1)コマンド引数が不足していた場合は<実行例(2)>のようにエラーメッセージを表示する。 (2)上底、下底、高さ、及び面積は実数値として処理する。 (3)台形の上底、下底、及び高さを引数として受け取って面積を算出するユーザー関数を作成し使用する。 (4)面積の表示はmain関数で行い、<実行例(1)>のように表示する。 そのとき、上底、下底、高さは小数点以下2桁、面積は小数点以下3桁で表示する。 <実行例(1)> Z:\>ee1001 3.5 4.2 8.37↓ 上底3.50,下底4.20,高さ8.37の台形の面積は32.224 <実行例(2)> Z:\>ee1001 3.5 4.2↓ 引数が足りません。 【演習2】 点数を3つキー入力すると、3つの点数の合計点と平均点を表示するプログラムを作成せよ。ただし、以下の条件を満たすこと。 条件: (1)点数は整数で入力する。。 (2)入力された3つの点数のうち1つでも0未満だった場合は、<実行例(3)>のようにエラーメッセージを表示する。 (3)3つの点数を受け取って、3つの点数の合計点と平均点を算出するユーザー関数を作成し使用する。また、合計点は整数、平均点は実数で算出する。 (4)合計点と平均点の表示はmain関数で行い、<実行例(1)(2)>のように表示する。 そのとき、合計点は全4桁、平均点は全6桁小数点以下1桁で表示する。 <実行例(1)> 点数: 80↓ 点数: 65↓ 点数: 98↓ 合計点 243 平均点 81.0 <例実行(2)> 点数: 80↓ 点数: -1↓ 点数: 98↓ 点数は0以上で入力してください よろしくお願いします

  • C言語が分からないので分かる方説明お願いします

    C言語が分からないので分かる方説明お願いします #include<stdio.h> int main(void) { int i; int tensu[5]; int sum=0; printf(”点数を入力してください。”); for(i=0;i<5;i++){ printf(”%2d番:”,i+1); scanf(”%d”,&tensu[i]); sum+=tensu[i]; } printf(”合計点:%5d¥n”,sum); printf(”平均点:%5.1f¥n”,(double)sum/5); return(0); } 実行すると 点数を入力してください。 1番:95 2番:83 3番:85 4番:63 5番:89 合計点:415 平均点:83.0 できるだけ詳しく教えてください

  • 3つの条件のうち、2つを満たす人の人数を数える関数

    こんにちは。 とっても困っているのでよろしくお願いします! 例えば、クラスの生徒の試験3科目の点数を入力して、 3科目のうちどれでも2科目は50点以上の生徒の人数を 数えたい場合、数式はどのようになりますか? つまり、3つの条件のうち2つを満たす人の 数え方の関数を教えて下さい! どうぞよろしくお願いいたします。

専門家に質問してみよう