2.Java基础之概述-流程控制+数组+IDEA基本使用+程序调试

1.流程控制

1.1 流程是什么

生活中处处都有流程:比如你们大学报到

程序就是为了解决生活的问题,程序也有流程

1.2 顺序流程

从上到下,一条直线走下去

1.3 分支结构

1.3.1 if单分支

需求:如果今天天晴,我们就去上课;其他情况不处理

语法:

if(boolean){ //boolean可以是一个很长的表达式,&& || 拼接
    //your code
}

Tips:若if语句块中只有一条语句,则if后面的{}可以省略,但是不建议省略,若按照阿里规约,强制不能省

练习:从键盘输入两门考试成绩,english和math,若english>120,且数学>140,金钱鼓励

1.3.2 if-else

语法:

if(boolean){
    //your code
} else {
    //your code
}

需求:从键盘输入两门考试成绩,english和math,若english>120,且数学>140,给100块钱;否则,下次努力

流程图如下:

在这里插入图片描述

练习:从键盘输入两门考试成绩,english和math,若english>130,且数学>100,或者 english>90,且数学>140 给100块钱;否则,下次努力

需求2【字符串如何比较内容】:如果今天天晴,我们就去上课;否则,在家睡觉

//①区分大小写【网上的各种登录密码】;②不区分【验证码】
if("sunny".equals(weather)){}
if("sunny".equalsIgnoreCase(weather)){}

练习:模拟登录操作。提示用户输入用户名、密码、验证码[默认都是admin,验证码不区分大小写],若三个都通过,则表示登录成功;否则登录失败

注意:字符串的比较,将已知放在前面,避免NullpointException

1.3.3 多重if

需求:以分数为例,[90,100] 优秀;[80,90) 良好;[60,80) 及格;[0,60) 不及格。根据输入的分数,在控制台输出对应的等级。

用上面的多个if能否实现?使用多个if完全ok,但是每个if都会比较,效率比较低,我们期望的是匹配到一个if后,其他的就无须判断,即我们的整个判断结束。

此时,我们可以使用多重if

语法:

if(条件1) {
    //语句1
} else if(条件2) {
     //语句2
} else if(条件3) {
     //语句3
} 
//....else if可以有多个
else {
    //语句4
}
//最后一个else可以省略

在多重if中,语句的顺序打乱的话,虽然没有语法错误,但是不符合逻辑

所以,你在使用多重if的时候要注意顺序

练习:键盘输入一个人年龄[假设年龄是合法的数据],请根据年龄来判断这个人现在处于生命的哪个阶段;

[0-5]婴幼儿[6-10] 少年[11-18] 青少年[19-35]青年[36-55] 中年[56-100] 老年

1.3.4 嵌套if

需求:100米赛跑,10秒以内,可以进入决赛;进入决赛之后,再分男女组。跑步时间、男、女均从键盘输入

public class Test04_NestingIf {
    public static void main(String[] args) {
        //需求:100米赛跑,10秒以内,可以进入决赛;进入决赛之后,再分男女组。 2-3层居多
        // 跑步时间、男、女均从键盘输入
        Scanner scanner = new Scanner(System.in);

        System.out.println("输入时间:");
        int time = scanner.nextInt();

        if(time <= 10) {
            //有资格进入决赛
            System.out.println("恭喜,进入决赛.....");
            System.out.println("请输入性别:");
            String gender = scanner.next();
            if("male".equals(gender)) {
                System.out.println("进入男子组");
            } else if("female".equals(gender)){
                System.out.println("进入女子组");
            } else {
                System.out.println("人妖组.....");
            }
        } else {
            System.out.println("对不起,被淘汰了......");
        }
    }
}

练习:模拟登录且判断是否有权限操作某个功能。提示用户输入用户名、密码【管理员用户默认都是admin、admin,张三 zs zs】,登录成功之后,提示:“欢迎来到本选课系统”,然后输入需要执行的操作【实际上,根据登录用户,为其展示不同的功能页面】

①delete:此时若是管理员用户,则提示“删除成功”;否则提示“你权限不够,无权操作”

②insert:此时若是管理员用户,则提示“新增成功”;否则提示“你权限不够,无权操作”

1.3.5 if-else vs 三元运算符

  1. 三元运算符的执行/运算结果必须有一个变量来接收,而if-else不需要
  2. 以求两数最大值为例,若结果需要赋值给了一个变量,此时,三元运算符更加简洁一些;if-else功能更强大一些

需求:求最大值

1.3.6 switch

多重if一般用于处理区间范围的判断,等值也可以做,但是没有switch结构简洁高效。switch通常用于等值判断。

语法:

switch(条件){
    case1:
        //语句1
        break;  
    case2:
        //语句3
        break;  
    //....case 可以有多个
    default:
        //上述case若都没有匹配上,可以给一个默认结果
}

需求:输入一个月份编号[1-12],根据输入的编号,输出对应的季节[1-3]:春天

/*
* 1.switch中的表达式的结果可以为哪些类型?byte、short、char、int、String、枚举
* 注意:
* ①long不行
* ②String:jdk7开始支持
* ③枚举是jdk1.5开始支持
* 2.多个case中的逻辑一样的话,能否优化?
    case 1:
    case 2:
        result = "春天";
        break;
* 3.break能否省略?break的作用是什么?
* ①语法没有任何错误,但是语义上不符合,会出现case 穿透
* ②break跳出switch结构,继续执行switch后面的语句
* 4.default的位置能否随意放?语法上,任意摆放,通常我们将default语句放在最后
* */

switch (monthNo) {

    case 1:
       // result = "春天";
        System.out.println("春天");
        break;

    case 4:
     //   result = "夏天";
        System.out.println("春天2");
       break;
    case 7:
      //  result = "秋天";
        System.out.println("春天3");
        break;
//            case 1:
//            case 2:
//                result = "春天";
//                break;
    default:
        System.out.println("春天4");
        result = "未知";
}

练习:以分数为例,[90,100] 优秀;[80,90) 良好;[60,80) 及格;[0,60) 不及格。根据输入的分数,在控制台输出对应的等级。【使用switch完成】tips:对10取余数,利用余数进行switch

1.3.7 switch vs 多重if

  1. 适用场景:一般等值判断,通常使用switch结构;除了等值以外的情况,通常使用if
  2. if的适用场景,较switch更宽泛一些,即使用switch的情况,if都可以搞定

1.4 循环

1.4.1 为什么使用循环

需求:打印100份试卷,格式:sout(“这是第2份试卷”)

我们可以使用100行输出语句实现????有如下问题

  1. 代码重复
  2. 维护性极差:copy99份,修改99次
  3. 如果让你打印1万,10万份呢?

1.4.2 什么是循环

生活中的循环:跑步【有限制】、小日子…etc.

程序中的循环:为了解决重复的事情,循环的特征

  1. 做什么:重复的事情/操作
  2. 条件:即循环终止的条件
  3. 更新循环变量:即每执行完一次操作后,需要修改循环变量值

1.4.3 while循环

语法:

数据类型 变量 = 初始值;
while(条件) {
    //执行循环操作
    //修改控制循环条件的那个变量
}

需求:计算1-n的和【n从键盘输入】

int result = 0;
int i = 1;
while (i <= 100) {
   result += i;
   i++;
}
System.out.println(result);
}

练习:1-100的和,当sum>=80的时候,结束循环,同时打印出这个数字以及sum值,比如8,此时大于80,停止

//1.练习:1-100的和,当sum>=80的时候,结束循环,
// 同时打印出这个数字以及sum值,比如8,此时大于80,停止
int i = 1;
int result = 0;
while (i <= 100) {
    result += i;
    if(result >= 20) {
        System.out.println(i);
        break;
    }
    i++;
}
System.out.println(result);
System.out.println("================");

练习:在1-100中,找出能整除3的数,并打印出来,以及求出他们的和,当他们的和大于50的时候,跳出循环。

//2.练习:在1-100中,找出能整除3的数,并打印出来,
// 以及求出他们的和,当他们的和大于50的时候,跳出循环。
int j = 1;
int sum = 0;  //累加
while (j <= 100) {
    if(j % 3 == 0) {
        System.out.print(j+"\t");
        sum += j;
        if(sum >= 50) {
            break;
        }
    }
    j++;
}
System.out.println(sum);

1.4.4 do-while

语法:

do {
    //your code
}while(条件);

需求1:以考试为例,先考一场再说,考完之后,交给老师批改[键盘输入问老师是否合格],若不合格,抄作业,下次补考

public class Test06_DoWhile {
    public static void main(String[] args) {
        //需求:以考试为例,先考一场再说,考完之后,
        // 交给老师批改[键盘输入问老师是否合格],若不合格,抄作业,下次补考
        Scanner input = new Scanner(System.in);
        String result;
        int num = 0; //计数器思想
        do{
            System.out.println("准备考试......");
            //时长,假设60分钟
            System.out.println("老师我考试合格了吗?.....");
            result = input.next();
            if("y".equals(result)) {
                System.out.println("恭喜合格了。。。。。");
            } else {
                num ++;
                if(num == 3) {
                    System.out.println("你已经考了四次了,补考3次,正常考1次.....");
                    System.out.println("重修一年.........");
                    break;
                }
                System.out.println("继续努力,就差1分.....");
            }
        } while ("n".equals(result));

        System.out.println("考试结束.....");
    }
}

需求2:计算机产生随机数,猜中即胜,猜不中,提示是大了还是小了,继续猜,直到猜中,记录用户猜了几次,给出所用时间和评语。

在这里插入图片描述

import java.util.Scanner;

/**
 * @author azzhu
 * @create 2020-06-27 21:25:56
 */
public class Guess {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int randomNum = (int)(Math.random()*100);

        // 用户猜的数字
        int guess;
        // 猜测次数
        int count = 0;
        System.out.println("我心里有一个0-99之间的整数,你猜是什么?");

        long startTime = System.currentTimeMillis();

        // 用户猜测随机数
        do {
            guess = input.nextInt();
            if(randomNum < guess) {
                System.out.println("大了点,再猜!~~~~");
                count ++;
            } else if(randomNum > guess) {
                System.out.println("小了点,再猜!~~~~");
                count ++;
            } else {
                // 猜中
                count ++;
                break;
            }
        } while (true);

        long endTime = System.currentTimeMillis();

        System.out.println("这个数字是:"+randomNum);
        System.out.println("您猜的次数是:"+count);
        System.out.println("您猜的时间是:"+(endTime-startTime)+"毫秒");

        // 根据猜测次数给出评价
        if(count == 1) {
            System.out.println("你太聪明了!....");
        } else if(count >= 2 && count <=5) {
            System.out.println("不错,再接再厉!.....");
        } else {
            System.out.println("要努力啊!!!!!!!!!");
        }
    }
}

练习:统计1-854之内,能被4整除的数的个数。

1.4.5 while vs do-while

  1. 语法不同
  2. 循环中语句执行的次数不同:while有可能一次都不执行,而do-while,不管条件是否满足,至少都会执行一次

1.4.6 for循环

主要针对循环次数固定的时候

语法:

for(①初始化循环变量;②循环条件;③更新循环变量){
    ④循环操作
}
//①②④③ ---> ②④③ ----.......

需求1:打印100份试卷

for(int i=1;i<=100;i++) {
    // 字符串拼接小口诀:""一对,""中间++一对,+放变量+
    System.out.println("第"+i+"句输出....");
}

for循环的特殊语法-1:

            //1.死循环
//        for (;;){
//            System.out.println("第..句输出....");
//        }
        //2.死循环
//        for(int i=1;i<10;){
//
//        }
        //3.死循环
//        for(int i=1;;) {
//            System.out.println("第..句输出....");
//        }

        //5.死循环
//        for(int i=1;;i++) {
//            System.out.println("第..句输出....");
//        }

for循环的特殊语法-2:for中可以有多个循环变量

实现如下需求:

0 + 6 = 6

1 + 5 = 6

6 + 0 = 6

//6.多个循环变量
/*
         5 + 0 = 5
         4 + 1 = 5
         。。。。
         0 + 5 = 5
        * */
for (int i = 5,j=0; i >=0 && j <= 5 ; i--,j++) {
    System.out.println(i+"+"+j+"="+(i+j));
}

需求2:实现十道 100 以内加减法数学题

能根据题目计算出答案,与输入答案对比,判断做题是否正确,最后计算分数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QrLNdK03-1618371622956)(assets/image-20200627215345902.png)]

import java.util.Scanner;

public class RandomQuestion {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        // 计算正确次数
        System.out.println("==================答题开始=====================");
        int correctTimes = 0;
        for (int i = 1; i < 6; i++) {
            // 生成2个随机数
            int num1 = (int)(Math.random()*101);
            int num2 = (int)(Math.random()*101);

            // 加法
            if(num1 <= num2) {
                System.out.println(num1 + "+" + num2 + "=?");
                int answer = input.nextInt();

                if(answer == num1 + num2) {
                    correctTimes ++;
                    System.out.println("回答正确!*******您共答对"+correctTimes+"次");
                } else {
                    System.out.println("回答错误!*******您共答对"+correctTimes+"次");
                }
            } else {
                //减法
                System.out.println(num1 + "-" + num2 + "=?");
                int answer = input.nextInt();
                if(answer == num1 - num2) {
                    correctTimes ++;
                    System.out.println("回答正确!*******您共答对"+correctTimes+"次");
                } else {
                    System.out.println("回答错误!*******您共答对"+correctTimes+"次");
                }
            }
        }
        System.out.println("========共5题,总分100分,每题20分==========");
        System.out.println("您的最终得分:"+(correctTimes*20));
    }
}

1.4.7 for vs while/do-while

  1. 功效:都是完成循环操作
  2. 场景:一般对于循环次数固定,优先选择for;对于次数不固定,选择while、do-while
  3. 语法不同
  4. break:用于跳出循环体,通常是跟if一起使用

1.4.8 continue vs break vs return

public class Test13_Continue {
    public static void main(String[] args) {
        int num = 1;
        while (num <= 10) {
            num ++;
            if(num == 5) {
                //  continue;   //跳出本次循环,继续执行后面的循环,且当次循环后面的语句也不会走
                //  break; //直接结束整个循环,执行循环后面的语句
                return; //在后面的学习中,return使用的还是蛮多的,直接结束我们的方法,return后面的语句都不会走
            }
            System.out.println(num);
        }

        System.out.println("aaa");
    }
}

1.5 几种重要思想

  1. 计数器思想
  2. 累加思想

2.数组

2.1为什么要使用数组

需求:保存一个班级的10人成绩,并计算其总分、平均分、最高分、最低分,查找某个人的成绩

我们可以使用前面的变量实现,定义多个相同数据类型的变量呗!

  1. 在内存中为变量开辟一个存储空间,每个变量并不是连续的空间存储,对于JVM的垃圾回收不利

  2. 发现:上面定义的10个变量,都是相同的数据类型,引入了数组的使用

  3. 考虑点:

    ①数据存取的方便性

    ②对于Java的GC【Garbage Collection】而言,连续空间的GC,不会产生内存碎片

2.2 数组是什么

数组:是存储一组相同数据类型的数据,在内存中是一块连续的存储空间,它也是引用类型

2.3 数组的使用

对比:变量的声明和使用

注意:玩数组其实就是在玩下标

数组的定义和使用

//1.向内存声明一个空间
// int[] scores;  int scores[] 这种写法用的不多
//2.需要多个空间
// scores = new int[3];
//1和2 合二为一
int[] scores = new int[3];

//3.向数组中存放数据,通过下标操作数组
scores[0] = 10; //动态赋值,可以从键盘输入
//4.使用数组元素
System.out.println(scores[0]);
System.out.println(scores[1]);

//静态赋值
double[] ages = {18,20};

数组的特点:

  1. 数组长度一旦定义,不能改变
  2. 数组的下标:[0,长度-1]
  3. 数组的长度如何获取:数组名.length,后面要获取长度,一律使用这种方式
  4. 数组下标越界:ArrayIndexOutOfBoundsException,肯定是你的下标有问题
  5. 数组元素都有默认值:比如int–>0,引用类型 -->null
  6. 数组元素都有默认值:比如int–>0,引用类型 -->null

2.4 数组的内存结构

在这里插入图片描述

2.5 数组的常见使用

2.5.1 遍历

遍历:将我们数组元素一一取出来

若需要操作下标,使用经典for循环;若仅仅是取元素【不需要拿下标】,可以使用增强for循环

增强for的语法

for(数据类型 变量名:要遍历的那个数组){}
//数组遍历方式1:经典for循环
for (int i = 0; i < scores.length; i++) {
    System.out.println(scores[i]);
}

System.out.println("===============");
//数组遍历方式2:增强for循环 jdk1.5新增
//for(数据类型 变量[临时存储变量]:数组名称)
for (int score : scores) {
    System.out.println(score);
}

2.5.2 最大/最小值

掌握思想:打擂台

public static void main(String[] args) {
    int[] array = {23,42,11,24,98};

    //求最大值:打擂台
    int max = array[0]; //假定第一个元素最大

    for (int i = 1; i < array.length; i++) {
        if(array[i] > max) {
            max = array[i];
        }
    }

    System.out.println("最大值:"+max);
}

2.5.3 标记思想

需求:从键盘接收输入,为数组动态赋值,若输入的值都是整数[0,100],则计算平均分;若输入的过程中,出现负数,则停止输入,且不计算平均分,并给一个错误提示。

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    double[] scores = new double[3];

    double sum = 0;

    //标记思想:你可以使用任意数据类型,通常使用boolean类型
    //而且,针对两种情况的处理方案,可以考虑使用标记思想
    boolean flag = true;    //默认是正常状态
    for (int i = 0; i < scores.length; i++) {
        System.out.println("请输入第"+(i+1)+"个人的成绩:");
        double score = scanner.nextInt();
        if(score < 0) {
            flag = false;   //疫情状态
            break;
        }
        sum += score;
    }
    if(flag) {
        System.out.println("平均分:"+sum/scores.length);
    } else {
        System.out.println("疫情期间...............");
    }
}

2.5.4 在指定范围内查找元素

//位置从1开始
System.out.println("请输入起始位置:");
int startIndex = scanner.nextInt();

System.out.println("请输入结束位置:");
int endIndex = scanner.nextInt();

System.out.println("请输入要查找的数字:");
int findValue = scanner.nextInt();

//startIndex >0 && startIndex < array.length && endIndex > 0 && endIndex<array.length
// startIndex <= endIndex
//TODO 目前找的是第一个,若有多个,你给我累加出有多少个,下标分别是多少
int index = -1; //对于数组下标的操作,一般将初始值置为-1
for(int i = startIndex-1;i <= endIndex-1;i++) {
    if(array[i] == findValue) {
        index = i;
        break;
    }
}

if(index != -1) {
    System.out.println("找到了:"+findValue);
    System.out.println("下标为:"+index);
} else {
    System.out.println("查无此数......");
}

2.5.5 思考

前面遍历、求最值、查找元素,都只针对某个数组,执行相同的功能,需要将其使用方法进行封装。

3.IDEA的基本使用

3.1 安装

傻瓜式安装

3.2 基本配置和使用

  1. 配置编码格式

在这里插入图片描述

  1. 字体大小

在这里插入图片描述

  1. 背景设置

在这里插入图片描述

  1. 创建一个Project

在这里插入图片描述

  1. 配置全局JDK

在这里插入图片描述

  1. 两步next,进入如下界面

在这里插入图片描述

  1. 创建class,实际上是xxx.java

在这里插入图片描述

  1. 编写代码

  2. 运行即可:三种方式

在这里插入图片描述

方式三:暂且可以不掌握

在这里插入图片描述

  1. 观察编译后的文件位置

在这里插入图片描述

  1. 补充-配置类的签名

在这里插入图片描述

  1. 合理使用包[当成目录使用]

    至于包的命名规范,暂且不说

在这里插入图片描述

3.3 常用快捷键

  1. psvm然后tab键,直接生成main方法
  2. sout然后tab键,直接生成System.out.println()
  3. ctrl+/:单行注释
  4. ctrl+shift+/:多行注释

4.程序调试

4.1 调试的用处

  1. 方便我们跟踪代码,时刻知道我们遍历的变化
  2. 帮助我们定位代码哪里有问题

4.2 使用

  1. 打断点:让代码停在哪一行

在这里插入图片描述

  1. 以断点模式运行

在这里插入图片描述

  1. 进入debug视图

在这里插入图片描述

  1. 断点执行

在这里插入图片描述

5.练习

  1. 买彩票,[500,正无穷),买楼买车;[100,500],xxxx;[50,100),xxx;[0,50),xxx

    使用多重if实现,单位是万

  2. 键盘输入一个4位数,比如8888,算出每个位数之和,8+8+8+8=32,拿着24跟18比较,大于20,中一等奖;二等奖,[10,20) —

    tips:关键是怎么取出每个位数的值

  3. 模拟实现一个记账软件,具体说明参见如下图解:补上验证码

在这里插入图片描述

  1. 掷骰子,[1,6]随机产生,每次产生3个,根据数字,去买大、买小【规则自己玩】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值