3.3.2switch语句
switch语句的一般形式为:
switch(<表达式>)
{
case<常量1>:
<语句1>;break;
case<常量2>:
<语句2>;break;
……
case<常量n>:
<语句n>;break;
[default:
<语句n+1>;]
}
注意:
switch后的表达式必须是byte、short、char、int或enum型。
下面是2个例子。
例3-2编写一个Application程序,接受用户输入的一个1-12之间的整数(如果输入的数据不满足这个条件,则要求用户重新输入),利用switch语句输出对应月份的天数。
importjava.io.*;
publicclassCh3Ex2
{staticinti=0;
publicstaticvoidmain(Stringargs[])
{do
{System.out.println("请输入1~12之间的一个整数:
");
BufferedReaderbr=
newBufferedReader(newInputStreamReader(System.in));
try
{Strings=br.readLine();i=Integer.parseInt(s);}
catch(IOExceptionioe)
{System.err.println(ioe.toString());
System.exit(0);
}
catch(NumberFormatExceptionnfe)
{System.out.println("输入格式错误。
");i=-1;}
}while(i<1||i>12);
switch(i)
{case1:
System.out.println("1月份有31天。
");break;
case2:
System.out.println("2月份有28或29天。
");break;
case3:
System.out.println("3月份有31天。
");break;
case4:
System.out.println("4月份有30天。
");break;
case5:
System.out.println("5月份有31天。
");break;
case6:
System.out.println("6月份有30天。
");break;
case7:
System.out.println("7月份有31天。
");break;
case8:
System.out.println("8月份有31天。
");break;
case9:
System.out.println("9月份有30天。
");break;
case10:
System.out.println("10月份有31天。
");break;
case11:
System.out.println("11月份有30天。
");break;
default:
System.out.println("12月份有31天。
");
}
}//endofmainmethod
}//endofclass
//用Scanner读整数,重写上述程序
importjava.util.*;
publicclassCh3Ex2
{publicstaticvoidmain(Stringargs[])
{inti=0;Scannerbr=newScanner(System.in);
do
{System.out.println("请输入1~12之间的一个整数:
");
try
{i=br.nextInt();}
catch(InputMismatchExceptione)
{br.nextLine();System.out.print("输入格式错误!
");i=-1;}
}while(i<1||i>12);br.close();
switch(i)
{case1:
System.out.println("1月份有31天。
");break;
case2:
System.out.println("2月份有28或29天。
");break;
case3:
System.out.println("3月份有31天。
");break;
case4:
System.out.println("4月份有30天。
");break;
case5:
System.out.println("5月份有31天。
");break;
case6:
System.out.println("6月份有30天。
");break;
case7:
System.out.println("7月份有31天。
");break;
case8:
System.out.println("8月份有31天。
");break;
case9:
System.out.println("9月份有30天。
");break;
case10:
System.out.println("10月份有31天。
");break;
case11:
System.out.println("11月份有30天。
");break;
default:
System.out.println("12月份有31天。
");
}
}//endofmainmethod
}//endofclass
例3-3利用随机数发生器产生0~9之间的整数并输出(P44)。
classCh3Ex3
{publicstaticvoidmain(Stringargs[])
{intx=(int)(Math.random()*10);//0.0≤Math.random()<1.0
System.out.println("随机数x放大10倍后的整数值:
"+x);
switch(x)
{case0:
System.out.println("case0:
"+x);break;
case1:
System.out.println("case1:
"+x);break;
case2:
System.out.println("case2:
"+x);break;
case3:
System.out.println("case3:
"+x);break;
case4:
System.out.println("case4:
"+x);break;
case5:
System.out.println("case5:
"+x);break;
case6:
System.out.println("case6:
"+x);break;
case7:
System.out.println("case7:
"+x);break;
case8:
System.out.println("case8:
"+x);break;
default:
System.out.println("default:
"+x);//break;
}
}
}
3.4循环语句
Java的循环语句有三种:
(1)while语句
(2)dowhile语句
(3)for语句
3.4.1while语句
它的一般格式为:
while(<布尔表达式>){
<循环体>
}
例3-4计算Fibonacci数列前20项的值(P46)。
Fibonacci序列的数学定义如下:
publicclassCh3Ex4{
staticfinalintMAX=20;
publicstaticvoidmain(Stringargs[]){
intf1=0,f2=1,k=0;
System.out.println("Fibonacci数列前20项是:
");
while(kSystem.out.print(""+f1+""+f2);
f1=f1+f2;
f2=f1+f2;
k+=2;
if(k%4==0)System.out.println();//一行4个数
}
System.out.println();
}
}
3.4.2do-while语句
它的一般格式为:
do{
<循环体>
}while(<布尔表达式>)
例3-5输入字符,显示其Unicode码,输入#程序结束(P49例3-10)。
importjava.io.*;
publicclassCh3Ex5
{staticcharc;
publicstaticvoidmain(String[]args)
{try
{do
{System.out.println("输入1个字符并按回车,按#结束");
c=(char)System.in.read();
System.in.skip
(2);//忽略回车及换行符
System.out.println(c+"的Unicode的值为:
"+(short)c);
}
while(c!
='#');
}
catch(IOExceptione)
{System.out.println("读错误!
");}
}
}
程序运行结果如下:
输入字符并按回车,按#结束
a↙
a的Unicode的值为:
97
输入字符并按回车,按#结束
B↙
B的Unicode的值为:
66
输入字符并按回车,按#结束
#↙
#的Unicode的值为:
35
3.4.3for语句
for循环的通用格式如下:
for(<初始化部分>;<布尔表达式>;<修正表达式>)
{
<循环体>
}
注意:
若循环次数可确定,一般用for语句,当循环次数不能确定一般用do语句或dowhile语句。
下面是2个例子。
例3-6把按升序排列的int型数组元素按降序排列。
//Ch3Ex6.java
publicclassCh3Ex6
{publicstaticvoidmain(Stringargs[])
{inta[]={1,2,3,4,5,6,7,8,9},b;
for(inti=0,j=a.length-1;i{b=a[i];a[i]=a[j];a[j]=b;}//循环4次
System.out.println(“ReducedSorting:
”);
for(inti=0;iSystem.out.print(a[i]+””);
}
}
该程序的运行结果为:
ReducedSorting:
987654321
注意:
在遍历数组或java.util.Collection时,一般用增强的for循环。
一般形式:
for(SomeTypeinst:
instArr){<循环体>}
其中,instArr可以是SomeType数组和各种泛型容器(列表、集合、队列等),
inst是任意的标识符
SomeType是元素的类型
采用增强的for循环(enhancedforloop)来改写上述例程。
publicclassCh3Ex6
{staticinta[]={1,2,3,4,5,6,7,8,9},b;
publicstaticvoidmain(Stringargs[])
{for(inti=0,j=a.length-1;i{b=a[i];a[i]=a[j];a[j]=b;}
System.out.println(“ReducedSorting:
”);
for(intelement:
a)//JDK1.5上才支持
System.out.print(element+””);
System.out.println();
}
}
例3-7编写Application程序找出所有的水仙花数并输出。
水仙花数是三位数,它的各位数字的立方和等于这个三位数本身。
例如371=33+73+13,371就是一个水仙花数。
publicclassCh3Ex7/Ch3Ex7.java有4个水仙花数
{publicstaticvoidmain(String[]args)
{inti,j,k,m=1;
for(intn=100;n<1000;n++)//循环900次
{i=n/100;//百位数
k=n%10;//个位数
j=(n-i*100)/10;//十位数
if(Math.pow(i,3)+Math.pow(j,3)+Math.pow(k,3)==n)
System.out.println("找到第"+m+++"个水仙花数:
"+n);
}
}
}
程序运行结果如下:
找到第1个水仙花数:
153
找到第2个水仙花数:
370
找到第3个水仙花数:
371
找到第4个水仙花数:
407
3.5跳转语句
break语句、continue语句、return语句等。
Java语言不支持goto语句。
1.break语句
(1)不带标号的break语句
break;//用于退出当前的循环语句或switch语句。
(2)带标号的break语句
其一般形式为:
break<标号名>;//语句块的标号
带标号的break语句表示跳出标号注明的那个语句块,进入后面的语句。
如:
for(.......)
{lable1:
for(......)
{for(......)
{..........
breaklable1;
......//该语句序列不被执行
}
.......//该语句序列不被执行
}
.......//该语句序列被执行
}
2.continue语句
(1)不带标号的continue语句
continue;//结束本次循环,进入下一轮循环。
(2)带标号的continue语句
其一般形式为:
continue标号名;//外层循环语句开始处的标号
带标号的continue语句使程序执行流程直接转入标号标明循环的下一轮循环。
下面是一个求1到100之间的所有素数(prime)的程序段,使用了带标号的continue语句。
完整的源代码见教材P57。
firstLoop:
for(inti=1;i<100;i++)
{for(intj=2;j
{if(i%j==0)continuefirstLoop;}
System.out.print(i+””);
}
3.return语句
使程序执行流程跳转到调用方法处。
它的格式如下:
return<表达式>;
表达式的值就是被调用方法返回给调用者的值。
3.6异常处理控制语句(第6章)
try
{<语句序列>}
catch(<异常类型1><参数1>)
{<语句序列1>}
...
catch(<异常类型n><参数n>)
{<语句序列n>}
[finally
{<语句序列>}]
下次课交U盘:
编写一个字符界面的Application程序,接受用户从键盘输入的10个整数,比较并输出其中的最大值和最小值。