Java第四天

Java第四天

switch分支结构

基本语法:

switch(表达式){
​ case 常量1:
​ 语句块1;
​ break;
​ case 常量2:
​ 语句块2;
​ break;
​ …
​ case 常量n:
​ 语句块n;
​ break;
​ default:
​ default语句块;
​ break;
}

基本流程及介绍:

  1. switch关键字表示switch分支
  2. 表达式对应一个值
  3. case常量1:当表达式的值等于常量1,就执行语句块1
  4. break表示退出switch
  5. 如果和case常量1匹配,就执行语句块1,如果没有匹配就继续匹配case常量2
  6. 如果一个都没匹配上就执行default
import java.util.Scanner;
public class Switch01{
	public static void main(String[] args) {
			
			Scanner myScanner = new Scanner(System.in);

			System.out.print("请输入一个字符(a-g):");
			char c1 = myScanner.next().charAt(0);
	
			switch(c1){
				case 'a':
					System.out.println("星期一");
					break;
				case 'b':
					System.out.println("星期二");
					break;
				case 'c':
					System.out.println("星期三");
					break;
				case 'd':
					System.out.println("星期四");
					break;
				case 'e':
					System.out.println("星期五");
					break;
				case 'f':
					System.out.println("星期六");
					break;
				case 'g':
					System.out.println("星期日");
					break;
				default:
					System.out.println("?");
			}
	}
}

注意事项和细节讨论

  1. 表达式数据类型,应该和case后的常量类型一致,或者是可以自动转成可以相互比较的类型,比如输入的是字符,而常量是int

  2. switch(表达式)中表达式的返回值必须是:(byte,short,int,char,enum[枚举],String)

    double c = 1.1;
    switch(c){//错误
        case 1.1://错误
            System.out.println("ok");
            break;
    }
    
  3. case子句中的值必须是常量,而不能是变量

    char c = 'a';
    char c2 = 'c';
    switch(c){
        case c2://错误
            System.out.println("ok1");
            break;
        case 'b' + 1://正确
            System.out,println("ok2");
            break;
        default:
            System.out,println("ok3");
    }
    
  4. default子句是可选的,当没有匹配的case时,执行default

  5. break语句用来执行完一个case分支后使程序跳出switch语句块;如果没有写break,程序会顺序执行到switch结尾

    char c = 'a';
    switch(c){
        case 'a':
            System.out.println("ok1");
            //break;
        case 'b'://正确
            System.out,println("ok2");
            //break;
        default:
            System.out,println("ok3");
    }
    

    换而言之,只要没有break,只要有一个case匹配到表达式的值,那么后面的case就不用再匹配了,而是会直接执行相应的语句块

switch和if的比较

  1. 如果判断的具体数值不多,而且复合byte、short、int、char、enum、String这六种类型。建议使用swtich语句
  2. 对于区间的判断,对于结果为boolean类型判断都使用if
  3. switch可以实现的 if语句都可以实现,使用哪一个就要看哪个对于解决问题的效率更高

for循环控制

基本语法
for(循环变量初始化;循环条件;循环变量迭代){
​ 循环操作;
}

说明

  1. for关键字表示循环控制
  2. for有四要素:
    (1)循环变量初始化
    (2)循环条件
    (3)循环操作
    (4)循环变量迭代
  3. 循环操作,这里可以有多条语句,也就是我们要循环执行的代码
  4. 如果循环操作语句只有一条语句,可以省略{}但是最好不要省略
for(ini i = 1; i <= 80; i++){
    System.out.println("你好");
}

细节说明

  1. 循环条件时返回一个布尔值的表达式

  2. for(;循环判断条件;)中的初始化和变量迭代可以写到其他地方,但是俩边的分号不能省略

  3. 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开

    int count = 3;
    for(int i = 0 , j = 0; i < count; i++, j += 2){
        System.out.println("i ="+ i +"j =" + j);//i = 2 j = 4;
    }
    

for编程思想(ForExercise.java)

化繁为简和先死后活

public class ForExercise{
	public static void main(String[] args) {

		int count = 0;//计数器
		int sum = 0;//总和
		int start = 1;
		int end = 100;
		int t = 9;//倍数
		for(int i = start; i < end ; i++){
			if(i % t == 0){
				System.out.println("i = "+i);
				count++;
				sum += i;
			}
		}
		System.out.println("共有" + count + "个");
		System.out.println("总和为:" + sum);
	}
}

while循环控制

基本语法

循环变量初始化;
while(循环条件){
​ 循环体;
​ 循环变量迭代;
}

int i = 1;
while(i < 10){
    System.out.println("i = "+ i);
    i++;
}

说明

  1. while循环也有四要素
  2. 只是四要素放的位置不一样

do…while循环控制

基本语法

循环变量初始化;
do{
​ 循环体(语句);
​ 循环变量迭代;
}while(循环条件);\

int i = 1;
do{
    System.out.println("i = "+ i);
    i++;
}while(i < 10);

说明

  1. do while时关键字
  2. 也有循环四要素只是位置不一样
  3. 先执行,再判断,也就是说,一定会执行一次
  4. while后面有个分号;

while 和 do…while的区别(WhileAndDoWhile.java)

public class WhileAndDoWhile{
	public static void main(String[] args) {
		int i = 1;
		while(i < 0){
			i++;
			System.out.println("i = " + i);
		}

		System.out.println("========================");
		int j = 1;
		do{
			j++;
			System.out.println("j = " + j);
		}while(j < 0);
	}
}

上面代码运行的结果只会出现j = 2

多重循环控制(难点!重点!)

介绍

  1. 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while,do…while均可以作为外层循环和内层循环。[建议一般使用两层,最多不要超过三层,否则代码的可读性很差]

  2. 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可以结束外层的当次循环,开始下一次的循环

  3. 设外层循环次数为m次,内层为n次,则内层循环体需要执行m*n次

    for(int i = 1;i <= 7; i++){
        for(int j = 1;j <= 2;j++){
            System.out.println("ok");//7*2=14
        }
    }
    

循环控制的编程思想

化死为活

题目:

  1. 统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的总分,平均分
  2. 统计三个班及格人数和不及格人数,每个班有五名学生
import java.util.Scanner;
public class MulForExercise01{
	public static void main(String[] args) {
		Scanner myScanner = new Scanner(System.in);

		double totalScore = 0;
		int passNum = 0;
		int noPassNum = 0;
		for( int i = 1; i <= 3; i++){

			double sum = 0;
			
			for(int j = 1;j <= 5;j++){
				System.out.print("请输入第" + i + "个班的第" + j + "个学生的成绩:");
				double score = myScanner.nextDouble();
				if(score >= 60){
					passNum++;
				}else{
					noPassNum++;
				}
				sum += score;
			}
			totalScore += sum;
			double pingjun = sum / 5;
			System.out.println("第"+i+"个班的总分是"+sum+"平均分是"+ pingjun);
		}
		System.out.println("三个班的总分是:"+totalScore+"平均分是:"+totalScore/3 + "及格人数:"+passNum+"不及格人数:"+noPassNum);
	}
}

上面代码是死的

下面代码是活的

import java.util.Scanner;
public class MulForExercise01{
	public static void main(String[] args) {
		Scanner myScanner = new Scanner(System.in);

		double totalScore = 0;//所有班级总分
		int passNum = 0;//及格人数
		int noPassNum = 0;//不及格人数
		int classNum = 3;//班级个数
		int stuNum = 5;//每个班的学生人数
		for( int i = 1; i <= classNum; i++){

			double sum = 0;
			
			for(int j = 1;j <= stuNum;j++){
				System.out.print("请输入第" + i + "个班的第" + j + "个学生的成绩:");
				double score = myScanner.nextDouble();
				if(score >= 60){
					passNum++;
				}else{
					noPassNum++;
				}
				sum += score;
			}
			totalScore += sum;
			double pingjun = sum / stuNum;
			System.out.println("第"+i+"个班的总分是"+sum+"平均分是"+ pingjun);
		}
		System.out.println(classNum +"个班的总分是:"+totalScore+"平均分是:"+totalScore/(classNum*stuNum) + "及格人数:"+passNum+"不及格人数:"+noPassNum);
	}
}

化繁为简

题目:打印空心金字塔

  1. public class Stars{
    
    	public static void main(String[] args) {
    		//先打印一个矩形
    		for(int i = 1; i <= 5;i++){
    			System.out.println("*****");
    		}
    	}
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHL1JGqn-1645534447735)(C:\Users\xiaban\Pictures\java学习\矩形.png)]

  2. public class Stars{
    
    	public static void main(String[] args) {
    		//打印半个金字塔
    		for(int i = 1; i <= 5;i++){
    			//控制打印每层的*个数
    			for(int j = 1; j <= i;j++){
    				System.out.print("*");
    			}
    			//每打印一层*后,就换行
    			System.out.println("");
    		}
    	}
    }
    

在这里插入图片描述

  1. public class Stars{
    
    	public static void main(String[] args) {
    		for(int i = 1; i <= 5;i++){
    			//打印整个金字塔
    			//在输出*之前,还要输出对应的空格 对应空格 = 总层数 - 当前层
    			for(int k = 1; k <= 5-i; k++){
    				System.out.print(" ");
    			}
    			for(int j = 1; j <= 2*i - 1;j++){
                    //控制打印每层的*个数
    				System.out.print("*");
    			}
    			//每打印一层*后,就换行
    			System.out.println("");
    		}
    	}
    }
    

在这里插入图片描述

  1. public static void main(String[] args) {
    		for(int i = 1; i <= 5;i++){
    			//打印空心金字塔
                //在输出*之前,还要输出对应的空格 对应空格 = 总层数 - 当前层
    			for(int k = 1; k <= 5-i; k++){
    				System.out.print(" ");
    			}
    			for(int j = 1; j <= (2*i - 1); j++){
    				//当前行的第一个位置是*,最后一个位置也是*
    				//最后一行是i,要全部输出*
    				if(j == 1 || j == 2*i - 1 || i == 5){
                        //控制打印每层的*个数
    					System.out.print("*");
    				}else{
    					System.out.print(" ");
    				}
    				
    			}
    			//每打印一层*后,就换行
    			System.out.println("");
    		}
    	}
    

    在这里插入图片描述

  2. public class Stars{
    
    	public static void main(String[] args) {
    		//化死为活
    		int totalLevel = 15;//层数
    		for(int i = 1; i <= totalLevel;i++){
    			//打印空心金字塔
                //在输出*之前,还要输出对应的空格 对应空格 = 总层数 - 当前层
    			for(int k = 1; k <= totalLevel-i; k++){
    				System.out.print(" ");
    			}
    			for(int j = 1; j <= (2*i - 1); j++){
    				//当前行的第一个位置是*,最后一个位置也是*
    				//最后一行是i,要全部输出*
    				if(j == 1 || j == 2*i - 1 || i == totalLevel){
                        //控制打印每层的*个数
    					System.out.print("*");
    				}else{
    					System.out.print(" ");
    				}
    				
    			}
    			//每打印一层*后,就换行
    			System.out.println("");
    		}
    	}
    }
    

在这里插入图片描述


跳转控制语句-break

基本介绍:
break语句用于终止某个语句块的执行,一般使用在switch或者循环[for,while,do…while]中

基本语法:
{
​ …;
​ break;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmrTsaFj-1645534447737)(C:\Users\xiaban\Pictures\java学习\break控制while.png)]

for(int i = 0; i < 10; i++){
    if(i == 3){ break; }
    System.out.println("ok" + i);
}
System.out.println("en");

细节说明:

  1. break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块(BreakDetail.java)
  2. 标签的基本使用
    label1:{ …
    label2: { …
    label3: { …
    ​ break label2;
    ​ }
    ​ }
    }
    (1). break语句可以指定退出那层
    (2). label1是标签,由程序员指定
    (3). break后指定到哪个label就退出到哪里
    (4). 在实际开发中,尽量不要使用标签
    (5). 如果没有指定break,默认退出最近的循环体
public class BreakDetail{
	public static void main(String[] args) {
		
		lable1:
		for(int j = 0; j < 4; j++){
		lable2:
			for(int i = 0; i < 10; i++){
				if(i == 2){
					break;//等价于break label2;
				}
				System.out.println("i = " + i);
			}
		}
	}
}
//输出i = 0,i = 1,i = 0,i = 1,i = 0,i = 1,i = 0,i = 1
public class BreakDetail{
	public static void main(String[] args) {
		
		lable1:
		for(int j = 0; j < 4; j++){
		lable2:
			for(int i = 0; i < 10; i++){
				if(i == 2){
					break lable1;
				}
				System.out.println("i = " + i);
			}
		}
	}
}
//输出i = 0,i = 1

跳转控制语句-continue

基本介绍

  1. continue语句用于结束本次循环,继续执行下一次循环
  2. continue语句出现在多层嵌套的循环语句中,可以通过标签指明要跳过的是哪一层循环,这个和前面的标签的使用的规则一样

基本语法:
{
​ …
​ continue;
​ …
}

在这里插入图片描述

int i = 1;
while(i <= 4){
    i++;
    if(i == 2){
        continue;
	}
    System.out.println("i = "+ i);//i = 3, i = 4, i = 5
}

细节说明

label1:
for(int j = 0; j < 4; j++){
    label2:
    for(int i = 0;i < 10; i++){
        if(i == 2){
            continue;//等价于continue label2 输出(i = 0, i = 1,i = 3,....,i = 9)*4次
            //continue label1;//输出(i = 0, i = 1)*4次
        }
        System.out.println("i = "+i);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值