循环结构
循环结构:程序反复执行某个或某些操作,直到某条件为假(或真)时才停止循环
特别注意:循环结构必须给出循环出口,否则就是死循环。
Switch循环语句
while型结构:先判断条件,当条件为真时执行循环体,并且在循环体结束时自动返回到循环入口处,再次判断循环条件;
如果条件为假,则退出循环体到达流程出口处。即“先判断,后执行”;
语法结构:
while(boolean){
}
while 执行流程:
当程序执行到 while 循环时 , 会首先判断小括号里的值 ,如果值
为假 :结束while语句 , 程序继续向下走 (1)
为真 :会把while 循环里大括号里的所有内容执行一次 , 全部执行完毕之后 ,会再度来到条件处 (2)
判断小括号里的值 , 如果值
为假 (1)
为真 (2)
注意: 如果没有 break return ,条件一直为true , 那么循环会一直循环下去
循环输出1到100
/**
* @author Amanda
*switch循环输出1到100
*/
public class Test {
public static void main(String[] args){
int i = 1;
while( i <= 100){
System.out.println(i);
i++;
}
System.out.println("mian-gg");
}
}
Switch循环输出累加和
/**
* @author Amanda
*switch循环输出累加和
*/
public class Test {
public static void main(String[] args){
int i = 1;
int sum = 0;
while( i <= 100){
sum += i;
i++;
}
System.out.println("sum = " + sum);
System.out.println("mian-gg");
}
}
练习:1-100累加 输出 1-100 内的奇数和偶数 求出所有的水仙花数
/**
* @author Amanda
* 1-100累加
输出 1-100 内的奇数和偶数 并对偶数求和
求出所有的水仙花数
*/
public class Test {
public static void main(String[] args){
sum();
printWord();
Narcissus();
System.out.println("mian-gg");
}
private static void Narcissus() {
// 水仙花数 某个三位数的 个位 十位 百位 各取立方 , 它们的和等于自身
int i = 100;
int x,y,z;
while(i < 1000){
x = i / 1 % 10;
y = i / 10 % 10;
z = i / 100 % 10;
// if((x^3 + y^3 + z^3) ==i) //^为异或,应用Math.pow(a, b)方法,a的b次幂
// if( x*x*x + y*y*y + z*z*z == i) //方法1
if(Math.pow(x, 3) + Math.pow(y, 3) + Math.pow(z, 3) == i) //方法2
System.out.println(i);
i++;
}
}
private static void printWord() {
// TODO Auto-generated method stub
int sum = 0;
int sum1 = 0;
int y = 1;
while(y <= 100){
if(y % 2 == 0){
System.out.println("偶数" + y);
sum += y;
}else{
System.out.println("奇数.." + y);
sum1 += y;
}
y++;
}
System.out.println("偶数和为:" + sum);
System.out.println("奇数和为:" + sum);
}
private static void sum() {
// TODO Auto-generated method stub
int i = 1;
int sum = 0;
while( i <= 100){
sum += i;
i++;
}
System.out.println("sum = " + sum);
}
}
.
do-while循环
语法结构
do{
//循环体;
//步进语句;
}while(布尔值); //分号不能省
执行流程:
当程序执行到 dowhile时 , 它们是一个整体 ;
程序会首先执行 大括号的内容 , 这是循环体 ;
然后进行条件判断 , 如果小括号的值
为假 : 结束循环 程序继续向下走 (1)
为真 : 执行循环体一次 , 循环体整体结束了 , 再到条件判断处进行条件判断 (2)
为假 :(1)
为真 :(2)
注意: do while 循环保证了循环体至少被执行一次
例:
public static void main(String[] args) {
// do-while循环
int i = 10; //循环初始条件
do{ //进入循环体
System.out.println("loop:" + i);
i--; //步进语句
}while(i < 0); //执行一次循环体后才判断条件
}
练习:1-200的累加
public static void main(String[] args) {
// do-while循环
int i = 1; //循环初始条件
int sum = 0;
do{ //进入循环体
System.out.println(i);
sum += i;
i++; //步进语句
}while(i <= 200); //执行一次循环体后才判断条件
System.out.println("sum = " + sum);
}
for循环
语法格式:
for(初始化语句;循环条件(布尔值);循环步进语句(++或--)){
//循环执行体
}
执行流程:
第一步:初始化语句;该语句只在循环开始前执行一次,在此处可以声明一个或多个同类型的变量,作用域只在for中
第二步:每次执行循环体前,先判断循环条件的值,如果循环条件为真,则进入第三步,条件为假则进入第五步;
第三步:执行循环体一次;
第四步:执行循环步进语句(表达式3)后进入第二步;
第五步:结束循环;
联系:1-100的累加
public static void main(String[] args){
int sum = 0;
for(int i = 0; i <= 100;i++){
sum += i;
}
System.out.println("sum = " + sum);
}
练习: for输出1-100 , 奇数偶数分别添加标识
/**
* for输出1-100 , 奇数偶数分别添加标识
* @author Acer
*
*/
public class TestOddEven {
public static void main(String[] args){
for(int i = 1; i <= 100;i++){
if(i % 2 == 0)
System.out.println("偶数" + i);
else{
System.out.println("..奇数" + i);
}
}
}
}
for循环省略
- 大括号可以省略 但是省略之后只对之后第一条语句产生作用
- 表达式1 可以省略 , 省略之后 , 往往放在for循环之前 , 如无特殊需求最好不这么写
- 表达式3 可以省略 , 省略之后会写在 循环体中
- 达式2 , 即条件也可以省略 , 但是省略之后会更复杂 往往要在循环体中 增加 if和break 结合 营造出循环的出口
int i = 1;
for(;;){
if(i == 101)
break;
System.out.println(i++);
}
练习:完成一个功能 , 键盘录入用户名 , 用户名必须是 100-10000 之间的数字 ,用户可能录入失败 , 那么让他再度录入 直至成功;
import java.util.Scanner;
/**
* 完成一个功能 , 键盘录入用户名 用户名必须是 100-10000 之间的数字 用户可能录入失败 , 那么让他再度录入 直至成功
* @author Amanda
*/
public class UserInfo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean b = true;
/*// 使用 常量 + break 来解决问题
for (;;) {
System.out.println("请录入100-10000之间的用户名");
int next = sc.nextInt();
if (100 <= next && next <= 10000)
break;
else
System.out.println("不合法");
}
System.out.println("录入了合法的用户名");*/
//使用变量完成改功能
while(b){
System.out.println("请录入100-10000之间的用户名");
int next = sc.nextInt();
if(100 <= next && next <= 10000)
b = false;
else
System.out.println("不合法");
}
System.out.println("录入了合法的用户名");
}
}
**
操作循环的关键字
**
使用break结束循环 break可以终止循环 和 switch语句的运行
break用于结束一个循环,即跳出循环体,执行循环体之后的代码;
/**
* break用于结束一个循环,即跳出循环体,执行循环体之后的代码
* @author Amanda
*
*/
public class TestBreak {
public static void main(String [] args){
//break 语句的应用 break用于结束循环,执行循环体后面的语句
for(int i = 1; i <= 5; i++){
if(i == 4) break;//当满足条件是,跳出整个循环体,执行输出语句Hello
System.out.println("i = " + i);
}
System.out.println("Hello!");
}
}
使用continue提前结束本次循环
/**
* 使用continue提前结束本次循环
* @author Acer
*
*/
public class TestContinue {
public static void main(String[] args){
//测试continue语句的应用 continue终止本次循环,不跳出整个循环体,继续下次循环
for(int i = 1; i <= 5; i++){
if(i == 3) continue; //结束本次循环 但还是会开始下一次循环
System.out.println("i = " + i);
}
}
}
continue与break的区别:
使用return结束方法
return关键字不是专门用于结束循环,return的功能时结束一个方法。当一个方法遇到return语句时,这个方法将被结束。
方法结束 , 执行权回到方法调用处 ;
public class TestReturn {
/**
* 使用return结束方法
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0;i < 5;i++){
if(i == 2){
return; //结束方法
}
System.out.println(i);
}
System.out.println("main方法");
}
}
嵌套循环:
把一个循环放到另一个循环体内,就形成了嵌套循环;
嵌套循环:各种类型的循环都可以作为外层循环或内层循环
执行流程 : 外循环执行一次 , 内循环执行全部 ; 内循环就是外循环的循环体的一部分 ;
/**
* 把一个循环放到另一个循环体内,就形成了嵌套循环;
* @author Amanda
* 执行流程 : 外循环执行一次 , 内循环执行全部 ; 内循环就是外循环的循环体的一部分 ;
*/
public class NestedLoop {
public static void main(String[] args){
//嵌套循环
for(int line = 0;line < 5; line++){//外层循环控制行数
for(int space = 0;space < (5 - 1 - line);space++){//内层循环控制列数,打印空格
System.out.print(" ");
}
for(int star = 0;star < (line + 1); star++){//内层训话控制列数,打印*号
System.out.print("*");
}
System.out.println();//打印完每行后进行换行
}
}
}
…
使用break continue 只能控制单层循环 , 如果出现在嵌套循环的内循环中 , 那么操作的就是内循环 ;
break continue 不仅可以结束其所在循环,还可以直接结束外层循环。
此时需要在break continue 后紧跟一个标签,借助于标签可以操作一个外层循环。
Java中的标签就是 标识符+冒号 ,只有放在循环语句之前才有作用。
public class test02 {
/**
* 标签:标识符+:
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
test: for(int i = 1;i < 10; i++){
for(int j = 1; j <= i;j++){
if(j == 3)
break test; //使用的时候 在外面加上标签的名字
System.out.print(i + "*" + j + "=" + (i * j) + "\t");
}
System.out.println();
}
}
}
案例:
/**
* int 值 转 二进制
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 31;
int num = 127;
while(i >= 0){
System.out.println(num >> i-- & 1);
}
}