Java流程控制
Java流程控制
Java流程控制01:用户交互Scanner
- 前面的基础语法还未涉及到程序与人的交互,但是Java提供了一个工具类,可以获取用户的输入。java.util.Scanner是Java5的新特征,我们可以用Scanner类来获取用户的输入。
- 基础语法
Scanner s = new Scanner(System.in);
- 通过Scanner类的next()与nextLine()方法获取字符串,在读取前一般我们需要使用hasNext()与hasNextLine()判断是否还有输入的数据
//next()方法
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
//nextLine()
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
if (scanner.hasNextLine()){
String str = scanner.nextLine();
System.out.println("输入的内容为:"+str);
}
scanner.close();
}
//输入样例:hello world ------>输出样例:hello world
//也可以直接获取,不用判断
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据:");
String str = scanner.nextLine();
System.out.println("输入的内容为:"+str);
scanner.close();
}
-
next()
- 1、一定要读取到有效字符后才会结束输入;
- 2、对输入有效数字之前遇到的空白,next()方法会自动将其过滤掉;
- 3、只要输入有效字符后才将其后面输入的空白作为分隔符或者结束符;
- 4、next()方法不能得到带有空格的字符串。
-
nextLine()
- 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
- 可以获得空白。
Java流程控制02:Scanner进阶使用
Scanner方法如何获取整数和小数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//从键盘接收数据
int i = 0;
float f = 0.0f;
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();
}
//求输入的数字的和与平均值
public static void main(String[] args) {
//我们可以输入多个例子,并求其总和与平均值,每输入一个数字用回车确认,
// 通过输入非数字来结束输入并输出执行的结果;
Scanner scanner = new Scanner(System.in);
//和
double sum = 0;
//计算输入了多少个数字
int m = 0;
System.out.println("请输入数字:");
//通过循环判断是否还有输入,并在里面对每一次进行求和统计
while(scanner.hasNextDouble()){
double x = scanner.nextDouble();
m++;//m=m+1;
sum=sum+x;
System.out.println("你输入了第"+m+"个数据,然后当前结果sum="+sum);
}
System.out.println(m+"个数的和为:"+sum);
System.out.println(m+"个数的平均值:"+(sum/m));
scanner.close();
}
Java流程控制03:顺序结构
- 什么是顺序结构?
Java的基本结构就是一种顺序结构,除非特别指明,否则就按照顺序一句一句执行。
- 语句之间,框之间是按照从上到下的顺序进行,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。
public class OrderDemo01 {
public static void main(String[] args) {
//按顺序输出
System.out.println("hello1");
System.out.println("hello2");
System.out.println("hello3");
System.out.println("hello4");
System.out.println("hello5");
}
}
Java流程控制04:if选择结构
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双选择结构
- 假设现在又一个需求,我们想要找父母要1000元生活费,成功了,得到1000元;失败了,得到0元;此时这种需求用一个if就不能完成了,我们需要两个判断了,即if双选择结构,所以就有了if-else结构。
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}else{
//如果布尔表达式为false将执行的语句
}
//以下为该方法例子
public class IfDemo02 {
public static void main(String[] args) {
//这里来个考试例子,如果考试成绩大于60就是及格,小于60就不及格
Scanner scanner = new Scanner(System.in);
System.out.println("请输入成绩:");
int score = scanner.nextInt();
if (score>60){
System.out.println("及格");//如果输入大于60执行这一句
}else {
System.out.println("不及格");//如果输入小于60执行这一句
}
scanner.close();
}
}
if多选择结构
我们可以看出上面的代码只有及格与不及格两种情况,如果想出现更多可能,单靠上面的是做不到的,所以我们需要一个多选择器来处理这类问题!
if(布尔表达式1){
//如果布尔表达式1的值为true将执行的语句
}else if(布尔表达式2){
//如果布尔表达式2的值为true将执行的语句
}else if(布尔表达式3){
//如果布尔表达式3的值为true将执行的语句
}else {
//如果以上布尔表达式都不为true执行的语句
}
//例子
/*
if语句至多有1个else语句,else语句在所有else if语句之后。
if语句可以有若干个elseif语句,他们必须在else之前。
一旦其中一个else if语句检测为true,其他的else if以及else语句都将跳过执行。
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入成绩:");
int score = scanner.nextInt();
if (score==100){
System.out.println("恭喜满分");
}else if(score<100&&score>=90){
System.out.println("等级为A");
}else if (score<90&&score>=80){
System.out.println("等级为B");
}else if (score<80&&score>=70){
System.out.println("等级为C");
}else if (score<70&&score>=60){
System.out.println("等级为D");
}else if(score<60&&score>=0){
System.out.println("抱歉,不及格!");
}else {
System.out.println("成绩不合法");
}
scanner.close();
}
嵌套的if语句
使用嵌套的if...else语句是合法的。即可以在另一个if或者else if语句中再嵌套一个if或者else if语句。
if(布尔表达式1){
//如果布尔表达式1的值为true将执行的语句
if(布尔表达式2){
//如果布尔表达式2的值为true将执行的语句
}
}
Java流程控制05:Switch选择结构
-
多选选择结构除了上面的方式,还有一种就是switch case语句。
-
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
-
switch case 语句中的变量类型有:byte、short、int、char以及String(javaSE 7以后的版本才支持)
-
case标签必须为字符串常量或字面量。
switch(表达式){
case value:
//语句
break;//可用可不用
case value:
//语句
break;//可用可不用
//可以有任意数量的case语句
default://可选
//语句
}
public static void main(String[] args) {
//case穿透 //switch匹配一个具体的值
char grade = 'F';
switch (grade){
case 'A':
System.out.println("优秀");
break;
case 'B':
System.out.println("良好");
break;
case 'C':
System.out.println("一般");
break;
case 'D':
System.out.println("合格");
break;
case 'E':
System.out.println("不合格");
break;
default:
System.out.println("未知等级");
}
}
/*case穿透指的是每个case后面如果都写了break则只会输出所对应的结果;但如果某个case后面没有接break,则会输出那些当前值及其以下的值;大家可以测试几次加以理解*/
//String是JavaSE 7版本后才支持的变量类型
public static void main(String[] args) {
//String是JDK7的新特性,表达式结果可以是字符串!!!
//字符的本质还是数字
//反编译 :Java--->class(字节码文件----->不懂?)------>反编译(IDEA)
String name = "Devin~Y";
switch (name){
case "Devin~Y":
System.out.println("Devin~Y");
break;
case "Devin":
System.out.println("Devin");
break;
default:
System.out.println("What Are You Doing?");
}
}
//我们可以通过反编译来查看字节码文件理解,以下为反编译文件内容
public class SwitchDemo02 {
public SwitchDemo02() {
}
public static void main(String[] args) {
String name = "Devin~Y";
byte var3 = -1;
switch(name.hashCode()) {
case -1070501643:
if (name.equals("Devin~Y")) {
var3 = 0;
}
break;
case 65925082:
if (name.equals("Devin")) {
var3 = 1;
}
}
switch(var3) {
case 0:
System.out.println("Devin~Y");
break;
case 1:
System.out.println("Devin");
break;
default:
System.out.println("What Are You Doing?");
}
}
}
Java流程控制06:While循环详解
循环结构
-
while循环
- while是最基本的循环,它的结构为:
while(布尔表达式){ //循环内容 }
- 只要布尔表达式为true,循环就会一直执行下去;
- 我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环;
- 少数情况需要一直循环下去,比如服务器的请求响应监听等
- 循环一直为true就会造成无限循环【死循环】,我们正常的业务编程中应该尽量避免死循环,否则会影响程序性能或造成程序卡死崩溃!
//Demo1 public static void main(String[] args) { //输出1~100 int i=0; while(i<100){ i++; System.out.println(i); } //死循环,尽量不要出现这种情况 //while (true){} } //Demo2 public static void main(String[] args) { //输出1+2+...+100 int i=0; int sum=0; while(i<=100){ sum=sum+i; i++; } System.out.println(sum); }
Java流程控制07:Do···while循环
- 对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使满足条件也至少要执行一次。
- do···while循环和while循环相似,不同的是,do···while循环至少会执行一次
dp{
//代码语句
}while(布尔表达式)
- While和do···While的区别:
- while先判断后执行,do···while是先执行后判断!
- do···while总是保证循环体会至少被执行一次!这就是两者的主要差别。
//Demo01
public static void main(String[] args) {
int i = 0;
int sum =0;
do{
sum=sum+i;
i++;
}while (i<=100);
System.out.println(sum);
}
//Demo02----------->while和do···while的区别,自己运行见区别哦!
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);
}
Java循环控制08:for循环
-
for循环相比于前面的while和do···while循环而言,它使得代码变得更加简单;
-
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构;
-
for循环执行的次数是在执行前就确定的
for(初始化;布尔表达式;更新){ //代码语句 } //while和for循环的比较 public static void main(String[] args) { int a = 1;//初始化条件 while(a<=100){//条件 System.out.println(a);//循环体 a+=2;//迭代 } System.out.println("while循环结束!"); System.out.println("=========================="); //初始化//条件判断//迭代 for(int i=1;i<=100;i++){ System.out.println(i); } System.out.println("for循环结束!"); }
//Demo01
public static void main(String[] args) {
//0~100之间奇数和
int oddsum=0;
for (int i = 1; i <=100 ; i+=2) {
oddsum+=i;
}
System.out.println(oddsum);
System.out.println("=======================");
//0~100之间偶数和
int evensum=0;
for (int a=0;a<=100;a+=2){
evensum+=a;
}
System.out.println(evensum);
System.out.println("========以上为法一==========");
//法二
int sumodd=0;
int sumeven=0;
for (int i = 0; i <=100; i++) {
if(i%2!=0){//奇数判断
sumodd+=i;
}else{
sumeven+=i;
}
}
System.out.println("奇数的和"+sumodd);
System.out.println("偶数的和"+sumeven);
}
//Demo02
public static void main(String[] args) {
//用while或for循环输出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.print("\n");
}
}
//println 输出完会换行
//print 输出完不会换行
}
//Demo03
public static void main(String[] args) {
//打印九九乘法表
/*
1、先打印第一行
2、把固定的1再用一个循环包起来
3、去掉重复项,i<=j
4、调整样式
*/
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();
}
}//还有其他方式哦,大家可以多试试。
Java循环控制10:增强for循环
- Java 5引入了一种主要用于数组和集合的增强型for循环(先做了解)。
for(声明语句:表达式){
//代码句子
}
//Demo
public static void main(String[] args) {
int[] numbers={10,20,30,40,50};//定义一个数组
for(int i=0;i<5;i++){
System.out.println(numbers[i]);
}
System.out.println("========================");
//遍历数组的元素
for(int x:numbers){
System.out.println(x);
}
}
- 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定再循环语句块,其值与此时数组元素的值相等。
- 表达式;表达式是要访问的数组名,或者是返回值的数组的方法。
Java循环控制11:break、continue、goto
- break在任何循环语句中的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句(break语句也在switch语句中使用)
- continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环判定。
- 关于goto关键字:用来改变函数代码的执行顺序,跳转到函数指定的标签的地方运行,goto不能跨函数代码块跳转。
//breakDemo
public static void main(String[] args) {
int i = 0;
while (i<100){
i++;
System.out.println(i);
if (i==30){
break;
}
}
}//结果输出到30时,循环结束(只是当前循环结束);但不影响外面输出值System.out.println("123456");
//continueDemo
public static void main(String[] args) {
int i=0;
while(i<100){
i++;
if (i%10==0){
System.out.println();
continue;
}
System.out.print(i);
}
}//结果出不输出10或10的整倍数,其他还是会输出
//gotoDemo不是重点
public static void main(String[] args) {
//打印101~150之间的所有质数
//质数是指大于1的自然数中,除了1和它本身以外不再有其他因素的自然数
int count = 0;
outer:for(int i=101;i<150;i++){
for(int j=2;j<i/2;j++){
if(i%j==0){
continue outer;
}
}
System.out.print(i+" ");
}
}
Java流程控制12:打印三角形及Debug
/*
*
***
*****
*******
*********
*/
public static void main(String[] args) {
//打印三角形 5行
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();
}
}