一、for循环
循环概念:条件成立,就重复执行
1. 语法结构
for(表达式1;表达式2;表达式3){
...代码块...
}
表达式1:初始化变量
表达式2:判断条件
表达式3:更新变量
执行流程:
- 初始化变量
- 判断条件:结果一定是boolean值
- true - 执行代码块,并更新变量,重复第2个步骤
- false- 跳出整个循环语句
for (int i = 1; i <= 5; i++) {
System.out.println("循环输出5遍");
}
for循环变形:
int i = 1;
for (; i <= 5; ) {
System.out.println("循环输出5遍");
i++;
}
System.out.println(i);
//注意:在for循环内部声明的变量不能在for循环外面使用
死循环:
for (; ; ) {
System.out.println("死循环");
}
需求1:打印0~10的数字
for (int i = 0; i <= 10; i++) {
System.out.println(i);
}
需求2:打印1,3,5,7,9的数字
for (int i = 1; i <= 9; i += 2) {
System.out.println(i);
}
需求3:打印10~1的数字
for (int i = 10; i > 0; i--) {
System.out.println(i);
}
需求4:循环录入5门椎名真白的成绩,输出总分
Scanner scan = new Scanner(System.in);
double sum = 0;//总和
for (int i = 1; i <= 5; i++) {
System.out.println("请输入第" + i + "门成绩:")
double score = scan.nextDouble();
sum += score;//累加总分
}
System.out.println("椎名真白的总分为:" + sum);
案例:循环录入5次int类型的数字,输出最大值
Scanner scan = new Scanner(System.in);
System.out.println("请输入第1个数字:");
int max = scan.nextInt();
for(int i = 2; i<=5; i++) {
System.out.println("请输入第" + i + "个数字:");
int num = scan.nextInt();
if(max < num) {
max = num;
}
}
System.out.println("最大值为:" + max);
2. for循环嵌套
案例1:输出3行4列长方形的星号
for (int i = 0; i < 3; i++) {//外层循环控制的是行数
for (int j = 0; j < 4; j++) {//内层循环控制的是列数
System.out.print("*");
}
System.out.println();
}
案例2:打印三角形
*
**
***
****
*****
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
案例3:三角形
*****
****
***
**
*
for (int i = 0; i < 5; i++) {
for (int k = 0; k < i; k++) {
System.out.print(" ");
}
for (int j = 0; j < 5 - i; j++) {
System.out.print("*");
}
System.out.println();
}
案例4:九九乘法表
for(int i = 1;i<=9;i++){
for(int j = 1;j<=i;j++){
System.out.print(j + "x" + i + "=" + (i*j) + "\t");
}
System.out.println();
}
二、while循环
语法结构:
while(表达式){
...代码块...
}
表达式的结果一定是boolean
true - 循环
false- 跳出循环
死循环:
while (true) {
System.out.println("xxx");
}
案例:每月存5000,每年递增1000元,多久后存满50万
int money = 5000;
int month = 0;//几个月
int allMoney = 0;
while (allMoney < 500000) {
month++;
allMoney += money;
if (month % 12 == 0) {//每年递增1000元
money += 1000;
}
}
System.out.println(month/12+"年" +month%12 +"个月后存满50万 ");
三、do-while循环
语法结构:
do {
...代码块...
} while (表达式);
先执行一遍代码块
再判断表达式,表达式的值一定是boolean类型
true - 循环
false- 跳出循环
死循环:
do{
System.out.println("xxx");
}while(true);
案例:可知白草参加学校组织的歌咏比赛,大赛在即,老师建议:先彩排一次,如果很令人满意,以后就不用彩排了,否则每天都排,直到现场表现满意为止!
Scanner scan = new Scanner(System.in);
String str;
do {
System.out.println("可知白草:旋转跳跃,我闭着眼~~~");
System.out.println("可知白草:老师,您满意吗??");
str = scan.next();
} while (str.equals("不满意"));
四.for & while & do-while
表达式的区别:
for(初始化变量;判断条件;更新变量){}
while(判断条件){}
do{}while(判断条件);
**注意:**判断条件的结果都是boolean类型,true-循环,false-跳出循环
执行顺序的区别:
for:先判断再执行
while:先判断再执行
do-while:先执行一遍,再判断
应用场景:
循环次数确定时:for
循环次数不确定时,先判断:while
循环次数不确定时,先执行一遍:do-while
五、特殊的流程控制语句
1. break
作用于循环中,表示跳出当前循环
案例:循环录入志田黑羽同学5门课的成绩并计算平均分,如果某分数录入为负,停止录入并提示。
Scanner scan = new Scanner(System.in);
double sum = 0;
boolean flag = true;//true-正常录入 false-有错误情况
for (int i = 1; i <= 5; i++) {
System.out.println("请输入第" + i + "门成绩:");
double score = scan.nextDouble();
if (score < 0) {
flag = false;
break;//跳出循环体
}
sum += score;
}
if (flag) {
double avg = sum / 5;
System.out.println("平均分为:" + avg);
} else {
System.out.println("分数为负数,停止录入");
}
2. continue
作用于循环中,表示跳过循环体剩余的部分
案例:循环录入Java课5名学生的成绩,统计分数大于等于80分的学生比例。
Scanner scan = new Scanner(System.in);
int num = 0;//大于等于80分学生的人数
for (int i = 1; i <= 5; i++) {
System.out.println("请输入第" + i + "名学生的成绩:");
double score = scan.nextDouble();
if (score < 80) {
continue;//跳过循环体剩余的部分
}
num++;
}
System.out.println("分数大于等于80分的学生比例:" + (num / 5.0 * 100) + "%");
3. return
结束当前方法
public static void main(String[] args) {
System.out.println("22");
System.out.println("33");
if (true) {
return;//结束当前方法
}
System.out.println("这一句不会被运行");
}
return的主要作用有两点:
- 返回方法指定类型值
- 用于方法结束的标志,return 后面的语句不会被执行
4. label
给循环做标记
需求:嵌套for循环,外层循环5次,内层循环3次,当外层循环到第3次时,在内层循环中关闭外层循环
testLabel: //标签名可随意取
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 3; j++) {
if (i == 3) {
break testLabel;//关闭外侧循环
}
System.out.println(i + " -- " + j);
}
}
经典面试题:以下代码会报错吗?不会
https://www.bilibili.com/
for (int i = 0; i < 5; i++) {
System.out.println("//后的被当成了注释,https:被当成了Label标签");
}
万年历案例
输入一个年份,再输入一个月份,把那个月的日历打印出来
//1.输入年和月
Scanner scan = new Scanner(System.in);
System.out.println("请输入年:");
int year = scan.nextInt();// 2020
System.out.println("请输入月:");
int month = scan.nextInt();// 6
//2.计算1900~输入年的天数
int allDayOfYear = 0;
for (int i = 1900; i < year; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {//闰年
allDayOfYear += 366;
} else {//平年
allDayOfYear += 365;
}
}
//3.计算1~输入月的天数
int allDayOfMonth = 0;
for (int i = 1; i < month; i++) {
switch (i) {
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
allDayOfMonth += 31;
break;
case 4:case 6:case 9:case 11:
allDayOfMonth += 30;
break;
case 2:
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
allDayOfMonth += 29;
} else {
allDayOfMonth += 28;
}
break;
}
}
//4.计算1900~输入年的天数 + 计算1~输入月的天数
int allDay = allDayOfYear + allDayOfMonth;
//5.计算星期
int week = allDay % 7 + 1;
//6.计算当月的天数
int day = 0;
switch (month) {
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
day = 31;
break;
case 4:case 6:case 9:case 11:
day = 30;
break;
case 2:
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
day = 29;
} else {
day = 28;
}
break;
}
//7.打印日历
System.out.println("一\t二\t三\t四\t五\t六\t日");
int num = 0;//控制换行
//打印空格
for (int i = 1; i < week; i++) {
System.out.print("\t");
num++;
}
//打印日期
for (int i = 1; i <= day; i++) {
System.out.print(i + "\t");
num++;
if (num % 7 == 0) {
System.out.println();//换行
}
}
演示: