计算输入字符的次数 - Do-While循环Java

时间:2014-06-05 21:34:13

标签: java for-loop increment do-while

我有点困惑为什么我需要在这篇文章中使用do-while循环。我要做的是计算用户输入字符的次数。当用户键入“。”时,计数应该停止。当我尝试在没有do-while的情况下运行程序时,x的计数乘以3.我在线阅读控制台输入是行缓冲的。我理解它的方式是一个整行是由一个角色创建的,因此实际上有更多的角色?我的理解是否正确?如果可能的话,我可以解释一下do-while循环吗?

public class readCharLengths {
public static void main(String args[]) 
    throws java.io.IOException {
        char typed, ignore;
        int x=0;  
        for ( ; ; ) {      //infinite loop to keep reading in values

            typed = (char) System.in.read();      //get typed character

            do {                                    //confused here
            ignore = (char) System.in.read();       //confused here
            } while (ignore != '\n');               //confused here

                    if (typed =='.') break;       //break loop when . is typed
            x++;                                  //increment x

        }

     System.out.println("The number of characters is: " + x);   //print x

}
}

3 个答案:

答案 0 :(得分:1)

这取决于用户如何向控制台提供输入的环境。如果他们一次插入一个字符,每个字符在一个单独的行上。或者,如果他们输入一串字符,基本上就像一个句子,然后计算字符数,直到达到一个句号。

如果每行一个字符,我建议:

    int x = 0;
    Scanner in = new Scanner(System.in);
    while (true) {
        String input = in.nextChar();
        if (input.equals('.') {
            break;
        } else {
            x++;
        }
    }

如果是一串字符,我建议:

    int x = 0;
    Scanner in = new Scanner(System.in);

    String input = in.nextLine();

    for (int i=0; i<input.length(); i++) {
        if (input.charAt(i).equals('.') {
            break;
        } else {
            x++;
        }
    }

答案 1 :(得分:0)

嗯,关于这一点有几件事。

首先,这可能不会做你想要的,因为do / while循环将消耗第一个之后的每个字符,而不会递增计数器直到它到达LF。因此,假设您键入至少一个字符,然后按Enter键,您的计数将始终为1,并且do / while循环就位。但是,如果您的意图是允许用户一次只输入一个字符(后跟Enter),则查看第二个项目。

其次,控制台输入默认为缓冲,直到您按Enter键。所以,如果你把do / while循环输出,输入一个字符然后按Enter,你实际上会在Windows上得到三个字符 - 你输入的字符,CR和LF。假设您正在使用单个字符进行测试,则可以将乘法解释为3。

答案 2 :(得分:0)

要回答做什么...... while循环,我将进入一些非常基本的编程概念。如果我遇到这种方式,我不是故意屈尊俯就:我只是不知道你的编程技能水平,所以我假设你是新手。

首先,让我解释一下循环条件的概念。循环条件是在程序运行时评估的代码,可以是truefalse。因此,在常规while循环的情况下,格式为:

while (loop condition) {
    run some code, maybe multiple times
}

当你的代码到达while代码行时,它会评估条件并决定是否在循环的大括号内运行代码。

假设你的条件是“x必须小于5”。您可能有while这样的循环:

int x = 0;
while(x < 5) {
   System.out.println("A");
   x++;
}

此代码将在5行打印A,因为x = 0在第一次到达while语句时,并且由于0 < 5计算为true,循环的代码将执行。到达循环结束时,它会跳转到循环条件并再次进行评估。这一次,x = 1,因为我们在x中添加了1。从1 < 5开始,循环再次发生。这种情况总共发生了5次,然后在评估循环条件时,您尝试5 < 5,即false。它会跳过循环代码并在此时继续执行程序。

一个do ... while循环基于相同的想法。不是在循环开始时检查循环条件,而是在结束时检查它。所以......

int x = 0;
do {
  System.out.println("A");
} while(x < 0);

此代码将输出一次。即使不满足循环条件(因为x从0开始),当你使用do ... while时,循环代码总是至少执行一次。在循环结束时,将检查条件,并且由于0 < 0false,循环不会重复。


那么,关于System.in.read()如何运作。你说得对,它会缓冲输入,直到达到换行符。但你真的知道这意味着什么吗?

这是它的工作原理。你开始在控制台中输入内容。假设您键入aabbcc,然后按Enter键。您的程序在调用System.in.read()时等待,直到用户输入被发送回程序。虽然输入第一个a时它不会继续运行!只有按Enter键,您的程序才会继续运行(即发送换行符)。

缓冲输入的想法是,一旦程序重新开始运行,您输入的所有字母都将被存储并可用。因此,当您输入aabbcc后运行程序时,所有这些字母都可用(以及您按下的回车键的换行符)。

使用您的代码,这意味着您第一次拨打System.in.read()时,会收回字符a,但仍有abbcc和换行符等待。它进入循环并读取每个字符。因此,它会显示a,然后是b,然后是b,然后是c,然后是c,然后是新行。此时循环条件为false,循环结束。