六、循环结构
6.1 while循环
6.1.1 什么是循环
一组相同或相似的语句被有规律的重复执行
循环要素:
- 循环条件
- 循环体
6.1.2 while的执行逻辑
while(boolean 表达式) { //当boolean表达式的值为true时执行循环体
循环体;
}
6.1.3 while用于处理循环逻辑
//计算0-100的和
int i = 0;//循环变量
int sum = 0;//结果
while(i <= 100) {
sum += i;//累加
i ++;//循环变量自增
}
6.1.4 while循环和break配合使用
break关键字一般用于跳出循环
//计算0-50的和
int i = 0;//循环变量
int sum = 0;//结果
while(i <= 100) {
sum += i;//累加
i ++;//循环变量自增
if(i == 50) {break;}
}
6.1.5 猜数字案例V1.0
System.out.println("请输入0-100内的整数:");
Scanner scan = new Scanner(System.in);
//设置输入的范围在100以内
//int randomNumber = (int)(Math.random()*100);
//等价于
Random rand = new Random(); //产生随机数
int randomNumber = rand.nextInt(100); //设置随机数的范围0~99
//int randomNumber = rand.nextInt(90)+10; //设置随机数的范围10~99
while(true) {
int userNumber = scan.nextInt();
if(userNumber > randomNumber) {
System.out.println("大了");
}
else if(userNumber < randomNumber){
System.out.println("小了");
}
else {
System.out.println("猜对了");
break;
}
}
6.2 do while循环
6.2.1 do while的执行逻辑
do{
循环体
}while(boolean表达式);// 当boolean表达式为true,会执行循环体
6.2.2 do while 用于处理循环逻辑
int pwd;
do{
System.out.println("请输入密码");
pwd = scan.nextInt();
}while(pwd != 123456);// 判断输入的密码是否为123456,直到输对为止
6.2.3 do while和while的区别
while是先判断后执行的,而do while是先执行后判断
do while无论满不满条件都先执行一次循环体
6.2.4 案例-猜数游戏V02
System.out.println("请输入0-100内的整数:");
Scanner scan = new Scanner(System.in);
//int randomNumber = (int)(Math.random()*100);
Random rand = new Random();
int randomNumber = rand.nextInt(100);
int userNumber = 0;
do {
userNumber = scan.nextInt();
if(userNumber > randomNumber) {
System.out.println("大了");
}
else if(userNumber < randomNumber){
System.out.println("小了");
}
else {
System.out.println("猜对了");
//break;可以不用了。原因是先执行了再去判断的当。相等时就不再执行循环体了
}
}while(randomNumber != userNumber);
6.3 for循环
6.3.1 for语句的执行逻辑
for(表达式1;表达式2;表达式3) {
循环体
}
1.表达式1 只执行第一次,后续的循环从表达式2开始
2.表达式2 如果为true 如果为false 则不执行直接跳出
3.循环体
4.表达式3
6.3.2 for用于固定次数的循环
//0-100的累加
int sum = 0;
for(int i = 0; i <= 100; i ++ ) {
sum += i;
}
6.3.3 for循环的三要素
循环变量的定义:int i = 0;
循环条件:i <= 100;
循环变量的变化:i++;
//第一种
int i = 0;
for(; i <= 100 ; i ++) {
循环体
}
//第二种
int i = 0;
for(; i <= 100 ; ) { //!!循环变量二不能变形
循环体
i ++;
}
//for循环的死循环
for(;;){
循环体
}
总结: for循环必须要有两个分号";"
6.3.4 for循环中break和continue关键字
for和break搭配使用,一般情况下需要和条件分支结构搭配使用
break和break的区别:
- break:跳出所有循环
- continue:跳出本次循环
int sum = 0;
for(int i=1; i<=100; i++){
if( i % 10 == 3) {
continue;
}
sum += i;
}//累加,跳过了各位数位3的所有数字
6.3.4 案例–质数的提取
boolean isFlag = true;
public void show(){
for (int i = 2; i <= 100; i++) {//打印输出的数
for (int j = 2; j < i; j++) {//数字的遍历(去掉1和其本身)
if(i%j==0){//能被除尽
isFlag = false;
}
}
if(isFlag==true){
System.out.println(i);
}
isFlag=true;//重置,否则只能输出2,3,因为到4时isFlag其已经变成了false
}
}
- 优化
boolean isFlag = true;
//获取当前时间毫秒数
long start = System.currentTimeMillis();
public void show(){
for (int i = 2; i <= 100000; i++) {//打印输出的数
for (int j = 2; j <= Math.sqrt(i); j++) {//数字的遍历(去掉1和其本身)(优化二:Math.sqrt(i):2*6、3*4和4*3、6*2的问题直接吧后半不半直接求掉)
if(i%j==0){//能被除尽
isFlag = false;
break;//只对非质数的自然数(优化1:提速大概10倍)
}
}
if(isFlag==true){
System.out.println(i);
}
isFlag=true;//重置,否则只能输出2,3,因为到4时isFlag其已经变成了false
}
//代码运行结束时所花费的时间
long end = System.currentTimeMillis();
double cha = end-start;
System.out.println("运行所花费的时间:"+cha);
}