循环结构(while/do-while/for)
逻辑:如果…,则再继续…。
循环结构分为当型(while、for)和直到型(do…while)
当型:布尔表达式条件为true时,反复执行某语句,当布尔表达式的值为false时才停止循环。
直到型:先执行某语句, 再判断布尔表达式,为true时,就执行反复某语句,当布尔表达式条件为false时才停止循环。
while循环
格式:
While (布尔表达式) {
循环体;
}
当布尔表达式的结果为true时一直执行循环体内容,直到结果为false时结束循环。
注意:循环体中必须要有使循环结束的语句,复制会出现死循环。
示例:
package com.itcode.demo1;
/**
* @author: 成都码到功成学员
* @Description:
* 需求:while循环加if-else嵌套使用 求1-100奇数之和,偶数之和。
* 以后我们做练习最好能把以前的知识结合在一起,锻炼自己的思维能力。
*/
public class TestControl5 {
public static void main(String[] args) {
int i = 0;
int count1 = 0; // 奇数和
int count2 = 0; // 偶数和
while (i <= 100) {
// 当i是奇数时就把奇数的值累加到count1。反之则累加到count2。
if (i%2 != 0) {
count1 += i;
i ++;
} else {
count2 += i;
i ++;
}
}
System.out.println("奇数和:" + count1);
System.out.println("偶数和:" + count2);
}
}
效果:
示例二:输入10个人的年龄,判断大于30岁所占的比例
do-while循环
格式:
do{
循环体;
}While (布尔表达式);
概述:先执行某语句, 再判断布尔表达式,为true时,就执行反复某语句,当布尔表达式条件为false时才停止循环。
和while的区别:while是先判断再执行,do…while是先执行再判断。
示例:
package com.itcode.demo1;
/**
* @author: 成都码到功成学员
* @Description:
* 需求:do…while循环版求1-100直接奇数和和偶数和,知道大概格式就行,很少用。
*/
public class TestControl6 {
public static void main(String[] args) {
int i = 0;
int count1 = 0; // 奇数和
int count2 = 0; // 偶数和
do {
// 当i是奇数时就把奇数的值累加到count1。反之则累加到count2。
if (i%2 == 0) {
count2 += i;
i++;
} else {
count1 += i;
i++;
}
} while (i <= 100);
System.out.println("奇数和:" + count1);
System.out.println("偶数和:" + count2);
}
}
for循环
格式:
for(初始化语句;布尔表达式;迭代因子){
循环体;
}
细节阐述
初始化语句:设置循环变量初始化值。
布尔表达式:任意布尔表达式都可以。
迭代因子:控制循环变量的增减。
循环体:输出内容
初始化作用域:仅限于for循环内。
无限循环
for (;;) {//类似while(true){}
}
示例:
package com.itcode.demo1;
import java.util.Scanner;
/**
* @author: 成都码到功成学员
* @Description:
* 键盘录入for循环n*n乘法表
*/
public class TestControl7 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数:");
int a = scanner.nextInt();
for (int x = 1; x <= a; x++) { // 外循环控制行数
for (int y = 1; y <= x; y++) {// 内循环控制列数
// System.out.print()与System.out.println();的区别是,System.out.print();不换行。
System.out.print(y + "*" + x + "=" + x * y +"\t");
}
System.out.println();
}
}
}
注意for增强型
for-each/增强for循环不能修改数组元素的值,不涉及索引(下标)的操作。
String[] arr = {"成都", "码到", "功成"}; // 普通for循环 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } // 增强/for-each循环 只能读取值,不能修改值。 for (String s : arr) { System.out.println(s); }
嵌套循环
概述:在一个循环语句内部再嵌套1-n个循环。while、do-while与for循环相互间可任意嵌套多层。
示例:
package com.itcode.demo1;
/**
* @author: 成都码到功成学员
* @Description:
* 需求:循环嵌套练习2个
*/
public class TestControl2 {
public static void main(String[] args) {
// 1.
System.out.println("第一个练习效果:");
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
System.out.print(j + "\t");
}
System.out.println();
}
// 2.用while循环或其他循环输出1-1000之间能被5整除的数,且每行输出4个。
System.out.println("第二个练习效果:");
for (int i = 1; i < 1000; i++) { // 输出1-1000之间
if (i%5 == 0) { // 能被5整除的数
System.out.print(i + "\t");
}
if(i%20 == 0){// 每行输出4个, 就是每行输出个数乘以(能被*整除的数)
System.out.println();
}
}
}
}
效果:
continue,break
continue
:略过本次循环之后继续循环。(只能放在循环中,搭配if语句使用)break
:直接终止,剩下的循环不再执行。跳出所在循环或switch语句。(一般用于循环或者switch语句中),想跳出外层循环请使用标签。return
:返回值和结束方法运行。
注意:1.break可以放在任何语句中,比如单独使用if语句必须搭配标签使用。
o:if(a=2){
break o;
}
示例:
package com.itcode.demo1;
/**
* @author: 成都码到功成学员
* @Description:
* 需求:contine,break的区别
*/
public class TestControl9 {
public static void main(String[] args) {
// 让我们来看相同条件下continue语句和beak语句运行结果的不同
System.out.println("continue语句运行结果:");
for (int i = 1; i < 12; i++) {
if (i == 7) {
continue;// 7不会显示,其它小于12的数字都会显示
}
System.out.print(i + "\t");
}
System.out.println();
System.out.println("beak语句运行结果:");
for (int i = 1; i < 12; i++) {
if (i == 7) {
break;// 大于6的数字都不会显示
}
System.out.print(i + "\t");
}
}
}
效果:
练习:
package com.itcode.demo1;
/**
* @author: 成都码到功成学员
* @Description:
* 需求:contine,break 练习。
*/
public class TestControl10 {
public static void main(String[] args) {
// 把100~150之间不能被3整除的数输出,并且每行输出5个
int sum = 0; //计数器
for (int i = 100; i < 150; i++) {
if (i%3 == 0) {
continue;// 如果是三的倍数,跳过
}
// 反之则输出
System.out.print(i+ ",");
sum++;// 每输出一个就计一个
// 每行的数量达到五个,换行
if (sum%5 == 0) {
System.out.println();
}
}
}
}
效果:
带标签的continue/break
简单来讲,标签可以从内循环调到外循环。一般不用,但需要了解。
示例:
package com.itcode.demo;
import javax.swing.JFrame;
/**
* @author: 成都码到功成学员
* @Description:
* 求质数。
* 质数:只能被1和自己本身整除的数,1和2不算。
* 数学逻辑:如果一个数N从N%2开始,依次N%3,N%4,N%5,N%6……一直n%(小于n/2)其结果都不是0的时候,这个数就是质数。
*/
public class TestControl11 {
public static void main(String[] args) {
/*
* 求[101-104)之间的质数
* 执行过程:
* 注意:到哪一层代码我都用汉字一二三四五表示,让大家更好理解。
* ① 验证101
* 1.从“一”开始,int i =101, i <104满足条件,继续往下。
* 2.来到“二”,j等于2,判断条件2小于101/2,继续往下。
* 3.来到“三”,101%2值不等于0,回到“二”,先给j加上1,j的值变成3。3小于101/2,往下执行。
* 4.又来到“三”,101%3值不等于0,又回到“二”,j++,j的值变成4。判断4小于101/2。往下执行。
* 5.来到“三”,101%4的值不等于0,又回到“三”……
* 6.“三”“二”之间往返遍历判断,也就是“101%5,101%6,101%7,101%8,101%9……”的值是否等于0。
* 7.执行到101%49时还不满足不满足i%j==0,还是要继续返回到“二”,49加1等于50。
* 8.50不满足j < 101/2(101/2=50,因为j的值是整数型),结束“二”/内循环,来到“五”,打印出101。
* ② 验证102
* 1.打印完毕回到“一”,执行"i++",i的值由101变成102。判断102小于104,继续往下。
* 2.来到“三”,102%2值等于0。不是质数,进入“三”里面,通过"continue outer;"直接跳到"outer:for(i……"/外循环。
* ③ 验证103
* 1.执行"i++",i的值由102变成103。判断103小于104,继续往下。
* 2.来到“二”,j等于2,判断条件2小于103/2,继续往下。
* 3.来到“三”,103%2值不等于0,回到“二”,先给j加上1,j的值变成3。3小于103/2,往下执行。
* 4.又来到“三”,103%3值不等于0,又回到“二”,j++,j的值变成4。判断4小于103/2。往下执行。
* 5.来到“三”,103%4的值不等于0,又回到“三”……
* 6.“三”与“二”之间往返遍历判断,也就是“103%5,103%6,103%7,103%8,103%9……”的值是否等于0。
* 7.执行到103%50还不满足不满足i%j==0,还是要继续返回到“二”,50加1等于51。
* 8.51不满足j < 103/2(103/2=51,因为j的值是整数型),结束“二”/内循环,来到“五”,打印出103。
* ④ 结束
* 1.打印完毕回到“一”,执行"i++",i的值由103变成104。判断104小于104不满足,整个循环执行完毕。
* 2.所以控制台打印结果就是101和103。
* */
// 一 外循环,依次遍历[101,104)的值。
outer:for(int i=101; i<104; i++) {
// 二 内循环 从2开始,依次加一,为“N%2开始,依次N%3,N%4,N%5,N%6……一直n%(小于n/2)”做准备。
for(int j=2; j <i/2; j++) {
// 三 if语句 验证值是否为质数
if(i%j == 0) {
// 四 跳转到外循环。
continue outer;
}
}
// 五 打印出质数。
System.out.println(i+"\t");
}
}
}
效果:
练习
练习1:
效果:
Last updated
Was this helpful?