ヒント

1.必要になる変数と初期化

1)キーボードから受け取った値を入れる「入力値変数 x」 (整数型)
2)値を何回受け取ったかをかぞえる「カウンタ変数 count」 (整数型)
  初期値は0でなければならない
3)合計を入れる「合計値用変数」 (整数型 sum)
  初期値は0でなければならない
4)平均を入れる「平均値用変数」 (浮動小数点型 average)

2.素朴な考え方

この作業はつぎの3つから成り立っている

1)変数をクリアする

「カウンタ変数 count」と「合計値用変数 sum」を0にする

2)値をキーボードから複数受け取る作業(負の値が入力されたら終わる)

以下の4つの作業をループ
 1: 値を1つキーボードから受け取り,「入力値用変数 x」に入れる
 2:「入力値用変数」の値が正の値だったら次に進み,そうでなかったら,まとめ作業Aに移る
 3:「カウンタ変数 count」の値を1増やす
 4:「合計値用変数 sum」に「入力値用変数 x」を加える

ループ作業は無条件で継続するが,ループの途中で脱出口がある。

3)まとめ作業Aの内容

「合計値用変数 sum」の値と「カウンタ変数 count」の値から平均値を計算して,「平均値用変数 average」に入れる
「合計値用変数 sum」の値と「平均値用変数 average」を表示する

3.ループ作業は無条件で継続するが,ループの途中で脱出するプログラム

無条件ループは while(1){ ・・・  } のように書くことができる。
ループ中からの緊急抜け出しは if (xxxxx) break; と書くことができる。

while (1) {
 1: 値を1つキーボードから受け取り,「入力値用変数 x」に入れる
 2: if (「入力値用変数 x」<= 0) break;
 3:「カウンタ変数 count」の値を1増やす
 4:「合計値用変数 sum」に「入力値用変数 x」を加える
}

これをプログラムとして構成すると次のようになる。
「カウンタ変数」を0に初期化
「合計値用変数」を0に初期化

while (1) {
  1: 値を1つキーボードから受け取り,「入力値用変数 x」に入れる
  2: if (「入力値用変数 x」<= 0) break;
  3:「カウンタ変数 count」の値を1増やす
  4:「合計値用変数 sum」に「入力値用変数 x」を加える
}

「合計値用変数」の値と「カウンタ変数」の値から平均値を計算して,「平均値用変数」に入れる
「合計値用変数」の値と「平均値用変数」を表示する

このプログラムは,文法的には正しく。このままで通用する。
4.ループの途中で脱出するプログラム

「3.」で考えたプログラムは,文法的には正しく。このままで通用する。
しかし,途中脱出のあるループは,大きなプログラムの場合,読みにくいとして嫌われることが多い。
ループからの脱出はループの最上部または最下部であるべきとする考え方である。

「3.」で考えたプログラムは大枠として次の構成になっている。

ループ前作業
while (1) {
  作業A
  if (xxxx) break;
  作業B
}
ループ後作業

このプログラムは次の形に変形できる。

ループ前作業
作業A
while (1) {
  if (xxxx) break;
  作業B
  作業A
}
ループ後作業
さらに次の形に変形できる。
ループ前作業
作業A
while (yyyy) {
  作業B
  作業A
}
ループ後作業

こうすると,作業Aを2回記述することにはなるが,ループからの脱出をループの最上部にすることができる。
プログラムとして構成すると次のようになる。

「カウンタ変数」を0に初期化
「合計値用変数」を0に初期化

1: 値を1つキーボードから受け取り,「入力値用変数」に入れる

while(「入力値用変数」の値が正の値だったら){   ←ここが2:
   3:「カウンタ変数」の値を1増やす
   4:「合計値用変数」に「入力値用変数」を加える
   1: 値を1つキーボードから受け取り,「入力値用変数」に入れる
   (次の作業のために,値を1つキーボードから受け取る)

「合計値用変数」の値と「カウンタ変数」の値から平均値を計算して,「平均値用変数」に入れる
「合計値用変数」の値と「平均値用変数」を表示する