どうも多浪Fランぼっち底辺大学生です。
今回は【配列を用いて最高点・最低点・平均点を求める】プログラムを作成していきます。
配列や関数について基礎知識が不足している人は、理解以前の問題があります。
以下のリンクから自分に合った参考書を購入して学習を進めてみてはどうでしょうか?

Contents
仕様
想定する仕様としては以下とします。
- 任意の人数を入力
- 人数分の点数を入力(0~100の間とする)
- 最高点と最低点と平均点の3つを求め出力する
そして、同じような処理を一まとめにした関数を作成をします。
→void get_point(int array , int num);
→void erro_message(int point);
→int get_max(int array[] , int num);
→int get_min(int array[] , int num);
→double get_ave(int array[] , int num);
まぁ、「良く分からんwww」と思っている人も居ると思います。だから、なるべく詳しく説明を施していこうと思っています。
じゃけん(邪剣)見て逝きましょうね。
取り合えずソースコード全体から見せてイクッ!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
#include<stdio.h> void get_point(int array[],int num); void error_message(int point); int get_max(int array[],int num); int get_min(int array[],int num); double get_ave(int array[],int num); #define MAXSIZE 20 int main(){ int num; //人数を格納する変数// int max,min; double ave; int array[MAXSIXE]; //配列の大きさはMAXSIZE分とする// printf("データ数を入力してください(1~20):"); scanf("%d",&n); get_point(array,num); max=get_max(array,num); min=get_min (array,num); ave=get_ave(array,num); printf("\n<結果>\n"); printf("最大値は%dです\n",max); printf("最小値は%dです\n",min); printf("平均値は%.1fです\n",ave); } //点数を配列に格納する// void get_point(int array[] , int num){ int i,point; for (i=0;i<num;i++){ do{ printf("NO.%d",i+1); scanf("%d",&point); //もし点数が0~100の間でないなら// if (point<0 || point>100){ erro_message(point); //エラーメッセージの表示// } //そうでないなら配列に格納// else{ array[i]=point; } } }while(point<0 || point>100); } //エラー表示// void erro_message(point){ if (point<0){ printf("入力ミス:%dは0未満です\n",point); } else if (point>100){ printf("入力ミス:%dは100をこえています\n",point); } } } //最高点を求める// int get_max(int array[] , int num){ int i,max; max=array[0]; //仮の最高点をarray[0]とする for (i=1;i<num;i++){ if (max<array[i]){ max=array[i]; } } return max; } //最低点を求める// int get_min(int array[],int n){ int i,min; min=array[0]; for (i=1;i<n;i++){ if (min>array[i]){ min=array[i]; } } return min; } //平均点を求める// double get_ave(int array[],int num){ int i,sum=0; for (i=0;i<n;i++){ sum+=array[i]; } return (double)sum/num; } |
っと、こんな感じですね(-ω-)/
ソースコードを見て”分からない箇所”が無ければOKです。

もし、分からないのであれば説明を綴っていくので見て下さいね。
void get_point(int array[] , int num);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void get_point(int array[] , int num){ int i,point; for (i=0;i<num;i++){ do{ printf("NO.%d",i+1); scanf("%d",&point); //もし点数が0~100の間でないなら// if (point<0 || point>100){ erro_message(point); //エラーメッセージの表示// } //そうでないなら配列に格納// else{ array[i]=point; } } }while(point<0 || point>100); } |
これは人数分の点数を配列に格納する関数です。
点数(num)が0~100の間ならば配列に格納し、そうでないならばerro_message関数を実行しエラー文を表示して、再度値の読み込みを行っていますね(‘ω’)ノ
whileとdo whileの違い
whileとdo whileはどちらも繰り返し(ループ)処理に違いはありません。
しかし、別のところで違いがあるんですよね。
一周目から条件に当てはまるかどうかを判定して実行する
一周目は条件を無視して実行する
ここでは、point変数に値が入っていない初期化の状態で条件判定を行ってしまうとエラーが起きてしまいます。なのでdo whileとするのです。
void error_message(int point);
1 2 3 4 5 6 7 8 |
void erro_message(point){ if (point<0){ printf("入力ミス:%dは0未満です\n",point); } else if (point>100){ printf("入力ミス:%dは100をこえています\n",point); } } |
get_point関数内で入力した値(point変数に格納した値)が0~100に収まっていない場合、error_message関数を呼び出しメッセージを表示します。
error_message関数の中でpointに格納された値が0未満の時は「~~は0未満です」として、100より大きい時は「~~は100を超えています」と表示しています。
int get_max(int array[] , int num);
1 2 3 4 5 6 7 8 9 10 11 |
int get_max(int array[] , int num){ int i,max; max=array[0]; //仮の最高点をarray[0]とする for (i=1;i<num;i++){ if (max<array[i]){ max=array[i]; } } return max; } |
配列arrayに格納された値同士を大小比較します。
まず、仮の最高点max変数にarray[0]を格納しておきます。そしてソースコードの様に比較していき、maxの値を更新していきます。
以下(↓)の様な感じで最大値を判別していきます
ex) array[5]={6,3,9,10,1}とすると
max=6 //仮の最高点
× max<3 — max=6
〇 max<9 — max=9
〇 max<10 — max=10
× max<1 — max=10
array[5]の中の最高点は10だと判る
int get_min(int array[] , int num);
1 2 3 4 5 6 7 8 9 10 11 |
int get_min(int array[],int n){ int i,min; min=array[0]; //仮の最低点// for (i=1;i<n;i++){ if (min>array[i]){ min=array[i]; } } return min; } |
get_min関数もget_max関数と同様に仮の最低点を設定し大小比較を行います。
double get_ave(int array[] , int num);
1 2 3 4 5 6 7 8 |
double get_ave(int array[],int num){ int i,sum=0; for (i=0;i<n;i++){ sum+=array[i]; } return (double)sum/num; } |
sum変数にarrayに格納された値を加算していきます。そして、それを人数で割って平均値を求めだしています。
(double)sum/numとは
1 2 3 4 5 6 7 8 |
double get_ave(int array[],int num){ int i,sum=0; for (i=0;i<n;i++){ sum+=array[i]; } return (double)sum/num; } |
sumの前に(double)が付いています。これを”キャスト”と言います。
キャストを使うことで変数の型を変換することが出来ます。
ここでは、sumはint型ですがキャストを用いてdouble型に変換することで、平均点を小数点を含む値まで求めることが出来るんですね(‘ω’)ノ
おわり
以上が【配列を使って最高点・最低点・平均点を求める】プログラムの説明でした。
今後もこのような知識が役に立ってくるはずなので、しっかりと身に付けましょう。