循环结构(for,while,dowhile,多重循环)
for循环控制
-
基本语法
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(语句);
}
-
说明
- for关键字,表示循环控制
- for有四要素:
- 循环变量初始化
- 循环条件
- 循环操作
- 循环变量迭代
- 循环操作可以有多条语句,也就是我们要循环执行的代码
- 如果 循环操作(语句)只有一条语句,可以省略{},建议不要省略
-
流程图
注意事项和细节说明
1. 循环条件使返回一个布尔值的表达式
2.for(;循环判断条件;)中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。
int i = 1;
for(;i <= 10;){
System.out.println("shiliu" + i);
i++;
}
System.out.println("i=" + i);//i = 11
3.循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开。循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开。
4.内存分析法分析输出结果
分析:
1)执行 int i = 0,j = 0;
2)执行 i < count;
3)执行 System.out.println("i=" + i + "j=" + j);
4)执行 i++,j += 2(判断(i < count)?)
int count = 3;
for(int i = 0,j = 0;i < count;i++,j += 2){
System.out.println("i=" + i + "j=" + j);
}// 0 0 1 2 2 4
练习题
1.打印1-100之间所有是9的倍数的整数,统计个数及总和
🤔 编程思想:化繁为简
public class Homework01{
public static void main(String[] args){
/*思路分析
1.完成 输出1-100的值
2.在输出的过程中,进行过滤,只输出9的倍数
3.统计个数,定义一个变量 int count = 0;当条件满足时count++;
4.总和,定义一个变量 int sum = 0;当条件满足时累计 sum+=i*/
int count = 0;//统计个数
int sum = 0;
for(int i = 1;i <= 100;i++){
if(i % 9 ==0){
System.out.println("i=" + i);
count++;
sum += i;
}
}
System.out.println("count=" + count);
System.out.println("sum=" + sum);
}
}
🤔 先死后活[先考虑固定的值,然后转成可以灵活变化的值]
/*1.为了适应更好的需求,把范围开始的值和结束的值,做成变量
2.还可以更进一步 9 倍数也做成变量 int t = 9*/
int count = 0;//统计个数
int sum = 0;
int start = 1;
int end = 100;
int t = 5;
for(int i = start;i <= end;i++){
if(i % t ==0){
System.out.println("i=" + i);
count++;
sum += i;
}
}
System.out.println("count=" + count);
System.out.println("sum=" + sum);
2. 完成以下输出
public class Homework01{
public static void main(String[] args){
/*0 + 5 = 5
1 + 4 = 5
2 + 3 = 5
3 + 2 = 5
4 + 1 = 5
5 + 0 = 5*/
for (int i = 0;i <= 5;i++){
System.out.println(i + "+" + (5 - i) + "=" + 5);
}
}
}
🤔 先死后活
//5 替换成n
int n = 10;
for (int i = 0;i <= n;i++){
System.out.println(i + "+" + (n - i) + "=" + n);
}
while循环控制
-
基本语法
while(循环条件){
循环体(语句);
循环变量迭代;
}
-
说明
- while循环也有四要素
- 只是四要素放的位置不一样
-
注意事项和细节说明
- 循环条件是返回一个布尔值的表达式
- while循环时先判断再执行语句
-
练习题
1. 打印1-100之间所有能被3整除的数
public class Homework01{
public static void main(String[] args){
int i = 1;
while(i<=100){
if(i % 3 ==0){
System.out.print(i + "\t");
}
i++;//变量自增
}
}
}
2. 打印40-200之间所有的偶数
public class Homework01{
public static void main(String[] args){
int i = 40;
while(i<=200){
if(i % 2 ==0){
System.out.print(i + "\t");
}
i++;
}
}
}
do-while循环控制
-
基本语法
循环变量初始化;
do{
循环体(语句);
循环变量迭代;
}while(循环条件);
-
说明
- do while是关键字
- 也有循环四要素,只是位置不一样
- 先执行在判断,也就是说至少会执行一次
- 最后有一个分号**;**
- while和do-while的区别,举例:要账
- while先判断再执行
- do-while先执行再判断
-
注意事项
- 循环条件是返回一个布尔值的表达式
- do-while循环是先执行,再判断,因此它至少执行一次
-
练习题
1. 打印1-100,计算1-100的和
public class Homework01{
public static void main(String[] args){
int i = 0;
int sum = 0;
do{
i++;
System.out.println(i);
sum += i;
}while(i < 100);
System.out.println("sum=" + sum);
}
}
2. 统计1-200之间能被5整除但不能被3整除的个数
public class Homework01{
public static void main(String[] args){
int i = 1;
int num = 0;
do{
i++;
if(i % 5 == 0 && i % 3 != 0){
System.out.println("i=" + i);
num++;
}
}while(i <= 200);
System.out.println("num=" + num);
}
}
3. 如果李三不还钱,则lucy将一直使出五连鞭,直到李三说还钱为止[System.out.println(”lucy问:‘还钱吗’?y/n”);]do……while……
import java.util.Scanner;
public class Homework01{
public static void main(String[] args){
/*化繁为简
1)不停的问还钱吗?
2)使用char answer接收,定义一个Scanner对象
3)在do-while的while判断如果是y就不再循环*/
Scanner input = new Scanner(System.in);
char answer = ' ';
do{
System.out.println("lucy使出五连鞭");
System.out.println("lucy问还钱吗?y/n");
answer = input.next().charAt(0);
System.out.println("他的回答是" + answer);
}while(answer != 'y');
System.out.println("李三还钱了!");
}
}
!多重循环控制
-
介绍
1. 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for、while、do-while均可以作为外层循环和内层循环【建议一般使用两层,最多不要超过3层。否则代码的可读性很差】
2.实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当层循环,开始下一次的循环。
for(int i = 0;i < 2;i++){
for(int j = 0;j < 3;j++){
System.out.println("i=" + i + "j=" + j);
}
/*
i=0j=0
i=0j=1
i=0j=2
i=1j=0
i=1j=1
i=1j=2 */
3.设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m * n次。
练习题
1. 统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。统计三个班及格人数,每个班有5名同学。
import java.util.Scanner;
public class Homework01{
public static void main(String[] args){
/*思路分析:
化繁为简
1)先计算一个班的成绩,5个学生,使用for
1.1)创建Scanner对象然后,接收用户输入
1.2)得到该班级的平均分,先定义一个 double sum把该班学生的成绩累计起来
2)统计3个班(每个班5个学生)平均分
3)所有班级的平均分
3.1)定义一个变量 double totalScore 累积所有学生的成绩
3.2)当多重循环结束后,totalScore / (3 * 5)
4)统计三个班的及格人数
4.1)定义变量 int pasNum = 0;
4.2)当有一个学生成绩>=60.passNUm++
5)优化【效率/可读性/结构】*/
Scanner input = new Scanner(System.in);
double totalScore = 0;//累积所有学生的成绩
int passNum = 0;//累积及格人数
for(int i = 1;i <= 3;i++){
double sum = 0;
for(int j = 1;j <= 5;j++){
System.out.print("请输入第" + i +"个班的第" + j + "个学生的成绩:");
double score = input.nextDouble();
//当有一个学生成绩>=60, passNum++
if(score >= 60){
passNum++;
}
sum += score;//累积
}
//因为sum是5个学生的总成绩
System.out.println("sum=" + sum + "平均分=" + (sum / 5));
//把 sum累计到totalScore
totalScore += sum;
}
System.out.println("三个班总分=" + totalScore
+ " 平均分=" + totalScore /(3 * 5));
System.out.println("及格人数有:" + passNum);
}
}
2. 打印出九九乘法表。
public class Homework01{
public static void main(String[] args){
for(int i=1;i<=9;i++) {
for(int j=1;j<=i;j++) {
System.out.print(j+"×"+i+"="+i*j+"\t");// \t 跳到下一个TAB位置
}
System.out.println();
}
}
}
🐾 经典的打印金字塔
使用for循环完成。编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔[化繁为简,先死后活]
public class Homework01{
public static void main(String[] args){
/*
*
* *
* *
*******
*/
/*思路分析:化繁为简
1.打印一个矩形
*****
*****
*****
*****
*****
2.打印半个金字塔
*
**
***
****
*****
3.打印整个金字塔
* 2*层数-1 4个空格(总层数-1)
*** 3个空格(总层数-2)
*****
*******
*********
4.打印空心金字塔
* 2*层数-1 当前行的第一个位置是*,最后一个位置也是*
* *
* *
* *
********* 全部输出*
*/
/*
先死后活
5 层数做成变量 int totallLevel = 5
*/
int totallLevel = 10;
for(int i = 1;i <= totallLevel;i++){//表示层数
//在输出*之前还要输出空格
for (int k = 1;k <= totallLevel - i;k++ ) {
System.out.print(" ");
}
//控制打印每层*的个数
for(int j = 1;j <= 2 * i - 1;j++){
//当前行的第一个位置是*,最后一个位置也,最后一层全部*
if(j == 1 || j == 2 * i - 1 || i == totallLevel){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println(" ");
}
}
}
跳出语句
break
随机生成1-100个数,知道生成了97这个数,看看一共用了几次?
提示:(int)(Math.random() * 100) + 1
思路:循环,但是循环的次数不知道→break 当某个条件满足时,终止循环
-
基本介绍
break语句用于终止某个语句块的执行,一般使用在switch或者循环(for、while)
-
快速入门
public class Homework01{
public static void main(String[] args){
for(int i = 0;i < 10;i++){
if(i == 3){
break;
}
System.out.print("i=" + i + "\t");
//i=0 i=1 i=2
}
System.out.println("退出for循环");
}
}
注意事项和细节说明
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
标签的基本使用
label1:
for(int j = 0;j < 4;j++){
label2:
for(int i = 0;i < 10;i++){
if(i == 2){
//break;//等价于break label2
break label1;
}
System.out.println("i=" + i);
}
}
-
说明:
- break语句可以指定退出哪层
- label1是标签,名字由程序员指定。
- break后指定到那个label就退出到那里
- 如果没有指定break,默认退出最近的循环体。
练习题
1. 1-100以内的数求和,求出当和第一次大于20的当前数(for+break)
public class Homework01{
public static void main(String[] args){
int sum = 0;
//i的作用范围在for
//在for循环外部定义变量n,把当前i赋给n
int n = 0;
for(int i = 1;i <=100;i++){
sum += i;
if(sum > 20){
System.out.println("和大于20");
n = i;
break;
}
}
System.out.println("当前数为:" + n);
}
}
2. 实现登录验证,有3次机会,如果用户名为“lucy”,密码“666”提示登录成功,否则提示还有几次机会(for+break)
import java.util.Scanner;
public class Homework01{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String username = "";
String password = "";
int chance = 3;
for(int i = 1;i <= 3;i++){
System.out.print("请输入用户名:");
username = input.next();
System.out.print("请输入密码:");
password = input.next();
//比较输入的名字和密码是否正确
//补充说明 字符串内容的比较 使用的是equals
//System.out.println("林黛玉".equals(name)); 可以避免空指针
if("lucy".equals(username) && "666".equals(password)){
System.out.println("登陆成功!");
break;
}
chance--;
System.out.println("还有" + chance + "次机会");
}
}
}
continue
-
基本介绍
- continue语句用于结束本次循环,继续执行下一次循环。
- continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环,这个和前面的标签的使用规则一样。
-
快速入门
public class Homework01{
public static void main(String[] args){
int i = 1;
while(i <= 4){
i++;
if(i == 2){
continue;
}
System.out.print("i=" + i + "\t");
//i=3 i=4 i=5
}
}
}
案例分析说明
//可利用内存分析法
tabel1:
for(int j = 0;j < 2;j++){
label2:
for(int i = 0;i < 3;i++){
if(i == 2){
continue;//等价于continue label2
}
System.out.print("i=" + i + "\t");
//i=0 i=1 i=0 i=1
}
}
return
-
介绍
return使用在方法,表示跳出所在的方法。
如果return写在main方法,退出程序。
public class Homework01{
public static void main(String[] args){
for(int i = 1;i <= 5;i++){
if(i == 3){
System.out.println("十六" + i);
return;
}
System.out.println("Hello word!");
}
System.out.println("go on..");
/*Hello word!
Hello word!
十六3*/
}
}