Java中的用户交互和流程控制
Scanner类
Scanner类全称是java.util.Scanner是Java5的新特征,包含许多方法用来保存和调用用户的输入。
next和hasnext
示例代码:
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
Scanner test = new Scanner(System.in);
System.out.println("请输入文字:");
if (test.hasNext()){
String str = test.next();
System.out.println("您输入的文字是:"+str);
}
test.close();
}
}
运行结果:
nextLine和hasNextLine
示例代码:
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
Scanner test = new Scanner(System.in);
System.out.println("请输入文字:");
if (test.hasNextLine()){
String str = test.nextLine();
System.out.println("您输入的文字是:"+str);
}
test.close();
}
}
运行结果:
简单用法和注意事项
-
hasNext和hasNextLine
-
两者都是用来判断用户是否有输入数据。
-
使用分别搭配next和nextLine使用。
-
Scanner类还有很多hasNext方法用来判断用户输入的字符类型。
-
-
next和nextLine(常用)
-
两者都是用来将用户的输入保存下来,并且得到有效字符后才可以结束输入。
-
区别是next以空格为结束符,nextLine以回车为结束符。
-
next不能得到带有空格的字符串,输入字符之前的空白next方法会将其自动去掉。
-
-
除了nextLine以外,Scanner类还有很多方法供我们使用,比如nextInt用来判断用户输入的是否为一个整数,nextDouble用来判断用户输入的是否为小数等。与之对应的还有对应的has方法。
-
System.in
-
真正接收用户输入的方法,以上示例中将用户的输入封装成Scanner类。
-
-
close
-
Scanner是一个IO流相关的类,凡是这种与IO流相关的类使用结束后必须关闭掉,否者会一直占用资源。
-
流程控制
顺序结构
最基本的运行结构,没有特别指明的情况下,所有代码从上至下一句一句运行。
顺序结构是最简单的算法结构,它是若干个依次执行的处理步骤组成的,也是任何一个算法或程序都离不开的基本结构。
示例代码:
public class Demo2 {
public static void main(String[] args) {
System.out.println("这是第一行代码");
System.out.println("这是第二行代码");
System.out.println("这是第三行代码");
System.out.println("这是第四行代码");
System.out.println("这是第五行代码");
System.out.println("这是第六行代码");
}
}
运行结果:
选择结构
if单选择结构
示例代码:
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入字符:");
if (scanner.hasNextInt()) {
int a = scanner.nextInt();
System.out.println("您输入的数字是:" + a);
}
scanner.close();
}
}
-
只有当用户输入的是整数类型时scanner.hasNextInt为true才会执行if中的语句。
-
只有if作为判断依据的布尔表达式为true才会执行if中的语句。
-
注意:if中的语句在程序中有可能不执行
if双选择结构
示例代码:
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入字符:");
if (scanner.hasNextInt()) {
int a = scanner.nextInt();
System.out.println("您输入的数字是:" + a);
} else {
String str = scanner.nextLine();
System.out.println("您输入的字符是:" + str);
}
}
scanner.close();
}
-
当用户输入整型数据时scanner.hasNextInt为true,执行if中的语句。否则,执行else中的语句。
-
注意:if-else结构的语句一定会被执行,满足if条件执行if,不满足则执行else。
if的嵌套和多选择结构
if嵌套(二分法)示例代码:
import java.util.Scanner;
/**
* 判断学生的成绩,满分100分成绩80分以上(含80分)则成绩为A
* 80分以下,60分以上(含60分)则成绩为B
* 60分以下,40分以上(含40分)则成绩为C
* 40分以下,则成绩为不及格,需要参加补考。
*/
public class Demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生的分数:");
if (scanner.hasNextInt()) {
int score = scanner.nextInt();
if (score <= 100) {
if (score >= 80) {
System.out.println("您的成绩为A");
} else {
if (score >= 60) {
System.out.println("您的成绩为B");
} else {
if (score >= 40) {
System.out.println("您的成绩为C");
} else {
System.out.println("您的成绩不及格,请参加补考。");
}
}
}
} else {
System.out.println("您的成绩异常,请联系该科目老师检查!");
}
} else {
System.out.println("您的输入有误,程序退出!!");
}
scanner.close();
}
}
以上代码为if嵌套,可以将以上代码改为if-else-if。
if-else-if示例代码:
import java.util.Scanner;
/**
* 判断学生的成绩,满分100分成绩80分以上(含80分)则成绩为A
* 80分以下,60分以上(含60分)则成绩为B
* 60分以下,40分以上(含40分)则成绩为C
* 40分以下,则成绩为不及格,需要参加补考。
*/
public class Demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生的分数:");
if (scanner.hasNextInt()) {
int score = scanner.nextInt();
if (score <= 100) {
if (score >= 80 && score <= 100) {
System.out.println("您的成绩为A");
} else if (score >= 60) {
System.out.println("您的成绩为B");
} else if (score >= 40) {
System.out.println("您的成绩为C");
} else {
System.out.println("您的成绩不及格,请参加补考。");
}
} else {
System.out.println("您的成绩异常,请联系该科目老师检查!");
}
} else {
System.out.println("您的输入有误,程序退出!!");
}
scanner.close();
}
}
-
注意:一个if语句可以有若干个else if语句,但是最多只能有一个else语句,else语句在所有else if语句之后。一旦有一个else if语句被执行则所有else if和else语句跳过执行。
switch多选择结构
switch case,多选择结构的另一种实现方式。
因为JDK7的新特性,表达式的结果可以是字符串。
示例代码:
import java.util.Scanner;
/**
* 使用Switch做一个简易的成绩查询系统。
* 输入学生的姓名,如果匹配成功则返回对应的成绩
*/
public class Demo3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生的姓名:");
if (scanner.hasNextLine()) {
String name = scanner.nextLine();
switch (name) {
case "寅大猛":
System.out.println("您的成绩为"+76);
break;
case "李二狗":
System.out.println("您的成绩为"+42);
break;
case "吴三桂":
System.out.println("您的成绩为"+100+",恭喜满分!");
break;
default:
System.out.println("该生成绩未录入或输入有误,如需要帮助请联系负责老师:136xxxxxx");
}
}
scanner.close();
}
}
-
break在switch结构中表示结束switch结构,执行break后程序不会再执行剩下的case甚至default。
-
Switch结构经常用来比对一些数据是否符合我们需要的值。
循环结构
不同于顺序结构和选择结构这种只能被执行一次,循环结构在循环条件满足前可以循环多次。
while循环
在程序中while是最基本的循环。
示例代码:
import java.util.Scanner;
/**
* 让用户输入两个整数,计算两个整数的和。
*/
public class Demo1 {
public static void main(String[] args) {
int num1 = 0; //定义一个整型用来接收用户的第一个数字。
int num2 = 0; //定义一个整型用来接收用户的第二个数字。
Demo1 demo = new Demo1(); //实例化Demo1类,用以调用方法。
Scanner scanner = new Scanner(System.in);
//实例化Scanner类,用以调用方法。
while (true) { //While循环,强制要求用户输入。
System.out.println("请输入第一个整数:");
if (scanner.hasNextInt()) { //判断用户输入的数据是否为整型。
num1 = scanner.nextInt(); //用户输入数据类型正确,赋值给num1。
break; //赋值结束后跳出循环。
} else { //用户输入数据类型不正确的情况下,进入else分支。
System.out.println("数据类型错误,请重新输入:");
//反馈用户信息,让用户重新输入数字。
scanner.next(); //开始重新等待用户输入。
}
}
//第二个数字的While循环,所有代码参照第一个数字。
while (true) {
System.out.println("请输入第二个整数:");
if (scanner.hasNextInt()) {
num2 = scanner.nextInt();
break;
} else {
System.out.println("数据类型错误,请重新输入:");
scanner.next();
}
}
System.out.println("您输入的两个数和为:" + demo.sum(num1, num2)); //调用方法计算两数之和。
scanner.close(); //程序结束,释放内存。
}
/**
* @param a 整数a
* @param b 整数b
* @return a与b的和
*/
public int sum(int a, int b) { //方法,两个形参,接收主程序传进来的参数。
int sum = a + b; //计算两个形参的和。
return sum; //返回该值。
}
}
以上代码中while在用户没有按照要求输入时让用户重新输入,直到用户输入正确为止。
-
当while循环条件的布尔表达式为true时执行循环内语句。
-
执行到最后一句代码后返回while语句重新判断循环条件。
-
只有当while的循环条件为flase时或在循环内执行到break时才会结束循环。
-
我们绝大多数情况是需要循环满足某个条件后停止下来的,以让程序不至于卡死。
do-while循环
对于while循环而言,如果不能满足条件则不能进入循环,但有时候我们需要即使不满足条件也至少执行一次的时候使用do-while循环。
while循环示例代码:
/**
* 计算整数1-100的和,每计算一个数生成当前结果。
*/
public class Demo3 {
public static void main(String[] args) {
int i = 0;
int sum = 0;
while (i < 100 && i!=0) {
i++;
sum = sum + i;
System.out.println("i的值为:" + i + ",sum的值为" + sum);
}
}
}
因为i的初始值为0,不满足循环条件,所以以上代码什么都不会输出。
do-while循环示例代码:
package com.rsp2012.continuation;
/**
* 计算整数1-100的和,每计算一个数生成当前结果。
*/
public class Demo3 {
public static void main(String[] args) {
int i = 0;
int sum = 0;
do {
i++;
sum = sum + i;
System.out.println("i的值为:" + i + ",sum的值为" + sum);
} while (i < 100 && i!=0);
}
}
因为i在循环判断的时候值为1,所以程序正常运行。
运行结果:
由以上两个示例得出while和do-while最重要的区别:
-
do-while循环是先执行循环内的语句,再判断循环条件。
-
while循环是先判断循环条件,满足再执行循环内的语句。
for循环
虽然所有循环结构都可以用while和do-while来表示,但Java提供了第三种循环方式,即for循环,for循环的出现使得一些循环结构变得简单。
for循环对比while循环示例代码:
/**
* 在控制台打印1-100的所有的整数(包含1和100)。
*/
public class Demo4 {
public static void main(String[] args) {
int a = 1; //初始化
while(a<=100){ //循环条件
System.out.println(a); //循环体
a++; //迭代
}
//初始化;循环条件;迭代
for (int i=1;i<=100;i++){
System.out.println(i); //循环体
}
}
}
for循环的特点:
-
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
-
for循环的循环次数和循环条件的迭代是在执行前就确定的。而while循环的循环次数和循环条件的迭代都在循环体中。
-
for循环的执行步骤:
-
程序执行到for循环的时候,for循环的初始化会最优先执行。初始化可以是一个或多个循环控制的变量,也可以是空语句。
-
初始化执行结束后,检测布尔表达式的值。如果值为true,则循环体执行。
-
执行一次循环后,循环控制变量迭代。
-
再次检查布尔表达式的值,如果值依然为true,则循环体继续执行。
-
-
for的死循环:
public class Demo5 { public static void main(String[] args) { for (; ; ) { } } }
-
热知识:在IDEA中输入循环次数.for可以直接调出for循环的框架
break和continue
break
示例代码:
/**
* 打印1-10的所有整数(包含1和10)
*/
public class Demo13 {
public static void main(String[] args) {
int i = 0;
while (i <= 10) {
if (i == 5) {
i++;
break;
}
System.out.println(i);
i++;
}
}
}
以上示例打印结果0、1、2、3、4,因为在5的时候跳出了该循环。
break可以用在任何循环的循环体部分,用来强行跳出循环。
跳出循环后不执行循环中的剩余语句,也在switch中用来结束switch结构。
continue
示例代码:
/**
* 打印1-10的所有整数(包含1和10)
*/
public class Demo13 {
public static void main(String[] args) {
int i = 0;
while (i <= 10) {
if (i == 5) {
i++;
continue;
}
System.out.println(i);
i++;
}
}
}
以上示例打印结果0、1、2、3、4、6、7、8、9、10,因为在5的时候终止了这次循环,没有执行后面的语句。
continue同break一样,它可以用在任何循环的循环体部分,用来终止这次循环。
终止循环后会跳过本次循环未执行的语句,直接执行循环判定开始下一次循环。
goto拓展(万恶之源)
本章节仅用于拓展了解,实际工作中不建议使用
本章节仅用于拓展了解,实际工作中不建议使用
本章节仅用于拓展了解,实际工作中不建议使用
代码示例:
/**
* 计算201-300之间的所有质数
*/
public class Demo14 {
public static void main(String[] args) {
outer:for (int i = 201; i <= 300; i++) {
//遍历201-300之间的每一个数
for (int j = 2; j < i/2; j++) {
//用当前i的值依次与j的值进行取余
if(i%j==0){
//当i的值能被j整除时,结束本次循环
continue outer;
//continue结束后跳到标签处
}
}
System.out.println(i);
}
}
}
goto语句很早就在程序设计语言中出现和使用,尽管goto仍然是Java的一个保留关键字,但并未在语言中得到正式使用。
然而,在break和continue这两个关键字上,我们仍能看出一些goto的影子,即带标签的break和continue。
标签指后面跟着一个冒号的标识符,例如:label:
对Java来说唯一能用到标签的地方是循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue语句通常只会中断当前循环,但如果和标签一起使用,则会中断到存在标签的地方。
循环练习作业
分别计算1-100中所有奇数和偶数的和(包含1和100)
/**
* 分别计算1-100中所有奇数和偶数的和(包含1和100)
*/
public class Demo5 {
public static void main(String[] args) {
int oddSum = 0;
int evenSum = 0;
for (int i = 0; i <= 100; i++) {
if (i % 2 != 0) {
oddSum += i; //oddSum = oddSum + i;
} else {
evenSum += i; //evenSum = evenSum +i;
}
}
System.out.println("1-100中所有奇数的和为:" + oddSum);
System.out.println("1-100中所有偶数的和为:" + evenSum);
}
}
用while输出1000之内(包含1000)所有能被5整除的数,并且每行输出3个。
/**
* 用while输出1000之内(包含1000)所有能被5整除的数,并且每行输出3个。
*/
public class Demo6 {
public static void main(String[] args) {
int a = 0; //控制循环的变量,主要输出结果。
int i = 1; //控制换行的变量
while (a <= 1000) { //while循环1-1000的所有数
if ((a % 5 == 0) && (a != 0)) { //判断当前数能被5整除并不为0
if ((i % 3 != 0)) { //判断当前行输出是否足3
System.out.print(a + "\t"); //输出结果不换行
} else {
System.out.println(a); //输出结果并换行
}
i++; //不管是否换行,每次输出后i++
}
a++; //循环迭代
}
}
}
用for输出1000之内(包含1000)所有能被5整除的数,并且每行输出3个。
/**
* 用for输出1000之内(包含1000)所有能被5整除的数,并且每行输出3个。
*/
public class Demo7 {
public static void main(String[] args) {
for (int i = 0, a = 0; i < 1000; i++) { //变量i控制循环,a控制打印数量
if ((i != 0) && (i % 5 == 0)) { //判断当前数是否为0与能否被5整除
if ((a != 0) && (a % 3 == 0)) { //判断当前输出数量是否为0能否被3整除
System.out.print(i+"\t"); //当前打印数量不能被3整除的情况
} else {
System.out.println(i); //当前打印数量能被3整除的情况
}
a++; //不管能否被3整除,只要打印了数据则a++;
}
}
}
}
使用for打印九九乘法表
/**
* 使用for打印九九乘法表
*/
public class Demo8 {
public static void main(String[] args) {
for (int i = 1, b = 1; i <= 9; ) { //i为乘数1,b为乘数2
if (b < 9) { //乘数2小于9的情况,打印后不换行。
System.out.print(b + "x" + i + "=" + i * b + "\t");
b++;
} else if (b == 9) { //乘数2等于9的情况,打印后换行。
System.out.println(b + "x" + i + "=" + i * b);
b++;
} else { //乘数2大于9的情况。
i++; //乘数1自增。
b = 1; //乘数2回到1。
}
}
}
}
运行结果:
修改排版
/**
* 使用for打印九九乘法表
*/
public class Demo9 {
public static void main(String[] args) {
for (int i = 1, b = 1, n = 1; i <= 9; ) { //i为乘数1,b为乘数2,n为换行变量。
if (b < 9) { //乘数2小于9的情况,打印后不换行。
System.out.print(i + "x" + b + "=" + i * b + "\t");
b++;
} else if (b == 9) { //乘数2等于9的情况,打印后换行。
System.out.println(i + "x" + b + "=" + i * b);
b++;
n++; //每换行一次n+1。
} else { //乘数2大于9的情况。
i++; //乘数1自增。
b = n; //乘数2回到n,第几行b就从几开始。
}
}
}
}
打印结果:
使用for循环嵌套:
/**
* 使用for打印九九乘法表
*/
public class Demo10 {
public static void main(String[] args) {
for (int i = 9; i >= 1; i--) {
for (int b = 1; b <= i; b++) {
System.out.print(b + "x" + i + "=" + i * b + "\t");
}
System.out.println();
}
}
}
运行结果:
结构拓展
增强for循环
Java5引入的主要用于数组或集合的增强型for循环,简化了遍历数组和集合的代码量。
for循环代码示例:
public class Demo12 {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50, 60, 70, 80};
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
//返回结果为数组中的所有元素。
}
}
i为数组的索引,length是一个属性,表示集合或数组的长度。
索引总是从0开始的。
增强for循环代码示例:
public class Demo11 {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50, 60, 70, 80};
for (int x : numbers) {
System.out.println(x);
}
//返回结果为数组中的所有元素。
}
}
x必须与数组或集合的类型相匹配。
增强for中其实就是把集合或数组中的每个元素都赋值给x
for和增强for的区别:
-
任何循环都可以用for循环运行,但不一定能用增强for运行。
-
增强for循环内部其实是使用了Iterator迭代器遍历的,只能遍历数组和实现了Interable接口的集合。
-
普通for循环可以获取元素索引,增强for循环无法获取元素索引
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人