一、概述
- 程序运行时的流程控制取决于程序时如何执行的,有三大流程控制语句,即顺序控制、分支控制、循环控制。
二、顺序控制
- 1、程序从上到下逐行的执行,中间没有任何判断和跳转
- 2、注意事项
Java中定义变量时采用合法的前向引用,也就是变量先定义再使用。
int n1 = 12;
int n2 = n1 + 1;
//完全可以
int n2 = n1 + 1;
int n1 = 12;
//这么写就不行了
三、分支控制
1、单分支 if
-
(1)语法:
if(条件表达式){ 执行代码块;可以有多条语句 }
-
(2)说明:当条件表达式为 true 时,就会执行 { } 中的代码,反之,不执行 { } 中的代码;
如果执行代码块中只有一条数据,则 { } 可以省略,但是建议写上 -
(3)例如:编写一个程序,输入自己的年龄,如果年龄大于18岁,则输出 “你的年龄大于18岁,要对自己的行为负责,可以坐牢了”
思路分析:1、接收输入的年龄,一个 Scanner 对象 2、把年龄保存到一个变量中 3、使用 if 判断,输出对应消息 Scanner scanner = new Scanner(System.in); System.out.println("请输入你的年龄"); int age = scanner.nextInt(); if(age>14){ System.out.println("你的年龄大于18岁,要对自己的行为负责,可以坐牢了"); } //输出 //请输入你的年龄 //21 //你的年龄大于14岁,要对自己的行为负责,可以坐牢了
2、双分支 if else
-
(1)语法:.
if(条件表达式){ 执行代码块1;(可以有多条语句) }else{ 执行代码块2;(可以有多条语句) }
-
(2)说明
当条件表达式为 true 时,就会执行 { 执行代码块1 } 中的代码,反之,执行 { 执行代码块2 } 中的代码;
如果执行代码块中只有一条数据,则 { } 可以省略,但是建议写上 -
(3)例如:编写一个程序,输入自己的年龄,如果年龄大于18岁,则输出 “你的年龄大于18岁,要对自己的行为负责,可以坐牢了”,否则就输出"你的年龄还小,这次就放过你了"
思路分析:1、接收输入的年龄,一个 Scanner 对象 2、把年龄保存到一个变量中 3、使用 if 判断,输出对应消息 Scanner scanner = new Scanner(System.in); System.out.println("请输入你的年龄"); int age = scanner.nextInt(); if(age>18){ System.out.println("你的年龄大于18岁,要对自己的行为负责,可以坐牢了"); }else{ System.out.println("你的年龄还小,这次就放过你了"); } //输出 //请输入你的年龄 //16 //你的年龄还小,这次就放过你了
-
(4)相关练习1:读程序,写出最后输出结果
int x = 7; int y = 4; if(x > 5){ //正确,进入这个 代码块中 if(y > 5){ //错误,不会进行这个代码块, //反而会进入这个 if 所对应的 else 的代码块中 System.out.println(x + y); }else{ System.out.println("学习Java"); //所以会输出这个语句 } }else{ System.out.println("x = " + x); } //输出 学习Java
-
(5)相关练习2:编写程序:声明 2 个 double型 变量并赋值,如果第一个数小于 10,且第二个数小于 20,打印两数之和
思路分析:1、接收输入的数据,一个 Scanner 对象 2、把 输入数据 保存到一个 double型 变量中 3、使用 if 判断,输出对应消息 Scanner scanner = new Scanner(System.in); System.out.println("请输入第一个数 " ); double d1 = scanner.nextDouble(); System.out.println("请输入第二个数 " ); double d2 = scanner.nextDouble(); if(d1 > 10.0 && d2 <20 ){ System.out.println("输入的两数之和为" + (d1 + d2) ); } //输出 //请输入第一个数 //15 //请输入第二个数 //15 //输入的两数之和为30.0
-
(6)相关练习3:编写程序:定义两个变量 int型,判断二者的和,是否能被 3 又被 5 整除,打印结果
思路分析:1、接收输入的数据,一个 Scanner 对象 2、把 输入数据 保存到一个 int型 变量中 3、使用 if 判断,输出对应消息 Scanner scanner = new Scanner(System.in); System.out.println("请输入第一个数" ); int n1 = scanner.nextInt(); System.out.println("请输入第二个数" ); int n2 = scanner.nextInt(); int sum = n1 + n2; if(sum % 3 == 0 && sum % 5 == 0){ System.out.println("输入的两数之和为" + (n1 + n2) + "\n能够被 3 和 5 整除" ); }else{ System.out.println("输入的两数之和为" + (n1 + n2) + "\n不能够被 3 和 5 整除" ); } //输出 //请输入第一个数 //6 //请输入第二个数 //9 //输入的两数之和为15 //能够被 3 和 5 整除
-
(7)相关练习4:编写程序:判断一个年份是否为闰年,判断条件1:年份能被4整除,但是不能被100整除,2:能被400整除
思路分析:1、接收输入的数据,一个 Scanner 对象 2、把 输入数据 保存到一个 int型 变量中 3、使用 if 判断,输出对应消息 Scanner scanner = new Scanner(System.in); System.out.println("请输入一个数" ); int n1 = scanner.nextInt(); if((n1 % 4 == 0 && n1 % 100 != 0) || n1 % 400 == 0){ System.out.println("输入的年份 是 闰年" ); }else{ System.out.println("输入的年份不是闰年" ); } //输出 //请输入第一个数 //2000 //输入的年份 是 闰年
3、多分支
-
(1)语法:
if(条件表达式1){ 执行代码块1;(可以有多条语句) }else if(条件表达式2){ 执行代码块2;(可以有多条语句) } else if(条件表达式3){ 执行代码块3;(可以有多条语句) } ...... else{ //多分支 可以没有这个最后的 else,如果所有条件表达式都不成立,则一个执行入口都没有 执行代码块n //如果有这个 else ,如果所有的条件表达式都不成立,则默认执行这个 else 中的代码块 }
-
(2)说明
当 条件表达式1 为 true 时,就会执行 { 执行代码块1 } 中的代码,
如果 条件表达式1 不成立,才会去判断 条件表达2 是否成立,如果条件表达式2成立,则执行 { 执行代码块2 } 中的代码;
如果 条件表达式2 不成立,才会去判断 条件表达3 是否成立;
以此类推,如果所有的表达式都不成立,则执行 else 的代码块,注意,只能有 1 个执行入口 -
(3)例如:编写一个程序,输入芝麻信用分,显示对应结果;
如果:
信用分为100,则输出 信用极好
信用分为(80,99],则输出 信用良好
信用分为(60,80],则输出 信用一般
其他情况 ,则输出 信用不及格思路分析:1、接收输入的分数,一个 Scanner 对象 2、把分数保存到一个变量中 3、使用 if - else 多分支 判断,输出对应消息 Scanner scanner = new Scanner(System.in); System.out.println("请输入你的芝麻信用分" ); int n1 = scanner.nextInt(); if(n1 >= 1 && n1 <=100){ //这个可以使用异常处理机制来完成 if(n1 == 100){ System.out.println("信用极好" ); }else if(n1 > 80 && n1 <= 99){ System.out.println("信用良好" ); }else if(n1 >=60 && n1 <= 80){ System.out.println("信用一般" ); }else{ System.out.println("信用不及格" ); } }else{ System.out.println("输入的信用分要在 1 ~ 100" ); } //输出 //请输入你的芝麻信用分 //97 //信用良好
4、嵌套分支
-
(1)基本介绍:
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支,外面的分支结构被称为外层分支。书写规范:不要超过三层,为保障代码的可读性
-
(2)语法:
if(条件表达式1){ if(条件表达式2){ 执行代码块2;(可以有多条语句) } else if(条件表达式3){ 执行代码块3;(可以有多条语句) } }else{ ..... }
-
(3)例如:编写一个程序,根据输入,显示对应结果
如果:
参加歌手比赛,如果初赛成绩大于 8.0,则进入决赛,否则提示淘汰
并且根据性别提示进入男子组还是女子组
输出成绩和性别,进行判断和输出信息思路分析:1、接收输入的信息,一个 Scanner 对象 2、把信息分别保存到 变量中 3、使用 if - else 多分支、嵌套分支 判断,输出对应消息 首先判断是否进入决赛,然后在 进入决赛的嵌套中 再判断是男子组还是女子组 Scanner scanner = new Scanner(System.in); System.out.println("请输入你的成绩" ); double score = scanner.nextDouble(); if(score > 0.0){ if(score > 8.0){ System.out.println("你已经进入了决赛" ); System.out.println("请输入你的性别" ); char gender = scanner.next().charAt(0); if(gender == '男' ){ System.out.println("你已进入决赛男子组"); }else if(gender == '女' ){ System.out.println("你已进入决赛女子组"); }else{ System.out.println("你输入的性别有误,请重新输入" ); } }else{ System.out.println("你已经被淘汰"); } }else{ System.out.println("你输入的成绩有误,请重新输入" ); } //输出 //请输入你的成绩 //9 //你已经进入了决赛 //请输入你的性别 //男 //你已进入决赛男子组
-
(4)课后练习:写出一个出票系统:根据淡旺季的月份和年龄,打印票价
思路分析:1、接收输入的信息,一个 Scanner 对象 2、把信息分别保存到 变量中 3、使用 if - else 多分支、嵌套分支 判断,输出对应消息 首先先根据输入的月份判断淡旺季,然后在 不同的月份嵌套中 根据输入判断票价 Scanner scanner = new Scanner(System.in); System.out.println("请输入当前月份" ); int month = scanner.nextInt(); if(month >= 4 && month <= 10){ System.out.println("请输入你的年龄" ); int age = scanner.nextInt(); if(age >=18 && age <=60){ System.out.println("你所购买的票价是:60 元" ); }else if(age < 18){ System.out.println("你所购买的票价是:30 元" ); }else if(age >60){ System.out.println("你所购买的票价是:20 元" ); }else{ System.out.println("你输入的年龄有误,请重新输入" ); } }else if((month > 10 && month <= 12) || (month > 0 && month <= 3)){ System.out.println("请输入你的年龄" ); int age = scanner.nextInt(); if(age >=18 && age <=60){ System.out.println("你所购买的票价是:40 元" ); } }else { System.out.println("你输入的月份有误,请重新输入" ); } //输出 //请输入当前月份 //8 //请输入你的年龄 //40 //你所购买的票价是:60 元
5、switch 分支结构
-
(1)语法
switch(条件表达式){ case 常量1: 执行代码块1;(可以有多条语句) break; case 常量2: 执行代码块2;(可以有多条语句) break; ..... case 常量n: 执行代码块n;(可以有多条语句) break; default: default 执行代码块; break; }
-
(2)使用细节
1、switch 关键字,表示 switch 分支2、表达式对应一个值
3、case 常量1:当 条件表达式的的值 等于 常量1,那么就 执行代码块1
4、break 表示退出这个switch
5、如果 条件表达式的的值 不等于 常量1,则继续向下寻找,看是否有匹配,如果又匹配的,就执行相应代码块
6、如果一个都没有匹配上,执行 default 中的代码块
-
(3)注意事项和细节讨论
1、表达式数据类型,应和 case 后的常量类型保持一致,或者是可以自动转成可以相互比较的类型,比如输入的是 字符,而常量是 int2、switch(表达式)中表达式的返回值必须是 byte short int char enum(枚举) String // 注意 没有浮点型
3、case 子句中的值必须是常量,而不能是变量,,比如
char c1 = 'a'; char c2 = 'b'; switch(c1){ case c2: //这个地方就会报错,不能用 c2 要用 'b' System.out.println("OK"); break; }
4、default 子句是可选的,没有也行,当没有匹配的 case 时,执行 default
5、break 语句用来在执行一个 case 分支后使得程序跳出整个 switch 语句块,如果没有 break,则程序会在 switch 中顺着往下执行,一直到结尾这就是字句代码块穿透
-
(4)switch 和 if 的比较
1、如果判断的具体数值不多,且符合 byte,short,int,char,enum,String 这 6 种数据类型,建议 switch
2、对于区间判断,对结果为 boolean 类型判断,使用 if ,if 使用的范围更广
-
(5)课后练习①:写出一个程序,该程序可以接收一个字符,a,b,…,g,分别对应一周七天,通过 switch 完成
思路分析:1、接收输入的信息,一个 Scanner 对象 2、把信息分别保存到 变量中 3、使用 switch case来判断应该输出什么对应消息 Scanner scanner = new Scanner(System.in); System.out.println("请输入一个字符 a~ g"); char c = scanner.next().charAt(0); //java中只要是有值返回就是一个表达式 switch(c){ 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("没有匹配结果,请检查输入"); } System.out.println("退出了 switch,但是程序继续在执行"); //输出 //请输入一个字符 a~ g //c //星期三 //退出了 switch,但是程序继续在执行
-
(6)课后练习②:写出一个程序,转换大小写,只转换a,b,c,d,e,其他的输出other
Scanner scanner = new Scanner(System.in); System.out.println("请输入一个小写字符"); char c = scanner.next().charAt(0); //java中只要是有值返回就是一个表达式 switch(c){ case 'a': System.out.println("A"); break; case 'b': System.out.println("B"); break; case 'c': System.out.println("C"); break; case 'd': System.out.println("D"); break; case 'e': System.out.println("E"); break; default: System.out.println("other"); } //输出 //请输入一个小写字符 //a //A
-
(7)课后练习③:写出一个程序,输入一个百分制的分数,大于60,输出合格,小于60 输出不合格
设计思路:要转换一下,int score 获取收据,然后 int x = score / 60;及格的人 x = 1;不及格的人 x = 0; case 子句用 x 来完成 Scanner scanner = new Scanner(System.in); System.out.println("请输入成绩"); int c = scanner.nextInt(); int x = c / 60; switch(x){ case 1: System.out.println("合格"); break; case 0: System.out.println("不合格"); break; default: System.out.println("输入有误"); } //输出 //请输入成绩 //30 //不合格
-
(8)课后练习④:写出一个程序,根据用户输入的月份确定季节(使用穿透)
Scanner scanner = new Scanner(System.in); System.out.println("请输入月份"); int c = scanner.nextInt(); switch(c){ 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; } //输出 //请输入月份 //6 //夏
四、循环控制
1、for 循环控制
-
(1)基本介绍:听其名,知其意,就时让你的代码可以循环的执行
-
(2)基本语法:
for(循环变量初始化 ; 循环条件 ; 循环变量迭代){ 循环操作(语句) ;//若这个部分只有一条语句,则{}可以省去,但是不建议 }
说明:四要素:循环变量初始化 ; 循环条件 ; 循环变量迭代;循环操作(语句)
-
(3)注意事项和细节说明
0)、执行顺序:循环变量初始化 ; 循环条件判断; 进入循环体,执行循环操作(语句); 循环变量迭代
1)、循环条件时返回一个 blooean 的表达式
2)、for(;循环判断条件;)中的初始化和变量迭代可以写在其他地方,但是 两边的 ; 不能省略
3)、循环变量的初始化可以有多条初始化语句,但要求类型一样,并且中间用 , 隔开
4)、使用内存分析法,下面输出为
int count =3; for(int i= 0,j = 0;i < count;i++,j += 2){ System.out.println("i = " + i + " j = " + j);//这个执行完之后 循环变量才会按照循环变量迭代去修改 } //输出 //i = 0 j = 0 //i = 1 j = 2 //i = 2 j = 4
-
(4)课堂练习
1)、输出 0 ~ 100 所有 9 的倍数,统计个数和总和int count = 0; int sum = 0; for(int i = 1 ; i < 100 ; i ++){ if(i % 9 == 0){ System.out.println(i); count ++; sum += i; } } System.out.println(count); System.out.println(sum); //输出 9 18 27 36 45 54 63 72 81 90 99 //11 //594 编程思想,可以把其实,终止,倍数都用变量来表示 int start = 1; int end = 100; int t = 9; // 倍数 int count = 0; int sum = 0; for(int i = start ; i < end ; i ++){ if(i % t == 0){ System.out.println(i); count ++; sum += i; } } System.out.println(count); System.out.println(sum);
2)、输出这样的结果
//输出 //0+10 = 10 //1+9 = 10 //2+8 = 10 //3+7 = 10 //4+6 = 10 //5+5 = 10 //6+4 = 10 //7+3 = 10 //8+2 = 10 //9+1 = 10 //10+0 = 10
先化繁为简,先输出一列,再输出一列,找出规律,合并这几列 for(int i = 5,j = 0; i >= 0 ; i--,j++){ System.out.println(i + "+" + j + " = " +(i + j)); } //输出 5+0 = 5 4+1 = 5 3+2 = 5 2+3 = 5 1+4 = 5 0+5 = 5 //先死后活 int n=10; for(int i = 0 ; i <= n ; i++){ System.out.println(i + "+" + (n - i) + " = " + n)); }
2、whlie 循环控制
-
(1)基本语法:
whlie(循环条件){ //循环条件 为真,进入循环内部 循环体(语句); 循环变量迭代 ; //执行后,再次去判断 循环条件 } while 也有四要素,只是放的地方和 for 不一样 while 退出之后,程序会继续执行,不会终止
-
(2)注意事项和细节说明
1)、循环条件是返回一个 boolean型 的表达式
2)、while 循环是先判断再执行语句
-
(3)课堂练习:
1)、打印 1 ~ 100之间所有能被 3 整除的数
int i =1; while(i < 100){ if(i % 3 == 0){ System.out.print(i + " "); } i++; } //输出 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
2)、打印40 ~ 200 之间所有的偶数
//编程思想:同样的,还可以把循环条件用变量来代替 int i =40; while(i < 200){ if(i % 2 == 0){ System.out.print(i + " "); } i++; }
3、do while循环控制
-
(1)基本语法:
d0{ 循环体(语句); 循环变量迭代 ; //执行后,再次去判断 循环条件 }while( 循环条件 ) ;
注意:
1)、do while 是关键字2)、do while 也有四要素,只是放的地方不一样
3)、先执行代码块,也就是说,代码块一定会至少执行一次
4)、最后要有一个 ;
5)、 while 是先判断,再执行;do while 是先执行,再判断
-
(2)注意事项和细节说明
1)、循环条件是返回一个 boolean型 的表达式
2)、do while 是先执行,再判断,循环内代码块至少执行一次 -
(3)课堂练习:
打印 1 ~ 100之间所有的数;统计他们的和;
int i = 1; int sum = 0; int j = 1; int count = 0; char answer; do{ System.out.println(i); sum += i; i++; }while( i <= 100); System.out.print("1 ~ 100 的总和是" + sum);
统计1 ~ 200 能被五但是不能被0三整除的数;
//思路分析 统计1 ~ 200 能被五但是不能被0三整除的数 //先输出 1 - 200 //然后判断 %5 == 0 && % 3 != 0; //统计满足条件的个数 //输出个数 do{ if(j % 5 == 0 && j % 3 != 0){ count++; } j++; }while( j <= 200); System.out.println("1 ~ 200 能被五但是不能被0三整除的数有" + count + " 个");
如果张三不还钱,就一直打到他还钱
do{ System.out.println("我问你 你还钱吗?"); Scanner scanner = new Scanner(System.in); System.out.println("请输入你的回答(y/n)"); answer = scanner.next().charAt(0); System.out.println("他的回答是" + answer); j++; }while( answer == 'n'); System.out.println("你终于还钱了");
4、多重循环控制
-
(1)、基本介绍
1)、讲一个循环放在另一个循环体内,就形成了嵌套循环。其中 for/ while/ do while 均可以作为内层循环和外层循环[建议一般使用两层,不要超过三层]2)、实质上,嵌套循环就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为 false 时,才会完全跳出内层循环,才可以结束外层的当次循环,开始下一次的循环
3)、设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m * n 次
4)、案例分析
for(int i = 0;i < 2;i++){ for(int j = 0; j < 3;j++){ System.out.println("i = " + i + "j = " + j); } } //输出 //i = 0 j = 0 //i = 0 j = 1 //i = 0 j = 2 //i = 1 j = 0 //i = 1 j = 1 //i = 1 j = 2
-
(2)、课堂练习
1)、统计三个班的成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入],计算三个班的及格人数,每个班有 5 名同学//化繁为简 //1.1、统计一个班的 5 个学生的成绩;一个 for 单层平均分循环 //1.2、得到一个班级的平均分,累计 所有成绩,再均分 //2.1、统计三个班的平均分 外层一个 班级循环,嵌套在 平均分循环外面 //3.1 、统计及格人数,定义一个count ,在班级平均分循环中,判断接收到的成绩是否及格,if 语句 count++ Scanner scanner = new Scanner(System.in); double score = 0; double sum = 0; //统计班级总分,为求平均使用 double ave = 0; //计算平均分 double total_score = 0;//三个班的平均分 int count = 0; //计算及格的总人数 for(int i = 1; i <= 3; i++){ //i 表示班级 这个还可以再次优化 使用变量来搞定 for(int j = 1;j <= 5;j++){//j 表示学生 System.out.println("请输入第" + i + "个班的第 " + j +"个学生的成绩"); score = scanner.nextDouble();//获取键盘输入 System.out.println("成绩为 :" + score ); if(score >= 60){//及格判断 count++; } sum += score; //获取班级分数 total_score += score;//获取总分数 } ave = score / 5; System.out.println("\n第" + i + "个班级的平均分为 : " + ave ); } total_score /= 15; System.out.println("\n所有班级的平均分为 : " + total_score ); System.out.println("\n所有班级的及格人数为 : " + count );
2)、打印输出 九九乘法表
//化繁为简 //0、1 先输出9行出来,单层 for循环 //0、2 在每一行中完成下列目标 //1.1、第 1 行输出 1 个,第2行输出 2个,以此类推,即 每一行 比 上一行 多出 一列 , //1.2、先输出 1 * 1 = 1 到 每一行的 行数 1 * 行数 = 行数 ,每一行的输出应该不换行,只有一行输出完了之后才会换行 //2.1、统计三个班的平均分 外层一个 班级循环,嵌套在 平均分循环外面 //3.1 、统计及格人数,定义一个count ,在班级平均分循环中,判断接收到的成绩是否及格,if 语句 count++ //先死后活,其中 行数可以用变量代替,来完成更多的乘法表 for(int i = 1; i <= 9; i++ ){ // i 是行数 for(int j = 1; j <= i; j++){// j 是每一行的列数,列数最多应该和行数相等 System.out.print( j + " * " + i + " = " + (i * j) + '\t' );//输出乘法口诀 } System.out.println();//使得换行 } //输出结果 //1 * 1 = 1 //1 * 2 = 2 2 * 2 = 4 //1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 //1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16 //1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25 //1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36 //1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49 //1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64 //1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
3)、打印输出空心金字塔
* * * * * * * * * ***********
-
//1.1、先输出一个直角三角形 *
int totalLever =6;//层数 for(int i = 1; i <= totalLever; i++ ){ // i 是行数 for(int j = 1; j <= i ; j++){// j 是每一行的列数,列数最多应该和行数相等 System.out.print("*");//输出* } System.out.println();//使得换行 } * ** *** **** ***** ******
-
//1.2、然后把上方的 直角三角形 补全成等腰三角形
* *** ***** ******* ********* *********** *************
-
//1.3、第一行移动的是(最后一行个数 - 第一行个数) / 2,
第二行移动的是(最后一行个数 - 第二行个数) / 2,
接下来的移动规律以此类推,先输出实心金字塔
-
//1.4、移动过后,每一行 打印的 * 的个数 为
行数 * 数 1 1 2 3 3 5 4 7 得到规律: *数 = 行数 X 2 - 1
int totalLever =6;//层数 for(int i = 1; i <= totalLever; i++ ){ // i 是行数 for(int k = 0; k < totalLever - i; k++){ System.out.print(" ");//输出空格,移动位置 } for(int j = 1; j <= i* 2 - 1 ; j++){// j 是每一行的列数,列数最多应该和行数相等 System.out.print("*");//输出* } System.out.println();//使得换行 }
-
//2、使空心
* * * * * * * * * * *
// 让每一行第一个和最后一个位置打印出* , // 第一个位置 就是 空格结束的位置 为:j == 1 // 最后一个位置就是 原来实心金字塔最后一个 * 的位置 : 2 * 当前行数 -1, // 在打印 * 的循环中插入 if 条件判断语句,是 ||,否则就输出空格 int totalLever =6;//层数 for(int i = 1; i <= totalLever; i++ ){ // i 是行数 for(int k = 0; k < totalLever - i; k++){ System.out.print(" ");//输出空格,移动位置 } for(int j = 1; j <= i * 2 - 1 ; j++){// j 是每一行的列数,列数最多应该和行数相等 if(j == 1 || j == i * 2 -1 ){ System.out.print("*");//输出* }else{ System.out.print(" ");//输出* } } System.out.println();//使得换行 }
-
//3、把最后一行补齐,加一个判断,判断这一行是否为最后一行,如果是,直接输出 全*,这个可以放在上面输出空格那里,就不用多写一个 if 了
* * * * * * * * * ***********
int totalLever =6;//层数 for(int i = 1; i <= totalLever; i++ ){ // i 是行数 for(int k = 0; k < totalLever - i; k++){ System.out.print(" ");//输出空格,移动位置 } for(int j = 1; j <= i * 2 - 1 ; j++){// j 是每一行的列数,列数最多应该和行数相等 if(j == 1 || j == i * 2 -1 || i == totalLever){ System.out.print("*");//输出* }else{ System.out.print(" ");//输出* } } System.out.println();//使得换行 }
-
//4 、终极版:先死后活,其中 行数可以用变量代替,来完成更多的形状的空心金字塔
Scanner scanner = new Scanner(System.in); System.out.println("请输入你想要打印的空心金字塔的层数:");//输出* int totalLever =scanner.nextInt();//层数 for(int i = 1; i <= totalLever; i++ ){ // i 是行数 for(int k = 0; k < totalLever - i; k++){ System.out.print(" ");//输出空格,移动位置 } for(int j = 1; j <= i * 2 - 1 ; j++){// j 是每一行的列数,列数最多应该和行数相等 if(j == 1 || j == i * 2 -1 || i == totalLever){ System.out.print("*");//输出* }else{ System.out.print(" ");//输出* } } System.out.println();//使得换行 } //输出 //请输入你想要打印的空心金字塔的层数: //8 * * * * * * * * * * * * * ***************
-
五、跳转控制语句 break - - for 循环控制
-
1、基本介绍
听其名,知其意,就时让你的代码可以循环的执行,所有循环内部都可以使用
-
2、基本语法
{ ... break; .... }
-
3、快速入门
for(int i = 1; i <= 10; i++ ){ if (i == 3){ break; } System.out.println("i = " + i); } //输出 //i = 1 //i = 2
-
4、注意事项和细节说明
(1)、break语句出现在多层嵌套中的语句块中使,可以通过标签指明要终止的使那一层语句块
(2)、标签的基本使用
1)、语法label1:{... label2: {... label3: {... ... break label2; ... } } }
2)注意:
①、berak 语句可以指定退出哪层②、label1 使标签,由程序员指定,label 可以写成任意 ,满足标识符命名规则即可
③、break 指定到哪个label 就推出到哪里
④、实际开发中,尽量不要使用标签
⑤、如果没有指定 break ,默认推出最近的循环体
#)实际应用
abc1: for(int i = 1; i <=4; i++ ){ abc2:for(int j = 1; j <= 2; j++ ){ if(i == 2){ break;//等价于退出abc2 //输出 i = 1 i = 2 i = 3 i = 4 //reak abc1; //输出 i = 1 } } System.out.println("i = " + i); }
-
4、课堂练习
(1)、1 - 100以内的数据求和,求出 当 和 第一次大于 20 的当前数//如果想在for循环 外面输出 i ,则需要定义一个变量 n ,或者把 i 定义在循环外部 (int i = 0;); int sum = 0; int n = 0; for(int i = 1; i <=100; i++ ){ n = i; sum += i; if(sum > 20){ System.out.println("累计的和大于20"); System.out.println("i = " + i); break; } } System.out.println("i = " + n);//输出 i = 6 //输出 //累计的和大于20 //i = 6
(2)、实现登录验证,有三次机会,如果用户名为 “陈然”,密码 "666"提示登陆成功,否则提示还有几次机会
思路: 用 for 循环嵌套,如果 输入密码正确,则使用 break 退出for 循环 设计一个登陆机会 的 变量 ,每次不成功,就会 -- ,然后判断 == 0 ?, 如果 != ,则提示还有几次机会,如果 ==0,则输出 你输入的密码错误,刷新页面 Scanner scanner = new Scanner(System.in); String name = ""; String password = ""; int chance = 3; for(int i = 1; i <=3; i++ ){ System.out.println("请输入你的用户名:"); name = scanner.next(); System.out.println("请输入你的用户名:"); password = scanner.next(); if("陈然".equals(name) && "666".equals(password)){ System.out.println("登陆成功"); break; }else{ chance--; System.out.println("你还有" + chance + "次 机会"); } } //输出 //请输入你的用户名: //陈鑫 //请输入你的用户名: //666 //你还有2次 机会 //请输入你的用户名: //陈然 //请输入你的用户名: //666 //登陆成功
六、跳转控制语句 continue
-
(1)、基本介绍
1、coutinue 语句用于结束本次循环,继续执行下一次循环,continue 执行时,自动完成循环变量的迭代,然后开启下一次循环条件判断
2、continue 语句出现在多层嵌套的循环语句中时,可以通过标签要跳过的是那一层循环,不写标签默认跳出最近的循环,使用方法与break 中标签一致,这里不展开
-
(2)、语法
{ ... continue; ... }
-
(3)、课堂练习
int i = 1; while(i <= 4){ i++; if(i ==2){ continue; } System.out.println("i = " + i); } //输出 //i = 3 //i = 4 //i = 5
七、跳转控制语句 return
-
(1)、基本介绍
return 使用在方法中,表示跳出所在的方法,如果写在 main()方法中,则会退出程序
-
(2)、课堂练习
for(int i = 1; i <=3; i++ ){ if(i == 2){ System.out.println("ii"); //return; //输出 helloworld ii //continue; //输出 helloworld ii helloworld 你好 break; //输出 helloworld ii 你好 } System.out.println("helloworld"); } System.out.println("你好");
八、课后练习
- (1)、编程实现以下功能
某人有100,000元,每经过一次路口,要交费,规则如下
当现金 > 50000时,每次交 5%
当现金 <= 50000时,每次交1000
问:可以经过多少次路口,(while break完成)//思路分析 //while 的条件是身上的钱大于0,所以定义一个变量来存钱,也定义一个变量来存储通过的路口数目 //while 内部写 if 语句,来扣钱,if 条件时钱的数量范围 >50000 else if 的范围是 <= 50000 //然后在 if 的执行语句块中 扣钱 //上述的 else if 里面还要有一个 if 是判断钱够不够通过下一个路口也就是钱 >= 1000?,如果不能,则break int count = 0; double money = 100000; while(true){ if(money > 50000){ money = money * 0.95; count++; }else if( money >= 1000){ money -= 1000; count++; }else{ break; } } System.out.println("你一共通过了 " + count + " 个路口");//62个
- (2)、判断一个数是不是水仙花数 水仙花数:一个三位数 的 各个位置上的立方和 等于其本身 例如 153 = 111 + 333 + 555
//思路,这就是求个位、十位、百位的具体数值,然后 if(判断公式是否为真) Scanner scanner = new Scanner(System.in); System.out.println("请输入一个数:"); int n = scanner.nextInt(); int ge = n % 10; int shi = (n%100)/10; int bai = n/100; if(ge*ge*ge + shi*shi*shi + bai*bai*bai == n ){ System.out.println(n + " 是一个水仙花数"); }else{ System.out.println(n + " 不是一个水仙花数"); } //求得100 - 1000 的水仙花数 for(int i = 100; i <1000; i++ ){ int ge = i % 10; int shi = (i%100)/10; int bai = i/100; if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i ){ System.out.println(i + " 是一个水仙花数");//371 153 370 407 } }
- (3)、输出 1 - 100 之间所有被5整除的数,5 个为 1 行
//思路: //判断是否整除 5 //定义一个变量来存储每一行输出的个数,到达 5 个后,启动换行操作 int count = 0; for(int i = 1; i <=100; i++ ){ if(i % 5 == 0){ System.out.print((i) +" \t"); count ++; if(count == 5){ System.out.println(); count = 0; } } } //5 10 15 20 25 //30 35 40 45 50 //55 60 65 70 75 //80 85 90 95 100
- (4)、输出小写 a - z 以及 大写Z - A
//思路: //字符的本质是一个编码,我们能对这个编码进行操作, 接下来就是循环 + / - char small_a = 97; char big_Z = 90;//大写字符 = 小写字符 - 22 for(int i = 0; i <25; i++ ){ System.out.print(small_a + " "); small_a ++; } System.out.println(); for(int i = 0; i <25; i++ ){ System.out.print(big_Z + " "); big_Z --; } System.out.println();
- (5)、求1 - 1/2 + 1/3 - 1/4…1/100 的值
//思路 //分母逐渐递增,用for 来完成 //分子是 1 / -1 来回切换,只需要判断位数 (偶数位为负,奇数位为正) 即可 double sum = 0; for(int i = 1; i <= 100; i++ ){ if(i % 2 == 0){ sum -= 1.0/i ;//隐藏陷阱,分子的 1 写成1.0 }else{ sum += 1.0/i; } } System.out.println(sum);//输出 0.688172179310195
- (6)、求 1 + (1+2) + (1+2+3) + … + (1+2+3+…+100) 的结果
//双层循环外面一层是第多少次 + ,为 里面一层 提供加的结束数值 int sum = 0; for(int i = 1; i <= 100; i++ ){ for(int j = 1; j <= i; j++ ){ sum += j ; } } System.out.println(sum);//171700