------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.7 程序流程控制
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
流程控制语句分类流程控制语句分类:顺序结构、选择结构、循环结构。
1.7.1顺序结构:从上往下,依次执行。
示例:
class ShunXuJieGouDemo { public static void main(String[] args) { System.out.println("程序开始了"); System.out.println("Hellow Java"); System.out.println("程序结束了"); } }
程序运行结果:
1.7.1选择结构
1.7.1.1 if语句
格式一:
if(比较表达式) {
语句体;
}
执行流程:先计算比较表达式的值,看其返回值是true还是false。如果是true,就执行语句体;如果是false,就不执行语句体。
示例1:
class IfDemo{ public static void main(String [] args){ int x = 10; if(x == 10){ System.out.println("x的值为10"); } System.out.println("Over"); } }
运行结果:
注意事项;
1、比较表达式无论简单还是复杂,结果必须是boolean类型
2、if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,就不能省略。建议永远不要省略。
3、一般来说:有左大括号就没有分号,有分号就没有左大括号
格式二:
if ( 条件表达式 )
{
语句体1;
}
else
{
语句体2;
}
执行流程:首先计算比较表达式的值,看其返回值是true还是false。如果是true,就执行语句体1;
如果是false,就执行语句体2;
示例:判断键盘所输入的一个整数是奇数还是偶数
import java.util.Scanner;//导包 class IfTest{ public static void main(String [] args){ //创建键盘录入对象 Scanner sc = new Scanner(System.in); //输入想要判断的整数 System.out.println("输入想要判断的整数:"); int x = sc.nextInt(); //判断是奇数还是偶数 int y = x%2; if(y == 0){ System.out.println("所输入的数是偶数"); } else{ System.out.println("所输入的数是奇数"); } } }
运行结果:
if else 语句和三目运算符的联系和区别:
class IfDemo2{ public static void main(String [] args){ int x = 10; int y ; if(x > 10){ y = 100; } else{ y = 200; } System.out.println("y="+y); } }
运行结果:
用三目运算符实现:
class IfDemo2{ public static void main(String [] args){ int x = 10; int y = x > 10? 100:200; System.out.println("y="+y); } }
运行结果:
结论:当if else运算后,有一个具体的结果时,可以简化写成三元运算符。
格式三:
if(比较表达式1) {
语句体1;
}
else if(比较表达式2) {
语句体2;
}
else if(比较表达式3) {
语句体3;
}
...
else {
语句体n+1;
}
示例:用键盘录入一个成绩,判断并输出成绩的等级。
90-100 优秀
80-90 好
70-80 良
60-70 及格
0-60 不及格
import java.util.Scanner; class IfDemo3{ public static void main(String [] args){ //创建键盘录入对象 Scanner sc = new Scanner(System.in); //录入数据 System.out.println("请输入你的成绩:"); int score = sc.nextInt(); if(score > 90 && score <= 100){ System.out.println("优秀"); } else if(score > 80 && score <= 90){ System.out.println("好"); } else if(score > 70 && score <= 80){ System.out.println("良"); } else if(score >= 60 && score <= 70){ System.out.println("及格"); } else if(score >= 0 && score < 60){ System.out.println("不及格"); } else{ System.out.println("您输入的成绩有误"); } } }
运行结果:
1.7.1.2 switch语句
格式:
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
注意:switch语句的表达式的取值时是有限定的,可取的值为:byte,short,int,char,JDK5以后可以是枚举,JDK7以后可以是字符串。
示例1:键盘录入一个数据,根据这个数据,我们输出对应的星期几
键盘录入1,对应输出星期一
键盘录入一个数据,根据这个数据,我们输出对应的星期?
键盘录入1,对应输出星期一
键盘录入2,对应输出星期二
...
键盘录入7,对应输出星期日
import java.util.Scanner; class SwitchDemo{ public static void main(String [] args){ //创建键盘录入对象 Scanner sc = new Scanner(System.in); //键盘控制录入数据 System.out.println("请输入一个数据(1-7)"); int week = sc.nextInt(); switch(week){ case 1: System.out.println("星期一"); break; case 2: System.out.println("星期二"); break; case 3: System.out.println("星期三"); break; case 4: System.out.println("星期四"); break; case 5: System.out.println("星期五"); break; case 6: System.out.println("星期六"); break; case 7: System.out.println("星期七"); break; default: System.out.println("输入的数据有误"); break; } } }
运行结果:
注意事项:1、case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的。
2、default可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
3、break可以省略,但是结果可能不是我们想要的。会出现一个现象:case穿透。
4、进入switch语句后,执行顺序是先执行case,然后从上到下,最后再执行default。即使default放在case上面,执行顺序也不变。
5、结束switch语句的两种情况:①遇到break,②执行到switch语句结束。
示例2:看程序写结果
class SwitchTest { public static void main(String[] args) { int x = 2; int y = 3; switch(x){ default: y++; break; case 3: y++; case 4: y++; } System.out.println("y="+y); System.out.println("---------------"); int a = 2; int b = 3; switch(a){ default: b++; case 3: b++; case 4: b++; } System.out.println("b="+b); } }
分析:第一个switch语句执行时,执行到default语句后,后面有break,所以就退出switch语句,执行输出语句。
第二个switch语句执行时,执行到default语句后,因为没有break,所以继续执行后面的两个case语句而不用判断是否满足条件。
运行结果:
示例3:用switch语句实现键盘录入月份,输出对应的季节
import java.util.Scanner; class SwitchTest4{ public static void main(String [] args){ //创建一个键盘录入对象 Scanner sc = new Scanner(System.in); //输入数据 System.out.println("请输入月份(1-12)"); int month = sc.nextInt(); switch(month){ case 1: case 2: case 12: System.out.println("冬季"); break; case 3: case 4: case 5: System.out.println("春季"); break; case 6: case 7: case 8: System.out.println("夏季"); break; case 9: case 10: case 11: System.out.println("秋季"); break; default: System.out.println("你输入的月份有误"); } } }
程序运行结果:
思考:if和switch语句什么时候用比较合适:
if语句使用前提:1、针对结果是boolean类型的判断
2、针对一个范围的判断
3、针对几个常量值的判断
switch语句使用前提:针对几个常量值的判断
针对几个常量值的判断,建议使用switch语句,因为switch语句会将具体的答案都加载进内存,效率相对高。
1.7.3
循环结构
1.7.3.1 for循环
格式:
for(初始化语句;判断条件语句;控制条件语句) {
循环体语句;
}
for里面的三个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复整个过程,直到条件不满足为止。
示例一:使用for循环在控制台输入3句“hellow world”
class ForDemo{ public static void main(String [] args){ for(int i = 1;i <= 3;i++ ){ System.out.println("hellow world"); } } }
运行结果:
练习1:求出1-10之间数据之和
class ForDemo3{ public static void main(String [] args){ int sum = 0; for(int i = 1;i <= 10;i++){ //int sum = 0; sum = sum + i; } System.out.println("sum:"+sum); } }
运行结果:
练习2:求出1-100之间偶数和
class ForDemo4{ public static void main(String [] args){ int sum = 0; for(int i = 1;i <= 100;i++){ if(i%2 == 0){ sum += i; } } System.out.println("sum:"+sum); } }
运行结果:
练习3:在控制台输出所有的”水仙花数”(所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身)。
class ForDemo6{ public static void main(String [] args){ int count = 0; for(int i = 100;i <= 999;i++){ int x = i%10;//求出个位数 int y = i/10%10;//求出十位数 int z = i/100%10;//求出百位数 if(i == (x*x*x+y*y*y+z*z*z)){ System.out.println(i); count++; } } System.out.println("所有的水仙花数的个数是:"+count); } }
运行结果:
1.7.3.2 for循环
格式:
初始化语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}
示例1:
class WhileDemo3{ public static void main(String [] args){ //while循环 int count2 = 0; int i = 100; while(i <= 999){ int ge = i%10; int shi = i/10%10; int bai = i/100%10; if(i == (ge*ge*ge + shi*shi*shi + bai*bai*bai)){ count2++; } i++; } System.out.println(count2); } }
运行结果:
练习:我国最高山峰是珠穆朗玛峰:8848m,我现在有一张足够大的纸张,厚度为:0.01m。
请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
class WhileDemo5{ public static void main(String [] args){ //定义一个统计变量,初始化值为0; int count = 0; //最高山峰是珠穆朗玛峰:8848m这是最终的厚度 //我现在有一张足够大的纸张,厚度为:0.01m这是初始厚度 double start = 0.01; double end = 8848.00; while(start < end){ //只要每次变化的厚度没有超过珠穆朗玛峰的高度,就折叠,统计变量++ count++; //没折叠一次厚度就会变为原来的2倍 start *= 2; } System.out.println("要折叠"+count+"次"); } }
运行结果:
思考:while循环和for循环的区别?
1、for为了循环而定义的变量在for循环结束就在内存中释放,而while循环使用的变量在循环结束后还可以继续使用。
2、for循环适合针对一个范围判断进行操作,while循环适合判断次数不明确操作
1.7.3.3 do...while 循环
格式:
初始化语句;
do {
循环体语句;
控制条件语句;
}
while(判断条件语句);
示例:
class DoWhileDemo{ public static void main(String [] args){ int i = 1; do{ System.out.println("i="+i); i++; } while(i <= 3); } }
运行结果:
循环语句的区别:
do...while循环至少执行一次循环体,而for,while循环必须先判断条件是否成立,然后决定是否执行循环体语句。
注意死循环:
两种最简单的死循环:while(true){...}、for(;;){...}
1.7.3.4 循环嵌套
示例1:请输出下面的4行5列的星星(*)图案。
*****
*****
*****
*****
代码如下:
class ForForDemo{ public static void main(String [] args){ for(int x = 1;x <= 4;x++){ for(int y = 1;y <= 5;y++){ System.out.print("* "); } System.out.println(); } } <span style="font-size:18px;">}</span>
运行结果:
示例2:请输出下列的形状
*
**
***
****
*****
代码如下:
class ForForDemo2{ public static void main(String [] args){ for(int x = 1;x <= 5;x++){ for(int y = 1;y <= x;y++){ System.out.print("*"); } System.out.println(); } } }
运行结果:
示例3:在控制台输出九九乘法表。
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
...
1x9=9 2x9=18 ... ... 9x9=81
代码如下:
class ForForDemo3{ public static void main (String [] args){ for(int i = 1;i <= 9;i++){ for(int j = 1;j <= i;j++){ System.out.print(j+"x"+i+"="+i*j+'\t'); } System.out.println(); } } }
运行结果:
注意:代码中的"\t"是一个转义字符,也就是制表符。还有其他的一些转义字符:\n:回车,\b:退格,\r:回车符
1.7.4 控制跳转语句
1.7.4.1 break(跳出)
应用范围:
1、switch语句中
2、循环语句中
示例:
class BreakDemo{ public static void main(String [] args){ for(int x = 0;x < 10;x++){ if(x==3){ break; } System.out.println("x="+x); } } }
运行结果:
当x的值为3的时候,跳出循环
1.7.4.2 continue(继续)
应用范围:循环结构。
continue语句是结束本次循环继续下次循环。
示例:
class Continue{ public static void main(String [] args){ for(int x = 0;x <= 10;x++){ if(x==3){ continue; } System.out.println("x="+x); } } }
运行结果:
当x的值为3时,跳出本次循环,执行下次循环。
注意:这两个语句离开应用范围,存在是没有意义的。
扩展知识:标号的出现,可以使得这两个语句作用于指定范围。
示例1:
class BreakDemo2{ public static void main(String [] args){ out:for(int x = 0;x <= 3;x++){ in:for(int y = 0;y <=4;y++){ if(y==2){ break; } System.out.println("x="+x+",y="+y); } } } }
运行结果:
示例2:
class ContinueDemo2{ public static void main(String [] args){ out:for(int x = 0;x <= 3;x++){ in:for(int y = 0;y <= 4;y++){ if(y==2){ continue; } System.out.println("x="+x+",y="+y); } } } }
运行结果:
练习:小芳的妈妈每天给她2.5元钱,她都会存起来,但是, 每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,请问,经过多少天,小芳才可以存到100元钱。
分析:小芳的妈妈每天给她2.5元钱 double dayMoney = 2.5;
她都会存起来 double moneySum = 0;
因为是统计的题,所以必须有一个统计变量,在这里是用于统计天数的 int dayCount = 0;
当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱
dayCount%5==0时,moneySum -= 6;
经过多少天,可以存到100元 double result = 100;
方法一:使用while循环
class WhileDemo{ <span style="white-space:pre"> </span>public static void main(String [] args){ <span style="white-space:pre"> </span>double dayMoney = 2.5; <span style="white-space:pre"> </span>double moneySum = 0; <span style="white-space:pre"> </span>double result = 100; <span style="white-space:pre"> </span>int dayCount= 0; <span style="white-space:pre"> </span>while(moneySum < result){ <span style="white-space:pre"> </span>dayCount++; <span style="white-space:pre"> </span>moneySum += dayMoney; <span style="white-space:pre"> </span>if(dayCount%5==0){ <span style="white-space:pre"> </span>moneySum -= 6; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>System.out.println(dayCount); <span style="white-space:pre"> </span>} }
运行结果:
方法2:使用while死循环
class WhileBreakDemo{ public static void main(String [] args){ double dayMoney = 2.5; double moneySum = 0; int dayCount = 0; int result = 100; while(true){ dayCount++; moneySum += dayMoney; if(moneySum >= result){ break; } if(dayCount%5 == 0){ moneySum -= 6; } } System.out.println("一共用了"+dayCount+"天存了100元"); } }
运行结果:
版权声明:本文为博主原创文章,未经博主允许不得转载。