JAVA流程控制
用户交互Scanner
java.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入,实现程序和人的交互
基本语法:
Scanner s=new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否有输入的数据
public class Demo01 {
public static void main(String[] args) {
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNext()){
//使用next方式接收
String str=scanner.next();
System.out.println("输入的内容为"+str);
}
//凡是属于IO流的类,如果不关闭会一直占用资源,用完就关掉
scanner.close();
}
}
//该程序执行后不会直接结束,会等等用户在控制台继续输入数据(即程序里面说的键盘数据),按回车确认后,控制台打印“输入的内容为+键盘录入的数据” 之后再结束程序
//键入 hello world 只会输出hello
public class Demo02 {
public static void main(String[] args) {
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNextLine()){
//使用nextLine方式接收
String str=scanner.nextLine();
System.out.println("输入的内容为"+str);
}
//凡是属于IO流的类,如果不关闭会一直占用资源用完就关掉
scanner.close();
}
}
//键入 hello world 会完整输出hello world
-
next():
- 一定要读取到有效字符后才可以结束输出
- 对输入有效字符之前遇到的空白,next()方法会自动将其去掉
- 只有输入有效字符后才将后面输入的空白作为分隔符或者结束符
- next()不能得到带空格的字符串
-
nextLine():
- 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
- 可以获得空白
因为next()遇到空格就结束,使用得较少,一般使用nextLine()
public class Demo5 { public static void main(String[] args) { //要求:可以输入多个数字,求其平均数和总和,没输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果 //next()与nextLine()方法获取输入的字符串 //hasNext()与hasNextLine()判断是否有输入的数据 Scanner scanner = new Scanner(System.in); double sum=0; int m=0; while(scanner.hasNextDouble()){ double x=scanner.nextDouble(); m++; sum=sum+x; System.out.println("你输入了第"+m+"个数据,当前总和值为:sum="+sum); } System.out.println(m+"个数的平均值是"+sum/m); System.out.println(m+"个数的总和是"+sum); scanner.close(); } }
顺序结构
java的基本结构就是顺序结构,除非特别指明,否则就按顺序一句一句执行
顺序结构是最简单的算法结构
语句与语句之间,是按从上到下的顺序进行执行的,它是由若干个依次执行的处理步骤组成;是任何一个算法都离不开的基本算法结构
public class Demo6 {
public static void main(String[] args) {
System.out.println(hello1);
System.out.println(hello2);
System.out.println(hello3);
System.out.println(hello4);
}
}
选择结构
-
if单选择结构
我们很多时候要去判断一个东西是否可行,然后才去执行,这样一个过程在程序中用if语句来表示
语法:
if(布尔表达式){ //布尔表达式为true将执行的语句 }
public class ifDemo01 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入内容:"); String s=scanner.nextLine(); //equals:判断字符串是否相等 if(s.equals("Hello")){ System.out.println(s); } System.out.println("End"); scanner.close(); } }
-
if双选择结构
例:现在有一个需求,公司要收个一个软件,如果收个成功,给人支付100万;如果收购失败,自己找人开发。
这个需求用一个if无法搞定,需要有两个判断
语法:
if(布尔表达式){ //布尔表达式为true将执行的语句 }else{ //布尔表达式为false将执行的语句 }
public class ifDemo02 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入成绩"); int score =scanner.nextInt(); if(score<60){ System.out.println("不及格"); }else{ System.out.println("及格"); } scanner.close(); } }
-
if多选择结构
对于学生的成绩,分ABCD等级,存在区间多级判断,如90-100是A,80-90是B等;很多时候我们的选择也不仅仅只有两个吧,故需要一个多选择结构来处理这类问题
语法:
if(布尔表达式1){ //布尔表达式1为true将执行的语句 }else if(布尔表达式2){ //布尔表达式2为true将执行的语句 }else if(布尔表达式3){ //布尔表达式3为true将执行的语句 }else{ //以上所有布尔表达式都不为true是执行的语句 }
public class ifDemo3 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入成绩"); int score =scanner.nextInt(); if(score>=90 & score<=100){ System.out.println("A"); }else if(score>=80 & score<90){ System.out.println("B"); } else if(score>=60 & score<80){ System.out.println("C"); }else if(score>=0 & score<60){ System.out.println("D"); }else{ System.out.println("成绩不合法"); } scanner.close(); } }
-
嵌套的if结构
使用嵌套的if…else语句是合法的。也就是说可以在另一个if或者else if语句中使用if或者else if语句
语法:
if(布尔表达式1){ //布尔表达式1为true将执行的语句 if(布尔表达式2){ //布尔表达式2为true将执行的语句 } }
-
switch多选择结构
多选择结果还有一个实现方式就是switch case语句
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支
switch case语句中的变量类型可以是:
- byte,short,int或者char
- Java7开始,switch支持字符串String类型比较了
- case标签必须为字符串常量或字面量
语法:
switch(expression){ case value: //语句 break;//可选 case value: //语句 break;//可选 //可以有任意数量的case语句 default://可选 //语句 }
public class SwitchDemo01 { public static void main(String[] args) { //case穿透 //switch是匹配一个具体的值,if是一个区间范围 //break会跳出switch;当没有写break时,只要匹配成功,从匹配成功的case开始,后面的都会输出 //default:当都不匹配时就会输出default的 char grade ='C'; switch (grade){ case 'A': System.out.println("优秀"); break;//可选;如果没写break,会将满足条件的case及后面的全部输出 case 'B': System.out.println("良好"); break; case 'C': System.out.println("及格"); //C开始没有break;如果C匹配上,那么几个开始,后面的需改善,挂科,未知等级都会输出 case 'D': System.out.println("需改善"); //为了规范,每写一个case都加上break case 'E': System.out.println("挂科"); default: System.out.println("未知等级"); } } }
为了规范,每写一个case都加上break
循环结构
-
while循环
while是最基本的循环,结构为:
while(布尔表达式){ //循环内容 }
-
只要布尔表达式为true,循环就会一直执行下去
-
大多数情况下是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环
-
少数情况需要让循环一直执行,如服务器的请求响应监听等
-
循环条件一直为true会造成无线循环【死循环】,正常业务编码中应该尽量避免死循环。死循环会影响程序性能或造成程序卡死崩溃
public class WhileDemo01 { public static void main(String[] args) { //输出1~100 int i=0; while(i<100){ i++; System.out.println(i); } } }
public class WhileDemo2 { public static void main(String[] args) { //计算1+2+3+...+100 int i=0; int sum=0; while (i<100){ i++; sum=sum+i; } System.out.println(sum); } }
-
-
do…while循环
-
对于while语句而言,如果不满足条件,则不能进入循环。单有时候需要几遍条件不满足,也至少执行一次
-
do…while循环和while循环类似,不同的是,do…while循环至少会执行一次
-
while和do…while的区别
- while先判断后执行;do…while是先执行后判断
- do…while总是保证循环体会被至少执行一次
结构:
do{ //代码语句 }while(布尔表达式)
public class WhileDemo3 { public static void main(String[] args) { //计算1+2+3+...+100 int i=0; int sum=0; do{ i++; sum=sum+i; }while (i<=100); System.out.println(sum); } }
-
-
for循环
-
for循环使一些循环结构变得更加简单
-
for循环语句是支持迭代的一种通用结构,是最有效,最灵活的循环结构
-
for循环执行的次数是在执行前就确定的,语法格式如下:
for(初始化;布尔表达式;更新){ //代码语句 }
public class ForDemo01 { public static void main(String[] args) { int sum=0; for (int i=0;i<=100;i++){ sum=sum+i; } System.out.println(sum); } }
public class ForDemo02 { public static void main(String[] args) { //分别打印出100以内所有奇数与偶数 int a=1; while(a<100){ System.out.println(a); a+=2; } System.out.println("while循环结束"); for(int i=2;i<=100;i+=2){ System.out.println(i); } System.out.println("for循环结束"); } }
-
for循环快捷键:输入 100.for 会自动生成
for (int i = 0; i < 100; i++) { }
public class ForDemo03 { public static void main(String[] args) { //计算0-100所有奇数之和,所有偶数之和 int oddSum=0; int evenSum=0; for (int i = 0; i <=100; i++) { if(i%2!=0){ oddSum=oddSum+i; }else{ evenSum+=i; } } System.out.println("所有奇数之和oddSum="+oddSum); System.out.println("所有偶数之和evenSum="+evenSum); } }
public class ForDemo04 { public static void main(String[] args) { //打印九九乘法表 // \t 空格 //System.out.println();相当于每次内循环结束,打印一次空白换行一次 for (int j = 1; j <=9; j++) { for (int i =1; i <=j; i++) { System.out.print(i+"*"+j+"="+(i*j)+"\t"); } System.out.println(); } } }
-
-
-
增强型for循环
可用于取代迭代器
格式如下:
for(声明语句 : 表达式){ //代码句子 }
public class ForDemo05 { public static void main(String[] args) { String [] arr={"果果","果果2","果果3","果果4","果果5"};//定义一个数组 //遍历数组中的元素 for(String x:arr){ System.out.println(x); } } }
声明语句:声明新的局部变量,改变量类型必须和数组元素的类型匹配。起作用域限定在循环语句块,其值与此时数组元素的值相等
表达式:表达式是要访问的数组名,或者返回值为数组的方法
break & continue
-
break在任何循环语句的主体部分,均可用break控制循环的流程break用于强行退出循环,不执行循环中剩余的语句。(break也在switch语句中使用)
主要用于循环语句和switch中,只是跳出循环不是结束真个程序
public class BreakDemo { public static void main(String[] args) { int i=0; while (i<100){ i++; System.out.println(i); if(i==30){ break; //本来应该循环到i=100的,此处i=30时break,循环30次就结束循环 } } } }
-
continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定
public class ContinueDemo { public static void main(String[] args) { int i=0; while(i<100){ i++; if(i%10==0){ System.out.println(); continue; //终止了i%10结果为o(i是10的倍数)时的这一次循环中尚未执行的语句打印输出i+“ ”; //然后继续回到循环中进行下一次循环的判定 } System.out.print(i+" "); } } }
break终止整个循环;continue终止某次循环
练习
打印三角形
public class TestDemo01 {
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;j++){
System.out.print("*");
}
for (int j=1;j<i;j++){
System.out.print("*");
}
System.out.println();
}
}
}