一、输入与输出
现代的程序都使用GUI收集用户的输入,然而,编写这种界面的程序需要使用较多的工具与技术,目前还不具备这些条件。我们的第一要务是熟悉Java程序设计语言,因此我们要使用基本的控制台来实现输入输出。
- 读取输入
前面小节已经看到,将输出打印到“标准输出流”(即控制台窗口)是一件非常容易的事情,只要调用System.out.println即可。然而,读取“标准输入流”System.in 就没有那么简单了。要想通过控制台进行输入,首先需要构造一个与“标准输入流”System,in关联的Scanner对象。
Scanner in =new Scanner(System.in);
现在,就可以使用Scanner类的各种方法读取输入了。
例如,nextLine方法将读取一行输入。
System.out.println(“what`s is your name?”);
String name=in.nextLine();
在这里,使用nextLine方法是因为在输入行中有可能包含空格。
要想读取一个单词(以空白符作为分隔符),可以调用
String firstName=in.next();
要想读取一个整数,就调用nextInt方法。
System.out.print(“How old are you?”);
int age =in.nextInt();
与此类推,要想读取下一个浮点数,就调用nextDouble方法。
Scanner类定义在java.util包中。如在程序中导入:import java.util.*;
当时使用的类不是定义在基本java.lang包中时,一定要使用import指令导入相应的包。 - 格式化输出
可以使用语句System.out.print(x)将数值x输出到控制台。这条命令将以x的类型所允许的最大非0数位个数打印输出x。
例如:
double x=10000.0/3.0;
System.out.print(x);
打印:3333.3333333333335
在早期的Java版本中,格式化数值曾引起一些争议。Java 5沿用了C语言函数库中的printf方法。例如,调用
System.out.printf("%8.2f",x);
会以一个字段宽度打印x:包括8个字符,另外精度为小数点后2个字符。也就是说,这会打印一个前导的空格和7个字符,如下所示:
3333.33
可以为printf提供多个参数,例如:
System.out.printf(“Hello,%s.Next year,you`ll be %d”,name,age);
每一个%字符开始的格式说明符都用相应的参数替换。格式说明符尾部的转换符指示要格式化的数值的类型:f表示浮点数,s表示字符串,d表示十进制整数。
另外,还可以指定控制格式化输出外观的各种标志。
- 控制流程
与任何程序设计语言一样,Java使用条件语句和循环语句确定控制流程。
块作用域
块(即复合语句)是指由若干条Java语句组成的语句,并用一对大括号括起来。块确定了变量的作用域。块可以嵌套在另一个块中。
例如:
public static void main(String [ ] args){
int n;
{
int k;
}
}
但是,不能再嵌套的两个块中声明同名的变量。
例如,下面的代码就有错误,而无法通过编译:
public static void main(String []args)
{
int n;
{
int k;
int n;
}
}
**注释:**再C++中,可以再嵌套的块中重定义一个变量。在内层定义的变量会覆盖在外层定义的变量。这就有可能带来编程错误,因此Java中不允许这样做。
3.1 条件语句
在Java中,条件语句的形式为
if(condition) statement
与绝大多数程序设计语言一样,Java常常希望在某个条件为真时执行多条语句。在这种情况下,就可以使用块语句,形式为
if(condition)
{
statement1
statement2
}
例如:
if(a>b)
{
max=a;
min=b;
}
在Java中,更一般的条件语句如下所示
if(condition) statement1 else statement2
例如:
if(a>b)
{
temp=a;
}else{
temp=b;
}
其中else部分总是可选的。else子句与最邻近的if构成一组。因此,在语句
if(x<=0) if (x= =0) sign=0; else sign=-1;
中else与第2个if配对。当然,使用大括号会让这段代码更加清晰:
if(x<=0) { if(x= =0) sign=0; else sign=-1;}
使用if…else if…很常见
例如:
if(a>b)
{
max=a;
min=b;
}else if(a=b){
max=min=a;
}else{
max=b;
min=c;
}
3.2 循环
当条件为true时,while循环执行一条语句(也可以是一个块语句)。一般形式如下:
while(condition) statement
如果开始时循环条件的值就为false,那么while循环一次也不执行。
例如:
while(i<100)
{
i++;
}
while循环语句在最前面检测循环条件。因此,循环体中的代码有可能一次都不执行。如果希望循环体至少执行一次,需要使用do/while循环将检测放在最后。它的语法如下:
do statement while(condition);
这种循环语句先执行语句(通常是一个语句块),然后再检测循环条件。如果为true,就重复执行语句,然后就再次检测循环条件,以此类推。
例如:
do
{
i--;
}while(i>=0);
3.3 确定循环
for循环语句是支持迭代的一种通用结构,由一个计数器或类似的变量控制迭代次数,每次迭代后这个变量将会更新。
例如:下面的循环数字1~10输出到屏幕上。
for(int i=1;i<=10;i++)
System.out.println(i);
for语句的第1部分通常是对计数器的初始化;第2部分给出每次新一轮循环执行前检测的循环条件;第3部分指定如何更新计数器。
尽管Java允许再for循环的各个部分放置任何表达式,但有一条不成文的规则:for语句的3部分应该对同一个计数器变量进行初始化、检测和更新。若不遵守这一规则,编写的循环常常晦涩难懂。
3.4 多重选择:switch语句
在处理多个选项是时,使用if/else结构显得有些笨拙。Java有一个与C/C++完全一样的switch语句。
例如:
switch(count)
{
case 1:
....
break;
case 2:
....
break;
case 3:
....
break;
case 4:
....
break;
default:
....
break;
}
switch语句将从与选项值相匹配的case标签开始执行,直到遇到break语句,或者执行到switch语句的结束处为止。如果没有相匹配的case标签,而有default子句,就执行这个子句。
警告:
有可能触发多个case分支。如果在case分支语句的末尾没有break语句,那么就会接着执行下一个case分支语句。这种情况相当危险,常常会引入错误。为此我们在程序中从不使用switch语句。
case标签可以是:
- 类型为char、byte、short、或int的常量表达式。
- 枚举常量
- 从Java7开始,case标签还可以是字符串字面量。
3.5 中断控制流程语句
break语句:可以用于退出循环语句。
continue语句:越过当前循环体的剩余部分,立刻跳到循环首部。
例如:如果将continue语句用于for循环中,就可以跳到for循环的“更新”部分。
3.6 大数
如果基本的整数和浮点数精度不够满足需求,那么可以使用java.math包中两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现任意精度的整数运算,BigDecimal实现任意精度的浮点数运算。