今度は、代表的な「整数データを入力していき、合計と平均を求める」プログラムです。合計・平均プログラムは、そのまま売り上げの合計・平均プログラムに利用できるので、しっかりと学習しましょう。
<プログラムの流れ>
フローチャートは、次のようになります。
<データの終わりを判定する方法>
キーボードからの入力も繰り返しに含むような繰り返し処理の場合、キーボードからの入力で、データの終わりを何にするかは、プログラマが決めることですが、一般的な方法として次の2種類が考えられます。・ある決めた値を判定条件にする・^Z(「コントロール」キー+「Z」キー)を押す
まず自分で決めた値を判定条件にする場合を、詳しく説明していきます。
<特定の入力データ>
このプログラムのループ条件は、9行目にあるように、suuti!=-99 ・・・入力データsuutiが-99でない間ループしろということになっています。これは別の表現をすれば、
入力データsuutiが-99になったらループ終了を意味します。また、終了条件の値は-99の他に自由に設定できます。ただし、他の入力データと重ならないような値に設定にしなければなりません。
<値の塗り替え>
また、このループ条件のポイントとなる変数suutiの値(入力データの値)は、ループ範囲の中の実行文のどれかで、毎回のループごとにその値が更新されるという形に記述されていなければなりません。このプログラムではループごとにscanf("%d",&suuti);を実行して、変数suutiに新しい数値を読み込んでいます。
この変数suutiの値の塗り替えを行わずに、
といったプログラムを書くと、変数suutiの値が最初のままで変化しないので、終了条件-99がsuutiに入らなくなり、無限ループになってしまいます。
<scanfの2度読み>
また、このプログラムのではwhile(ループ)の中でscanfを行う前に、8行目でもscanfを行っている点に注意して下さい。このように入力を2度行う処理を2度読みといいます。2度読みは、データの入力処理の誤りを生じさせないようにするために行います。データ入力を繰り返すプログラムの場合、ループに入る前にscanfでデータを一度読み込んでおかないと、最後に終了条件として入力した-99という値までを換算してしまい、計算したデータがおかしくなります。
(※2度読みをしなくてもプログラムは作れますが、その場合にはgoukeiの初期値を99に設定しないといけません。)
特定の入力データ(たとえば-99)をデータの終わりとするプログラムの決まり文句(2度読み)は次のようになっています。
<値の初期化>
6行目は値の初期化をしています。このプログラムの場合、nの値は入力処理の回数を数えているので、最初は0にしておきます(n=0;と初期化)。また、goukeiに関しても、最初変数waには何も入っていない状態にしておく必要があるのでgoukei=0;としておきます。
では次に、2度読みをしないで済む、入力データをあらかじめ決めているEOFのプログラムを次に説明します。