控制流有两种结构: 条件结构 循环结构
条件结构三种:基本条件结构,多重条件结构,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;
}