Java流程控制
Scanner对象
在流程控制前,java给个我们提供了一个工具类,让我们可以获取用户的输入。java,util.Scanner事Java5的新特性,我可以通过Scanner类来获取用户的输入
基本使用:
Scanner s=new Scanner(System.in); //System.in 和 System.out 相反,一个输入一个输出
s.close() // 最后一定要关闭,因为所有的输入输出流都要进行关闭不然就会浪费资源的,一定记住
然后可以通过next() 与 nextLine() 方法获取输入的字符串,在读取前我们一般需要使用hasNext() 与 hasNextLine 判断是否还有输入的数据。
public class Scanners {
public static void main(String[] args) {
//Scanner 是用来控制和用户交互的,可以用来获取用户的输入
// 首先需要创建一个扫描器对象,用来接受键盘数据
Scanner scan=new Scanner(System.in);
//判断有没有下一个输入 用hasNext()
if(scan.hasNextLine()){ //hasNextLine() 就是一行了
//如果有下一个输入就用Next接受
String str=scan.nextLine(); //等待用户输入后接受
System.out.println("用户的输入是:"+str); //以输入的空格结束
// nextLine() 以enter键结束,可以接受空格的
//当然可以你不用if判断也是可以的,直接等待用户输入
}
//所有的输入输出流都要进行关闭不然就会浪费资源的,一定记住
scan.close();
}
}
//运行结果为:
// hello world
//用户的输入是:hello world
next() 与 nextLine()的区别
next():
- 一定要读取到有效字符后才可以结束输入
- 对输入的有效字符之前遇到的空白,next()方法会自动将其去掉, 例如:Hello world 那么读取到的就只有Hello
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
- next() 不能得到带空格的字符串
nextLine():
- 以enter 键为结束符,也就是说nextLine() 方法返回的是输入回车之前的所有字符
- 可以获得空白,就是不会以获取到空格结束
高级用法--规定输入数据的类型
//我们可以输入多个数字,并求其总和与平均数,每输入一个数字用回车键确认,通过输入非数字
// 来结束输入并输出执行的结果
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
double sum=0; //总和
int m=0; //个数
while (scanner.hasNextDouble()){ //用循环判断是否还有double类型的输入,不满足就退出循环
double mak= scanner.nextDouble();
++m;
sum=sum+mak;
System.out.println("你输入了第"+m+"个数据");
}
System.out.println("输入的总和为:"+sum);
System.out.println("输入的平均数为:"+sum/m);
scanner.close();
}
当然可以不止是nextDouble(),还有nextInt()等等
顺序结构
java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句的执行
顺序结构是最简单的算法结构
语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构
选择结构
if单选择结构
我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表示
if(布尔表达式) {
// 如果布尔表达式为true 将执行的语句
}
if双选择结构
那现在就有个需求,公司要收购一个软件,成功了,给人支付100万元,失败了,自己找人开发,这样一个需求用一个if那就很难搞定了,就是需要有两个判断,一个双选择结构,所以就有了if ---else 结构
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
if多选择结构
当然在生活中我们的很多选择都不仅仅是只有两个的,所以我们还需要一个多选择结构来处理这类问题
if(布尔表达式1){
//如果布尔表达式1的值为true
}else if(布尔表达式2){
//如果布尔表达式2的值为true
}}else if(布尔表达式3){
//如果布尔表达式3的值为true
}else{
//如果以上的表达式都不为true 执行代码
}
注意的是:if语句至多有1个else语句,else语句在所有的else if语句之后。if语句可以有若干个else if语句,他们必须早else语句之前
一旦其中一个else if语句检测为true,其他的else if以及else 语句都将跳过执行
嵌套if结构
使用嵌套if....else 语句是合法的,也就是说可以在另外一个if 或者else if语句中使用if 或者else if 语句,这就是前台if
if(布尔表达式1){
//如果布尔表达式1的值为true
if(布尔表达式2){
// 如果布尔表达式2的值为true执行代码
}
}
Switch多选择结构
多结构还有一个实现方式就是Switch case 语句
Switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支
switch(expression){
case value:
//语句
break; //可选
case value:
//语句
break; //可选
default : //可选,就是默认执行的
//语句
}
Switch语句中的变量类型可以是
- byte、short、int 或者是char
- 从javaSE7开始的
- Switch支持字符串String类型
- case标签必须为字符串常量或字面量
补充:反编译 java---class -------反编译(idea)
把class文件放入到idea
所以switch 是通过哈希值来比较的
循环结构
while循环
white是最基本的循环,它的结构为
while(布尔表达式){
//循环内容
}
注意点:
-
只要布尔表达式为true,循环就会一直执行下去
-
我们大多数情况都是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环
-
少部分情况需要循环一直执行,比如服务器的请求响应监听等
-
循环条件一直为true就会造成无线循环(死循环),我们应该避免这种死循环发生,会影响程序的性能或者让程序卡死崩溃
//while 的基本使用 int i=0; int sum=0; //负责加数 // while(i<100){ //循环输出1-100 // i++; // System.out.println(i); // } while (i<=100){ //求出1加到100 的和 sum+=i; i++; } System.out.println(sum); //5050 }
do....while
对于while语句来说,如果不满足条件,就不能进入循环,但有时候我们需要即是不满足条件也至少执行一次
do...while 循环和while循环很相似,不同的是,do...while循环至少会执行一次
do{
//代码语句
} while(布尔表达式)
do...while 循环和while循环的区别
- while先判断在执行,do ....while是先执行后判断
- do....while总是保证循环体会被至少执行一次,这是主要的差别
for循环
for循环相较于white,结构变得更加简单
for循环语句是支持迭代的一种通用结构,是最有效的最灵活的循环结构
for循环的执行次数是在执行前就确定的:
for(初始化; 布尔表达式; 更新){
// 代码语句
}
一些小案例:
计算 0-100 之间奇数 和偶数的和:
public class fordemo {
public static void main(String[] args) {
// 100.for +enter 可以快速的写出for循环
//计算 0-100 之间奇数 和偶数的和
int odd=0; //奇数
int even=0; //偶数
for (int i = 0; i <=100; i++) {
if(i%2==0){
even+=i;
}
else{
odd+=i;
}
}
System.out.println("偶数的和为:"+even);
System.out.println("奇数的和为:"+odd);
//偶数的和为:2550
//奇数的和为:2500
System.out.println("====================");
用循环输出1-1000之间可以被5整除的数,并且每行输出3个
for (int i = 0; i <= 1000; i++) {
if(i%5==0){
System.out.print(i+"\t");
}
if(i%(5*3)==0){
System.out.println();
// println 输出完后会自动换行
// print 输出完后不会自动换行
}
/*
0
5 10 15
20 25 30
35 40 45
......
980 985 990
995 1000
*/
九九乘法口诀表:
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循环
格式如下:
for(声明语句 : 表达式){
//代码语句
}
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配,起作用域定在循环语句块中,其值与此时数组元素的值相等
表达式:表达式是要访问的数组名,或者是返回值为数组的方法
public static void main(String[] args) {
int[] sum={1,3,5,67,845,4};
for (int key : sum){
System.out.println(key);
}
/*输出结果
1
3
5
67
845
4
*/
}
break 与 continue
break: 在任何循环语句的主体部分,都可以用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句(通常和Switch语句一起使用)
continue: 用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定