2011-05-13 72 views
0

对不起,如果它的一个愚蠢的问题,但我是一个初学者使用StreamTokenizer,我试图解决这个练习this,请帮助我,我不知道我的程序中有什么问题,永远达不到我的解决方法,它也永远不会完成,我已经问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("%.4f\n", res)); 
     } 
    } 
} 
+1

如果在调试器中逐句通过代码,会发生什么情况?这将是确定问题出在哪里的最快捷方式。 – 2011-05-13 16:01:04

+0

如果您从未接触过对“solve()”的调用,那么您的'while'循环一定不能结束... – 2011-05-13 16:01:37

+0

您如何运行该程序?您是将文件重定向到标准输入,还是手动输入输入? – sjr 2011-05-13 16:02:54

回答

4

您正在阅读标准输入,并且您的代码循环显示,直到获得TT_EOF。要将TT_EOF添加到您的程序中,如果您使用的是Unix,则需要按Ctrl-D;如果您使用的是Windows,则需要按Ctrl-Z然后按Enter

+0

它没有完成循环,我只是想输入,直到16 MG然后显示答案(解决方法) – bentham 2011-05-13 16:10:32

+0

@GeorgeBecj:只要'索引'达到16,''break'出'while'。 – NPE 2011-05-13 16:19:04

+0

我加if (index> = 16){break;}并且循环结束,并且它显示了solve方法的输出,谢谢但我真的可以理解如何完成这个循环 – bentham 2011-05-13 16:30:21

3

您正在等待System.in,它是阻塞读,故我,你永远不会得到EOF所以您在循环将继续等待输入。

+0

那么我该如何完成循环? – bentham 2011-05-13 16:03:42

1

事实上,您需要从命令行输入文件,或者在控制台上输入文本,然后输入EOF字符。按Ctrl + Z在Windows中生成EOF,按Ctrl + D在Unix/Linux中生成EOF。

编辑:如果您的输入是单行,您可以检查TT_EOL而不是TT_EOF。 您必须在进入循环之前致电eolIsSignificant(true)。这将确保将行尾处理为单独的令牌

+0

它没有完成循环,我只是想输入,直到16 MG然后显示答案 – bentham 2011-05-13 16:10:14

相关问题