程序控制流---循环结构(while循环 do-while循环 for循环)
控制流有两种结构: 条件结构 循环结构
条件结构三种:基本条件结构,多重条件结构,switch条件结构
循环结构三种:while循环 do-while循环 for循环
while循环:先判断条件,再执行循环操作,通常在未知循环次数时使用(只知道满足什么条件时停止,不清楚要循环多少次)
do-while循环:先执行、再判断循环条件,对其结果判断是否继续进行循环( 相当于while(true)结合break使用 )
for循环:本质是对while的简化,在已知情况下(循环次数)使用
for(变量初始化;循环条件;变量更新){ ...... }(已知循环多少次,当循环次数到了,就停止循环)
continue:跳过一次循环
break:跳出单层循环
while循环:(使用while前,必须要声明变量,并对其初始化,如果在条件中声明,则每次都会重新生成,变量不会发生改变,循环不会停止;条件中的变量必须要进行更新到不满足条件才能使循环结束)
while(条件){ //重复执行的代码 }
例子:生成1-100内偶数的和(思路:1%2==0;2%2==0;......100%2==0)
计算数值从1开始,每次递增1,重复执行的是偶数判断
//此方法每一个数都要判断,性能不好 int i=1; int sum=0; while(i<=100){ if(i%2==0){ sum+=i; } i++; } sout(sum);
//此方法按照偶数的规律,直接得到偶数以及偶数和的值 int j=2; int sum=0; while(j<=100){ sum+=j; j+=2; } sout(sum);
例子:录入10个人的年龄,分别计算老年(60以上)、中年(20-59)、幼年(1-19)分别多少人?
Scanner sc=new Scanner(System.in); //分别用于记录三个年龄段的人数和 int oldCount=0; int middleCount=0; int youngCount=0; int i=1; while(i<=10){ sout(“请输入第”+i+“个人的年龄:”); int age=sc.nextInt(); if(age>=60){ oldCount++; } else if(age>=20){ middleCount++; } else{ youngCount++; } i++; } sout(“老年人共有:”+oldCount+“,中年人有:”+middleCount+“,幼年有:”+youngCount)
例子:操场800米一圈,要跑4300米,需要跑几圈,不满一圈算一圈
//跑的距离 int len=0; //跑的圈数 int count=0; //不能等于4300,不然正好到了4300米时还是会进入循环 while(len<4300){ count++; len+=800; } sout("共跑了"+count+"圈");
例子:产生四位验证码
Random ran=new Random(); String code=""; int i=1; while(i<=4){ //生成0-9的数字 int n=ran.nextInt(10); code+=n; i++; } sout("生成的验证码是:"+code);
do-while循环(先执行再循环,循环至至少会执行一次(先做,对其结果进行判断,是否继续进行))
do{
//循环执行条件
}while(条件);
例子:参加考试,判断是否要进行补考(考过了一次根据成绩判断是否进行补考)
Random ran=new Random(); int score; do{ score=ran.nextInt(); sout("考试分数是:"+score); }while(score<60); sout("通过了考试!");
例子:登录失败后重新输入的操作
Scanner sc=new Scanner(System.in); //创建变量 String name; String pwd; //创建记录用户名和密码是否正确的变量 boolean nameFlag; boolean pwdFlag; do{ //每次进入循环都要充值一下记录的数据,不然上次循环变更的flag还会保存 nameFlag=true; pwdFlag=true; sout("请输入用户名"); String name=sc.next(); sout("请输入密码"); String pwd=sc.next(); //判断用户名是否一致 if(!name.equals("admin")){ sout("用户名输入错误,请重新输入"); //更改nameFlag nameFlag=false; } //判断密码是否正确 else if(!pwd.equals("000")){ sout("密码输入错误,请重新输入"); //更改pwdFlag pwdFlag=false; } }while(!nameFlag||!pwdFlag); sout("登录成功!");
for循环(本质是对while的简化,在已知循环次数的情况下使用较多)
for(变量初始化;循环条件;变量更新){
//循环内容代码
}
执行循环:变量初始化——条件判断——循环内容——变量更新——循环条件
1.for循环表达式必须要写(即使不写内容也要写分号)
2.3个表达式允许部分缺失
for( ; ; ){(没有变量初始化,没有循环条件,是个死循环)
sout("执行循环");
}
int i=1; for( ;i<=10;i++){ sout(i); //循环条件中有一个i++,循环体中又一次i++,所以打印出来是1.3.5.7.9 i++; } //最后打印出来是11 sout("退出循环后的i是:"+i);
例子:输入班级的人数,并依次录入每个人的成绩,计算该班级平均分
Scanner sc=new Scanner(System.in); sout("请输入班级的人数:"); int n=sc.nextInt(); //记录班级总分数 int totalScore=0; for(int i=1;i<=n;i++){ sout("请输入第"+i+"个人的成绩"); int score=sc.nextInt(); //记累计总分数 totalScore+=score; } //记录平均分 int avg=totalScore/n; sout("班级平均分为:"+avg);
循环中的控制(循环的内容可以使用break终止,也可使用continue跳过;break表示跳出当前循环,continue表示跳过循环中的一次)
break和continue后写任何代码都不会执行,都会报错
例子:计算1-100的和,当和超过3000时,此时正在累加的数是多少?
int sum=0; for(int i=0;i<=100;i++){ sum+=i; //判断是否超过3000 if(sum>3000){ sout("正在累加的是:"+i+"当前和是:"+sum); //退出循环 break; } }
例子:打印1-10,跳过5不打印
for(int i=1;i<=10;i++){ if(i==5){ //如果是5就跳过 continue; } //不是5就打印 sout(i); }
例子:计算1-100所以奇数的和
/********方法一********/ int sum=0; for(int i=1;i<=100;i+2){ sum+=i; }
/*******方法二********/ int sum=0; for(int i=0;i<=100;i++){ //是偶数就跳过 if(i%2==0){ continue; } sum+=i; }