Java学习第3天 循环
循环就像是单圈400米的跑道上完成10000米长跑,跑完25全,满足条件,循环结束
跑满25圈,对我们来说可能非常久且不太可能,对计算机来说,就是一瞬间的事。
1、for循环
for循环多用于明确循环次数的循环里。
for循环恐怕是用的最多的循环了,观赏性和逻辑性和可读性都非常强。
语法:
for(初始部分 ; 循环条件 ; 迭代部分){
//循环操作
}
- 首先,初始化一个变量
- 在循环条件中布尔值判断,为true时候运行下面代码,为false时候跳出循环
- 本次循环执行完毕后,执行迭代对象,再次判断。如果仍为true,则会再次执行代码(注意:若迭代部分设置不好,容易出现死循环)
- 直到布尔判断为false,才会跳出整个循环,执行后续代码(当然,break也可以,后面说)
打印100遍hello world
public class Demo01 {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println("hello world");
}
}
}
结果:
hello world
hello world
hello world
....
其流程为,看图
例题2,计算n的阶乘,例如n = 10, 那么n的阶乘为 10 * 9 * 8 * 7 * 6…*1
public class Demo01 {
public static void main(String[] args) {
int sum = 1;
for (int i = 10; i >= 1; i--) {
sum = sum * i;
System.out.print(i + " ");
}
System.out.println("sum: "+sum);
}
}
结果
10 9 8 7 6 5 4 3 2 1 sum: 3628800
需要知道自己设置的i的值的变化是否正确,可能一不小心 i 就变成2或者0就停了,结果就不对了
1.1for循环打印三角形
循环结构是否能出师,如果能自己完成,那就没问题了
第一题,简单点,打印出下面的直角三角形
在这里,需要用到循环的嵌套
外层循环控制行数,内层循环控制输出星星等的个数
public class demo02 {
public static void main(String[] args) {
for (int i = 0; i < 6; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
//每打印完一行后换行
System.out.println();
}
}
}
下面到这个了
需要计算好空多少个格子再输出" * “,需要找好每行空格和” * "的个数规律,就很容易完成了,只要找好数量和行数之间的关系,就很好弄出来了
public class demo02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//控制台输入没有一句提示语,你会认为编辑器是不是卡了,或者自己写错了
System.out.println("请输入需要打印的行数:");
int len = sc.nextInt();
for (int i = 1; i <= len; i++) {
//先打印空格
for (int j = i; j <len ; j++) {
System.out.print(" ");
}
//打印星星
for (int j = 1; j <= (2*i - 1); j++) {
System.out.print("*");
}
System.out.println();
}
}
}
2、while循环
for能做的,whlie也能做。
while(循环判断){
>代码块
}
在循环判断中,若结果为true,则执行代码块
若结果为false,则结束循环
用while循环打印100遍的HelloWorld
public class Demo03 {
public static void main(String[] args) {
int i = 0;
while(i<100){
System.out.println("HelloWorld");
i++;
}
System.out.println(i);
}
}
结果:
HelloWorld
HelloWorld
HelloWorld
....
100 //i最后的数值
while循环和for循环差不多,但while循环需要自己把初始化值写到外面,循环的迭代 (如i++)需要自己手动添加到代码里,这样就稍微灵活点,同时也会复杂点,迭代放到代码开头或结尾输出的结果有可能会不同。
可以自己尝试打印星星
3、do while
场景适用于循环次数不明的情况
do{
代码块
}while(条件判断);
与while几乎相同,不同的是它需要先执行一次代码块,再进行判断,也就是说,无论如何它都至少执行一次。
银行取钱案例
字符串判断是否相同,不能用“==”,需要用"equals"
“123” == "123"是不行的,返回false
“123”.equals(“123”) 返回true
public class Demo04 {
public static void main(String[] args) {
//密码为123456,字符串类型
String passworld = "123456";
//银行取钱,输入密码,输错一次后还有三次机会
int num = 3;
//控制台输入实例化
Scanner sc = new Scanner(System.in);
do {
System.out.println("请输入你的密码:");
String pw = sc.next();
if (passworld.equals(pw)){
System.out.println("恭喜你,输入正确了,可以拿钱了");
break;
}else{
if (num==0){
System.out.println("你没机会取钱了,但你可以存钱");
}else {
System.out.println("输入错误,你还有" + num + "次输入机会");
}
num--;
}
}while (num>=0);
}
}
结果:
请输入你的密码:
12345
输入错误,你还有3次输入机会
请输入你的密码:
1549
输入错误,你还有2次输入机会
请输入你的密码:
4568
输入错误,你还有1次输入机会
请输入你的密码:
13546
你没机会取钱了,但你可以存钱
4、break, continue, return
4.1break
为跳出该循环
当i = 50时候,跳出循环,遇到break时候,他会直接跳出该循环,循环里面剩下的内容就不运行了。
public class Demo05 { public static void main(String[] args) { int i = 0; while(i<100){ System.out.println(i); if (i==50){ break; } i++; } } } 结果: 0 1 2 3 ..... 50
要知道break只是跳出当前循环,如果我是嵌套循环,不是跳出所有循环。
下面是嵌套循环例子
public class Demo06 {
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
System.out.println("这是第"+i+"层外循环");
for (int j = 0; j < 3; j++) {
System.out.println(j);
if (j==1){
System.out.println("我要跳出去了~~");
break;
}
}
}
}
}
结果:
这是第0层外循环
0
1
我要跳出去了~~
这是第1层外循环
0
1
我要跳出去了~~
这是第2层外循环
0
1
我要跳出去了~~
这是第3层外循环
0
1
我要跳出去了~~
4.2continue
为跳过当前循环
public class Demo07 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
if (i==2){
continue;
}
System.out.println(i);
}
}
}
结果:
0
1
可以看到,当为2时候,跳出了当前循环,后面的代码就不运行了,所以没有2出现
可套如上面break例子看看,把break换成continue就行了
4.3return
return是结束该函数,返回值(可能没有放回值,后面函数内容提到)
在main函数里,使用return相当于关机键,把所有东西都关掉了,遇到return后面所有代码都不运行
public class Demo07 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
if (i==2){
return;
}
System.out.println(i);
}
System.out.println("你好");
System.out.println("在吗");
}
}
结果:
0
1
可以看到,循环外面的"你好","在吗"都不运行了。
5、标号
- 通过标号,使循环更加灵活,可以在任意循环里结束其他的循环语句
例子
public class Demo08 {
public static void main(String[] args) {
K:
for (int i = 0; i < 5; i++) {
System.out.println("这是外层循环" + i);
for (int j = 0; j < 3; j++) {
System.out.println(j);
if (j==2){
System.out.println("我要结束标号K循环");
break K;
}
}
}
}
}
结果:
这是外层循环0
0
1
2
我要结束标号K循环
可以看到外层循环有标号为K,第一次循环时候,j==2时候,break K,标号为K的循环结束了。可以换成continue试下
但没有return K的,标号只使用于break和continue中
6、循环其他知识
6.1死循环
很多时候需要用到死循环,用break来进行断掉
while(true) 为死循环
for(;;){} 也为死循环,且语法是正确的
for和while相似,这样做其实就和while差不多了
for (int i = 0; i < 10; ) {
i++;
System.out.println(i);
}
6.2 变量的生命周期
在循环里定义的变量,只能在循环里使用,不能带出外面
例一
public class Demo10 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
}
System.out.println(i);
}
}
报错!! 外面没有定义 i
例二
public class Demo10 {
public static void main(String[] args) {
int i = 0;
while(i<3){
int j = 0;
i++;
j++;
System.out.println(j);
}
System.out.println("这是外层 i= "+i);
// System.out.println(j); //while里面定义的,在循环外面用不了,报错
}
}
结果
1
1
1
这是外层 i= 3