循环结构
一、循环的概念
在程序中,有条件的重复执行一段代码的过程叫做循环。
循环需要满足以下几个条件:
- 1、有循环执行的内容
- 2、有循环终止的条件
- 3、在每次循环过程中能够对条件所涉及的变量值进行改变
二、while循环
2.1 循环的语法
语法:
while(条件){
// 代码块
}
执行流程:
- 先判断条件是否成立,如果成立则执行代码块
- 代码块执行完毕后,再次判断条件是否成立,如果成立则再次执行代码块
- 重复上面两个步骤,直到条件不成立则结束循环
public class Demo1 {
public static void main(String[] args) {
byte n = 5;
while(n > 1) {
System.out.println("我很好,很厉害" + n);
n--;
}
}
}
2.2 循环的组成
public class Demo2 {
public static void main(String[] args) {
// 定义一个初始变量,来控制循环
// 1、初始变量
int n = 0;
// 目标是循环一百次
// 2、循环条件
while(n < 100) {
// 打印100次Hello, world
// 3、循环的业务(内容)
System.out.println("hello, world==" + n);
// 4、条件变量的改变
n++;
}
}
}
2.3 案例
public class Demo4 {
public static void main(String[] args) {
// 求1...10的乘积,结果是
// 循环的初始变量
int n = 1;
int sum = 1;
while(n <= 10) {
sum = sum * n;
System.out.println("第"+n+"次=" + sum);
n++;
}
System.out.println(sum);
}
}
public class Demo5 {
public static void main(String[] args) {
// 求1...100的偶数之和,结果是
// 循环的初始变量
// 从1到100,判断是否偶数,偶数就加
int n = 1;
int sum = 0;
while(n <= 100) {
System.out.println("第"+n+"次");
if(n % 2 == 0) {
sum += n;
System.out.println("计算结果相加为: " + sum);
}
n++;
}
System.out.println(sum);
// 使用简单算法,减少循环次数
// int n = 2;
// int sum = 0;
// while(n <= 100) {
// sum += n;
// n += 2;
// }
// System.out.println(sum);
}
}
public class Demo6 {
public static void main(String[] args) {
// 求1...100以内与7无关的数字之和
int n = 1;
int sum = 0;
while(n <= 100) {
/****此处写逻辑start****/
if(!(n % 7 == 0 || n % 10 == 7 || n / 10 == 7)) {
sum += n;
}
/****此处写逻辑end*****/
n++;
}
System.out.println(sum);
}
}
三、do-while循环
3.1 基本语法
语法:
do{
// 代码块
}while(条件);
执行流程:
- 先执行一次代码块
- 再判断条件是否成立,如果成立,再执行一次代码块
- 再判断条件是否成立,如果成立,再执行一次代码块,再次判断,直到条件不成立则循环终止。
public class Demo7 {
public static void main(String[] args) {
// 求1...100之和
int n = 1;
int sum = 0;
do{
sum += n;
n++;
}while(n<=100);
System.out.println(sum);
}
}
3.2 使用场景
简单的一个使用场景:
如果需要先执行一次,才有判断条件的情况下,需要使用do-while
public class Demo9 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
char answer; // 先不赋值
do{
System.out.println("抄写一次代码");
System.out.println("请老师输入评语:y/n");
// 在执行过程中赋值
answer = input.next().charAt(0);
}while(answer != 'y');
}
}
注意:一般情况下,while和do-while更适用于循环次数不固定的业务。
四、for循环
4.1 基本语法
语法:
for(初始化变量; 条件; 迭代部分){
// 代码块
}
执行流程:
- 初始化变量,仅执行一次
- 判断条件,成立则执行代码块
- 执行迭代部分,再判断条件,成立则再执行代码块,再执行迭代部分,再判断条件,直到条件不成立则循环终止。
public class Demo10 {
public static void main(String[] args) {
// 输出100次Hello, world
for(int n = 0; n<100; n++) {
System.out.println("hello, world" + n);
}
}
}
4.2 简单案例
// 求1-100的和
public class Demo11 {
public static void main(String[] args) {
// 求1-100的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println(sum);
}
}
public class Demo12 {
public static void main(String[] args) {
// 求1-10的乘积
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字:");
int n = input.nextInt();
int sum = 1;
for (int i = 1; i <= n; i++) {
sum *= i;
}
System.out.println(sum);
}
}
public class Demo13 {
public static void main(String[] args) {
// 求5个人的平级成绩
Scanner input = new Scanner(System.in);
int sum = 0;
for (int i = 0; i < 5; i++) {
System.out.println("请输入第"+(i+1)+"个同学的成绩:");
int score = input.nextInt();
sum += score;
}
System.out.println(sum);
double avg = (double)sum / 5;
System.out.println("平均分为:" + avg);
}
}
public class Demo14 {
public static void main(String[] args) {
// 输出所有5位回文数
for (int n = 10000; n < 100000; n++) {
if(n / 10000 == n % 10 && n / 1000 % 10 == n / 10 % 10) {
System.out.println(n);
}
}
}
}
五、流程控制
5.1 break
break:表示在循环过程中,终止循环。
public class Demo15 {
public static void main(String[] args) {
// 流程终止
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
System.out.println(i + "====" + sum);
if(sum > 1000) {
// 终止循环
break;
}
}
}
}
public class Demo16 {
public static void main(String[] args) {
// 求两个数的最小公倍数
int n = 15;
int m = 20;
for (int i = 1; i <= n * m; i++) {
// 判断数字是否公倍数
if(i % n == 0 && i % m == 0) {
System.out.println(i);
break;
}
}
}
}
public class Demo17 {
public static void main(String[] args) {
// 求两个数的最大公约数
int n = 12980;
int m = 21200;
for (int i = n; ; i--) {
if(n % i == 0 && m % i == 0) {
System.out.println(i);
break;
}
}
}
}
5.2 continue
表示跳过当次循环,继续下一次循环。
public class Demo18 {
public static void main(String[] args) {
// 打印所有偶数
for (int i = 0; i < 100; i++) {
// 当为奇数时,continue表示跳过当次循环(即当次循环中continue后面的代码不再执行),继续下一次循环
if(i % 2 != 0) {
continue;
}
System.out.println(i);
}
}
}
public class Demo19 {
public static void main(String[] args) {
// 求100以内所有奇数之和,使用continue
int sum = 0;
for (int i = 1; i <= 100; i++) {
if(i % 2 == 0) {
continue;
}
sum += i;
}
System.out.println(sum);
}
}
六、嵌套循环
public class Demo20 {
public static void main(String[] args) {
// 10个班,每班10个学生,输出学生编号
for (int i = 1; i <= 10; i++) {
System.out.println(i + "班");
for (int j = 1; j <= 10; j++) {
System.out.println(j + "号学生");
}
}
}
}
public class Demo21 {
public static void main(String[] args) {
// 百钱百鸡问题,100文钱要买100只鸡,公鸡5文,母鸡3文,小鸡3只1文,请问公鸡母鸡小鸡各几何。
for (int i = 0; i <= 100 / 5; i++) {
for (int j = 0; j <= 100 / 3; j++) {
for (int k = 0; k <= 100; k+= 3) {
if(i + j + k == 100 && i * 5 + j * 3 + k / 3 == 100) {
System.out.println("公鸡"+i+"只,母鸡"+j+"只,小鸡"+k+"只");
}
}
}
}
}
}
public class Demo22 {
public static void main(String[] args) {
// 打印100以内所有的质数
for (int i = 2; i < 100; i++) {
boolean b = false;
for (int j = 2; j < i; j++) {
if(i % j == 0) {
b = true;
break;
}
}
if(b == false) {
System.out.println(i + "是质数");
}
}
// int i = 11;
// boolean b = false;
// for (int j = 2; j < i; j++) {
// if(i % j == 0) {
// b = true;
// break;
// }
// }
// if(b == false) {
// System.out.println(i + "是质数");
// }
}
}
public class Demo23 {
public static void main(String[] args) {
// 3个班,每个班5个同学,求该班的平级成绩
Scanner input = new Scanner(System.in);
for (int n = 0; n < 3; n++) {
System.out.println("第"+(n+1)+"个班");
// 求5个人的平级成绩
int sum = 0;
for (int i = 0; i < 5; i++) {
System.out.println("请输入第"+(n+1)+"个班第"+(i+1)+"个同学的成绩:");
int score = input.nextInt();
sum += score;
}
System.out.println(sum);
double avg = (double)sum / 5;
System.out.println("第"+(n+1)+"个班平均分为:" + avg);
}
}
}