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 三元运算符
- 三元运算符的执行/运算结果必须有一个变量来接收,而if-else不需要
- 以求两数最大值为例,若结果需要赋值给了一个变量,此时,三元运算符更加简洁一些;if-else功能更强大一些
需求:求最大值
1.3.6 switch
多重if一般用于处理区间范围的判断,等值也可以做,但是没有switch结构简洁高效。switch通常用于等值判断。
语法:
switch(条件){
case 值1:
//语句1
break;
case 值2:
//语句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
- 适用场景:一般等值判断,通常使用switch结构;除了等值以外的情况,通常使用if
- if的适用场景,较switch更宽泛一些,即使用switch的情况,if都可以搞定
1.4 循环
1.4.1 为什么使用循环
需求:打印100份试卷,格式:sout(“这是第2份试卷”)
我们可以使用100行输出语句实现????有如下问题
- 代码重复
- 维护性极差:copy99份,修改99次
- 如果让你打印1万,10万份呢?
1.4.2 什么是循环
生活中的循环:跑步【有限制】、小日子…etc.
程序中的循环:为了解决重复的事情,循环的特征
- 做什么:重复的事情/操作
- 条件:即循环终止的条件
- 更新循环变量:即每执行完一次操作后,需要修改循环变量值
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
- 语法不同
- 循环中语句执行的次数不同: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
- 功效:都是完成循环操作
- 场景:一般对于循环次数固定,优先选择for;对于次数不固定,选择while、do-while
- 语法不同
- 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 几种重要思想
- 计数器思想
- 累加思想
2.数组
2.1为什么要使用数组
需求:保存一个班级的10人成绩,并计算其总分、平均分、最高分、最低分,查找某个人的成绩
我们可以使用前面的变量实现,定义多个相同数据类型的变量呗!
-
在内存中为变量开辟一个存储空间,每个变量并不是连续的空间存储,对于JVM的垃圾回收不利
-
发现:上面定义的10个变量,都是相同的数据类型,引入了数组的使用
-
考虑点:
①数据存取的方便性
②对于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};
数组的特点:
- 数组长度一旦定义,不能改变
- 数组的下标:[0,长度-1]
- 数组的长度如何获取:
数组名.length
,后面要获取长度,一律使用这种方式 - 数组下标越界:
ArrayIndexOutOfBoundsException
,肯定是你的下标有问题 - 数组元素都有默认值:比如int–>0,引用类型 -->null
- 数组元素都有默认值:比如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 基本配置和使用
- 配置编码格式
- 字体大小
- 背景设置
- 创建一个Project
- 配置全局JDK
- 两步next,进入如下界面
- 创建class,实际上是
xxx.java
-
编写代码
-
运行即可:三种方式
方式三:暂且可以不掌握
- 观察编译后的文件位置
- 补充-配置类的签名
-
合理使用包[当成目录使用]
至于包的命名规范,暂且不说
3.3 常用快捷键
psvm
然后tab键,直接生成main方法sout
然后tab键,直接生成System.out.println()
ctrl+/
:单行注释ctrl+shift+/
:多行注释
4.程序调试
4.1 调试的用处
- 方便我们跟踪代码,时刻知道我们遍历的变化
- 帮助我们定位代码哪里有问题
4.2 使用
- 打断点:让代码停在哪一行
- 以断点模式运行
- 进入debug视图
- 断点执行
5.练习
-
买彩票,[500,正无穷),买楼买车;[100,500],xxxx;[50,100),xxx;[0,50),xxx
使用多重if实现,单位是万
-
键盘输入一个4位数,比如8888,算出每个位数之和,8+8+8+8=32,拿着24跟18比较,大于20,中一等奖;二等奖,[10,20) —
tips:关键是怎么取出每个位数的值
-
模拟实现一个记账软件,具体说明参见如下图解:补上验证码
- 掷骰子,[1,6]随机产生,每次产生3个,根据数字,去买大、买小【规则自己玩】