Java 第三章 流程控制语句

流程控制语句

流程控制语句是什么呢?

流程控制语句:在一个程序执行过程中,各条语句的执行顺序对程序的运行结果是有影响的,也就是说程序的流程对运行结果是由直接影响的,因此有必要知道每条语句的执行流程,而且正常情况下需要通过控制流程语句来实现要完成的功能。

流程控制语句的分类

1、顺序结构:从上到下依次执行

2、分支结构:多个分支选择其中一个分支执行

3、循环结构:重复执行某些代码

顺序结构是程序中最基本的流程控制,美哟特定的语法结构,按照代码的先后顺序依次执行,程序中的大多数代码都是按照顺序结构执行的。可以说成是写在前面的程序先执行,后面的程序后执行。

接下来我们介绍较为重要的选择语句:

选择结构:

也叫分支结构。 根据条件的不同,有选择的执行某一片代码 ,Java提供了两种

  • if 结构
  • switch 结构

if分为三种格式:

1、单分支结构

语法格式:

  if(条件表达式){
       当条件表达式成立时需要执行的语句块;
}

执行过程:

条件成立,就执行{}其中的语句块,不成立就不执行。

注意:

(1)if(条件表达式)中的条件表达式的结果必须是boolean类型

(2)当{}中的语句只有一个语句(简单的语句,也可以是一个复合语句)时,可以省略{}

示例代码:

int year = 2020;
int day = 26;
if(year%4==0 && year%100!=0 || year%400==0){
    day = 29;
}

2、双分支结构

语法格式:

 if(条件表达式){
      当条件表达式成立(true)时需要执行的语句块1;
   }else{
      当条件表达式不成立(false)时需要执行的语句块2;
}

执行过程:

当条件表达式成立(true)时执行语句块1,否则执行语句块2

注意的是else后面没有表达式,只有if后面有。

示例代码:

int num = 15;
if(num%2==0){
    System.out.println(num + "是偶数");
}else{
     System.out.println(num + "是奇数");
}

3、多分支结构

语法格式:

   if(条件表达式1){
       当条件表达式1成立的时候,

       执行的语句块1;
   

  }else if(条件表达式2){
       当条件表达式1不成立,条件表达式2成立的时候,

       执行的语句块2;
    

   }else if(条件表达式3){
       当条件表达式1不成立,条件表达式2也不成立,条件表达式3成立的时候,

       执行的语句块3;
     

  }else{
        当以上所有的条件表达式都不成立,

        需要执行的语句块n+1;
}

执行过程:

(1)多个条件顺序往下判断,如果上面有一个条件成立了,下面的条件就不看了

(2)多个分支也只会执行其中的一个

注意:当多个条件是“互斥”关系(没有重叠部分),顺序可以随意;当多个条件是“包含”关系(有重叠部分),顺序不能随意,小的在上,大的在下面。

示例代码:

int score = 88;
            if(score==100){
                System.out.println("满分");
            }else if(score>=80){
                System.out.println("优秀");
            }else if(score>=60){
                System.out.println("及格");
            }else{
                System.out.println("不及格");
            }

4、嵌套

执行过程:

当嵌套在if中,就是当外面的if成立时,才会看里面的条件判断;

当嵌套在else中,就当外面的else满足时,才会看里面的条件判断;

而switch结构为:

语法格式:

  switch(表达式){
      case 常量值1:
          语句块1;
          break;
      case 常量值2:
          语句块2;
          break;
        .........
     default:
          语句块n+1;
          break;
}

执行过程:

(1)入口

        ①当switch(表达式)的值与case后面的某个常量值匹配,就从这个case进入;

        ②当switch(表达式)的值与case后面的所有常量值都不匹配,寻找default分支进入;

(2)一旦从“入口”进入switch,就会顺序往下执行,直到遇到“出口”

(3)出口

        ①自然出口:遇到了switch的结束}

        ②中断出口:遇到了break等

注意:

(1)switch(表达式)的值的类型,只能是:4种基本数据类型,两种引用数据类型。

(2)case后面必须是常量值,而且不能重复。

循环结构

循环结构的分类:

  • for循环
  • while循环

for循环

语法格式:

   for(初始化表达式语句;判断条件语句;控制条件语句){
    循环体语句;
  }

执行流程:

  1. 执行初始化表达式语句
  2. 执行判断条件语句
      如果是true,就继续执行
      如果是false,就结束循环
  3. 执行循环体语句
  4. 执行控制条件语句
  5. 回到2继续实行

注意:

(1)for(;;)中的两个;不能多也不能少。

(2)循环条件必须是boolean类型。

示例代码:

for(int i=1; i<=100; i++){//每次循环的步幅是1
    if(i%2==0){
        System.out.println(i);
    }
}

while循环

语法格式:

   while(true){
         循环体语句块;
     if(条件表达式){
         break;
    }
}

执行过程:

(1)先判断循环条件

(2)如果循环条件成立,就执行循环体语句块;然后回到(1)

(3)如果循环条件不成立,就结束while循环;

如果在循环体语句块中,遇到break,也会结束while循环;

注意:(1)while(循环条件)中循环条件必须是boolean类型。

示例代码:

int num = 2;
while(num<=100){
    System.out.println(num);
    num+=2;
}

循环结构的四要素

 

(1)循环变量的初始化表达式

(2)循环条件

(3)循环变量的修改的迭代表达式

(4)循环体语句块

for和while的小区别

使用区别:控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。

循环使用推荐for -- while

for ,while循环必须先判断条件是否成立,然后再决定是都执行循环体语句

习题实战

1、

/*
数据:a b c delt r1 r2
步骤:
1.提示用户输入abc三个参数
2.计算delt=b*b-4*a*c
3.判断delt的值
    3.1 delt>0
        输出两个解
    3.2 delt==0
        输出一个解
    3.3 delt<0
        无实数解
*/
import java.util.Scanner;
class  Demo03_01{
    public static void main(String[] args){
        //1.提示用户输入abc三个参数
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入a,b,c:");
        double a=scanner.nextDouble();
        double b=scanner.nextDouble();
        double c=scanner.nextDouble();
        //2.计算delt=b*b-4*a*c
        double delt=b*b-4*a*c;
        //3.判断delt的值
        if(delt>0){
            double r1=(-b+Math.sqrt(delt))/(2*a);
            double r2=(-b-Math.sqrt(delt))/(2*a);
            System.out.printf("r1=%.2f,r2=%.2f",r1,r2);
        }else if(delt==0){
            double r=(-b-Math.sqrt(delt))/(2*a);
            System.out.printf("r=%.2f",r);
        }else{
            System.out.println("无实数解!");
        }
    }
}

2、

/*
  数据:a b c d e f 
 步骤:
 1.输入数值
 2.判断k的值
 3.计算x y
 */
import java.util.Scanner;
public class Demo03_02 {
  public static void main(String [] args) {
   //1.输入数值
   Scanner input = new Scanner(System.in);
   System.out.print("请输入a、b、c、d、e、f的值:");
   double a = input.nextDouble();
   double b = input.nextDouble();
   double c = input.nextDouble();
   double d = input.nextDouble();
   double e = input.nextDouble();
   double f = input.nextDouble();
   //2.判断k的值
   double k = a * d - b * c ;
   if(k == 0) 
    System.out.println("无结果 ");
   else {
    //3.计算x y
    double x = (e * d - b * f)/(a * d - b * c);
    double y = (a * f - e* c)/(a * d - b * c);
    System.out.println("x的值:" + x +"y的值:" + y);
   } 
   
  }
}
   

3、

/*
数据:今天的周几 未来的天数 未来的周几
      (0+12)%7=5
      (4+4)%7=1
      (今天的周几+未来的天数)%7=未来的周几
      1月1日是周一 1%7=1
      1 2 3 4 5 6 7
      8 9 10 11 12 13 14
      15 16 17 18 19 20
      1月20日 20%7=6
步骤:
1.输入今天是周几
2.输入未来的几天
3.打印未来的几天是周几
*/
import java.util.Scanner;
class Demo03_03{
    public static void main(String[] args){
        //1.输入今天是周几
        Scanner scanner=new Scanner(System.in);
        System.out.print("今天是周几:");
        int today=scanner.nextInt();
        //2.输入未来的几天
        System.out.print("未来的几天:");
        int future=scanner.nextInt();
        //3.打印未来的几天是周几
        int futureDay=(today+future)%7;
 
        String todayStr="";
        String futureDayStr="";
        
        if(today==0){
            todayStr="周日";
        }else if(today==1){
            todayStr="周一";
        }else if(today==2){
            todayStr="周二";
        }else if(today==3){
            todayStr="周三";
        }else if(today==4){
            todayStr="周四";
        }else if(today==5){
            to

4、

/*
数据:num 
步骤:
1.输入一个数字
2.拼接出该数字的反序
3.输出
12345
12345%10=5 12345/10=1234
1234%10=4  1234/10=123
123%10=3   123/10=12
12%10=2    12/10=1
1%10=1     1/10=0
54321
5*10000+4*1000+3*100+2*10+1
(5*1000+4*100+3*10+2)*10+1
((5*100+4*10+3)*10+2)*10+1
(((5*10+4)*10+3)*10+2)*10+1
((((0*10+5)*10+4)*10+3)*10+2)*10+1
sum=0
sum=sum*10+5;   //5
sum=sum*10+4;   //54
sum=sum*10+3;   //543
sum=sum*10+2;   //5432
sum=sum*10+1;   //54321
*/
import java.util.Scanner;
class Demo03_04{
    public static void main(String[] args){
        //1.输入一个数字
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入一个数字:");
        int num=scanner.nextInt();
        int temp=num;
        //2.拼接出该数字的反序
        int sum=0;
        sum=sum*10+num%10;
        num/=10;
        sum=sum*10+num%10;
        num/=10;
        sum=sum*10+num%10;
        num/=10;
        sum=sum*10+num%10;
        num/=10;
        sum=sum*10+num%10;
        num/=10;
        sum=sum*10+num%10;
        num/=10;
        if(sum==temp){

5、

/*
数据:电脑随机产生的一个数字com 用户输入的一个数字usr
步骤:
1.提示用户输入一个两位数字
2.计算机随机产生一个两位数字
3.将每个数字拆开,分别进行对比,分输赢
a=usr%10; b=usr/10; c=com%10; d=com/10
*/
import java.util.*;
class Demo03_05{
    public static void main(String[] args){
        //1.提示用户输入一个两位数字
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入 一个数:");
        int usr=scanner.nextInt();
        //2.计算机随机产生一个两位数字
        Random random=new Random();
        int com = random.nextInt(99);
        String.format("%02d",usr);
        int m = usr;
        int n = com;
        //3.将每个数字拆开,分别进行对比,分输赢
        int a=m%10;
        int b=m/10;
        int c=n%10;
        int d=n/10;
        if(usr == com){
            System.out.println("奖金10000美元");
        }else if(a==d&&b==c){
             System.out.println("奖金300美元");
        }else
        if(a==c||a==d||b==c||b==d){
            System.out.println("奖金1000美元");
        }else{
            System.out.println("没有获奖");
        }
    }
}

6、

/*
数据:电脑随机产生的一个数字com 用户输入的一个数字usr
    0 1 2
    剪刀 石头 布
步骤:
1.提示用户输入一个数字
2.计算机随机产生一个数字
3.将两个数字进行对比,分输赢
    平局  com==usr
    用户赢 usr=0 com=2 | usr=1 com=0 | usr=2 com=1
    用户输 剩下的都是用户输
随机数
    Math.random() [0,1.0)*3 -> [0,3.0)->(int)[0,3.0)
    Random nextInt(n)
*/
import java.util.*;
class Demo03_06{
    public static void main(String[] args){
        //1.提示用户输入一个数字
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入 剪刀0 石头1 布2:");
        int usr=scanner.nextInt();
        //2.计算机随机产生一个数字
        Random random=new Random();
        int com=random.nextInt(3);
 
        String usrStr="";
        String comStr="";
        switch(usr){
            case 0: //if usr==0
                usrStr="剪刀"; 
                break;
            case 1:// if usr==1
                usrStr="石头";
                break;
            case 2:// if usr==2
                usrStr="布";
                break;
        }
        switch(com){
            case 0: 
                comStr="剪刀"

7、

/*
数据:星期几 h 某月的第几天 q 月份m 世纪数 j 该世纪第几年k 年份year
步骤:
1.提示用户输入年份,月份,日期
2.若月份为1月2月则m=13 14  year=year-1
3.计算星期hj
*/
import java.util.Scanner;
class Demo03_07{
    public static void main(String[] args){
        //1.提示用户输入年份,月份,日期
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入年份:");
        int year = scanner.nextInt();
        System.out.print("请输入月份1-12:");
        int m = scanner.nextInt();
        System.out.print("请输入日期1-31:");
        int q = scanner.nextInt();
        //2.若月份为1月2月则m=13 14  year=year-1
        if(m == 1 || m == 2){
            year = year - 1;
            m = m + 12;
        }
        //3.计算星期hj
        int h =(day+26*(month+1)/10+year%100+year%100/4+year/100/4+5*year/100)%7;
        String hStr="";
        switch(h){
            case 0: 
               System.out.println("今天是星期日");
                break;
            case 1:
               System.out.println("今天是星期一");
                break;
            case 2:
               System.out.p

8、

/*
数据:圆的圆心 圆的半径 点的坐标 距离
步骤:
1.提示用户输入点的坐标
2.计算点到圆心之间的距离
3.判断距离和半径之间的关系
    距离>半径   点在圆外
    距离==半径  点在圆上
    距离<半径   点在圆内
*/
import java.util.Scanner;
class Demo03_08{
    public static void main(String[] args){
        //1.提示用户输入点的坐标
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入坐标点:");
        double x=scanner.nextDouble();
        double y=scanner.nextDouble();
        //2.计算点到圆心之间的距离
        double xo=0;
        double yo=0;
        double radius=10;
        double distance=Math.sqrt(Math.pow(x-xo,2)+Math.pow(y-yo,2));
        //3.判断距离和半径之间的关系
        if(distance>radius){
            System.out.println("点在圆外");
        }else if(distance==radius){
            System.out.println("点在圆上");
        }else{
            System.out.println("点在圆内");
        }
    }
}

9、

/*
数据:三角形的三个顶点的坐标
步骤:
1.提示用户输入一个点的坐标
2.先大致判断一下坐标的范围
3.再精确的判断坐标的范围
*/
import java.util.Scanner;
class Demo03_09{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        //1.提示用户输入一个点的坐标
        System.out.print("请输入一个坐标:");
        double x=scanner.nextDouble();
        double y=scanner.nextDouble();
        //2.先大致判断一下坐标的范围
        //3.再精确的判断坐标的范围
        if(x>=0&&x<=200&&y<=-0.5*x+100){
            System.out.println("点再三角形内");
        }else{
            System.out.println("点再三角形外");
        }
    }
}

10、

/*
数据:大矩形的中点坐标、宽、高;小矩形的宽、高、中点坐标
步骤:
1.先输入大矩形的中心,宽和高
2.再输入小矩形的中心,宽和高
3.找小矩形在大矩形中极限
4.找小矩形与大矩形重叠的极限
*/
import java.util.Scanner;
class Demo03_10{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        //1.先输入大矩形的中心,宽和高
        System.out.print("请输入第1个矩形的信息:");
        double x1=scanner.nextDouble();
        double y1=scanner.nextDouble();
        double w1=scanner.nextDouble();
        double h1=scanner.nextDouble();
        //2.再输入小矩形的中心,宽和高
        System.out.print("请输入第2个矩形的信息:");
        double x2=scanner.nextDouble();
        double y2=scanner.nextDouble();
        double w2=scanner.nextDouble();
        double h2=scanner.nextDouble();
         //3.找小矩形在大矩形中极限
        double inXMin=x1-(w1-w2)/2;
        double inXMax=x1+(w1-w2)/2;
        double inYMin=y1-(h1-h2)/2;
        double inYMax=y1+(h1-h2)/2;
        //4.找小矩形与大矩形重叠的极限
        double outXMin=x1-(w1+w2)/2;
        double outXMax=x1+(w1+w2)/2;
        double outYMin=y1-(h1+h2)/2;
  

11、

/* 
数据:输入de数字
1.输入一个数字
2.再判断数字是否为0如果为0则退出不是则继续
3.计算总和,正的数的个数,负的数个数,平均值
*/
import java.util.Scanner;
class Demo03_11{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        double sum=0;  //总和
        int positives=0;    //正数的个数
        int negatives=0;    //负数的个数
        //1.输入一个数字
        System.out.print("请输入若干数字:");
        while(true){   //不管三七二十一 先进来再说
            int num=scanner.nextInt();
            //2.再判断数字是否为0如果为0则退出不是则继续
            if(num!=0){
                sum+=num;
                if(num>0){
                    positives++;
                }else{
                    negatives++;
                }
            }else{
                break;  //跳出当前循环
            }
        } 
        //3.  
        if(positives+negatives==0){
            System.out.println("没有其他数字的输入,除了0");
        }else{
            System.out.println("正数的个数"+positives);
            System.out.println("负数的个数"+negatives);
            System.out.println("总和"+sum)

12、

/*
数据:n1 n2 gcd
步骤:
1.输入两个数字
2.检查是否为公约数
3.输出最大公约数gcd
*/
import java.util.Scanner;
class Demo03_12{
    /* 
    21  42
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16~21
    3 7
    */
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        //1.输入两个数字
        System.out.print("请输入两个数字:");
        int n1=scanner.nextInt();
        int n2=scanner.nextInt();
        //2.检查是否为公约数
        int gcd=1;
        for(int i=n1<n2?n1:n2;i>=1;i--){
            if(n1%i==0&&n2%i==0){
                gcd=i;
                break;
            }
        }
        //3.输出最大公约数
        System.out.println(gcd);
 
    }
}

13、

/* 
120 2~120 ->2
60  2~60  ->2
30  2~30  ->2
15  2~15  ->3
5   2~5   ->5
1   
*/
import java.util.Scanner;
class Demo03_13{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入一个数字:");
        int num=scanner.nextInt();
        while(true){
            for(int i=2;i<=num;i++){
                if(num%i==0){
                    System.out.print(i+" ");
                    num=num/i;
                    break;
                }
            }
            if(num==1){
                break;
            }
        }
    }
}

14、

/*
数据:给出的数字模型
1.for循环每个的行数
2.for循环没行的空隔
3.for循环每行的列数
分析
 4  3  2  1 2 3 4
-3 -2 -2  0 1 2 3
第4行 x∈[-3,3] y=|x|+1
第5行 x∈[-4,4] y=|x|+1
*/
import java.util.Scanner;
class Demo03_14{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入行数:");
        int line=scanner.nextInt();
        for(int i=1;i<=line;i++){          //行数
            for(int k=1;k<=(line-i);k++){  //空格
                 System.out.print("  ");
            }
            for(int x=-(i-1);x<=i-1;x++){   //列
                if(line<10){
                    System.out.printf("%-2d",Math.abs(x)+1);
                }else{
                    System.out.printf("%-3d",Math.abs(x)+1);
                }
            }
            System.out.println();
        }
    }
}

15、

/*
数据:给出的数字模型
步骤:
1.for循环每个的行数
2.for循环每行的列数
*/
class Demo03_15{
    public static void main(String[] args){
         //第一个
        for(int i=1;i<=6;i++){            //行数
            for(int j=1;j<=i;j++){        //列
                System.out.print(j+" ");
            }
            System.out.println();//换行
        }
        //第二个
        System.out.println("==========");
        for(int i=1;i<=6;i++){            //行数
            for(int j=1;j<=7-i;j++){      //列
                System.out.print(j+" ");  //输出数字
            }
            System.out.println();         //换行
        }
        //第三个
        System.out.println("==========");
        for(int i=1;i<=6;i++){         //行数
            for(int k=1;k<=6-i;k++){   //空格数
                System.out.print("  ");  
            }
            for(int j=i;j>=1;j--){
                System.out.print(j+" "); //输出数
            }
            System.out.println();///换行
        }
        //第四个
        System.out.println("==========");
        fo

16、

/*
数据:数据:给出的数字模型
1.for循环每个的行数
2.for循环没行的空隔
3.for循环每行的列数
分析:
第4行  
         1  2  4 8 4 2 1
         0  1  2 3 2 1 0
      x -3 -2 -1 0 1 2 3
第5行
        1 2 4 8 16 8 4 2 1
        0 1 2 3 4  3 2 1 0
    x  -4-3-2-1 0  1 2 3 4
*/
class Demo03_16{
    public static void main(String[] args){
        for(int i=1;i<=8;i++){
            for(int k=1;k<=8-i;k++){
                System.out.print("    ");
            }
            for(int x=-(i-1);x<=i-1;x++){
                System.out.printf("%4d",(int)Math.pow(2,i-1-Math.abs(x)));
            }
            System.out.println();
        }
    }
}
/*
提示:
对于打印一些对称性的三角形图案或者是类似的问题
尽量向绝对值考虑
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值