Java基础-流程控制

1 用户交互Scanner

  • 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner 是Java5的新特征,我们可以通过Scanner类来获取用户的输入
  • 基本语法:
		Scanner s = new Scanner(System.in);
  • 通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
  • next()方法:
    1 一定要读取到有效字符后才可以结束输入
    2 对输入有效字符之前遇到的空白,next()方法会自动将其去掉
    3 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
    4 next()不能得到带有空格的字符串
        //创建一个扫描器对象,用于接收键盘数据
        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();
//输出
		使用next方法接收:
		现在键盘输入 回车输出
		输出的内容为:现在键盘输入
  • nextLine()方法:
    1 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
    2 可以获得空白
        Scanner scanner = new Scanner(System.in);

        System.out.println("使用next方法接收:");

        if (scanner.hasNextLine()){
            String str = scanner.nextLine();//程序会等待用户输入完成
            System.out.println("输出的内容为:"+str);
        }
 //输出
 		使用nextLine方法接收:
		现在键盘输入 回车输出
		输出的内容为:现在键盘输入 回车输出

小案例1:

        Scanner scanner = new Scanner(System.in);

        //从键盘接收数据
        int i = 0;
        float f = 0.0f;

        System.out.println("请输入整数:");

        if (scanner.hasNextInt()){
            i = scanner.nextInt();//i = scanner.方法名;
            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("输入的不是小数数据!");
        }
//输出
		请输入整数:
		9
		整数数据:9
		请输入小数:
		0.9
		小数数据:0.9

小案例2:
题目:可以输入多个数字,并求其总和与平均数,没输入一个数字用回车确认,通过输入非数字来结束输入并输出执行结果;
while循环:当表达式为真,则执行下面的语句;语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句;然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环;

        Scanner scanner = new Scanner(System.in);
        //和
        double sum = 0;
        //计算输入了多少个数字
        int m = 0;
        System.out.println("请输入:");
        //通过循环判断是否还有输入,并在里面对每一次进行求和和统计
        while(scanner.hasNextDouble()){
            double x = scanner.nextDouble();
            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();
//输出
		请输入:
		1
		2
		3
		x
		3个数的和为6.0
		3个数的平均数为2.0

2 顺序结构

  • Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。
  • 顺序结构是最简单的算法结构。
  • 语句与语句之间,框与框之间是按从上到下的顺序进行的,他是由若干个依次执行的处理步骤组成的,他是任何一个算法都离不开的一种基本算法结构

3 选择结构

  • if单选择结构
    在这里插入图片描述
        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("输入错误!");
        scanner.close();
  • if双选择结构
    在这里插入图片描述
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入内容:");
        String s = scanner.nextLine();

        //equals:判断字符串是否相等。
        if (s.equals("Hello")){
            System.out.println("输入正确:"+s);
        }else{
            System.out.println("输入错误!");
        }
        scanner.close();
  • if多选择结构
    在这里插入图片描述
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入成绩:");
        int score = scanner.nextInt();
        /*
        if 语句至多有1个else语句,else语句在所有的elseif语句之后,
        if 语句可以有若干个elseif语句,它们必须在else语句前面,
        一旦其中一个elseif语句检测为true,其他的elseif以及else语句都将跳过执行
         */
        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结构(二分查找)
    在这里插入图片描述
  • switch多选择结构
    1 多选择结构还有一个实现方式就是switch case语句
    2 switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支
    3 switch语句中的变量类型可以是:byte、short、int或者char,从Java SE 7 开始,switch支持字符串Sting类型了,同时case标签必须是字符串常量或字面量

语法:
在这里插入图片描述
小案例1:

        char grade = 'C';

        switch (grade){//switch:匹配一个具体的值
            case 'A'://case:穿透
                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("未知等级");
                break;

小案例2:

        String name = "插头";
        **//JDK7的新特性,表达式可以是字符串;**
        switch (name) {
            case "插头":
                System.out.println("插头");
                break;
            case "风扇":
                System.out.println("风扇");
                break;
        }

反编译:
idea中:点击右上角:project structure --> 复制project compiler output下class文件 --> 粘贴到项目下java文件同级目录下 --> 进ieda中打开即可查看编译前的代码。(第一次用需要接受一个反编译协议)
上面代码的反编译后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package demo;

public class Hello {
    public Hello() {
    }

    public static void main(String[] args) {
        String name = "插头";
        byte var3 = -1;
        switch(name.hashCode()) {
        case 815010://字符的本质还是数字
            if (name.equals("插头")) {
                var3 = 0;
            }
            break;
        case 1237817:
            if (name.equals("风扇")) {
                var3 = 1;
            }
        }

        switch(var3) {
        case 0:
            System.out.println("插头");
            break;
        case 1:
            System.out.println("风扇");
        }

    }
}

4 循环结构

  • while循环
    1 结构:在这里插入图片描述
    2 只要布尔表达式为TRUE,循环就会一直执行下去
    3 我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环
    4 少部分情况需要一直执行,比如服务器的请求响应监听等
    5 循环条件一直为TRUE就会造成无限循环【死循环】,我们正常的业务编程中应该尽量避免死循环,会影响程序性能或者造成程序卡死崩溃
    小案例:计算1+2+…+100
        int i = 0;
        int sum = 0;
        while (i<=100){
            sum = sum + i;
            i++;
        }
        System.out.println(sum);
//输出
		5050
  • do…while循环
    1 结构:在这里插入图片描述
    2 对于while语句而言,如果不满足条件,,则不能进入循环,但是有时候我们需要即使不满足条件,也至少执行一次,
    3 do…while循环和while循环相似,不同的是,do…while循环至少会执行一次
    4 while和do…while的区别:
    4.1 while先判断后执行,do…while是先执行后判断
    4.2 do…while总是保证循环体会被至少执行一次,这是他们的主要差别
    代码验证:
        int a = 0;
        while (a<0){
            System.out.println(a);
        }
        System.out.println("------------");
        do {
            System.out.println(a);
            a++;
        }while (a<0);
//输出
		------------
		0
  • for循环

1 for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构
2 for循环执行的次数是在执行前就确定的,语法格式:
在这里插入图片描述
2.1最先执行初始化步骤,可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。然后检测布尔表达式的值,如果为false,循环终止,开始执行循环体后面的语句。如果为TRUE,循环体被执行,执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。最后再次检测布尔表达式,循环执行上面的过程。
3 for循环的执行顺序
小案例1:计算1-100之间的奇数和偶数的和

       /* int sum1 = 0;//两个for显然太啰嗦,不太好
        int sum2 = 0;
		//idea中,输入100.for --> 回车:for (int i = 0; i < 100; i++)
        for (int i = 0; i <= 100; i=i+2) {
            sum1 = sum1 + i;
        }
        System.out.println("一百内偶数和:"+sum1);

        for (int i = 1; i <= 100; i=i+2) {
            sum2 = sum2 + i;
        }
        System.out.println("一百内奇数和:"+sum2);*/
        int sum1 = 0;
        int sum2 = 0;
        for (int i = 0; i <= 100; i++) {
            if (i%2==0){//偶数
                sum1+=i;//sum1=sum1+i;
            }else {//奇数
                sum2+=i;
            }
        }
        System.out.println("一百内偶数和:"+sum1);
        System.out.println("一百内奇数和:"+sum2);
//输出
		一百内偶数和:2550
		一百内奇数和:2500

小案例2:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个。
for循环:

/*   for:       
      for (int i = 1; i <= 1000; i++) {
                    if (i%5==0){
                        System.out.print(i+"\t");
                    }
                    if (i%(5*3)==0){//每行输出三个
                        System.out.print("\n");//System.out.println();
                    }
                }
                //println:输出完后会自动换行
                //print:输出完后不会自动换行*/
//while:
        int i = 1;
        while (i<=1000){
            if (i%5==0){
                System.out.print(i+"\t");
            }
            if (i%(5*3)==0){//每行输出三个
                System.out.print("\n");//System.out.print();
            }
            i++;
        }

小案例3:打印九九乘法表

        for (int x = 1; x <= 9; x++) {
            for (int y = 1; y <= x; y++) {//y<=x:清除重复内容,让它承下坡形状
                System.out.print(x+"X"+y+"="+x*y+"\t");
            }
            System.out.println("");//每循环完一遍进行自动换行
        }
//输出
1X1=1	
2X1=2	2X2=4	
3X1=3	3X2=6	3X3=9	
4X1=4	4X2=8	4X3=12	4X4=16	
5X1=5	5X2=10	5X3=15	5X4=20	5X5=25	
6X1=6	6X2=12	6X3=18	6X4=24	6X5=30	6X6=36	
7X1=7	7X2=14	7X3=21	7X4=28	7X5=35	7X6=42	7X7=49	
8X1=8	8X2=16	8X3=24	8X4=32	8X5=40	8X6=48	8X7=56	8X8=64	
9X1=9	9X2=18	9X3=27	9X4=36	9X5=45	9X6=54	9X7=63	9X8=72	9X9=81

增强for循环:
1 语法结构:
在这里插入图片描述
1.1声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等
1.2 表达式:表达式是要访问的数组名,或者是返回值为数组的方法
2 在JDK 5 中引入了一种主要用于数组或集合的增强型for循环

        int[] numbers = {1,2,3,4,5};//定义了一个数组
        for (int i = 0; i < 5; i++) {//常规for循环
            System.out.println(numbers[i]);
        }
            System.out.println("------------");
        for (int x:numbers){//增强型for循环
            System.out.println(x);
        }
//输出
		1
		2
		3
		4
		5
		------------
		1
		2
		3
		4
		5        

5 break&continue

  • break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
  • continue语句在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
  • 关于goto关键字
    1 沟通关键字很早就在程序设计语言中出现,尽管goto仍然是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto,然而,在break和continue这两个关键字上沟通的影子—带标签的break和continue。
    2 “标签”是指后面跟一个冒号的标识符,例如:label:
    3 对Java来说位移用到标签的地方是在循环语句之前,而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随标签使用,他们就会中断到存在标签的地方。
        int i = 0;
        while (i<100){
            i++;
            if (i%10==0){
                System.out.println();
                continue;//跳过当前判定结果的内容
            }
            System.out.print(i+"\t");
        }
        System.out.println("11111111111111");
//输出
		1	2	3	4	5	6	7	8	9	
		11	12	13	14	15	16	17	18	19	
		21	22	23	24	25	26	27	28	29	
		31	32	33	34	35	36	37	38	39	
		41	42	43	44	45	46	47	48	49	
		51	52	53	54	55	56	57	58	59	
		61	62	63	64	65	66	67	68	69	
		71	72	73	74	75	76	77	78	79	
		81	82	83	84	85	86	87	88	89	
		91	92	93	94	95	96	97	98	99	        

小案例:打印101-150之间所有的质数

		//outer:标签,
        outer:for (int i = 101; i < 150; i++) {
            for (int j = 2; j < i/2; j++) {
            //至于为什么只判断到i/2,这个有个基本定理的,检验素数只要判断自己一般范围内的约数个数。如果一半范围内有一个能整除的数字,那么必定有一个数字在1~ i内也是它的约数。不符合素数规定。所以只需要检验到i/2,其实直接j<i也可以,只不过没i/2快。
                if (i%j==0){//如果被整除(TRUE),就不是质数,如果不能被整除,就结束第二个for循环输出,然后继续第一个for循环。直至循环结束。
                    continue outer;//不再返回到判定是后循环的时的语句,而是返回到该标签所在的语句。
                }
            }
            System.out.print(i+" ");
        }
//输出
		101 103 107 109 113 127 131 137 139 149         

6 练习

练习1:打印三角形(可以设置断点然后点击右上角(绿色小蟑螂)Debug看运行过程)

        for (int i = 1; i <= 7; i++) {//行
            for (int j = 7; 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();
        }
//输出
		       *
		      ***
		     *****
		    *******
		   *********
		  ***********
		 *************       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值