循环结构分两大类,一类是当型,一类是直到型。
- 当型:
当布尔表达式条件为true时,反复执行某语句,当布尔表达式的值为false时才停止循环,比如:while与for循环。
- 直到型:
先执行某语句, 再判断布尔表达式,如果为true,再执行某语句,如此反复,直到布尔表达式条件为false时才停止循环,比如do-while循环。
while
/**
* public static void main(String[] args) {
* @author yuan
*
*/
public class TestWhile {
public static void main(String[] args) {
//1+2+3+4+...+100 = 5050
//暴力算法
//1-100之间的累加和
int i = 1;
int sum = 0;
while(i<100) {
sum += i;
i++;
}
System.out.println(sum);
}
}
do while
do-while循环结构会先执行循环体,然后再判断布尔表达式的值,若条件为真,执行循环体,当条件为假时结束循环。do-while循环的循环体至少执行一次
//1-100之间的累加和
public class TestDoWhile {
public static void main(String[] args) {
int i = 0;
int sum = 0;
do {
sum += i; // sum = sum + i
i++;
} while (i <= 100);//此处的;不能省略
System.out.println("Sum= " + sum);
}
}
for
语法结构:
for (初始表达式; 布尔表达式; 迭代因子) {
循环体;
}
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。for循环在第一次反复之前要进行初始化,即执行初始表达式;随后,对布尔表达式进行判定,若判定结果为true,则执行循环体,否则,终止循环;最后在每一次反复的时候,进行某种形式的“步进”,即执行迭代因子。
public class TestFor {
public static void main(String[] args) {
int sum = 0;
for(int i=1; i<=100; ++i){
sum += i;
}
System.out.println(sum);
//逗号运算符
for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) {
System.out.println("i= " + i + " j= " + j);
}
//无限循环
for ( ; ; ) { // 无限循环: 相当于 while(true)
System.out.println("爱你到永远!!");
}
}
}
初始化变量的作用域是for括号中间
嵌套循环 nested loop
public class TestNestedLoop {
public static void main(String[] args) {
for(int i=1; i<=5; ++i) {
for(int j=1; j<=5; ++j) {
System.out.print(i+"\t");
}
System.out.println();
}
//打印乘法口诀表 印度人的乘法口诀表是19×19
for(int i=1; i<=19; ++i) {
for(int j=1; j<=i; ++j) {
System.out.print(j + "*" + i + "=" + j*i + " ");
}
System.out.println();
}
//用while循环分别计算100以内的奇数及偶数的和,并输出。
//[1,100]奇数和偶数的个数相同
int i = 1, j = 2;
int sumUneven = 0; //奇数和
int sumEven = 0; //偶数和
while(i<=100 && j<=100) {
sumUneven += i;
i += 2;
sumEven += j;
j += 2;
}
System.out.println("奇数和"+sumUneven);
System.out.println("偶数和"+sumEven);
//用while循环或其他循环输出1-1000之间能被5整除的数,且每行输出5个。
int number = 1;
int flag = 0;
while(number<=1000) {
if(number%5 == 0) {
System.out.print(number+" ");
flag++;
}
if(flag != 0 && flag == 5) {
System.out.println();
flag = 0;
}
number++;
}
}
}
break和continue
在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。
public class TestBreakAndContinue {
public static void main(String[] args) {
//break
int total = 0;//定义计数器
System.out.println("Begin");
while (true) {
total++;//每循环一次计数器加1
int i = (int) Math.round(100 * Math.random());
//当i等于88时,退出循环
if (i == 88) {
break;
}
}
//输出循环的次数
System.out.println("Game over, used " + total + " times.");
//continue
int count = 0;//定义计数器
for (int i = 100; i < 150; i++) {
//如果是3的倍数,则跳过本次循环,继续进行下一次循环
if (i % 3 == 0){
continue;
}
//否则(不是3的倍数),输出该数
System.out.print(i + "、");
count++;//没输出一个数,计数器加1
//根据计数器判断每行是否已经输出了5个数
if (count % 5 == 0) {
System.out.println();
}
}
}
}
带标签的break和continue
goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在Java语言中得到正式使用;Java没有goto语句。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子—带标签的break和continue。
“标签”是指后面跟一个冒号的标识符,例如:“label:”。对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。
在 “goto有害”论中,最有问题的就是标签,而非goto, 随着标签在一个程序里数量的增多,产生错误的机会也越来越多。 但Java标签不会造成这方面的问题,因为它们的活动场所已被限死,不可通过特别的方式到处传递程序的控制权。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。
public class TestLableContinueAndBreak {
public static void main(String args[]) {
outer: for (int i = 101; i < 150; i++) {
for (int j = 2; j < i / 2; j++) {
if (i % j == 0){
continue outer;
}
}
System.out.print(i + " ");
}
}
}
来源:CSDN
作者:云疏不知数
链接:https://blog.csdn.net/qq_43808700/article/details/104109456