配色: 字号:
《Java程序设计教程》03 Java程序基本结构
2023-05-25 | 阅:  转:  |  分享 
  
第3章 Java程序基本结构 本章学习目标 理解复合语句的概念掌握if语句、if-else语句以及switch语句等分支结构掌握while
语句、do-while语句以及for语句等循环结构掌握break和continue等跳转语句掌握分支及循环结构的相互嵌套编程学会分
析较复杂程序的执行流程3.1 复合语句在Java语言中,有简单语句和复合语句之分。一条简单语句总是以分号结束。它代表一个要执行的
操作,可以是赋值、判断或者跳转等语句,甚至可以是只有分号的空语句(;)。空语句表示不执行任何操作。而复合语句是指用大括号括起来的语
句块(block)。它一般由多条语句构成,也允许只有一条简单语句。 复合语句格式如下: { 简单语句1; 简单语句2; …
简单语句n; }比如以下例子均为复合语句: { a = 1; b = 2; } 或 {
S = 0; }复合语句在后面要学习的流程控制结构中经常用到。需要多个语句作为一个“整体”出现时就必须用大括号将其括
起来作为一个复合语句。Java程序的语句流程分为以下3种基本结构:顺序结构、分支(选择)结构以及循环结构。对于分支和循环结构,当条
件语句或循环体语句多于一条时,必须采用复合语句的形式,即用大括号将其括起来,否则系统将默认条件语句或循环体语句仅有一条,即最近的那
一条。反过来,当条件语句或者循环体语句只有一条时,则可以使用也可以不使用大括号{ },这点需注意。 3.2 顺序结构由赋值语句以
及输入输出语句构成的程序,运行时按其编写顺序自上而下,从左到右依次执行,这种结构称为顺序结构,是计算机程序执行的最普遍流程。 【例
3-1】交换两变量的值。public class Test{ public static void main(Str
ing[] args) { int a=5,b=8,c; System.out.printl
n("a,b的初始值"); System.out.println("a="+a); System.ou
t.println("b="+b); c = a; a = b; b = c;
System.out.println("a,b的新值"); System.out.println("a
="+a); System.out.println("b="+b); }}【例3-2】已知三角形的三条边长
,求它的面积。 提示:面积 = 其中,public class Test{ public static void mai
n(String[] args) { double a=3,b=4,c=5,s; //三角形的三条边
double area; //三角形的面积 s = (a+b+c)/2;
area = Math.sqrt(s(s-a)(s-b)(s-c)); System.out.println(
"该三角形的面积为:"+area); }}【例3-3】通过交互式输入三角形的边长,并计算其面积。关于这个程序,有以下几点说明
:(1) import语句的作用是告诉程序到哪些路径去寻找类,当程序用到一些系统提供的或用户自定义的类时,必须添加相应的impor
t语句。当【例3-3】中删除import语句后,再编译,将会出现下面错误提示。(2) 有些方法,在调用时必须对其进行抛出相应异常的
声明或者对其进行异常捕获,如【例3-3】中BufferedReader类的readLine()方法。如果【例3-3】中删除“thr
ows IOException”,编译时将会出现报错信息:(3) 对于语句InputStreamReader reader=new
InputStreamReader(System.in);和Buffered Reader input=new Buffered
Reader(reader); ,System.in代表系统默认的标准输入(即键盘),首先把它创建为InputStreamRead
er类的对象reader,然后再创建为BufferedReader类的对象input,将原来的bit输入变成缓冲字符输入,以接收字
符串。这点,目前只要了解并记住写法即可;(4) 语句String temp=input.readLine();的作用是从控制台获取
一行字符串,语句a = Double.parseDouble(temp); 先将字符串转换为双精度浮点数,然后赋值给变量a,par
seDouble()方法是Double类中的静态方法,必须通过“Double.”调用。3.3 分支结构 分支结构表示程序中存在分
支语句,这些语句根据条件的不同,可能执行,也可能不执行,这取决于条件表达式的取值。分支结构:单分支、双分支和多分支结构。Java语
言的单分支语句是if语句,双分支语句是if-else语句,多分支语句是switch语句,当然,也可以用switch语句构成双分支结
构,或者用if-else语句嵌套构成多分支结构。 3.3.1 单分支条件语句 单分支条件语句的一般格式是: if (布尔表达
式) { 语句; }int i=0,j=0;if (i!=j) { i++;
j++; }int i=0,j=0;if (i!=j) i++; j++;int i=0,j=0;if (i!=j)
i++;j++;{ }【例3-4】乘坐飞机时,每位顾客可以免费托运20kg以内的行李,超过部分假定按每公
斤收费1.2元的话,试编写相应计算收费的程序。程序的设计步骤:(1)数据变量 w -----行李重量(以公斤为单位) fee-
----收费(单位元) 根据数据的特点,变量的数据类型必须为浮点型,不妨都定义为float型。 (2)算法:
0 w <= 20 fee =
1.2 (w-20) w > 20 (3)由System.out.println();语句提示用户输入行李重
量,调用前面学习的交互式输入方法读取输入的行李重量、赋值给temp字符串,再将字符串转换为float型、赋值给w。 (4)用单分支
结构,对行李重量w进行判断,若超重,按标准计费,程序片段如下: . . . fee = 0; if (w>20)
fee = 1.2 (w-20); . . .import java.io.;public class Test{
public static void main(String[] args) throws IOException {
float w,fee; //以下代码为通过控制台交互输入行李重量 Input
StreamReader reader=new InputStreamReader(System.in); Buf
feredReader input=new BufferedReader(reader); System.out.
println("请输入旅客的行李重量:"); String temp=input.readLine();
w = Float.parseFloat(temp); //字符串转换为单精度浮点型 fee =
0; if ( w > 20) { fee = (float)1.2 (w-20)
; } //建议要写大括号对! System.out.println("该旅客需交纳的托运费用:"+fee+"
元"); }}【例3-5】根据年龄,判断某人是否为成年。 public class Test { public
static void main(String[] args) { byte age=20;
if (age>=18) { System.out.println("成年")
; } if (age<18) { System.out.println(
"未成年"); } } }【例3-6】已知鸡和兔的总数量,以及鸡兔脚的总数,求鸡和兔各自的数量。pu
blic class Test{ public static void main(String[] args) {
double chick,rabbit; short heads=10,feet=32;
chick = (heads4-feet)/2.0; rabbit = heads - chick;
if (chick==(short)chick && chick>=0 && rabbit>=0)
{ System.out.println("鸡有"+chick+"只");
System.out.println("兔有"+rabbit+"只"); }
}}3.3.2 双分支条件语句Java语言的双分支结构由if-else语句实现,其格式如下: if (布尔表达式)
{ 语句1; }else { 语句2; }int i=0,j=0;if (i==j)
{ i++; j++; }else { i--; j--; } int i=0,j=0;if (
i==j) { i++; j++; }else i--;j--;int i=0,j=0;if (
i==j) i++; j++;else{ i--; j--;}【例3-7】鸡兔问题的改进。public class
Test{ public static void main(String[] args) { doubl
e chick,rabbit; short heads=10,feet=33; chick = (he
ads4-feet)/2.0; rabbit = heads - chick; if (chick=
=(short)chick&&chick>=0&&rabbit>=0) { S
ystem.out.println("鸡有"+chick+"只"); System.out.prin
tln("兔有"+rabbit+"只"); } else {
System.out.println("数据输入可能有误!"); }
}}【例3-8】根据年龄,判断某人是否为成年,用双分支实现。 public class Test { public s
tatic void main(String[] args) { byte age=20;
if (age>=18) { System.out.println("成年");
} else { System.out.println("未成年");
} } }【例3-9】判断2020的奇偶性,并输出结果?public class Test{
public static void main(String[] args) { short n = 202
0; if (n%2==0) { System.out.println("2020是偶数。"
); } else { System.out.println("2020是奇数。"); }
}}【例3-10】判断并输出2020年是否为闰年?闰年的判断:能被4整除但又不能被100整除、或者能被400整除的公元年。pu
blic class Test{ public static void main(String[] args) {
boolean leapYear; short year = 2020; leapYea
r = (year%4==0&&year%100!=0) || (year%400==0); if (leapYe
ar) { System.out.println("2020是闰年。"); } else
{ System.out.println("2020不是闰年。"); } }}3.3.3 分支结构嵌套J
ava语言允许对if-else条件语句进行嵌套,常见的嵌套结构如下: if (布尔表达式1) { if
(布尔表达式2) { 语句;} } if (
布尔表达式1) { 语句1;} else if (布尔表达式2) {
语句2; } else { 语句3; }if (布尔表达式1) { if (布尔表
达式2) { 语句1;} else { 语句2;} }else { 语句3
;}请分析以下分支嵌套的程序片段: int i=1,j=2;if (i!=j) --------① {
if (i>j) --------② { i--; } --------③
else { j--; } --------④ System.out.printl
n(“i=”+i+”,j=”+j); --------⑤ }else { System.out.println(“i=
”+i+”,j=”+j); } --------⑥... --------⑦该程序片段的执行结果为: i=1,j=1
【例3-11】根据某位同学的分数成绩,判断其等级:优秀(90分以上);良好(80分以上90分以下);中等(70分以上80分以下);
及格(60分以上70分以下);不及格(60分以下)。public static void main(String[] args)
throws IOException { float score; InputStreamReader
reader=new InputStreamReader(System.in); BufferedReader i
nput=new BufferedReader(reader); System.out.println("请输入分数
:"); String temp=input.readLine(); score = Float.
parseFloat(temp); if ( score < 90) { if ( sco
re < 80) { if ( score < 70) { i
f ( score < 60) { System.out.println("分数等级为:不及格"); }
else { System.out.println("分数等级为:及格"); }
} else { System.out.println("分数等级为:中等
"); } else { System.out.println("分数等级为:良好"); }
} else { System.out.println("分数等级为:优秀"); } } 【例3-13
】假定个人收入所得税的计算方式如下:当收入额小于等于1800元时,免征个人所得税;超出1800元但在5000元以内的部分,以20%
的税率征税;超出5000元但在10000元以内的部分,按35%的税率征税;超出10000元的部分一律按50%征税。试编写相应的征税
程序。 double income,tax; … … tax = 0
; if ( income <= 1800) { System.out.println("免征
个税.");} else if (income<=5000) { tax = (income-
1800)0.2;} else if (income<=10000) { tax = (50
00-1800)0.2+(income-5000)0.35;} else { tax =
(5000-1800)0.2+(10000-5000)0.35 +(income-10000)0.5;} S
ystem.out.println("您的个人收入所得税额为:"+tax); if ( income <= 1800
) { System.out.println("免征个税.");} else if (inco
me<=5000) { tax = (income-1800)0.2;} else if (
income<=10000); { tax = (5000-1800)0.2+(income-5000)0
.35;} else { tax = (5000-1800)0.2+(10000-5000)
0.35+(income-10000)0.5;}else找不到配对的if3.3.4 switch语句Java语言多分支结构的实
现语句是switch,switch语句的一般语法格式如下: switch(表达式) { case 判断值1: 语句1;
case 判断值2: 语句2; ... case 判断值n: 语句n; [default: 语句n+1;
] }switch语句表达式的值必须为有序数值(如整型数或字符等),不能为浮点数。case语句中的判断值须为常量值,可称之为标
号,它代表一个case分支的入口,每一个case分支后面的语句可以是单条的,也可以是多条的,当有多条语句时,不需要加大括号{}将其
括起来。default子句是可选的,并且其位置必须在switch结构的末尾,当表达式的值与任何case常量值均不匹配时,就执行de
fault子句,然后就退出switch结构。若表达式的值与任何case常量值均不匹配,且无default子句,则程序不执行任何操作
,直接跳出switch结构,继续后续的程序。 【例3-14】在控制台敲入0至6的数字,输出对应的星期数(0对应星期天,1对应星期
一,依此类推)。 public static void main(String args[])throws IOException
{ int day; System.out.print("请输入星期数(0-6):") ; day=(int)(System
.in.read())-''0''; switch(day) { c
ase 0: System.out.println(day +"表示是星期日"); case 1: System.o
ut.println(day +"表示是星期一"); case 2: System.out.println(day +
"表示是星期二"); case 3: System.out.println(day +"表示是星期三");
case 4: System.out.println(day +"表示是星期四"); case 5: System.
out.println(day +"表示是星期五"); case 6: System.out.println(day
+"表示是星期六"); default: System.out.println(day+"是无效数!") ; }
}程序运行结果: switch(day) { case 0: System.out.println(day +"
表示是星期日"); break; case 1: System.out.println(day +"表
示是星期一"); break; case 2: System.out.println(day +"表示
是星期二"); break; case 3: System.out.println(day +"表示是
星期三"); break; case 4: System.out.println(day +"表示是星
期四"); break; case 5: System.out.println(day +"表示是星期
五"); break; case 6: System.out.println(day +"表示是星期六
"); break; default: System.out.println(day+"是无效数!")
; } 使用switch结构时应注意的问题 (1)允许多个不同的case标号执行相同的语句,如以下格式:
... case 常量i: case 常量j: 语句;
break; ...(2)每一个case子句的常量值必须各不相同。3.4 循环结构程序设计时,常
会遇到一些并不复杂、但要反复进行的计算:(1) 计算累加和1+2+3+…+100。(2) 计算阶乘,如10!。(3) 计算一笔钱在
银行存了若干年后,连本带息有多少?计算(1),用一条语句:sum = 1+2+3+…+100 来求解,则赋值表达式太长,改成多条赋
值语句:sum +=1; sum +=2; sum +=3; …; sum +=100;也不行,有100条语句。 Java语言引入
了3种循环结构:while、do-while以及for语句来进行这类计算,其流程如下所示: 3.4.1 while语句while
语句的一般语法格式如下: while(条件表达式) { 循环体;
} while是关键字,首先计算条件表达式的布尔值,若为true则执行循环体,然后再次计算条件表达式的布
尔值,只要是true就循环往复一直执行,直到条件表达式的布尔值为false,才退出while结构。 循环体可以是
复合语句、简单语句甚至是空语句。 一般情况下,循环体中会有修改条件表达式取值的语句,否则就可能出现“死循环”(无
限循环)。 例如,while(true);这里,循环体为空语句,而条件表达式为常量true,这就是一个死循环。
【例3-17】利用while语句实现1到100的累加。 public static void main(String[]
args) { int sum=0; //累加和变量sum int i=1; /
/ 控制变量i while(i<=100) { sum+=i;
i++; } System.out.println("累加和为:"+sum);
}(1)存放累加和的变量初始值一般赋值为0。(2)变量i既是累加数,同时又用来控制循环条件。(3)循环体语句可以合并,简写为:su
m+=i++;。鉴于代码可读性,不建议这么写。(4) while循环体语句多于一条,因此必须以复合语句形式出现,千万不能漏掉大括号
。 【例3-18】利用while语句求10的阶乘。public class Test{ public static voi
d main(String[] args) { long jc=1; int i=1; while(i<=10)
{ jc=i; i++; } System.out.println((i-1)+
"!结果:"+jc); }}本程序需注意以下两点:(1)求阶乘的积时,变量jc的初始值应赋值为1 。(2)由于阶乘的积,
结果往往比较大,要注意防止溢出,可选用取值范围大的long型。【例3-20】有一条长的阶梯,如果每步2阶,则最后剩1阶,每步3阶则
剩2阶,每步5阶则剩4阶,每步6阶则剩5阶,只有每步7阶的最后才刚好走完,问这条阶梯最少有多少阶?public class Tes
t{ public static void main(String[] args) { int i=1; while
(!(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0)) { i++;
} System.out.println("这条阶梯最少有:"+i+"阶"); } }如果想知道在1万个阶梯以内,
都有哪些阶梯数满足题意的话,可以这样改写程序: while(i<=10000) { i
f(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0) { System.out.prin
t(i+"阶 "); } i++; }运行结果:119阶 329阶 539阶 749阶 959阶
1169阶 1379阶 1589阶 1799阶 2009阶 2219阶 2429阶 2639阶 2849阶 3059阶 3269
阶 3479阶 3689阶 3899阶 4109阶 4319阶 4529阶 4739阶 4949阶 5159阶 5369阶 557
9阶 5789阶 5999阶 6209阶 6419阶 6629阶 6839阶 7049阶 7259阶7469阶 7679阶 788
9阶 8099阶 8309阶 8519阶 8729阶 8939阶 9149阶 9359阶 9569阶 9779阶 9989阶3.4
.2 do-while语句 do-while语句的语法格式如下: do { 循环体; } whi
le(条件表达式);【例3-21】假定在Bank中存款额5000元,按6.25%的年利率计算,试问过多少年后 才能连本带利翻一翻
?试编程实现之。public class Test{ public static void main(String[] args)
{ double m=5000.0; //初始存款额 double s=m; //当前存款
额 int count=0; // 存款年数 do { s
=(1+0.0625)s; count++; } while(s<2m); Sys
tem.out.println(count+"年后连本带利翻一翻!"); }}do-while语句的循环体至少要被执行一次3.4.
3 for语句 for语句的一般语法格式如下: for(表达式1;条件表达式2;表达式3)
{ 循环体;
}表达式1一般用来给循环控制变量赋初值,它仅在刚开始时被执行一次,以后就不再被执行。表达式2是一个条件表达式,根据
其取值的不同,决定循环体是否被执行,若为true,则执行循环体,然后再执行表达式3。表达式3通常用来修改循环控制变量,以免陷入死循
环,接着又判断条件表达式2的布尔值,若还为true,则继续循环,直至布尔值变为false 。 【例3-22】利用for语句实现1到
100的累加。public class Test{ public static void main(String[] ar
gs) { int sum=0; //累加和变量sum for(int
i=1; i<=100;i++) // 控制变量i { sum+=i;
} System.out.println("累加和为:"+sum); }}【例3-23】假定在Bank中存款
额5000元,按6.25%的 年利率计算,试问过多少年后才能连本带利翻一翻? 试用for语句编程实现。public class
Test{ public static void main(String[] args) { double m=50
00.0; //初始存款额 double s=m; //当前存款额 int count=0;
// 存款年数 for( ; s<2m; s=(1+0.0625)s) { count++; } S
ystem.out.println(count+"年后连本带利翻一翻!"); }}3.4.4 循环嵌套 当循环体语句中又出
现了循环语句,就构成了循环嵌套,即多重循环。循环嵌套可以是两重的、三重的甚至更多重。 【例3-24】编程实现打印以下图案:

public class Test{ public static void main(Str
ing[] args) { int i,j; // i控制行数, j控制的个数 for(i=1;i<=6;i
++) { for(j=1;j<=i2-1;j++) { Sys
tem.out.print(""); } System.out.println();
//换行 } }}3.4.5 跳转语句 break continue return 1. br
eak break语句的作用是使程序流程从一个语句块中跳出来。break语句的语法格式: break [标号];标号是可选的,如
前面介绍的switch结构程序中就没有使用标号。不使用标号的break语句只能跳出当前的switch或循环结构,而带标号的brea
k语句则可以跳出由标号指出的语句块,并从语句块的下一条语句处继续执行。因此,带标号的break语句可以用来跳出多重循环。 【例3-
25】写出以下程序执行后的输出结果。public class Test{ public static void main(St
ring[] args) { int i ,s=0; for(i=1;i<=100;i++)
{ s+=i; if(s>50) { break
;} } System.out.println("s="+s); }}s=55【例3-26】写出
以下程序执行后的输出结果。public class Test{ public static void main(Strin
g[] args) { int jc=1,i=1; while(true)
{ jc=jci; i=i+1; if (jc>100
000) //首先突破10万的阶乘 { break; } }
System.out.println((i-1)+"的阶乘值是"+jc); }}9的阶乘值是3628
80【例3-27】写出以下程序执行后的输出结果。public class Test{ public static void
main(String[] args) { int s=0,i=1; label:
while(true) { while(true)
{ if (i%2==0) { break ; }
//不带标号 if(s>50)
{break label; } //带标号 s+=i
++; } i++;
} System.out.println("s="+s); }}s=642. continue c
ontinue语句只能用于循环结构,有两种形式: 不带标号和带标号前者的功能是提前
结束本次循环,即跳过当前循环体的其他后续语句,提前进入下一轮循环。对于while和do-while循环,不带标号的continue
语句会使流程直接跳转到条件表达式的计算,而对于for循环,则跳转至表达式3,修改控制变量后再进行条件表达式2的判断。带标号的con
tinue语句一般用在多重循环中,标号的位置与break语句的标号位置类似,一般需放至整个多重循环的前面,一旦内层循环执行了带标号
的continue语句,程序流程将跳转到标号处的外层循环,对于while和do-while循环,就是跳转到条件表达式;对于for循
环,则跳转至表达式3 。 【例3-28】写出以下程序执行后的输出结果。public class Test{ public
static void main(String[] args) { int s=0,i=0; do { i++; if (i%2!=0) { continue;} s+=i; } while(s<50); System.out.println("s="+s); }}s=56【例3-29】写出以下程序执行后的输出结果。public class Test{ public static void main(String[] args) { int i,j; label: for(i=1;i<=200;i++) //查找1到200以内的素数 { for(j=2;j
献花(0)
+1
(本文系大高老师首藏)