2

入力があります:

aN b c
a1 a2 a3 ... aN

例えば:

4 3 2
2 1 2 1 (I have here 'a' numbers, a = 4)
5 6 3
3 9 5 7 3 (I have here 'a' numbers, a = 5)
0 0 0

a または b または c が 0 になるときに入力の読み取りを停止したい。私はこれを試しました:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

public class Test {

    public static void main(String[] args) throws IOException {

        InputStreamReader converter = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(converter);
        String line = "";
        int a = -1, b = -1, c = -1;
        LinkedList<Integer> list = new LinkedList<>();

        while (a != 0 && b != 0 && c != 0) 
        {
            line = in.readLine();
            String tmp[] = line.split(" ");
            a = Integer.parseInt(tmp[0]);
            b = Integer.parseInt(tmp[1]);
            c = Integer.parseInt(tmp[2]);
            System.out.println("a = " + a + ", b = " + b + ", c = " + c);
            line = in.readLine();
            list.clear();
            tmp = line.split(" ");
            for (int i = 0; i < tmp.length; i++) {
                list.add(new Integer(Integer.valueOf(tmp[i])));
            }
            System.out.println("List = 4 3 2" + list);   
        }   
    }        
}

しかし、この簡単な入力で:

4 3 2
2 1 2 1
5 6 3
3 9 5 7 3
0 0 0

ゼロを 3 つ入力しても、プログラムは入力を待機します。それを改善する方法は?

編集:

あなたが誤解した男。入力の 2 行目 (4 行目、6 行目) を読み取る必要があるため、2 番目の readline が必要です ...

4

6 に答える 6

3

プログラムが 0 の行を読み取った後、停止する前に別の行を待機しています。

最も簡単な修正(おそらく最もクリーンではない):

while (true)
{
   line = in.readLine();
   String tmp[] = line.split(" ");
   a = Integer.parseInt(tmp[0]);
   b = Integer.parseInt(tmp[1]);
   c = Integer.parseInt(tmp[2]);
   if (a == 0 || b == 0 || c == 0)
     break;
   // ...
}
于 2013-02-07T13:12:32.023 に答える
3

次の 2 行があります。

line = in.readLine();

したがって、最初readLine()に 3 つのゼロを読み取った場合でも、残りのゼロを待ちます。breaka、b、cの少なくとも1つがゼロの場合、順序を変更するか、最初のreadlineの後に使用できます。

于 2013-02-07T13:13:34.437 に答える
2

OPが学習するのに役立つ方法で質問に答える方法は次のとおりです。

1) 問題を特定します。

「問題は、記述されたプログラムは、偶数行を読み取った後に停止する必要があるかどうかをテストするだけであることです。これは、入力を読み取っている場所を見ることで確認できます。」

2) 当面の問題を解決する方法についてヒントを与える。

「奇数行で停止できるようにしたい場合は、別のテストが必要になります...奇数行を読んだ後」.

3) その他の問題点を指摘してください。

「実際には、おそらく次のことも確認する必要があります。

  • readLine()呼び出しの結果はそうではありませんnull(これは、プログラムが入力の最後に到達したときに発生します。たとえば、Linux では ^D を入力し、Windows では ^Z を入力した場合)、
  • 1 行目、3 行目、5 行目などに少なくとも 3 つの数字があり、
  • 他にもいくつかあります。

これらをテストしないと、不正な入力が与えられたときにプログラムが例外で終了します。」


この方法で質問に答えるのは、実際には困難であり、より多くの作業が必要です (経験豊富なプログラマーにとって)。しかし、初心者がコードで考え始めることを奨励することは非常に重要です。結局のところ、それが彼らの宿題の本当の目標です。(点を取らない、完璧な解決策を生み出さない...)

于 2013-02-07T13:46:32.437 に答える
2
while (true) 
{
        line = in.readLine();
        String tmp[] = line.split(" ");
        a = Integer.parseInt(tmp[0]);
        b = Integer.parseInt(tmp[1]);
        c = Integer.parseInt(tmp[2]);
        if (a == 0 || b == 0 || c == 0) {
            break;
        }
        System.out.println("a = " + a + ", b = " + b + ", c = " + c);
        line = in.readLine();
        list.clear();
        tmp = line.split(" ");
        for (int i = 0; i < tmp.length; i++) {
            list.add(new Integer(Integer.valueOf(tmp[i])));
        }
        System.out.println("List = 4 3 2" + list);   
    } 
于 2013-02-07T13:15:08.600 に答える
1

これを試して

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class MultipleInputs {
    public static void main(String[] args) throws IOException {
        InputStreamReader converter = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(converter);
        while(true){
            String line = in.readLine();
            List<Integer> numbers = getNumbers(line);
            if(numbers.get(0) != 0 && numbers.get(1) != 0 && numbers.get(2) != 0){
                String line2 = in.readLine();
                List<Integer> numbers2 = getNumbers(line2);
                //TODO: do something with numbers2 
            } else {
                break;
            }
        }
    }
    private static List<Integer> getNumbers(String line){
        String [] strs = line.split(" ");
        List<Integer> list = new ArrayList<Integer>();
        for(String str : strs){
            try{
                list.add(Integer.parseInt(str));
            }catch (NumberFormatException e) {
                // Do nothing, just ignore the sub-string 
            }
        }
        return list;
    }
}
于 2013-02-07T13:24:58.313 に答える
0

これを試して。

while((line=in.readLine()) != null){
        String tmp[] = line.split(" ");
        a = Integer.parseInt(tmp[0]);
        b = Integer.parseInt(tmp[1]);
        c = Integer.parseInt(tmp[2]);
        if (a == 0 || b == 0 || c == 0) {
            break;
        }
        for (int i = 0; i < tmp.length; i++) {
            list.add(new Integer(Integer.valueOf(tmp[i])));
        }
}
于 2013-02-07T13:23:28.817 に答える