#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 МГ, а затем показать ответы