複数回入力


何かの値が入力されるまで入力を受け付けるという形式は、プログラミングの問題で多くみられます。

その後、合計・平均・最大値等の集計処理へ繋がることも多いです。

1.複数回入力の基本


複数回入力を実現するためには、while文の条件式を利用します。

下記は「『0』が入力されるまでの入力値(整数)の合計を求める」プログラムです。


複数回入力1(C)



#include <stdio.h>
int main(void){
    int num, sum = 0;

    printf("整数(終了時は0)を入力:");
    scanf("%d", &num);
    while(num != 0){
        sum = sum + num;
        scanf("%d", &num);
    }

    printf("入力値の合計:%d\n", sum);
    return 0;
}

複数回入力1(Java)

import java.util.Scanner;
public class InputNums{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int num, sum = 0;

        System.out.print("整数(終了時は0)を入力:");
        num = sc.nextInt();
        while(num != 0){
            sum = sum + num;
            num = sc.nextInt();
        }

        System.out.println("入力値の合計:" + sum);
    }
}


実行結果(例)

整数(終了時は0)を入力:5

-2

7

0

入力値の合計:10

2.複数回入力とdo-while文・break文


複数回入力1の場合でも良いのですが、while文では見ての通り、標準入力の文が2回必要になります。

プログラムを短くするためには、後で条件判定を行う「do-while文」を使うという方法があります。

下記は、「複数回入力1」の入力処理部分6行(7~12行目)をdo-while文で書き換えたものです。実行結果は「複数回入力1」と同じになります。


複数回入力2(C)

    printf("整数(終了時は0)を入力:");
    do{
        scanf("%d", &num);
        sum = sum + num;
    } while(num != 0);

複数回入力2(Java)

        System.out.print("整数(終了時は0)を入力:");   
        do{
            num = sc.nextInt();
            sum = sum + num;
        } while(num != 0);


ただ、do-while文は常に使えるわけではありません。

do-while文は後で条件判定を行うため、入力を終わらせるために入力した値(今回は0)も処理されてしまうからです。

今回は、0が入力されるまでの入力値を合計する処理であるため、最後に0が足されても何の支障もありませんが、問題によっては間違った処理になってしまう場合もあるので、注意が必要です。

例えば、「-1が入力されるまでの合計を求める」プログラムの場合、出力される合計は実際の合計 - 1になってしまいます。

なお、無限ループの中でbreak文を使うという方法でも、標準入力の文が1つで済みます。

break文には、終了条件が分かりやすいというメリットもあります。

下記は、「複数回入力1」の入力処理部分6行(7~12行目)をbreak文を使った場合で書き換えたものです。実行結果は「複数回入力1・2」と同じになります。


複数回入力3(C)

    printf("整数(終了時は0)を入力:");
    while(1){
        scanf("%d", &num);
        if(num == 0){
            break;
        }
        sum = sum + num;
    }

複数回入力3(Java)

        System.out.print("整数(終了時は0)を入力:");   
        while(true){
            num = sc.nextInt();
            if(num == 0){
                break;
            }
            sum = sum + num;
        }


break文直後にループから抜けるので、足し合わせていく処理は行われません。

終了時の「0が入力された時」という条件も分かりやすいですね。