C言語で平均身長を求めるプログラムの作り方|負数終了・入力制限・8回目無視を解説

C言語関連

C言語の学習では、for文やif文、配列、平均値計算などを組み合わせた課題がよく出題されます。特に「ユーザ入力を繰り返し受け取り、条件によって処理を分岐させる」問題は、基礎文法の理解確認として定番です。この記事では、「生徒の身長を複数入力し平均値を求めるプログラム」を題材に、負数入力による終了処理や特定回数の入力無視など、実践的な条件付きプログラムの書き方を解説します。

今回の課題条件を整理する

まずは仕様を整理すると、以下の条件になります。

条件 内容
入力回数 最大10回
入力値 浮動小数点数(float)
負数入力 その時点で終了
8回目の入力 平均計算から除外
出力 平均身長

この課題では、単純な平均計算だけでなく、「条件付きcontinue」や「break」の理解も重要になります。

C言語での実装例

以下が条件を満たす基本的なプログラム例です。

#include <stdio.h>

int main(void)
{
    float height;
    float sum = 0.0;
    float average;
    int count = 0;
    int i;

    for(i = 1; i <= 10; i++)
    {
        printf("%d人目の身長を入力してください: ", i);
        scanf("%f", &height);

        if(height < 0)
        {
            break;
        }

        if(i == 8)
        {
            continue;
        }

        sum += height;
        count++;
    }

    if(count > 0)
    {
        average = sum / count;
        printf("平均身長: %.2f\n", average);
    }
    else
    {
        printf("有効なデータがありません。\n");
    }

    return 0;
}

なぜ8回目を無視するのか

この課題のポイントは、8回目だけ平均計算に含めない点です。

例えば以下のような入力だった場合を考えます。

回数 身長 計算対象
1 170.5
2 168.0
3 172.3
8 999.9 × 無視

8回目だけはsumにもcountにも加えません。

そのため、continueを使って以降の処理を飛ばしています。

breakとcontinueの違い

初心者が混乱しやすいのが、breakとcontinueの違いです。

命令 意味
break ループを終了
continue その回だけ処理をスキップ

今回の課題では、負数入力時にbreak、8回目無視にcontinueを使っています。

変数宣言の場所に注意する理由

課題文に「変数宣言の場所に注意」と書かれている場合、古いC言語仕様を意識している可能性があります。

例えば、for文の途中ではなく、先頭付近で変数宣言する書き方です。

int i;
float height;

最近のC言語では途中宣言も可能ですが、授業環境によっては古い規格(C89など)を使っていることがあります。

初心者がよく間違えるポイント

この課題では、以下のミスが非常に多いです。

  • 8回目も平均に含めてしまう
  • countを増やし忘れる
  • 負数入力後も計算してしまう
  • 整数型(int)で宣言してしまう
  • countが0なのに平均計算する

特に「0除算」はエラー原因になりやすいので、if(count > 0)は重要です。

さらに理解を深める改良例

慣れてきたら、以下のような機能追加にも挑戦できます。

  • 最大身長・最小身長の表示
  • 入力値を配列に保存
  • 平均以外に中央値を表示
  • 不正入力チェック

こうした応用を行うことで、C言語の配列や条件分岐への理解も深まります。

まとめ

C言語で平均身長を求める課題では、単なる計算だけでなく、ループ制御・条件分岐・浮動小数点・入力終了条件など、複数の基礎知識が組み合わされています。

特に今回のような「8回目だけ無視」「負数入力で終了」といった条件付き処理は、実務プログラムでもよく使われる考え方です。

まずはbreakとcontinueの動きをしっかり理解し、実際にコンパイル・実行しながら動作確認することが上達への近道になります。

コメント

タイトルとURLをコピーしました