почему моя программа никогда не достигает метода solve?

#java #inputstream

#java #входной поток

Вопрос:

извините, если это глупый вопрос, но я новичок в использовании StreamTokenizer, я пытаюсь решить это это упражнение, пожалуйста, помогите мне, я не знаю, что не так в моей программе, которая никогда не достигает моего метода solve, он также никогда не завершается, я уже спрашивал на форуме timus, но я знаю, что здесь быстрее получить ответы

 import java.io.*;

public class Prueba {
    static int index = 0;
    static double[] l = new double[131072];

    public static void main(String args[]) throws IOException {
        StreamTokenizer str = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        while (((str.nextToken() != StreamTokenizer.TT_EOF))) {
            if (str.ttype == StreamTokenizer.TT_NUMBER) {
                l[index  ] = str.nval;
                //System.out.println(str.nval);
                // System.out.println(l[0]);
                // System.out.println(l[1]);
            }
        }
        solve();
    }

    public static void solve() {
        double res;
        for (int i = index - 1; i >= 0; i--) {
            res = Math.sqrt(l[i]);
            System.out.println(String.format("%.4fn", res));
        }
    }
}
  

Комментарии:

1. Что произойдет, если вы пройдетесь по своему коду в отладчике? Это был бы самый быстрый способ определить, в чем проблема.

2. Если вы никогда не достигнете вызова solve() , то ваш while цикл, должно быть, не заканчивается…

3. Как вы запускаете программу? Вы перенаправляете файл на стандартный ввод или вводите ввод вручную?

4. ввод вручную, так что, возможно, это ошибка

Ответ №1:

Вы читаете из стандартного ввода, и ваш код повторяется до тех пор, пока не получит TT_EOF . Чтобы ввести TT_EOF в свою программу, вам нужно нажать Ctrl-D , если вы используете Unix, или Ctrl-Z затем Enter , если вы используете Windows.

Комментарии:

1. Это не завершает цикл, я просто хочу ввести до 16 МГ, а затем показать ответы (метод solve)

2. @GeorgeBecj: break выходит из while , как только index достигнет 16.

3. Я добавляю if (index> =16){break;} и цикл завершается, а также он показывает выходные данные метода solve, спасибо, но я действительно могу понять, как завершить этот цикл

4. Я уже понимаю, о чем говорит проблема, в ней может быть много чисел до конца файла, поэтому судья оценит это

Ответ №2:

Вы ждете от System.in он блокируется при чтении, следовательно, вы никогда не доберетесь до EOF, поэтому цикл while продолжит ждать ввода.

Комментарии:

1. итак, как я могу завершить цикл?

Ответ №3:

Как бы то ни было, вам нужно либо передать файл из командной строки, либо ввести текст на консоли, за которым следует символ EOF. Нажатие Ctrl Z генерирует EOF в Windows, а нажатие Ctrl D генерирует EOF в Unix / Linux.

РЕДАКТИРОВАТЬ: Если ваш ввод состоит из одной строки, вы можете проверить наличие TT_EOL вместо TT_EOF. Вы должны вызвать eolIsSignificant(true) перед входом в цикл. Это гарантирует, что конец строки обрабатывается как отдельный токен

Комментарии:

1. Это не завершает цикл, я просто хочу ввести до 16 МГ, а затем показать ответы