Java第四天
switch分支结构
基本语法:
switch(表达式){
case 常量1:
语句块1;
break;
case 常量2:
语句块2;
break;
…
case 常量n:
语句块n;
break;
default:
default语句块;
break;
}
基本流程及介绍:
- switch关键字表示switch分支
- 表达式对应一个值
- case常量1:当表达式的值等于常量1,就执行语句块1
- break表示退出switch
- 如果和case常量1匹配,就执行语句块1,如果没有匹配就继续匹配case常量2
- 如果一个都没匹配上就执行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("?");
}
}
}
注意事项和细节讨论
-
表达式数据类型,应该和case后的常量类型一致,或者是可以自动转成可以相互比较的类型,比如输入的是字符,而常量是int
-
switch(表达式)中表达式的返回值必须是:(byte,short,int,char,enum[枚举],String)
double c = 1.1; switch(c){//错误 case 1.1://错误 System.out.println("ok"); break; }
-
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"); }
-
default子句是可选的,当没有匹配的case时,执行default
-
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的比较
- 如果判断的具体数值不多,而且复合byte、short、int、char、enum、String这六种类型。建议使用swtich语句
- 对于区间的判断,对于结果为boolean类型判断都使用if
- switch可以实现的 if语句都可以实现,使用哪一个就要看哪个对于解决问题的效率更高
for循环控制
基本语法
for(循环变量初始化;循环条件;循环变量迭代){
循环操作;
}
说明
- for关键字表示循环控制
- for有四要素:
(1)循环变量初始化
(2)循环条件
(3)循环操作
(4)循环变量迭代 - 循环操作,这里可以有多条语句,也就是我们要循环执行的代码
- 如果循环操作语句只有一条语句,可以省略{}但是最好不要省略
for(ini i = 1; i <= 80; i++){
System.out.println("你好");
}
细节说明
-
循环条件时返回一个布尔值的表达式
-
for(;循环判断条件;)中的初始化和变量迭代可以写到其他地方,但是俩边的分号不能省略
-
循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
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++;
}
说明
- while循环也有四要素
- 只是四要素放的位置不一样
do…while循环控制
基本语法
循环变量初始化;
do{
循环体(语句);
循环变量迭代;
}while(循环条件);\
int i = 1;
do{
System.out.println("i = "+ i);
i++;
}while(i < 10);
说明
- do while时关键字
- 也有循环四要素只是位置不一样
- 先执行,再判断,也就是说,一定会执行一次
- 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
多重循环控制(难点!重点!)
介绍
-
将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while,do…while均可以作为外层循环和内层循环。[建议一般使用两层,最多不要超过三层,否则代码的可读性很差]
-
实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可以结束外层的当次循环,开始下一次的循环
-
设外层循环次数为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 } }
循环控制的编程思想
化死为活
题目:
- 统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的总分,平均分
- 统计三个班及格人数和不及格人数,每个班有五名学生
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);
}
}
化繁为简
题目:打印空心金字塔
-
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)]
-
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(""); } } }
-
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(""); } } }
-
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(""); } }
-
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");
细节说明:
- break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块(BreakDetail.java)
- 标签的基本使用
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
基本介绍
- continue语句用于结束本次循环,继续执行下一次循环
- 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);
}
}