1.dowhile循环
1.1 dowhile循环语法
//与while循环的区别是,dowhile循环是先执行代码,再进行判断;至少要执行一次
/*
* 语法结构:
* 初始化语句;
* do{
* 要执行的代码;
* 增量语句
* }while(条件判断);
*
* 执行流程:
* 1.执行初始化语句(只执行一次)
* 2. 执行循环体语句
* 3. 执行增量语句
* 4. 条件判断,如果成立,则继续执行第二条;如果不成立,则直接退出循环
*
* 案例: 打印10次"helloworld"
*
* */
public class DoWhile1 {
public static void main(String[] args) {
int i = 1;
do {
System.out.println("helloworld..."+i);
i++;
}while(i<=10);
}
}
1.2 dowhile应用场景:
//案例:学生先写完作业,老师进行评语,如果评语为'y',则继续抄写作业;如果为'n',则不用抄写了
public class DoWhile2 {
public static void main(String[] args) {
//while循环:
/*
System.out.println("学生正在抄写作业...");
System.out.println("学生抄写作业完成....");
System.out.println("学生是否需要继续抄写作业? 请老师给评语:");
Scanner scanner = new Scanner(System.in);
char flag = scanner.next().charAt(0); //从控制台接收第一个字符
while(flag=='y') {
System.out.println("学生正在抄写作业...");
System.out.println("学生抄写作业完成....");
System.out.println("学生是否需要继续抄写作业? 请老师给评语:");
flag = scanner.next().charAt(0); //继续接收录入的值
}*/
//dowhile循环:
Scanner scanner = new Scanner(System.in);
char flag; //用于接收录入的值
do {
System.out.println("学生正在抄写作业...");
System.out.println("学生抄写作业完成....");
System.out.println("学生是否需要继续抄写作业? 请老师给评语:");
flag = scanner.next().charAt(0);
}while(flag=='y');
System.out.println("结束抄写作业..");
//while VS dowhile
//while: 先判断,后执行; 执行次数为0~n次; 用在循环次数可预见(打印10次helloworld)
//dowhile:先执行,后判断;执行次数为1~n次;用在循环次数不可预见
}
}
2. for循环(重点)
2.1 for循环语法结构
//for循环结构
/*
* for(初始化语句;条件判断;增量语句){
* 循环体语句;
* }
*
* 执行流程:
* 1.初始化语句
* 2.条件判断 如果成立,则执行循环体语句;不成立,则跳出循环
* 3.执行循环体语句
* 4.增量语句; 执行完后再回到第2句,条件判断
*
* 说明: for执行流程与while是一致的,只是写法上的区别;推荐用for,在循环嵌套中,结构更清晰
*
* 案例:打印10遍“好好学习,天天向上”
*
* 语法特点及执行流程,与while一致:
* 先判断,后执行;执行次数是0~n次;用在循环次数可预见
*
*/
public class For1 {
public static void main(String[] args) {
int i=1; //如果后面需要使用i变量,可以提取到前面(一般不会这么做)
for(;i<=10;i++) {
System.out.println("好好学习,天天向上.."+i);
}
System.out.println(i);
}
}
2.2 for案例2
//案例2: 从控制台输入一个正整数n(小于10),求出该数的阶乘
public class For2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个正整数:");
int n = scanner.nextInt();
int sum = 1;
for(int i=1;i<=n;i++) {
sum *= i;
}
System.out.println(n+"的阶乘为:"+sum);
}
}
2.3 for案例3
//案例3:从控制台录入5名学生的成绩,请求出他们的平均分
//分析:循环录入5次,汇总成绩,除以5
public class For3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double sum = 0; //记录汇总的值
for(int i=1;i<=5;i++) {
System.out.println("请输入第"+i+"个学生成绩:");
int score = scanner.nextInt();
sum += score; //汇总分数
}
System.out.println("平均分:"+sum/5);
}
}
3. 循环控制语句(重点)
3.1 循环控制概述
//循环控制语句(控制循环的退出): break,continue
//break:前面用在switch中,就是跳出switch;在循环中,表示跳出循环
//continue:跳出当次循环,不影响下一次循环的执行
//案例1:循环1~10,遇到5,则直接退出; 打印: 1, 2,3,4----->break
//案例2:循环1~10,遇到5,则跳过当次执行; 打印:1,2,3,4,6,7,8,9,10-->continue
public class Break1 {
public static void main(String[] args) {
for(int i=1;i<=10;i++) {
if(i==5) {
//break; //跳出循环
continue; //跳出当次循环,不影响下一次循环的执行
}
System.out.print(i+" ");
}
System.out.println("\n程序结束...");
}
//循环控制语句的应用场景:
//1.用在特殊的退出判断中,例如上述的案例
//2.结合死循环使用 break+死循环
}
3.2 死循环案例
//各种死循环的认识:
public class Break2 {
public static void main(String[] args) {
//1.for的死循环:
/*
for(;;) {
System.out.println("for的死循环...");
}*/
//2.while的死循环:
/*
while(true) {
System.out.println("while的死循环...");
}*/
//3.dowhile的死循环:
do {
System.out.println("dowhile的死循环");
}while(true);
//说明:死循环往往常用while和dowhile,死循环的结构会更好;
//尤其是dowhile,因为死循环往往循环次数不可预见
//三种循环的应用场景:
//1.先判断,后执行;循环次数明确--使用for,while用在死循环
//2.先执行后判断;循环次数不明确--dowhile(及死循环中)
}
}
3.3 break+死循环
//死循环案例:学生抄写作业,老师给出评语:‘y'则继续抄写,’n‘则结束抄写
public class Break3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
do {
System.out.println("学生正在抄写作业..");
System.out.println("抄写作业完成..");
char flag = scanner.next().charAt(0); //控制台录入
if(flag!='y') { //不等于y,则结束;等于y则继续
break;
}
}while(true);
System.out.println("抄写作业结束.."); //只要有出口,就不是不可到达的代码了
}
}
4. 循环嵌套(重点)
4.1 循环嵌套语法结构
//循环嵌套:循环中包含循环(一般使用for嵌套)
/*
* 嵌套语法结构
* for(初始化语句1;条件判断1;增量语句1){
* for(初始化语句2;条件判断2;增量语句2){
* 循环体语句2;
* }
* }
*
* 执行流程:
* 1.初始化语句1(只执行一次)
* 2.条件判断1,如果成立,进入到内层循环
* 3.进入内层循环
* 3.1 初始化语句2
* 3.2 条件判断2,如果成立则执行循环体语句2;如果不成立,则调到增量语句1
* 3.3 执行循环体语句2
* 3.4 增量语句2,再进入条件判断2,直到不成立为止
* 4.增量语句1,在进入条件判断1,依次循环
*
* */
//案例:打印3行5列的“*”
//问题分解: 考虑先打印1行5列
public class QianTao1 {
public static void main(String[] args) {
/*
System.out.println("*****");
System.out.println("*****");
System.out.println("*****");
*/
for(int i=1;i<=3;i++) { //外层打印行
//打印1行5列
for(int j=1;j<=5;j++) { //内层打印列
System.out.print("*");
}
System.out.println(); //换行
}
}
}
4.2 循环嵌套案例
//案例2:计算3个班,每个班5名同学的平均分
//分析:先计算第1个班5名同学;3个班就表示3行5列的结构
public class QianTao2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
for(int i=1;i<=3;i++) { //3个班代表3行
double sum = 0; //汇总每个班的总和
for(int j=1;j<=5;j++) { //5名同学代表5列
System.out.println("请输入第"+i+"个班,第"+j+"个同学的成绩");
int score = scanner.nextInt();
sum += score; //汇总每个班的5名成绩
}
System.out.println("第"+i+"个班的平均分为:"+sum/5);
}
}
}
4.3 打印直角三角形
//案例:打印直角三角形
/*
*例如:
* *
* **
* ***
* ****
*
* 分析:4行4列*; 行是确定的, 第一行,打印1列,意味着,j随着i的变化而变化
*/
public class QianTao3 {
public static void main(String[] args) {
for(int i=1;i<=4;i++) { //4行
for(int j=1;j<=i;j++) {
System.out.print("*");
}
System.out.println(); //换行
}
}
}
4.4 打印等腰三角形
//案例4:打印等腰三角形
/*
* 例如:
* *
* ***
* *****
* *******
* 再转换:
* *
* ***
* *****
* *******
*
* 分析:1. 行固定,列再找规律,随着行的变化而变化; 打印1 3 5 7 列
* 2. 再推空格变为等腰对称的*
*
* 扩展分析: 打印菱形 --再等腰三角形的基础上,再打印倒的等腰三角形
* *****
* ***
* *
*
* *****
* ***
* *
*
*/
public class QianTao4 {
public static void main(String[] args) {
//打印等腰三角形
for(int i=1;i<=4;i++) {
//第一行打印3个空格,第二行2个,第三行1个
for(int j=1;j<=4-i;j++) {
System.out.print(" "); //打印空格
}
for(int j=1;j<=2*i-1;j++) { //带入值,找规律
System.out.print("*");
}
System.out.println(); //换行
}
//打印倒着的等腰三角形
for(int i=1;i<=3;i++) {
//推空格
for(int j=1;j<=i;j++) {
System.out.print(" ");
}
//打印*
for(int j=1;j<=7-2*i;j++) {
System.out.print("*");
}
System.out.println(); //换行
}
}
}
5. break的练习
5.1 switch+dowhile的break使用
//练习1:自动取款机的案例
//分析:欢迎使用取款机的提示一直循环,需要写一个死循
public class Exec1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
do{
System.out.println("欢迎使用取款机:");
System.out.println("1.开户 2.存款 3.取款 4.转账 5.查询余额 6.修改密码 0.退出");
int num = scanner.nextInt();
//使用switch等值判断
switch (num) {
case 1:
System.out.println("开户成功!");
break;
case 2:
System.out.println("存款成功!");
break;
case 3:
System.out.println("取款成功!");
break;
case 4:
System.out.println("转账成功!");
break;
case 5:
System.out.println("查询成功,余额为100万");
break;
case 6:
System.out.println("修改密码成功!");
break;
case 0:
System.out.println("退出!");
break;
default:
System.out.println("输入有误,请重新输入");
break;
}
if(num==0) { //跳出switch之后,需要继续判断num是否为0,为0则跳出死循环
break;
}
}while(true);
System.out.println("---执行退出功能---");
}
}
5.2 循环嵌套中的break的使用
//扩展案例:在循环嵌套中使用break的案例
//案例:循环打印3行5列的1到5,如果遇到3后,每行后面的值都不打印
/*
* 分析,先打印3行5列的数值:
* 1 2 3 4 5
* 1 2 3 4 5
* 1 2 3 4 5
*
* 再打印判断break的循环:
* 1 2
* 1 2
* 1 2
*
*
* 结论:
* break用在循环嵌套中,只退出离它最近的一层循环
* 在switch+循环中,break也是退出一层流程控制语句
*
*/
public class Exec2 {
public static void main(String[] args) {
for(int i=1;i<=3;i++) {
for(int j=1;j<=5;j++) {
if(j==3) {
break; //在循环嵌套中,break退出离它最近的一层循环
}
System.out.print(j+" ");
}
System.out.println(); //回车
}
}
}
总结梳理:
作业:
1. 老王记不清自己家电子门密码,多次尝试输入密码,直到正确为止
提示:录入密码为整数类型的值
2. 对录入的分数进行判断。如果小于0大于100,标记出错状态,并立即跳出整个循环
死循环+break;
3. 循环录入Java课的5个学生成绩,统计分数大于等于80分的学生比例
提示:比例按小数打印即可,例如: 两个人大于80分--0.4
4. 循环录入3个班的5个学生成绩,统计每个班分数大于等于80分的学生比例
5. 打印99乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
...
提示: 直角三角形,变化i和j的值
6. 每日必备单词:
1.bug [ bʌg ]错误 2.debug [ di:'bʌg ]调试
3.continue [ kən'tinju: ]继续 4.launch [lɔːntʃ] 发行,运行
5.while [ (h)wail ] 当..时候 6.do [ dəu ]执行
7. create [kriˈeɪt] 创建 8. problem [ˈprɒbləm] 问题
9. terminate [ˈtɜːmɪneɪt] 终止 10. value [ˈvæljuː] 值
11. loop [luːp] 循环 12. nest [nest] 嵌套
13. flag [flæɡ] 标记 14. exit [ˈeksɪt] 退出