跟随狂神学Java第二天


今天在讲到判断接收键盘输入的Scanner的hasNext方法中有些疑惑,在自行百度后明白了其中的关键点,写在了里面,像是nextInt只会读取数值其内容中还有一个回车没有读取出来,后面的关于循环控制的比如打印九九乘法表和三角形,以前写过也有点生疏了。最后的作业简单四则运算也参考了一下其他人的代码,还需要努力提升编程思维。

Java流程控制

1.用户交互Scanner

java.util.Scanner,可以通过Scanner类来获取用户的输入

Scanner s = new Scanner(System.in)

通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断食肉还有输入的数据

  • next()

    • 一定要读取到有效字符后才可以结束输入

    • 对输入有效字符之前遇到的空白,next()自动去掉

    • 只有输入有效字符后才将其后面的空白作为分隔符或者结束符

    • nex()不能得到带有空格的字符串

  • nextLine()

    • 以Enter作为结束符。也就是说nextLine()方法返回的是输入回车之前的所有字符,

    • 可以获得空白

package com.ren.Scanner;
?
import java.util.Scanner;
?
public class Demo02 {
   public static void main(String[] args) {
       //创建一个扫描器对象,用于接受键盘的数据
       int i = 0;
       float f = 0.0f;
       Scanner scanner = new Scanner(System.in);
       if(scanner.hasNextInt()){
           i = scanner.nextInt();
           System.out.println(i);
      }else{
           //scanner.nextLine();
           System.out.println(scanner.nextLine()); //需要清空hasNext里面的数据
           System.out.println("不是整数");
      }
?
       if(scanner.hasNextFloat()){
           f = scanner.nextFloat();
           System.out.println(f);
      }else {
           System.out.println("不是小数");
      }
       //凡是属于IO流的类如果不关闭会一直占用资源,要养成良好习惯用完关掉
       scanner.close();
  }
}
?
  • 对于上面的程序我们要注意的是nextInt()只读取数值,剩下"\n"还没有读取,并将Scanner类读取依靠的cursor放在数值后面,"\n"前面,因此如果用nextInt()读取后,再用nextLine()读取,读取到的是换行符)可以在后面加个scanner.nextLine()来清空

  • next() 方法遇见第一个有效字符(非空格,非换行符)时,开始扫描,当遇见第一个分隔符或结束符(空格或换行符)时,结束扫描,获取扫描到的内容,即获得第一个扫描到的不含空格、换行符的单个字符串

  • 如果使用next()、nextDouble() 、 nextFloat()、nextInt() 读取后,其实还有一个回车未读取出来,若此时后面跟上一个nextLine()读取的是该回车。碰到nextLine()若Scanner中确实没有东西可以读取,会等待你输入。

  • 而hasnext()则会持续扫描缓冲区当扫描到数据时返回true为空时并不会返回false而是将方法阻塞等待你的输入,所以可以while(!sc.hasNext("#")) //匹配#返回true,然后取非运算。即以#为结束符号

2.顺序结构

JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行

顺序结构是最简单的算法结构

3.选择结构

  • if单选择结构

    • if(布尔表达式){

}

  • equals用来判断字符串是否相等

  • if双选择结构

    • if(布尔表达式){

}else{

}

  • if多选择结构

    • if(布尔表达式){

    }else if(布尔表达式){

    }else if(布尔表达式){

    }

  • 嵌套的if结构

    • if(布尔表达式){

      if(布尔表达式){

      }

      }

  • switch多选择结构

    • switch语句中的变量类型可以使:byte、short、int或者char

    • 从Java SE 7开始支持String类型

    • case标签必须为字符串和常量或字面量

switch(expression){
   case  value :
       //语句
       break; //可选
   case  value :
       //语句
       break; //可选
   default:
}

 

4.循环结构

  • while循环

    • 表达式为true,循环就会一直执行下去

    • 我们大多数情况会让循环停止下来,我们需要一个让表达式失效的方式来结束循环

    //循环内容
   int i = 0;
   int sum = 0;
   while(i<100){
       i++;
       sum = sum+i;
}
?
  • do...while循环

    • 对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次

    • while先判断后执行,dowhile是先执行后判断

int i = 0;
   int sum = 0;
do{
   i++;
   sum = sum+i;
}while(i<100);
  • for循环

    • for循环语句是最支持迭代的一种统统结构,是最有效、最灵活的循环结构。

    • for循环执行的次数是在执行前就确定的。

Tip:100.for+回车-------->for (int i = 0; i < 100; i++)

public static void main(String[] args) {    //九九乘法表
       for (int i = 1; i < 10; i++) {
           for (int j = 1; j <= i; j++) {
               System.out.print(i+"*"+j+"="+(i*j)+"\t");
          }
           System.out.println();
      }
  }

 

  • 在Java5中引入了一种主要用于数组的增强型for循环

for(声明语句 :表达式){
   //代码语句
   int numbers = [10,20,30,40,50];
   //遍历数组的元素
   for (int x:numbers){
       System.out.println(x);
  }
}

 

5.break & continue

  • break用于强行退出循环,也可用于switch

  • continue用于结束每次循环

6.练习

 ====================================================================================================

Java方法详解

1.什么是方法

  • Java方法是语句的集合,他们在一起执行一个功能

    • 方法时解决一类问题的步骤的有序组合

    • 方法包含于类或对象中

    • 方法在程序中被创建,在其他地方别引用

  • 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。

2.方法的定义及调用

  • 方法包含一个方法头和一个方法体。下面是一个方法的所有部分:

    • 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。

  • 返回值类型∶方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况returnValueType是关键字void。

  • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。

  • 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数

    • 形式参数:在方法被调用时用于接收外界输入的数据。 修饰符返回值类型方法名(参数类型参数名){

    • 实参:调用方法时实际传给方法的数据。

  • 方法体:方法体包含具体的语句,定义该方法的功能。

修饰符 返回值类型 方法名(参数类型 参数名){
   ---
   方法体
   ---
   return 返回值;
}

 

3.方法重载

  • 重载就是在一个类中,有相同的函数名称,但形参不同的函数。

  • 方法的重载的规则:

    • 方法名称必须相同

    • 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)

    • 方法的返回类型可以相同也可以不相同

    • 仅仅返回类型不同不足以成为方法的重载

  • 实现理论:

    • 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。

public static void main(String[] args) {
       int sum = add(1,2,3);
       System.out.println(sum);
?
  }
?
   //加法
   public static int add(int a,int b){
       return  a+b;
  }
?
   public static int add(int a,int b, int c){ //重载
       return  a+b+c;
  }
}

 

4.命令行传参

  • 有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。

5.可变参数

  • JDK 1.5开始,Java支持传递同类型的可变参数给一个方法。在方法声明中,

  • 在指定参数类型后加一个省略号(..)。

  • 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

public static void main(String[] args) {
       Demo03 demo03 = new Demo03();
       demo03.text(123,123);
  }
   public void text(int... i){
       System.out.println(i[0]);
       System.out.println(i[1]);
  }
}

 

6.递归

  • A方法调用B方法,我们很容易理解!

  • 递归就是:A方法调用A方法!就是自己调用自己

  • 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

  • 递归结构包括两个部分:

    • 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。递归体:

    • 什么时候需要调用自身方法。

public class Demo04 {
   public static void main(String[] args) {
       Demo04 demo04 = new Demo04();
       System.out.println(demo04.f(5));
  }
   public int f(int n){ //求n的阶乘
       if(n == 0)
           return 1;
       else
           return n*f(n-1);
  }
}

 

作业

package com.ren.method;
?
import java.util.Scanner;
?
public class Work {
   public static void main(String[] args) { //实现四则运算
       System.out.print("请输入第一个数:");
       Scanner a = new Scanner(System.in);
       double i = a.nextDouble();
       System.out.print("请输入操作类型:");
       Scanner operate = new Scanner(System.in);
       String j = a.next();
       System.out.print("请输入第三个数:");
       Scanner b = new Scanner(System.in);
       double k = b.nextDouble();
       Work work = new Work();
       switch(j){
           case "+" :
               System.out.println(work.add(i,k));
               break;
           case "-" :
               System.out.println(work.subtract(i,k));
               break;
           case "*" :
               System.out.println(work.mutiply(i,k));
               break;
           case "/" :
               System.out.println(work.dvide(i,k));
               break;
           default:
               System.out.println("输入错误");
      }
  }
   public double add(double a,double b){
       return a+b;
  }
   public double subtract(double a,double b){
       return a-b;
  }public double mutiply(double a,double b){
       return a*b;
  }public double dvide(double a,double b){
       return a/b;
  }
}