unit7 程序控制结构

2/22/2017来源:ASP.NET技巧人气:332

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 + "只");
					}
				}
			}
		}
	}
}