Java流程控制
Scanner对象
Scanner来自java.util工具包,可以实现人机交互,实现输入输出
基本语法:
Scanner scanner = new Scanner(System.in);
Scanner类获取输入的字符串有next()和nextLine()两种方法
输入数据之前要判断用户是否有输入数据,hasNext()与hasNextLine()
【演示】
public class ScannerDemo01 {
public static void main(String[] args) {
// 创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:");
if(scanner.hasNext()){
String str = scanner.next();// 通过str接收输入的数据
System.out.println("输入的内容:"+str);
}
scanner.close();// IO流记得要关闭,否则会占用资源
}
}
运行结果
请输入:
Hello World!
输入的内容:Hello
输入Hello world!发现只输出Hello
使用NextLine()方式:
public class ScannerDemo02 {
public static void main(String[] args) {
// 创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:");
if(scanner.hasNextLine()){
String str = scanner.nextLine();// 通过str接收输入的数据
System.out.println("输入的内容:"+str);
}
scanner.close();// IO流记得要关闭,否则会占用资源
}
}
运行结果
请输入:
Hello World!
输入的内容:Hello World!
发现输入Hello World!可以完整输出!
小结:
- next():
- 一定要读取到有效的字符后才可以结束输入
- 对输入有效字符之前遇到的空白,next()方法会自动去掉
- 只有输入有效字符才将其后面输入的空白作为分隔符或者结束符
- next()不能得到带有空格的字符串
- nextLine():
- 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
- 可以获得空白
Scanner对象进阶
Scanner对象有细颗粒的方法
【演示】
public class ScannerDemo03 {
public static void main(String[] args) {
int i = 0;
float f = 0.0F;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入整数:");
if(scanner.hasNextInt()){
i = scanner.nextInt();
System.out.println("输入的整数为:"+i);
}else{
System.out.println("输入的不是整数");
}
System.out.println("请输入小数:");
if(scanner.hasNextFloat()){
f = scanner.nextFloat();
System.out.println("输入的小数是:"+f);
}else{
System.out.println("输入的不是小数");
}
scanner.close();
}
}
Scanner类有:nextInt(),nextFloat(),nextDouble(),nextChar()……
顺序结构
- Java的基本结构是顺序结构,除非特别指明,否则将一句一句按顺序执行
- 顺序结构是最简单的算法结构
- 语句与语句之间,框与框之间是按从上到下的顺序执行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构
【演示】
public class Hello {
public static void main(String[] args) {
System.out.println("Hello1");
System.out.println("Hello2");
System.out.println("Hello3");
System.out.println("Hello4");
}
}
输出结果:
Hello1
Hello2
Hello3
Hello4
if选择结构
- if单选择结构
- if双选择结构
- if多选择结构
- 嵌套的if结构
if单选择结构
我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表示
【演示】
public class IfDemo01 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一段字符:");
String str = input.nextLine();
// equals:判断字符串是否相等
if(str.equals("hello")){
System.out.println("输入的内容为:hello");
}else{
System.out.println("输入的内容不是hello");
}
input.close();
}
}
if双选择结构
有些时候我们需要两个判断,这样就要用到我们的if-else结构
【演示】
public class IfDemo02 {
public static void main(String[] args) {
/* 成绩大于60及格,否则不及格 */
Scanner input = new Scanner(System.in);
System.out.println("请输入成绩:");
double score = input.nextDouble();
if(score>=60){
System.out.println("成绩及格:"+score);
}else{
System.out.println("成绩不及格:"+score);
}
input.close();
}
}
if多选择结构
我们发现刚才的代码并不符合实际,成绩应该有多个等级(A,B,C,D,E…)
语法结构:
if(布尔表达式1){
//如果布尔表达式1为true时执行该代码
}else if(布尔表达式2){
//如果布尔表达式2为true时执行该代码
}else if(布尔表达式3){
//如果布尔表达式3为true时执行该代码
}else{
//如果以上布尔表达式都不为true则该代码
}
public class IfDemo03 {
public static void main(String[] args) {
/* 成绩大于60且小于80为及格
成绩大于80且小于90为良好
成绩大于90为优秀
成绩小于60为不及格 */
Scanner input = new Scanner(System.in);
System.out.println("请输入成绩:");
double score = input.nextDouble();
if(score>=60 && score<80){
System.out.println("成绩及格:"+score);
}else if(score>=80 && score<90){
System.out.println("成绩良好:"+score);
}else if(score>=90 && score<=100){
System.out.println("成绩优秀:"+score);
}else if(score<60 && score>=0){
System.out.println("成绩不及格:"+score);
}else{
System.out.println("输入有误,成绩不合法");
}
input.close();
}
}
嵌套的if结构
使用嵌套的if..else语句是合法的。也就是说你可以在另一个if或者else语句中使用if或者else if语句。
语法:
if(布尔表达式1){
//如果布尔表达式1为true时执行该代码
if(布尔表达式2){
//如果布尔表达式2为true时执行该代码
}
}
public class IfDemo04 {
public static void main(String[] args) {
/* 判断一个数是否能被2,3,5整除 */
Scanner input = new Scanner(System.in);
System.out.println("请输入一个整数:");
int i = input.nextInt();
if(i%2==0){
if(i%3==0){
if(i%5==0){
System.out.println("这个数能被2,3,5整除");
}else{
System.out.println("这个数不能被2,3,5整除");
}
}else{
System.out.println("这个数不能被2,3,5整除");
}
}else{
System.out.println("这个数不能被2,3,5整除");
}
input.close();
}
}
switch选择结构
- 多选择结构还有一个实现方式就是
switch case
语句 switch case
语句判断一个变量与一系列中某一个值是否相同,每个值称为一个分支- switch语句中的变量可以是:
- byte.short.int或者char
- 从JavaSE7开始switch支持字符串String类型
- 同时case标签必须为字符串常量或者字面量
语法:
switch(expression){
case value:
//语句
break;//可选
case value:
//语句
break;//可选
//你可以有任意数量的case语句
default://可选
//语句
}
【演示】
public class SwitchDemo01 {
public static void main(String[] args) {
char grade = 'A';
switch (grade){
case 'A':
System.out.println("优秀");
break;
case 'B':
System.out.println("良好");
break;
case 'C':
System.out.println("及格");
break;
default:
System.out.println("未知等级");
}
}
}
结果:
优秀
注意case穿透
若没有遇到break语句将会一直执行下去,直到遇到break语句结束
public class SwitchDemo02 {
public static void main(String[] args) {
char grade = 'A';
switch (grade){
case 'A':
System.out.println("优秀");
case 'B':
System.out.println("良好");
case 'C':
System.out.println("及格");
default:
System.out.println("未知等级");
}
}
}
结果:
优秀
良好
及格
未知等级
循环结构
while循环
while是最基本你的循环,它的结构为
while(布尔表达式){
//循环内容
}
- 只要布尔表达式为true就会一直循环下去
- 我们大多数情况是会让循环停下来,我们需要一个让表达式失效的方式来结束循环
- 少部分情况需要循环一直执行,比如服务器监听等
- 循环条件一直为true会造成死循环,会影响程序性能或程序卡死崩溃
- 思考:计算1+2+3…+100的结果
public class Demo{
public static void mian(String[] args){
//输出1~100
int i = 0;
while(i<100){
i++;
System.out.println(i);
}
}
}
死循环演示
public class Demo{
public static void main(String[] args){
while(true){//布尔表达式永远成立
//监听聊天
//服务器监听
//...
}
}
}
计算1+2+3…+100的结果
public class WhileDemo01 {
public static void main(String[] args) {
/* 求1+2+3+……+100的和 */
int i = 1;
int sum = 0;
while(i<=100){
sum+=i;
i++;
}
System.out.println("sum="+sum);
}
}
do…while循环
-
对于while语句而言,如果不满足条件,则不能进入循环体。但有时候我们需要即使不满足条件也至少执行一次
-
do..while循环和while循环很相似,不同的是。do…while至少执行一次
do{ //代码语句 }while(布尔表达式);
-
while和do..while的区别
- while先判断后执行,do…while先执行后判断
- do…while总是保证循环体会被至少执行一次!这是他们的主要区别
【演示】
public class DoWhileDemo01 {
public static void main(String[] args) {
/* 求1+2+3+……+100的和 */
int i = 1;
int sum = 0;
do{
sum+=i;
i++;
}while(i<=100);
System.out.println("sum="+sum);
}
}
【while与do…while区别】
while先判断后执行语句,do……while先执行语句后判断
public class Hello {
public static void main(String[] args) {
int a = 0;
while (a<0){
System.out.println(a);
a++;
}
System.out.println("===============");
do {
System.out.println(a);
a++;
}while (a<0);
}
}
输出结果:
===============
0
for循环
-
虽然所有循环结构都可以用while和do…while表示,但Java提供了另一种语句—>for循环,使一些循环结构变得更加简单
-
for循环语句是支持迭代的一种通用结构,是最有效最灵活的循环结构
-
for循环执行的次数是在执行前就确定了,语法结构如下:
for(初始化;布尔表达式;更新){ //代码语句 } for(;;){//死循环 }
【for循环结构与while循环结构的对比】
public class Hello {
public static void main(String[] args) {
int a = 1; //初始化条件
while (a<=100){ //条件判断
System.out.println(a);
a+=2; //迭代
}
System.out.println("while循环结束");
//初始化;条件判断;迭代
for (int i = 1; i < 100; i+=2) {
System.out.println(i);
}
System.out.println("for循环结束");
}
}
for循环结构练习
- 计算0到100之间的奇数和偶数的和
- 用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
- 打印九九乘法表
// 练习一:计算0到100之间的奇数和偶数的和
public class ForDemo01 {
public static void main(String[] args) {
int odd = 0;// 奇数和
int even = 0;// 偶数和
for(int i = 1; i <= 100; i++){
if(i%2==0){
even += i;
}else{
odd += i;
}
}
System.out.println("奇数和odd="+odd);
System.out.println("偶数和even="+even);
}
}
// 练习二:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
public class ForDemo02 {
public static void main(String[] args) {
int i = 1;
int count = 0;
while(i <= 1000){
if(i%5 == 0){
System.out.print(i+" ");// print输出不会换行
count++;
if(count%3 == 0){
System.out.println();//换行
}
}
i++;
}
System.out.println("\n***************");
count = 0;
for(int j = 1; j <= 1000; j++){
if(j%5 == 0){
System.out.print(j+" ");
count++;
if(count%3 == 0){
System.out.println();
}
}
}
}
}
// 练习三:打印九九乘法口诀表
public class ForDemo03 {
public static void main(String[] args) {
for(int i = 1; i <= 9; i++){
for(int j = 1;j <= i; j++){
System.out.print(i+"*"+j+"="+i*j+"\t");
}
System.out.println();// 换行
}
}
}
输出结果:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
增强for循环
-
java5引入了一种主要用于数组或集合的增强型for循环
-
Java增强for循环语法格式如下:
for(声明语句:表达式){ //代码语句 }
-
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时的数组元素相等
-
表达式:表达式是要访问的数组名,或者是返回值为数组的方法
【演示】
public class ForDemo04 {
public static void main(String[] args) {
int[] array = {1,2,3,4,5,};
for(int element: array){
System.out.println(element);
}
}
}
输出结果
1
2
3
4
5
break和continue
- break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句(break语句也在switch语句中使用)
- continue语句在循环体中,用于终止某次循环条件,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定
【break】
public class BreakDemo01 {
public static void main(String[] args) {
int i = 1;
while(i <= 10){
System.out.println(i);
if(i == 5){
break;
}
i++;
}
System.out.println("***");
}
}
输出结果
1
2
3
4
5
***
【continue】
public class ContinueDemo01 {
public static void main(String[] args) {
for(int i = 1; i <= 10; i++){
if(i == 5){
continue;
}
if(i == 8){
break;
}
System.out.println(i);
}
}
}
输出结果
1
2
3
4
6
7
流程控制练习
打印三角形
public class TriangleDemo01 {
public static void main(String[] args) {
for(int i = 1; i <= 5; i++){
for(int j = 5; j >= i; j--){
System.out.print(" ");
}
for(int j = 1; j <= i*2-1; j++){
System.out.print("*");
}
System.out.println();
}
}
}
输出结果
*
***
*****
*******
*********