Skip to content

Latest commit

 

History

History
300 lines (177 loc) · 10.7 KB

Lesson04.md

File metadata and controls

300 lines (177 loc) · 10.7 KB

Lesson 04 - 输入和输出

眼睛是人的一种输入器官,图像在无时无刻地从这里涌入;嘴巴是人的一种输出器官,有意义的语言滔滔不绝地从这里流出。有了这些即时的输入和输出,大脑才能准确判断你所处的时机并作出相应的应答机制。

程序也是如此,它也需要输入和输出。一个简单的马里奥程序,需要时刻判断你方向键是否被按下,同时时刻让你看到地图上方块和怪物的状况。在你以后的编程中,你需要通过输入方便快捷地尝试不同的参数,需要通过输出检查你的运算结构是否正确。

由此可见输入和输出必不可少,那么这节课,我们就来学习一下Java中几种输入和输出的方法吧!

1 输入

在Java中,一般有两种输入的方法:

  • 使用工具类java.util.Scanner
  • 使用入参argument输入。

java.util.Scanner

这是一个重要的工具类,顾名思义,一个扫描仪。现在大家只需要知道这个工具的用法就好:

首先你需要获取一个“扫描仪”,我们这里给它取名叫sc

Scanner sc = new Scanner(System.in);

现在我们可以先从字面上理解,新建(new)了一个Scanner,并且名字叫sc(变量名)。System.in即系统输入,意思就是说这个叫做sc的Scanner是从系统输入(控制台)获取你输入的数的。

接下来我们就要了解一下怎么用它了:

int x = sc.nextInt();

注意这句语句里出现的Int,这正是表示这里希望从系统输入获得一个int类型的变量。当程序执行到这样一句话时,它会停住直到你给它一个整数并按下Enter(表示输入结束)。这样一来,你刚刚输入的整数会作为.nextInt()的运算结果,被赋值给了等号左边的int类型的变量x。

如果你输入的不是一个Int类型的数,程序会报错的哟!

类似地,我们还可以用相似的方法读入其他数据类型的数:

double y = sc.nextDouble();
float z = sc.nextFloat();
String s = sc.next();
String s2 = sc.nextLine();

这些都会读到空格为止,如果此时你的输入还有多余的内容,剩下的内容可以继续被之后的其他next方法读取到。

注意读入字符串String时,我们有两种不同的方法:

.next()会读到空格为止,而.nextLine()会直接读完一整行,也就是读到换行为止

比如你输入What's up?.next()的读到的结果为What's,而.nextLine()的读到的结果为What's up?

最后,差点忘了告诉各位,为了告诉计算机你要用的Scanner是哪里蹦出来的Scanner,你需要像这样在一切程序的开头import一下这个Scanner的包

import java.util.Scanner;

这表示你要用的工具类Scanner是来自java.util这个东西里的。你做了一个“导入”操作,表示要导入这个工具类,这样才能使用Scanner哦!千万别忘记~

我们来看这个例子,Addition1.java想要将运行时输入的两个数进行相加并输出结果。

import java.util.Scanner;

public class Addition1 {
    public static void main(String[] args) {
        
        // create a Scanner called sc
        Scanner sc = new Scanner(System.in);
        
        // get the two integers by the Scanner--"sc"
        int a = sc.nextInt();
        int b = sc.nextInt();
        
        // add them together
        int c = a + b;
        
        // show the result
        System.out.println(c);
        
        // usually we close it after all input operations
        sc.close();
    }
}

argument

除了能在程序运行时获取用户自定义的输入,我们还可以在运行前指定要输入的参数。比如Addition2.java想要将运行前设置的入参的两个数进行相加并输出结果。

可是如何指定好要输入的参数呢?我们一般运行Java程序是这样在命令行中输入指令的:

javac Addition2.java # compile to .class

java Addition2    	# run the .class file

想要指定需要运行的参数,只需要在第二句话中之后加上要输入的参数就好了:

java Addition2 1 2   # run with two parameter 1 and 2

上面的命令行指令就表示指定1和2作为Addition程序的入参,这个入参是可以有无限个的哟~记得用空格隔开每一个参数!

好了,那么下一个问题就来了,这里的入参,程序该怎么接收呢?

上节课说的public static void main(String[] args)不知道大家还记不记得,这里的args就是会最终接收到入参的那个变量。它是一个数组,不过现在我们只需要知道,你可以用args[0]args[1],……,args[n],……依次获取到刚刚入参的第n+1个参数,并且要注意的是,这里的每一个参数,读入后都成为了一个字符串。比如上面的例子,虽然1和2都是一个整数,但是分别传入了args[0]args[1]后,它们就变成了字符串"1""2"

字符串相加和int值相加可不一样,大家可以试试下面的代码:

String s1 = "1";
String s2 = "2";
System.out.println(s1+s2);

输出为:

12

所以字符串相加其实是进行了字符串的拼接操作。

既然不能用字符串相加,我们能不能想办法把它转换回整型int类型呢?

答案是可以的!Java又为你提供了方便的方法:Integer.parseInt(x)

这个方法可以将你输入的字符串变量(这里是x)转换为int类型的整型数据作为运算结果。

除此之外我们还有Double.parseDouble(x)将你输入的字符串变量(这里是x)转换为double类型的浮点型数据作为运算结果。

剩下的任务就是相加再打印输出结果咯,我们直接来看示例代码吧:

public class Addition2 {
    public static void main(String[] args) {
        
        // get the arguments and turn them into the correct data type
        int a = Integer.parseInt(args[0]);
        int b = Integer.parseInt(args[1]);
        
        // add them together
        int c = a + b;
        
        // show the result
        System.out.println(c);
    }
}

那么以上就是常用的输入的两种方式了,其中Scanner是更常用的,希望各位多加练习哦~

2 输出

System.out.println()

相信大家肯定已经对第一种输出方式并不陌生了:

System.out.println("Nice to meet you!");
System.out.println(c);

在这个括号我们可以写变量的名字,这可以打印出这个变量内部存储的值,也可以直接写直接量,这会直接打印出这个直接量。另外,我们要注意这里print之后的ln,这个可以理解为就是line,也就是的意思,表示打印完后会换行,下次打印会从下一行开始打印。

另外为了方便的打印一些解释,我们可以利用上一个part说到过的加号,当字符串和变量相加时,也会变成一个拼接的操作,把对应变量的值拼接到相应字符串之前或之后:

System.out.println("Calculate " + a + "+" + b)
System.out.println("The result is " + c);

当a的值为1,b的值为2,c的值为3时,输出为:

Calculate 1+2
The result is 3

System.out.print()

这个方法和println的区别就是少了一个ln,所以显然这个就是打印括号内的内容之后不会换行~其他用法都大致相似。

System.out.printf()

这个方法仔细讲起来可以用很大篇幅去描述,但我在这里仅会讲一些基本的用法,各种花里胡哨的操作大家可以靠百度学习。

首先大家肯定会好奇这里的f是什么,这个f代表的单词是format,格式。这个方法的中文翻译(非官方)就是——格式化输出。

那接下来让我们看看他怎么个格式化法,我们先看看这个语句:

int hour = 5;
int grade = 3;
System.out.printf("I slept %d hours a day on average when I was a Grade %d student in SUSTech.", hour, grade);

输出:

I slept 5 hours a day on average when I was a Grade 3 student in SUSTech.

在上面的字符串直接量中的%d叫做格式符,它们可以被替换为特定的整型变量值。字符串中出现的%d会依次被替换为这个字符串之后的变量,比如第一个%d hours%d就会被字符串后的第一个变量hour代替,第二个%d student%d则会被第二个变量grade代替。如果是其他类型的变量,则需要其他的格式符:

  • float, double: %f

  • char: %c

  • byte, short, int, long: %d

  • String: %s

你会发现这用上面的+操作符也行啊,确实是这样,在这种时候,你可以按照自己的喜好去使用任意的方法,但是切记你都得会,不然考试你会GG。

不过这东东的功能可不止于此:

  1. 四舍五入,用于浮点数float和double,.nf,n为多少就保留几位小数:

    double PI = 3.14159;
    System.out.printf("%.2f", PI)

    输出:

    3.14
    
  2. 填充空格,适合制表:

    double PI = 3.14159;
    int date = 14;
    System.out.printf("%6.2f%4d", PI, date)

    输出:

      3.14  14
    

    这里PI先按照.2f的要求保留两位小数,即3.14;然后6表示这个变量在显示时要求占6个格子,可是3.14只占4格啊,这个时候会在3.14的左边补两个空格就变成了两个空格之后3.14。后面的date同理。至于制表的用法,等大家做了乘法表的那个lab题我们再提吧。

3 转义字符 \

当我正准备快快乐乐结束这一个lesson的时候,我突然想起来,转义字符还没讲,我裂开来。转义字符(反斜杠)的出现主要是为了能打印出一些无法使用键盘打出来的字符,注意这东西的方向是从左上向右下,和除法符号/可不一样。

首先,大家可能记得上节课说过,字符串的直接量要用双引号"括起来,可是如果这个字符串本身里有双引号出现怎么办呢,为了防止歧义,我们使用\"表示这个"并不是表示字符串直接量的开头或结束,而是字符串的内容

其他常用的还有:

  • \n:换行
  • \t:制表符,与tab键功能相同
  • \\:转义了转义字符本身,表示这里我就是想打印出一个反斜杠,告诉编译器他是字符串的内容而不是作为转义字符使用的
  • \uxxxx:Unicode码,实质上是一个数字到字符的映射,xxxx是一个16进制数,\uxxxx就表示这个数对应的字符(有兴趣的也可以搜搜ASCII)
System.out.print("Hello\t\\(\"QwQ\")/\n");
System.out.println("\u6211\u7231\u004a\u0061\u0076\u0061");

输出:

Hello   \("QwQ")/
我爱Java