8、Java控制结构
8.1 顺序控制:从上到下顺序执行
8.2 分支控制(if,else,switch)
-
单分支结构(if)
-
双分支结构(if…else)
-
多分支结构(if…else if…else if…else)(斜体else可以没有)
-
switch…case(break):若case中没有break,则会产生穿透效应,即后面的case不需要判断也会执行,直至有break为止
switch(表达式)里表达式返回值必须是(byte ,short ,int ,char ,enum ,String),表达式数据类型必须和case后常量类型一致
Scanner scanner = new Scanner(System.in); System.out.println("请输入月份"); int month = scanner.nextInt(); switch (month){ case 3: case 4: case 5: System.out.println("春天"); break; case 6: case 7: case 8: System.out.println("夏天"); break; case 9: case 10: case 11: System.out.println("秋天"); break; case 12: case 1: case 2: System.out.println("冬天"); break; default: System.out.println("输入不正确"); }
8.3 循环控制(for ,while ,dowhile ,多重循环)
- for(循环变量初始化 ; 循环条件 ; 循环变量迭代){循环语句;}
-
循环条件是返回Boolean值的表达式
-
for(; 循环条件 ;)中循环变量初始化和循环变量迭代可以写到其他地方,但是两边的分号不可省略
-
for(;;)表示无限循环
-
循环变量初始化可以有多个初始化语句,但要求类型一致,并且中间用逗号隔开;循环变量迭代也可以有多条语句,用逗号隔开
for(int i = 0,j = 10;i<=10&&j>=5;i++,j--){ }
-
while(循环条件){循环语句 ; 循环变量迭代}
- 循环条件是Boolean值表达式
- 先判断再执行
-
do{循环体 ; 循环变量迭代 ; }while(循环条件);
- 循环条件是Boolean值表达式
- 先执行再判断
- 嘴都有一个分号别忘了
- 多重循环控制:将一个循环放在另一个循环体内
//九九乘法表
for(int i = 1;i<10;i++){
for(int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+(i*j)+"\t");
}
System.out.println();
}
练习:打印空心菱形
/** totalLevel-1 个空格
* * 1个* 5
* *** 3个* 4
* ***** 5 3
* ******* 7 2
* ********* 9 1空格
* *********** 11 0空格
* 2i-1个*
*
*
* *
* * *
* * *
* * *
* * *
* * *
*
*
*/
Scanner scanner = new Scanner(System.in);
System.out.println("输入菱形层数:");
int totalLevel = scanner.nextInt();
int uptotalLevel = totalLevel/2;
int untotalLevel = totalLevel/2-1;
for (int i = 1; i<=uptotalLevel;i++) {
for (int k = 1; k <= uptotalLevel - i; k++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
if (j == 1 || j == 2 * i - 1) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
/** untotalLevel=totalLevel/2-1 2*(untotalLevel-m)+1 m-1
* ********* 9 星号 0 空格
* ******* 7 1
* ***** 5 2
* *** 3 3
* * 1 4
*/
for(int m=1;m<=untotalLevel;m++){
for(int p = 1;p<=m;p++){
System.out.print(" ");
}
for(int n = 1;n<=2*(untotalLevel-m)+1;n++){
if(n==1||n==2*(untotalLevel-m)+1){
System.out.print("*");
}
else{
System.out.print(" ");
}
}
System.out.println();
}
8.4 break
-
退出循环,继续执行后面的语句
-
break语句出现在多层嵌套的语句块中,可以通过标签指明要终止的是哪一层语句块(正常情况下不用break标签来跳跃)
for1: for(int i = 0;i<=5;i++){ for2: for(int j= 0;j<10;j++){ if(j==2){ break for1;//直接退出for1循环 } System.out.print(j); } } System.out.println("over"); //输出:01over
-
若果没有指定break,则默认退出最近的循环体
8.5 continue
-
跳过本次循环,进入下一次循环
-
continue后也可以通过标签指明跳转到哪一层语句
label1: for(int i = 0;i<=2;i++){ label2: for(int j= 0;j<4;j++){ if(j==2){ continue label1;//进入label1循环 } System.out.print(j); } } System.out.println("over"); //输出:010101over
8.6 return
-
表示跳出所在的方法,若使用在main方法时,退出程序
label1: for(int i = 0;i<=2;i++){ label2: for(int j= 0;j<4;j++){ if(j==2){ return;//直接退出方法 } System.out.print(j); } } System.out.println("over"); //输出 :01
练习
class Work1{
/**
* 初始100000元,每次经过一次路口,需要缴费,规则如下:
* 1.当现金>50000时,每次交5%
* 2.当现金<=50000时,每次交1000
* 可以经过多少次路口
* 参考答案:62次
*/
public void work1(){
double money = 100000;
int road = 0;
while(money>1000){
if(money>50000){
money = 0.95 * money;
road++;
}
else{
money -=1000;
road++;
}
}
System.out.println("money:"+money);
System.out.println("可以经过"+road+"次路口");
}
}
class Work2{
//判断水仙花数
public void work2(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入三位数整数:");
int number = scanner.nextInt();
int a = number/100;
int b = number/10%10;
int c = number%10;
if(Math.pow(a,3)+Math.pow(b,3)+Math.pow(c,3)==number){
System.out.println(number+"是水仙花数");
}
else{
System.out.println(number+"不是水仙花数");
}
}
}
class Work3{
//交替打印a-z和A-Z
public void work3(){
for(char c1 = 'a';c1<='z';c1++){
System.out.print(c1+" ");
System.out.print((char)(c1-32)+" ");
}
System.out.println();
}
}
class Work4{
//求1-1/2+1/3-1/4...+1/99-1/100
//参考答案:0.688172179310195
public void work4(){
double result = 1;
double num = 1;
for(int i=2;i<=100;i++){
if(i%2==1){
result += num/i;
}
else if(i%2==0){
result -= num/i;
}
}
System.out.println("result:"+result);
}
}
class Work5{
//求1+(1+2)+(1+2+3)+(1+2+3+4)+...+(1+2+3+...+100)的结果
//参考答案:171700
public void work5(){
int result = 0;
int temp = 0;
for(int i = 1;i<=100;i++){
if(i==1){
result+=i;
temp+=i;
}
else{
temp+=i;
result +=temp;
}
}
System.out.println(result);
}
}