zoukankan      html  css  js  c++  java
  • Java基础之流程控制

    声明:本笔记具体可参考 速学堂学习网站

    3 流程控制

    • “顺序结构”:代表”先执行a,再执行b“的逻辑
    • “选择结构”:代表”如果……,则……“的逻辑
    • “循环结构”:代表”如果……,则再继续……“的逻辑
      语录:上述三种流程控制语句就能表示所有的事情!

    选择结构

    • if单选择结构

      • 示例:
      import java.util.Scanner;
      public class Test1{
          public static void main(String[] args){
              Scanner scanner = new Scanner(System.in);
              System.out.println("请输入能被5整出的数:")
              int num = scanner.nextInt();
              if(num%5!=0){//当if语句不写{},只能作用在后面的第一条语句;建议任何时候都写上{},即使里面只有一句话
                  System.out.println("您的输入有误!");
              }
          }
      }
      
    • if-else双选择结构

      • 示例
      import java.util.Scanner;
      public class Test2{
          public static void main(String[] args){
              Scanner scanner = new Scanner(System.in);
              System.out.println("请输入一个整数:")
              int num = scanner.nextInt();
              if(num%2!=0){
                  System.out.println("该数为奇数");
              }else{
                  System.out.println("该数为偶数");
              }
          }
      }
      

      补:可以用if-else替代条件运算符

      • 示例
      import java.util.Scanner;
      public class Test3{
          public static void main(String[] args){
              Scanner scanner = new Scanner(System.in);
              System.out.println("请输入一个整数:")
              int num = scanner.nextInt();
              System.out.println(num%2!=0?"该数为奇数":"该数为偶数");
          }
      }
      
    • if-else if-else多选择结构

      • 示例
      public class Test4{
          public static void main(String[] args){
              int i = (int)(100*Math.random())+1;//该方式可以生成随机数
              System.out.print("分数为"+i);
              if(i>=85){System.out.print(" 评级为A");}
              else if(i>=70){System.out.print(" 评级为B");}
              else if(i>=60){System.out.print(" 评级为C");}
              else{System.out.print(" 评级为D");}
          }
      }
      
    • switch结构

      • 示例
      public class Test5{
          public static void main(String[] args){
              int i = (int)(100*Math.random())+1;//该方式可以生成随机数
              System.out.print("分数为"+i);
              i = i/10;
              switch(i){
                  case 9:
                  case 8:
                  	System.out.println(" 评级为A");break;
                  	//假定大于等于80评级为A
                  case 7:
                  	System.out.println(" 评级为B");break;
                  case 6:
                  	System.out.println(" 评级为C");break;
                  default:
                  	System.out.println(" 评级为D");
              }
          }
      }
      

    循环结构

    • while循环

      • 示例
      public class Test6{
          public static void main(String[] args){
              int i = 0;
              int sum = 0;
              //1+2+3+...+100=?
              while(i<=100){
                  sum += i;//相当于sum=sum+i
                  i++;
              }
              System.out.println("Sum="+sum);
          }
      }
      
    • do-while循环

      • 示例
      public class Test7{
          public static void main(String[] args){
              int i = 0;
              int sum = 0;
              //1+2+3+...+100=?
              do{
                  sum += i;//相当于sum=sum+i
                  i++;
              }while(i<=100);//此处的;不能省略
              System.out.println("Sum="+sum);
          }
      }
      

      补:while语句和do-while语句区别在于do-while语句总是保证循环体至少会被执行一次,而while语句可能不执行

    • for循环

      • 示例
      public class Test8{
          public static void main(String[] args){
              int sum = 0;
              //1+2+3+...+100=?
              for(int i = 0;i<=100;i++){
                  sum += i;
              }
              System.out.println("Sum="+sum);
          }
      }
      

      补:可以在for循环中嵌入逗号运算符

      • 示例
      public class Test9{
          public static void main(String[] args){
              for(int i = 1, j = i + 10;i < 5;i++, j = i *2){
                  System.out.println("i="+i+" j="+j);
              }
          }
      }
      

      提示:
      编译器将while(true)与for(;;)看作同一回事,都指的是无限循环
      在for语句的初始化部分声明的变量,如for(int i = 0;...),其作用域为整个for循环体,不能在循环外部使用该变量。


    嵌套循环

    在一个循环语句内部再嵌套一个或多个循环,称为嵌套循环。while、do-while与for循环可以任意嵌套多层

    示例:

    public class Test10{
        public static void main(String[] args){
            for(int i=1;i<=9;i++){
                for(int j=1;j<=i;j++){
                    System.out.print(j+"*"+i+"="+(i*j<0?(" "+i*j):i*j)+" ");
                }
                System.out.println();
            }
        }
    }
    

    break语句

    在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句

    示例:

    public class Test11{
        public static void main(String[] args){
            int total = 0;//定义计数器
            System.out.println("Begin");
            while(true){
                total++;
                int i = (int)Math.round(100*Math.random());
                if(i==88){
                    break;
                }
            }
            System.out.println("Game over, used "+total+"times.");
        }
    }
    

    continue语句

    continue语句用在循环体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定

    注意
    continue用在while,do-while中,continue语句立刻跳到循环首部,越过了当前循环的其余部分;
    continue用在for循环中,跳到for循环的迭代因子部分

    示例:

    public class Test12{
        public static void main(String[] args){
            int count = 0;//定义计数器
            for(int i = 100;i<150;i++){
                //如果是3的倍数,则跳过本次循环,继续进行下一次循环
                if(i%3==0){
                    continue;
                }
                //否则(不是3的倍数),输出该数
                System.out.print(i+"、");
                count++;
                //根据计数器判断每行是否已经输出5个数
                if(count%5==0){
                    System.out.println();
                }
            }
        }
    }
    

    补:
    带标签的break和continue,对于Java来说只用在循环语句之前,用于在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方

    示例:

    //控制嵌套循环跳转打印101-150之间所有的质数
    public class Test13{
        public static void main(String[] args){
            outer:for(int i=101;i<150;i++){
                for(int j=2;j<i/2;j++){
                    if(i%j==0){
                        continue outer;
                    }
                }
                System.out.print(i+" ");
            }
        }
    }
    

    语句块

    语句块,确定了局部变量的作用域,其中的程序代码,作为一个整体,是要被一起执行的。块可以被嵌套在另一个块中,但不能在两个嵌套的块内声明同名变量;语句块可以使用外部的变量,而外部不能使用语句中定义的变量,因为语句块中定义的变量作用域只限于语句块

    示例:

    public class Test14{
        public static void main(String[] args){
            int n;
            int a;
            {
                int k;
                int n;//编译错误,不能重复定义变量n
            }//变量k的作用域到此为止
        }
    }
    

    方法

    方法就是一段用来完成特定功能的代码片段,类似于其他语言的函数

    示例:

    public class Test15{
        //main方法:程序的入口
        public static void main(String[] args){
            int num1 = 10;
            int num2 = 20;
            //调用求和方法,将num1与num2的值传给add方法中的n1与n2,求完和后将结果返回,用sum接收结果
            int sum = add(num1,num2);
            System.out.println("sum="+sum);//输出sum=30
            //调用打印的方法,该方法没有返回值
            print();
        }
        //求和方法
        public static int add(int n1,int n2){
            int sum = n1 + n2;
            return sum;//使用return返回计算的结果
        }
        //打印的方法,没有返回值,用void指定
        public static void print(){
            System.out.println("这是print()");
        }
    }
    

    注意:
    1.实参的数目、数据类型和次序必须和所调用的方法声明形式参数列表匹配
    2.return语句终止方法的运行并指定要返回的数据
    3.Java中进行方法调用中传递参数时,遵循值传递的原则(传递的都是数据的副本)
    4.基本类型传递的是该数据值的copy值
    5.引用类型传递的是该对象引用的copy值,但指向的是同一个对象


    方法重载

    • 方法重载是指定义多个方法名相同,但参数不同的方法;调用时,会根据不同的参数自动匹配对应的方法;重载方法实际是完全不同的方法,只是名称相同而已

    • 构成方法重载的条件:
      1.不同的含义:形参类型、形参个数、形参顺序不同
      2.只有返回值不同不构成方法的重载
      3.只有形参的名称不同,不构成方法重载

    • 示例

    public class Test16{
        public static void main(String[] args){
            System.out.println(add(3,5));//8
            System.out.println(add(3,4,10));//18
            System.out.println(add(3.0,5));//8.0
            System.out.println(add(3,5.0));//8.0
        }
        //求和方法
        public static int add(int n1,int n2){
            return n1+n2;
        }
        //方法名相同,参数个数不同,构成重载
        public static int add(int n1,int n2,int n3){
            return n1+n2+n3;
        }
        //方法名相同,参数类型不同,构成重载
        public static double add(double n1,double n2){
            return n1+n2;
        }
        //方法名相同,参数顺序不同,构成重载
        public static double add(int n1,double n2){
            return n1+n2;
        }
        //编译错误:只有返回值不同,不构成方法重载
        public static double add(int n1,int n2){
            return n1+n2;//返回值double类型
        }
        //编译错误:只有参数名称不同,不构成方法重载
        public static int add(int n2,int n1){
            return n1+n2;
        }
    }
    

    递归结构

    • 递归是一种常见的解决问题的方法,其基本思想是“自己调用自己”,一个使用递归结构的方法将会直接或间接的调用自己

    • 示例:使用递归求n!

    public class Test17{
        public static void main(String[] args){
            long d1 = System.currentTimeMillis();//获取当前时间
            System.out.printf("%d阶乘的结果是:%n",10,factorial(10));
            long d2 = System.currentTimeMillis();//获取运行上一条命令后的当前时间
            System.out.printf("递归费时:%s%n",d2-d1);
        }
        //求阶乘的方法
        static long factorial(int n){
            if(n==1){//递归头
                return 1
            }else{//递归体
                return n*factorial(n-1);//n!=n*(n-1)
            }
        }
    }
    
    • 递归缺陷

      简单的程序是递归的优点,但是递归调用会占用大量的系统堆栈,内存消耗多,在递归调用层次多时速度比要循环慢的多,所以在使用递归时要慎重

    • 示例:使用循环求n!

    public class Test18{
        public static void main(String[] args){
            long d3 = System.currentTimeMillis();
            int a = 10;
            int result = 1;
            while(a>1){
                result *= a*(a-1);
                a -= 2;
            }
            long d4 = System.currentTimeMillis();
            System.out.println(result);
            System.out.println("普通循环费时:%s%n",d4-d3);
        }
    }
    

    未完,待续 ~

  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/codeplayer1999/p/12465413.html
Copyright © 2011-2022 走看看