三.流程控制语句
1.JAVA语句分类
空语句 仅包含一个分号
表达式语句 由表达式加分号构成
赋值表达式 ++或--的前后缀形式 方法调用 对象创建表达式
声明语句 声明一个变量
标号语句 标号:语句
块语句 用一对花括号{ }将零个或多个语句括起来,也称复合语句
2.结构化程序设计的基本结构
(1)顺序结构
先执行A,再执行B
(2)选择结构:
若P为真,则执 行A,否则执行B。
若P为真,则执 行A,否则跳过A。
(3)循环结构
3.1)当型循环
当P为真,反复执行A, P为假时出循环。
3.2)直到型循环
先执行A, 再判断,若P为假,反复执行A, 直到P为真出循环。
(4) 三种基本结构总结
共同特点:单入口、单出口
三种结构之间可以是平行关系,也可以互相嵌套,通过结构之间的复合形成复杂的结构。
3.分支语句
分支语句实现程序流程控制的功能 ,即根据一定的条件有选择地执行或跳过特定的语句。
(1)if-else
if-else语法格式
if ( boolean类型表达式 ) { 语句或语句块; } if ( boolean类型表达式 ){ 语句或语句块; }else if ( boolean类型表达式 ) { 语句或语句块; }else { 语句或语句块; }
(2)switch
switch语句语法格式
switch(exp){ case const1: statement1; break; case const2: statement2; break; … … case constN: statementN; break; default: statement_dafault; break; }
注意:break的重要性
case的穿透性 :在switch语句中,如果后面不写break且已经进入程序,程序会一直往下走,不会判断case中的常量值,执行后面所有的case知道遇到break结束,或者执行完所有的case结束
例如:
public class Test { public static void main(String[] args) { int x = 6,y = 10,k = 5; switch(x % y) { case 0: k = x * y; case 6: k = x / y; case 12: k = x - y; default: k = x * y - x; } System.out.println(k); } }
结果:54
原因:case后没有break, x%y == 6 进入 case 6 得到 k = 0 ;case的穿透性进入 case 12 得到 k = -4;case的穿透性进入 default 得到 k = 54;已经到达switch,跳出switch。
4.循环语句
循环语句功能
在循环条件满足的情况下,反复执行特定代码
循环语句的四个组成部分
- 初始化部分(init_statement)
- 循环条件部分(test_exp)
- 循环体部分(body_statement)
- 迭代部分(alter_statement)
(1)for 循环
for 循环语句语法格式
for(init_statement; test_exp; alter_statement){ body_statement }
应用举例
public class ForLoop { public static void main(String args[]) { int result = 0; for(int i=1; i<=100; i++) { result += i; } System.out.println("result=" + result); } }
(2)while 循环
while 循环语句语法格式
[init_statement] while(test_exp){ body_statement; [alter_statement;] }
应用举例
public class WhileLoop { public static void main(String args[]) { int result = 0; int i=1; while(i<=100) { result+= i; i++; } System.out.println("result=" + result); } }
(3)do-while 循环
do/while 循环语句语法格式
[init_statement] do{ body_statement; [alter_statement;] } while( test_exp);
应用举例
public class WhileLoop { public static void main(String args[]) { int result = 0, int i=1; do { result += i; i++; }while(i<=100); System.out.println("result=" + result); } }
5.特殊的循环控制语句
(1) break
break语句用于终止某个语句块的执行
{ …… break; …… }
(2)contitnue
continue语句用于跳过某个循环语句块的一次执行
continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
6. 常用程序设计方法
(1)枚举法(穷举法)
“笨人之法”: 把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。
(2)迭代法
基本思想:不断由已知值推出新值,直到求得解为止。
迭代初值、迭代公式和迭代终止条件是迭代法的三要素。
例:斐波纳契数列。
前两个数都是1,第三个数是前两个数之和,以后的每个数都是其前两个数之和。
各数之间的一种递推关系,即:
Fn = Fn-1 + Fn-2,F1 = F2 =1 本
题的三要素是:
迭代初值:x=1, y=1
迭代公式:z=y+x
终止条件:共计算n-2次
2.1)累加型
2.2)阶乘型
2.3)递归法
基本思想是不断把问题分解成规模较小的同类问题,直到分解形成的问题因规模足够小而能直接求得解为止。
一般来说,使用递归的程序代码会更简捷,也更容易理解,但递归代码的执行效率却非常低,所以应尽量避免使用。
7.题目
(1)判断题
1.1 Java中的switch-case分支结构的特点是等值判断。它能用if分支结构进行改写。(T)
1.2 Java中的switch-case分支结构中,一旦控制表达式的计算结果与某个case值匹配成功,就执行完该case对应的语句块,即结束switch-case语句。(F)
1.3 在JDK1.8及以后的版本中,使用如下语句是否正确?(T)
String str="*******";
switch(str)
{
case "abc":
//...
break;
case "def":
//.....
break;
}
1.4 break语句只用于循环语句中,它的作用是跳出循环。(F)
1.5 循环嵌套是指在一个循环语句的循环体中再定义一个循环语句的语法结构。while、do…while、for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套。(T)
1.6 Java中continue语句的作用是结束本次迭代,开始下一次迭代。(T)
1.7 在switch语句中必须要有default选项。(F)
1.8 while(表达式)...语句中的“表达式”的值必须是boolean型数据。(T)
(2)单选题
2.1 假设有如下程序:
public class Demo {
public static void main(String args[]) {
boolean flag = 10%2 == 1 && 10 / 3 == 0 && 1 / 0 == 0 ;
System.out.println(flag ? "mldn" : "yootk") ;
}
}
最终执行结果是什么?
A.mldn
B.yootk
C.true
D.程序出错
2.2 编译运行以下程序后,关于输出结果的说明,正确的是( )。
public class Main {
public static void main(String[] args) {
int x = 4;
System.out.println("value is "+((x>4)?99.9:9));
}
}
A.输出结果为: value is 99.99
B.输出结果为: value is 9
C.输出结果为: value is 9.0
D.编译错误
2.3 下面代码运行结果显示( )。
double temperature = 50;
if (temperature >= 100)
System.out.println("too hot");
else if (temperature <= 40)
System.out.println("too cold");
else
System.out.println("just right");
A.too hot
B.too cold
C.just right
D.too hot too cold just right
2.4 下列语句序列执行后,k 的值是( )
int x=6, y=10, k=5;
switch( x%y ){
case 0: k=x*y;
case 6: k=x/y;
case 12: k=x-y;
default: k=x*y-x;
}
A.60
B.5
C.0
D.54
2.5 以下表达式中,()不可作为循环条件。
A.x = 10
B.y >= 80
C.inputPass == truePass
D.m !=3
2.6 while循环和 do…while循环的区别是:( )
A.没有区别,这两个结构任何情况下效果一样
B.while循环比 do…while循环执行效率高
C.while循环是先循环后判断,所以循环体至少被执行一次
D.do…while循环是先循环后判断,所以循环体至少被执行一次
2.7 在JAVA中,给定代码片段如下所示,则编译运行后,输出结果是()。
for (int i = 0; i < 10; i++) {
if (i == 10 - i) {
break;
}
if (i % 3 != 0) {
continue;
}
System.out.print(i + " ");
}
A.0
B.0 3
C.0 3 6
D.0 3 6 9
2.8 下面代码将输出( )行 "Welcome to Java"?。
int count = 0;
do {
System.out.println("Welcome to Java");
} while (count++ < 10);
A.10
B.11
C.9
D.1
2.9 分析下列代码的运行结果是什么?
void looper(){
int x=0;
one:
while(x<20) {
two:
System.out.print(++x);
if(x>3)
break two;
}
}
A.编译错误
B.0
C.1
D.2
2.10 下列选项中不属于本段代码输出结果的是( )
public class Main{
public static void main(String args[]) {
one:
two:
for(int i=0; i<3; i++) {
three:
for(int j=10; j<30; j+=10) {
System.out.println(i+j);
if(i>0)
break one;
}
}
}
}
A.10
B.20
C.11
D.21
2.11 挑错题(A,B,C,D注释标注的哪行代码有错误?)
public class Test {
public static void main(String args[]){
int m=1000;
while (m>100) //A
{
m = m--; //B
if (m == 600){ //C
continue;
m++; //D
}
System.out.println("m= "+m);
}
}
}
A.
B.
C.
D.
(3)填空题
3.1
public class E {
public static void main(String[] args) {
int x = 1,y = 6;
while (y-->0){
x--;
}
System.out.print("x = "+x+",y="+y);
}
}
x = -5 , y = -1
(4)程序填空题
4.1程序改错题:求1到5的阶乘的和
功能:求1!+2!+3!+4!+5!。
public class Test {
public static void main(String[] args) {
fun();
}
public static void fun(){
int n,j;
//float s=0.0,t=1.0;//此行语句有错误,改正后填到下侧空格内
float s = 0.0f, t = 1.0f; //填空1
for(n=1;n<=5;n++){
//s=1;//此行语句有错误,改正后填到下侧空格内
t=1; //填空2
for(j=1;j<=n;j++){
//t=t*n;//此行语句有错误,改正后填到下侧空格内
t=t*j; //填空3
}
//s+t=s;//此行语句有错误,改正后填到下侧空格内
s=t+s; //填空4
}
System.out.printf("jiecheng=%.0f\n",s);
}
}
(5)编程题
7-1 判断点是否在圆内?
编写程序,提示用户输入一个点(x,y),然后检查这个点是否在以原点(0,0)为圆心、半径为10的圆内或圆的边界上。
提示:
输入格式:
输入任意一个点的x轴和y轴坐标值,且两个值之间空格分隔。
输出格式:
若点在圆内,输出1,否则输出0。
输入样例:
4 5
输出样例:
1
代码:
import java.util.*;
public class Main
{
public static void main(String args[])
{
Scanner input=new Scanner(System.in);
double x=input.nextDouble();
double y=input.nextDouble();
if(x*x+y*y<100)System.out.println(1);
else System.out.println(0);
}
}
7-2 if-else基础训练-计算年利率
基本年利率7.7%
- 如果一年以内利率给5折
- 如果三年以内利率为7折
- 如果五年以内利率为100%
- 如果五年以上利率为1.1倍
输入一个年份,计算这个年份下的实际利率是多少?
输入格式:
输入一个整数。例如:6。
输出格式:
实际利率=8.47%
输入样例:
6
输出样例:
实际利率=8.47%
输入样例:
-1
输出样例:
error
代码:
import java.util.*;
public class Main{
public static void main(String []argc){
Scanner sc = new Scanner(System.in);
double year = sc.nextDouble();
double lilv = 0.077;
if(year <= 0)
System.out.println("error");
else {
if(year<=1)
lilv = lilv*0.5;
else if(year<=3)
lilv = lilv*0.7;
else if(year<=5)
lilv = lilv;
else
lilv = lilv*1.1;
System.out.println("实际利率="+lilv*100+"%");
}
}
}
7-3 打印99乘法表
打印99乘法表
输入样例:
不需要输入
输出样例:
在这里给出相应的输出。要求:99乘法表中,每个表达式的乘法结果长度为3。
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
代码:
public class Main{
public static void main(String []argc){
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= i; j++){
String c = String.format("%-3d",i*j);
System.out.print(i+"x"+j+"="+c);
}
System.out.println();
}
}
}
保留几位数可以用 String.format( , )或者System.out.printf()
System.out.printf("%dx%d=%-3d",i,j,(j*i));
7-4 累加求和
输入20以内的整数,编程计算k=1∑nk!,并输出计算结果。
输入格式:
输入正整数N,1<=N<=20
输出格式:
输出计算结果
输入样例:
在这里给出一组输入。例如:
20
输出样例:
在这里给出相应的输出。例如:
2561327494111820313
代码:
import java.util.*;
public class Main{
public static void main(String []args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long sum = 0;
for(int i = 1; i<=n;i++){
long jiecheng = 1;
for(int j = 1; j<=i;j++){
jiecheng = jiecheng*j;
}
sum = sum+jiecheng;
}
System.out.println(sum);
}
}
注意:jiecheng和sum两个数据为 long 类型
7-5 分解质因数
求出区间[a,b]中所有整数的质因数分解。
输入格式:
输入两个整数a,b。数据规模和约定 2<=a<=b<=10000
输出格式:
每行输出一个数的分解,形如k=a1a2a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)
输入样例:
在这里给出一组输入。例如:
3 10
输出样例:
在这里给出相应的输出。例如:
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
for (int i = a; i <= b; i++) {
if (isPrime(i))continue;
else prime(i);
}
}
public static boolean isPrime(int n) {//素数
boolean ret=true;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n%i==0){
ret=false;
break;
}
}
if (ret) System.out.println(n+"="+n);
return ret;
}
public static void prime(int n){
System.out.print(n+"=");
for (int i = 2; i <= n; i++) {
while (n%i==0&&n!=i){//从2开始除,直到与i相等就退出循环,能被i整除就输出因数i
System.out.print(i+"*");
n/=i;//n的值变为除去后的值
}
if (i==n){//退出时i等于n,输出最后结尾不带*的i
System.out.println(i);
}
}
}
}