一、输入输出
1.输出到控制台
-
输出语句:
- 输出数据之后换行:System.out.println();(这里的ln的作用就是用来换行的,没有ln就是不换行)
- 输出数据之后不换行:System.out.print();
public class Main{ public static void main(String args[]){ System.out.println("111"); System.out.println("");//输出语句中没有输出的内容是,该语句的功能就是可以换行 //System.out.println();单独的也行,跟System.out.println("");是一样的作用 System.out.println("222"); System.out.print("333"); System.out.print("444"); } }
输出
111
222
333444
111和222之间有一行空白,就是通过System.out.println("");实现的,也可以通过System.out.println();来实现换空白行,这两句输出代码在没有输出语句时的作用是实现换行,而System.out.println("");则没有换行功能,如果引号内什么数据都没有的话它什么都输出不了,但是代码能正确编译,如下
但是如果改成System.out.print()的话则会报错,因为System.out.print()的括号内需要至少一个参数来指定要输出的内容,而前面的System.out.println("")是有参数的,只不过它的参数是一个空字符串(在Java中空字符串表示一个长度为零的字符串,即不包含任何字符的字符串。)
-
字符串连接运算符(+):如果要在输出时连接多个字符串或者变量的值,则可以使用字符串连接运算符(+)来实现输出时连接多个字符串或者变量的值,如下代码可以将hello、 、world这三个字符连接起来了(中间那个是一个空格,空格也算是字符)
public class Main{ public static void main(Sting args[]){ System.out.println("hello" + " " + "world!");//输出hello world! } }
但是注意,如果遇到以下代码,则输出时1已经是被转换成字符类型的数据来,已经不是int型的数据了。所以在 Java 中,当整型数据和字符串使用
+
运算符连接时,整型数据会被自动转换为字符串形式,然后进行字符串的连接操作。public class Main{ public static void main(Sting args[]){ int num = 1; System.out.println(num + "HelloWord");//输出1HelloWorld } }
-
扩展:
-
字面量常量:指的是在代码中直接使用的固定值或常量,编译器在编译时将它们解析为相应的数据类型,并在程序运行时保持不变。在Java中,常见的字面量常量包括:
-
整数常量:
- 十进制整数,如
123
,-456
。 - 八进制整数,以
0
开头,如077
。 - 十六进制整数,以
0x
或0X
开头,如0x1F
,0xA5
。
- 十进制整数,如
-
浮点数常量:
- 普通浮点数,如
3.14
,-0.5
。 - 科学计数法表示,如
2.5e3
(即 2.5 × 10^3)。
- 普通浮点数,如
-
字符常量:
-
用单引号括起来的单个字符,如
'a'
,'9'
,'!'
。在Java中,字符常量是基于Unicode编码的。
-
-
字符串常量:
- 用双引号括起来的字符序列,如
"Hello"
,"123"
,"abc"
。
- 用双引号括起来的字符序列,如
-
布尔常量:
- 仅有两个值:
true
和false
,用来表示逻辑真和假。
- 仅有两个值:
-
空常量:
null
,表示引用类型的空值。
-
-
-
System.out.println()中的字面量常量举例:
-
整数字面量常量:
System.out.println(42); // 输出整数 42,这里的 42 是整数字面量常量
-
布尔值字面量常量:
System.out.println(true); // 输出布尔值 true,这里的 true 是布尔值字面量常量
-
字符字面量常量:
System.out.println('A'); // 输出字符 'A',这里的 'A' 是字符字面量常量
-
浮点数字面量常量:
System.out.println(3.14); // 输出浮点数 3.14,这里的 3.14 是浮点数字面量常量
-
-
格式化字符串输出:
-
%d - 十进制整数:用于格式化输出整数。
int num = 42; System.out.printf("Decimal: %d%n", num); // 输出: Decimal: 42
-
%x - 十六进制整数:用于格式化输出整数的十六进制表示。
int num = 42; System.out.printf("Hexadecimal: %x%n", num); // 输出: Hexadecimal: 2a
-
%o - 八进制整数:用于格式化输出整数的八进制表示。
int num = 42; System.out.printf("Octal: %o%n", num); // 输出: Octal: 52
-
%f - 浮点数:用于格式化输出浮点数。
double num = 3.14159; System.out.printf("Float: %f%n", num); // 输出: Float: 3.141590
-
%e - 科学计数法浮点数:用于以科学计数法格式化输出浮点数。
double num = 123456.789; System.out.printf("Scientific notation: %e%n", num); // 输出: Scientific notation: 1.234568e+05
-
%g - 根据值的大小决定使用%f或%e:根据值的大小选择使用%f(如果大)或%e(如果小)格式化输出浮点数。
double num = 123456.789; System.out.printf("General: %g%n", num); // 输出: General: 123457
-
%a - 十六进制浮点数:用于格式化输出浮点数的十六进制表示。
double num = 0.125; System.out.printf("Hex float: %a%n", num); // 输出: Hex float: 0x1.0p-3
-
%s - 字符串:用于格式化输出字符串。
String str = "Hello"; System.out.printf("String: %s%n", str); // 输出: String: Hello
-
%c - 字符:用于格式化输出字符。
char ch = 'A'; System.out.printf("Character: %c%n", ch); // 输出: Character: A
-
%b - 布尔值:用于格式化输出布尔值。
boolean flag = true; System.out.printf("Boolean: %b%n", flag); // 输出: Boolean: true
-
%h - 散列码:用于格式化输出对象的散列码(十六进制)。
Object obj = new Object(); System.out.printf("Hash code: %h%n", obj); // 输出: Hash code: 7a8acfde
-
%.2f%% - 百分比格式化:用于格式化输出百分比值。
double percentage = 0.75; System.out.printf("Percentage: %.2f%%%n", percentage * 100); // 输出: Percentage: 75.00%
-
2.从键盘输入
-
使用
Scanner
类可以方便地从键盘或其他输入流中获取用户的输入数据 -
Scanner
类的具体用法:
-
导入
Scanner
类:需要导入java.util.Scanner
类,因为Scanner
类位于java.util
包中。import java.util.Scanner;
-
创建 Scanner 对象:要从键盘获取输入,需要创建一个
Scanner
对象,并将System.in
作为参数传递给它,表示输入来自标准输入流(通常是键盘)。
Scanner scanner = new Scanner(System.in);
-
使用 Scanner 读取不同类型的数据:
Scanner
类提供了多种方法来读取不同类型的数据。以下是常用的方法:-
nextInt(): 用于读取一个整数。
System.out.print("请输入一个整数: "); int num = scanner.nextInt(); System.out.println("您输入的整数是: " + num);
-
nextDouble(): 用于读取一个双精度浮点数。
System.out.print("请输入一个浮点数: "); double d = scanner.nextDouble(); System.out.println("您输入的浮点数是: " + d);
-
nextFloat(): 用于读取一个单精度浮点数。
// 读取单精度浮点数 System.out.print("请输入一个单精度浮点数: "); float f = scanner.nextFloat(); System.out.println("您输入的单精度浮点数是: " + f);
-
nextLine(): 用于读取一行字符串。
System.out.print("请输入一个字符串: "); String str = scanner.next(); // 或者使用 nextLine() 读取整行 System.out.println("您输入的字符串是: " + str);
-
next(): 用于读取下一个单词(以空格作为分隔符)。当调用
scanner.next()
时,它会扫描输入流,直到找到下一个空白字符,然后返回该字符之前的字符序列作为一个单词。如果在调用next()
之前有连续的空白字符(如多个空格),则这些空格会被忽略。假设用户输入了Hello world Java programming
。如果使用scanner.next()
,它会依次返回"Hello"、"world"、"Java"和"programming",每次调用next()
都返回下一个按空白字符分隔的单词。import java.util.Scanner; public class HasNextExample { public static void main(String[] args) { // 创建Scanner对象 Scanner scanner = new Scanner(System.in); // 提示用户输入 System.out.print("请输入多个单词(以空格分隔): "); // 使用hasNext()和next()方法读取并输出每个单词 while (scanner.hasNext()) {//scanner.hasNext()是用来检查是否有下一个输入数据的,有的话就继续循环,没有下一个输入的话就停止循环 String word = scanner.next(); System.out.println("您输入的单词是: " + word); } // 关闭Scanner对象 scanner.close(); } }
-
-
注意事项:
-
消耗换行符: 当使用
nextInt()
、nextDouble()
或nextFloat()
读取数据后,需要调用scanner.nextLine()
来消耗掉剩余的换行符。这是因为nextInt()
等方法并不会消耗掉输入中的换行符,而nextLine()
会读取换行符并返回空字符串,因此需要额外调用一次以获取用户实际输入的内容。代码示例如下: -
import java.util.Scanner; public class ConsumeNewLine { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 提示用户输入整数 System.out.print("请输入一个整数: "); int number = scanner.nextInt(); // 消耗掉剩余的换行符 scanner.nextLine(); // 提示用户输入字符串 System.out.print("请输入一行文字: "); String text = scanner.nextLine(); // 输出结果 System.out.println("您输入的整数是: " + number); System.out.println("您输入的文字是: " + text); scanner.close(); } }
正常运行结果是这样的:
-
但是如果将scanner.nextLine()注释掉,则将会出直接跳过输入文字的那步,如图所示,就会出bug
-
关闭scanner对象:在不再需要Scanner对象时,及时调用
close()
方法释放相关资源,尤其是在长时间运行的应用程序中。
二、猜数字游戏
1.游戏规则:
-
选择一个范围:确定一个数字的范围,例如从1到100,或者更大或更小的范围,取决于游戏的难度和参与者的能力。
-
出题者选定一个数字:出题者在设定好的范围内选择一个秘密数字,不告诉猜题者。
-
猜题者猜数字:猜题者开始猜测出题者选择的数字。每次猜测,猜题者提出一个可能的数字。
-
出题者给出反馈:出题者根据猜题者的猜测给出相应的反馈,通常包括以下几种情况:
- 如果猜中了,出题者告知猜题者猜测正确,并结束游戏。
- 如果猜测的数字比出题者的数字大,出题者告知猜题者“太大了”或“过高”。
- 如果猜测的数字比出题者的数字小,出题者告知猜题者“太小了”或“过低”。
-
继续猜测:猜题者根据出题者的反馈调整猜测,继续提出新的数字,直到猜中为止。
-
游戏结束:游戏结束的条件是猜题者猜中了出题者的数字。可以根据需要记录猜测的次数,以便进行比较或者评分。
2.代码解析
-
导入类
import java.util.Scanner;
import java.util.Random;
Scanner
类用于从标准输入读取用户的输入。Random
类用于生成随机数。
-
主类
GuessTheNumberGame
import java.util.Scanner; import java.util.Random;
main
方法是程序的入口点,Scanner
和Random
对象被创建。
-
设定数字范围
int range = scanner.nextInt();
- 用户可以通过输入来设定数字的范围,这里通过
scanner.nextInt()
获取用户输入的范围。
-
生成随机数
int secretNumber = random.nextInt(range) + 1; // 随机选择一个1到100的数字
random.nextInt(range)
生成一个介于 0(包含)和range
(不包含)之间的随机整数,然后通过+1
调整范围为 1 到range
。
-
游戏逻辑
int guess; int attempts = 0; System.out.println("欢迎参加猜数字游戏!我选了一个1到100之间的数字,请猜猜是多少?"); do { System.out.print("你的猜测是: "); guess = scanner.nextInt(); attempts++; // 给出提示 if (guess < secretNumber) { System.out.println("太小了,请再试一次。"); } else if (guess > secretNumber) { System.out.println("太大了,请再试一次。"); } } while (guess != secretNumber);
- 使用
do-while
循环来进行猜测,直到用户猜中数字为止。 - 每次用户输入后,根据用户的猜测给出相应的提示,告知用户数字是太大还是太小。
-
游戏结束
System.out.println("恭喜你!你猜对了!数字是 " + secretNumber); System.out.println("你用了 " + attempts + " 次猜中。"); scanner.close();
- 当用户猜中数字时,输出恭喜信息以及猜测次数,并关闭
Scanner
对象。
3.参考代码
import java.util.Scanner;
import java.util.Random;
public class GuessTheNumberGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Random random = new Random();
int range = scanner.nextInt();//用户可以手动设置要猜的数字的范围
int secretNumber = random.nextInt(range) + 1; // 随机选择一个1到100的数字
int guess;
int attempts = 0;
System.out.println("欢迎参加猜数字游戏!我选了一个1到100之间的数字,请猜猜是多少?");
do {
System.out.print("你的猜测是: ");
guess = scanner.nextInt();
attempts++;
// 给出提示
if (guess < secretNumber) {
System.out.println("太小了,请再试一次。");
} else if (guess > secretNumber) {
System.out.println("太大了,请再试一次。");
}
} while (guess != secretNumber);
System.out.println("恭喜你!你猜对了!数字是 " + secretNumber);
System.out.println("你用了 " + attempts + " 次猜中。");
scanner.close();
}
}