unit7 程序控制结构
1. 程序逻辑
2. 选择结构
3. 循环结构
4. 循环的跳转
1 程序逻辑
1.1 顺序结构
如同阅读文章一样,从入口到出口一条龙执行完毕,如之前购物小票打印便是顺序结构。
1.2 分支结构
通过条件判断,选择性执行代码块。
1.3 循环结构
通过对给定条件的判断,完成代码的重复执行。
2 选择结构
2.1 if语句
单条件判断,格式
if(条件){
执行的代码
}
条件的数据类型为boolean,可以是返回结果为boolean类型的方法,也可以是true、false常量、关系运算符、boolean类型的变量。当条件为true的时候,条件成立,执行后面的代码块,不成立为false,则不执行。
//if:单条件判断,总价超过1000,打8折
double total = 1000;
if (total > 1000){
total *=0.8;
}
2.2 if……else语句
互斥条件判断
//if else,条件判断,总价超过1000,打8折,否则打9折
double total = 1001;
if (total > 1000){
total *=0.8;
}else {
total *=0.9;
}
2.3 if……else if……else语句
多条件判断,可以在多个if条件中选择满足条件的代码块执行,不满足执行else体的代码。
double total = 1000;
if (total > 1000){
total *=0.8;
}else if(total >500){
total *=0.9;
}else{ //else可写可不写,如果不写,则当不满足if条件直接跳过执行下面的语句
total *=0.95;
}
2.4 多重选择---switch语句
在现实业务中,许多场景需要我们从多个固定的值中选出一个进行操作。比如登录系统,选择身份:老板或者收银员,进入的系统也就不一样。
Switch语句可以根据一个变量值,对比多个可选值,当变量值匹配到可选值以后,执行该值对应的代码块。
//switch:多重选择
int choose = 1;//1代表老板,2代表收银员
switch (choose) {
case 1: //代表某一情况的值,当choose==1时,则执行该段代码块
System.out.println("boss");
break;
case 2:
System.out.println("cashier");
break;
default: //当以上值都没匹配到时,执行该段代码,可写可不写
System.out.println("enter error");
break;
}
3 循环结构
3.1 while循环
有时候需要根据给定的条件循环执行代码,这个时候使用while循环完成任务,while后面括号里的表达式为布尔类型,true执行循环代码,false退出循环,执行时,先判断是否满足条件,满足,值为true则执行,不满足就退出循环。
//while循环
int num1 = 0;
while (num1 <= 10){ //只要num1满足小于等于10,代码就会一直执行下去,括号中的数据类型为布尔类型,为true时,执行循环代码,flase结束循环
System.out.print(++num1+"、");
}
3.2 do……while循环
和while语句区别在于:while先判断条件是否成立,再去执行,do……while是先执行代码,再判断条件是否成立。
//do……while,先执行,后判断
do {
System.out.println("先执行代码");
} while (1>2);
3.3 for循环
循环,当需要对代码循环条件为计次循环的时候,可以使用for循环。
a) for循环语句使用格式
l 循环的重要组成部分
a) 循环变量初始化 (初始化表达式)
b) 循环出口(布尔表达式)
c) 循环增量(步进表达式)
d) 循环逻辑内容(循环体)
l for循环格式
for(初始化表达式①;布尔表达式②;步进表达式④){
循环体③
}
执行顺序: ①②③④>②③④>②③④… ②不满足为止。
①负责完成循环变量初始化
②负责判断是否满足循环条件,不满足则跳出循环
③具体执行的语句
④循环后,循环条件所涉及变量的变化情况
b) for循环注意事项
a)①②③④四个部分均可以为空
当①为空时,注意变量作用域的范围变化
当②为空时,为条件永远为true的死循环
当③为空时,通常没有意义
当④为空时,可以将其加入到循环体中,或同样成为死循环
b) 初始化表达式①的部分可以同时定义多个变量
步进表达式可以同时将多个循环相关变量改变,控制循环条件
//for循环打印从0到99数字
for (int i = 0; i <= 99;i++) {
System.out.print(i + " 、");
}
3.4 foreach循环
遍历循环,类似jquery中$.each()方法对元素的遍历操作。Foreach可以快速的对数组、集合的成员进行一次遍历操作。
//foreach遍历操作
int[] arr = {1,2,3,4,5};
for (int i : arr) { //i:每次循环时候,对应数组中的一个int类型数据,arr:数组,暂时理解为一个容器,里面放的全都是int类型数据
System.out.println(i);
}
3.5 循环嵌套
很多时候,一个循环是无法满足我们的业务需要,可能会用到循环中嵌套循环,就像if和else if那样,语句中还可以有if语句。
这里以99乘法表作为案例:
//使用for循环打印99乘法口决表
for (int i = 1; i < 10;i++) {
for (int j = 1; j <= i;j++) {
System.out.print(j + " * " + i + " = " + j * i+"\t");
}
System.out.println();
}
System.out.println();
//使用while打印99乘法口决表
int x = 1;
while (x<=9) {
int y = 1;
while (y<=x) {
System.out.print(y+ " * " + x + " = " +x*y+"\t");
y++;
}
x++;
System.out.println();
}
}
4 循环的跳转
Java提供continue、break、return关键字实现对循环的控制、结束功能。
4.1 break语句
结束循环,使用break强行终止循环,而不是当循环的条件不满足的时候才结束,一旦遇到break,系统就会结束当前循环,执行循环外的代码。
//循环的跳转
//break:结束当前所在的循环,无论哪种
int num2 = 1;
while (num2<10){
if (num2>3) {
System.out.println("强行结束循环!");
break;
}
System.out.println("打印:" + num2);
num2++;
}
for (int i = 0; i < 10;i++) {
System.out.println("打印:" + i);
if (i>3) {
System.out.println("打印结束!");//注意,当使用break结束循环,那么break后不能再有任何代码,因为那是无法被执行到的!
break;
}
}
//但是break只会结束当前所在的循环,如果是双层嵌套循环,是无法结束外层循环。
for (int i = 0; i < 10;i++) {
for (int j = 0; j < 10; j++) {
System.out.println("内层循环打印了j:" + j);
if (j == 3) {
System.out.println("这里已经结束了内层循环,但是外层循环还是会继续!");
break;
}
}
System.out.println("外层循环打印i:" + i);
}
continue语句
continue 的功能和break有点类似,区别是continue只是忽略了本次循环剩下的代码,接着开始下一次循环,并不会终止循环,而break是完全终止循环本身。
//continue:忽略本次循环剩下的代码
for (int i = 0; i < 5; i++) {
if (i == 2) {
System.out.println("这里忽略了剩下的代码,所以你看不到这是第几次循环");//记住,这里和break一样,不能在continue所在代码块中后面继续写代码。
continue;
}
System.out.println("这是第" + i + "次打印!");
}
4.2 return语句
return本身并不是用来控制循环的,而是结束所在的方法,后面可跟上数据、变量、常量和表达式返回给调用者,在这里可以起到结束方法作用,当使用return时,无论多少循环嵌套,都会被直接结束!
5 练习:
1、99乘法表打印(使用for和while循环打印)
1、 效果是打印9行,9列,也就是说是一个双层for循环,判断的条件是列数和行数都小于9。
2、 定义两层for循环,外层循环打印行,内层循环打印列。
3、 依据的条件是:内层循环打印的列数不能大于当前外层打印的行数
for(int i = 1; i <=9 ;i++){
for(int j = 1; j<= i ;j++){
System.out.print(j + "*" +i + "=" + i * j +"\t" );
}
System.out.println();
}
2、再看while循环打印99乘法表
intx = 1;
while(x<=9){
intj = 1;
while(j<=x){
System.out.print(j + "*" +x + "=" + x * j +"\t" );
j++;
}
System.out.println();
x++;
}
2、水仙花数:一个三位数,每位数字的3次方相加等于该数本身。
思路:循环遍历所有的三位数,然后判断条件是否成立。
for(int i = 100 ; i < 1000 ;i++){
int bai =i / 100;
int shi =i % 100 / 10 ;
int ge = i% 10 ;
if(bai * bai * bai + shi * shi * shi + ge * ge *ge == i){
System.out.println(i + "是一个水仙花数!");
}
}
3、母鸡3元,公鸡4元,小鸡0.5元,100元买100只鸡
思路:三层for循环,依次把每一种可能性遍历出来,然后判断条件是否成立,就OK!
条件:买的鸡一共数量=100,并且花了100块钱。
int temp = 0;
for( int muji = 1;muji<=98 ;muji++){
for(intgongji = 1; gongji<=98 ; gongji++){
for(intxiaoji = 1;xiaoji <=98 ;xiaoji++){
if((muji+ gongji +xiaoji == 100) && (muji *3 +gongji*4 +xiaoji *0.5 ==100)){
System.out.println("母鸡买了"+muji+"只,战斗鸡买了"+gongji+"只,小鸡买了"+xiaoji+"只");
}
temp++;
}
}
}
4、求101~200素数,除了1和他本身外不能被任何数整除。
思路:循环遍历101~200之间的数,内层一个循环遍历1~该数之间的数,依次对内层循环遍历的数取余,如果出现i%j==0的情况,就说明该数不是素数!
for(int i=102;i<200;i++){
booleanboo = true;
for(intj = 2; j<i; j++){
if(i%j==0){
boo=false;
}
}
if(boo){
System.out.println(i+"素数");
}
}
下面是我练习的代码:
package day07;
public class Program {
public static void main(String[] args) {
//if:单条件判断,总价超过1000,打8折,否则打9折
double total = 1000;
if (total > 1000) {
total *= 0.8;
}else if(total >500){
total *= 0.9;
}else{ //else可写可不写,如果不写,则当不满足if条件直接跳过执行下面的语句
total *= 0.95;
}
//switch:多重选择
int choose = 1;//1代表老板,2代表收银员
switch (choose) {
case 1: //代表某一情况的值,当choose==1时,则执行该段代码块
System.out.println("boss");
break;
case 2:
System.out.println("cashier");
break;
default: //当以上值都没匹配到时,执行该段代码,可写可不写
System.out.println("enter error");
break;
}
//while循环
int num1 = 0;
while (num1 <= 10){ //只要num1满足小于等于10,代码就会一直执行下去,括号中的数据类型为布尔类型,为true时,执行循环代码,flase结束循环
System.out.print(++num1+"、");
}
System.out.println();
//do……while,先执行,后判断
do {
System.out.println("先执行代码");
} while (1>2);
//for循环打印从0到99数字
for (int i = 0; i <= 99; i++) {
System.out.print(i + " 、");
}
//foreach遍历操作
int[] arr = {1,2,3,4,5};
for (int i : arr) { //i:每次循环时候,对应数组中的一个int类型数据,arr:数组,暂时理解为一个容器,里面放的全都是int类型数据
System.out.println(i);
}
//使用for循环打印99乘法口决表
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + " * " + i + " = " + j * i+"\t");
}
System.out.println();
}
System.out.println();
//使用while打印99乘法口决表
int x = 1;
while (x<=9) {
int y = 1;
while (y<=x) {
System.out.print(y+ " * " + x + " = " +x*y+"\t");
y++;
}
x++;
System.out.println();
}
//循环的跳转
//break:结束当前所在的循环,无论哪种
int num2 = 1;
while (num2<10){
if (num2>3) {
System.out.println("强行结束循环!");
break;
}
System.out.println("打印:" + num2);
num2++;
}
for (int i = 0; i < 10; i++) {
System.out.println("打印:" + i);
if (i>3) {
System.out.println("打印结束!");//注意,当使用break结束循环,那么break后不能再有任何代码,因为那是无法被执行到的!
break;
}
}
//但是break只会结束当前所在的循环,如果是双层嵌套循环,是无法结束外层循环。
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println("内层循环打印了j:" + j);
if (j == 3) {
System.out.println("这里已经结束了内层循环,但是外层循环还是会继续!");
break;
}
}
System.out.println("外层循环打印i:" + i);
}
//continue:忽略本次循环剩下的代码
for (int i = 0; i < 5; i++) {
if (i == 2) {
System.out.println("这里忽略了剩下的代码,所以你看不到这是第几次循环");//记住,这里和break一样,不能在continue所在代码块中后面继续写代码。
continue;
}
System.out.println("这是第" + i + "次打印!");
}
/*母鸡3元,公鸡4元,小鸡0.5元,100元买100只鸡,成立的条件就是三者总数相加等于100,总价等于100
* 条件为:muji + gongji + xiaoji == 100 && muji * 3 +gongji * 4 + xiaoji * 0.5 ==100
* 思路:三层for循环,直到满足条件
*/
for (int muji = 1; muji < 98; muji++) {
for (int gongji = 1; gongji < 98; gongji++) {
for (int xiaoji = 1; xiaoji < 98; xiaoji++) {
if (muji + gongji + xiaoji == 100 && muji * 3 +gongji * 4 + xiaoji * 0.5 ==100) {
System.out.println("购买方案为:母鸡:" + muji + "只,"+"公鸡:" + gongji + "只,"+"小鸡:" + xiaoji + "只");
}
}
}
}
}
}