我有点困惑为什么我需要在这篇文章中使用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
}
}
答案 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循环,我将进入一些非常基本的编程概念。如果我遇到这种方式,我不是故意屈尊俯就:我只是不知道你的编程技能水平,所以我假设你是新手。
首先,让我解释一下循环条件的概念。循环条件是在程序运行时评估的代码,可以是true
或false
。因此,在常规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 < 0
为false
,循环不会重复。
那么,关于System.in.read()
如何运作。你说得对,它会缓冲输入,直到达到换行符。但你真的知道这意味着什么吗?
这是它的工作原理。你开始在控制台中输入内容。假设您键入aabbcc
,然后按Enter键。您的程序在调用System.in.read()
时等待,直到用户输入被发送回程序。虽然输入第一个a
时它不会继续运行!只有按Enter键,您的程序才会继续运行(即发送换行符)。
缓冲输入的想法是,一旦程序重新开始运行,您输入的所有字母都将被存储并可用。因此,当您输入aabbcc
后运行程序时,所有这些字母都可用(以及您按下的回车键的换行符)。
使用您的代码,这意味着您第一次拨打System.in.read()
时,会收回字符a
,但仍有abbcc
和换行符等待。它进入循环并读取每个字符。因此,它会显示a
,然后是b
,然后是b
,然后是c
,然后是c
,然后是新行。此时循环条件为false
,循环结束。