总体内容
程序控制结构:顺序控制,分支控制,循环控制
程序控制结构
顺序控制
分支控制
if-else
if-else if-else if-else
- 可以没有else
- 示例
注意:这里输入只能是整数,非整数需要使用异常
注意:分支嵌套-进行判断前先进行有效性确认
注意这个练习中的赋值语句
分支嵌套
注意:建议分支嵌套最多三层,不然可读性不好
引申:接收字符的方法
- 先接收字符串,再取出字符串中的第一个字符
- 示例:接收一个性别
switch-case-break
没有匹配到的默认执行default
注意switch的细节
- 解读细节1:表达式的数据类型,必须和case的数据类型保持一致,或者两者之间可以进行比较
- 解读细节2:表达式的数据类型必须是byte,short,int,char,enum(枚举),String
- 解读细节3:case子句中的值必须是常量或者是常量表达式,不能是变量
练习:注意switch中编程思想
思想:把表达式转换为数字
思想:穿透的思想,利用case和break的配合
何时使用switch和if
循环控制
for循环
for循环基本语句介绍
for循环执行原理的例题(关键循环执行顺序)
for循环注意的细节
引申:ctrl+c会退出死循环
解读细节2:
写在for循环语句中则i的作用域只是for循环内部
写在外部则作用域是整个程序
for循环编程思想
两个思想:化繁为简,先死后或
例题1
思想1:化繁为简(问题拆解)
思想2:先死后活(常量换变量)
※例题2(问题拆解)
while循环
while循环基本语句介绍
do-while循环
do-while循环基本语句以及细节、例题
- 千万注意:while后有一个分号
- 在做菜单时用的较多,因为菜单肯定要先执行一次
- 一个例题:注意条件组合
- do-while实现菜单的样例
多重循环
要注意的点
- 循环间相互嵌套(外层循环,内层循环),建议嵌套最多两层,最多不超过三层,否则可读性差
- 嵌套循环就是把内层循环当作外层循环的循环体,当内层是false时进行外层的下一次循环
- 循环的次数:外层循环次数×内层循环次数
※多重循环的案例(注意两个思想和问题拆分)
1. 3个班级平均分,及格人数和总分
问题:3个班级平均分和所有班级平均分以及三个班级及格人数(这里列出的化繁为简,先死后活自己将常量修改为变量)
1.1 注意:这里没有用数组,只是用了一个变量去接收这5个成绩,但是在循环内就已经对每一个学生的信息进行了统计
1.2 ※思路:先进行一个班的统计(内循环进行5次获取学生信息+信息统计),然后再嵌套一个循环(外循环进行3次)
1.3 看这张图:循环内进行总数计算,循环结束下一行进行平均分计算
2. 九九乘法表(实现简单,体会思想就好)
2.1 思想:要想外循环和内循环如何嵌套:外循环进行几次,其中的内循环又执行几次
2.2 外循环9次,内循环循环的次数是根据外循环的值来变化
2.3 多少列就是外循环次数,多少行就是内循环次数
3. ※※空心金字塔(思想的整合)
3.1 打印整个金字塔的规律(九九乘法表的升级–>找到内循环的规律):
3.2 打印空心金字塔的变成思想(内循环不仅要计算出次数还要对里面的内容进行判断):
//整个金字塔时,不加判断直接输出*
//空心金字塔只有第一个和最后一个才输出*,所以要进行判断
3.3 编程过程及思路如下(先死后活,将常量变为变量,这里不写了)
3.4 这里最后一层我加了一个判断,其实不用,要会用条件组合!!!
3.5 打印结果:
跳转控制语句
break
引申:生成[1,100]随机数
- Math.random()生成[0,1)的double值
- 给它乘100,再强转为int类型,则范围就是[0,99]的整数
- 再+1,则范围是[1,100]的整数
循环中使用break的细节
注意:适用于循环中,默认执行当前循环体,当满足条件时跳出该循环
- 在循环中进行判断,如果满足条件则使用break跳出循环
- break默认是退出所在层的循环,如果用了标签则可以指定退出哪层(不推荐使用标签)
使用了lable标签指定:
循环中使用break的案例
案例1:累积和第一次大于20时的当前数(注意作用域)
- 注意作用域:
1.1 (推荐)方法1:在循环外部定义变量n,当条件满足时,把i赋给n
1.2 方法2:在循环外部初始化int i = 1;
案例2:模拟登陆验证,有三次机会
引申:sublime缩进和取消缩进
tab和shift+tab(取消缩进)
引申:判断字符串内容是否一致的函数方法equals()
推荐将具体的比较值放在前面,这样可以避免空指针
实现思路以及注意点和优化
思想利用:化繁为简
- 先不想循环,先想一次分支判断:是否登陆成功,输出成功/不成功
- 想循环,把一次分支装进循环里(最多循环三次),如果true则跳出循环
注意和优化:
- 作用域:name和password不能在循环体内定义,要在外部先定义再初始化
- 优化:可以定义一个变量chance,每登录失败一次就减1
- 优化:可以不写else,break以后就不会执行后面的语句,只有if不成立时才会进行后面的chance–和输出语句
import java.util.Scanner;
public class Dengluyanzheng{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String name = "";
String password = "";
int chance = 3;
for(int i = 1;i<=3;i++){
System.out.println("请输入名字:");
name = scanner.next();
System.out.println("请输入密码:");
password = scanner.next();
if("wpz".equals(name)&&"123".equals(password)){
System.out.println("登录成功");
break;
}
chance--;
System.out.println("还有" + chance + "次机会,请重新输入");
}
}
}
continue
continue介绍
- continue是结束本次循环,进行下一次循环(break是直接跳出循环,谁都不执行了)
- continue的执行过程
- 使用标签指定continue跳出哪个循环,开始进行哪个循环的下一次(默认是跳出最近的循环)
return
return:跳出所在方法,用在main方法中表示退出程序
本章案例
1. 案例1(注意辨别分支的条件)
2. 案例2:水仙花数(注意计算个位十位百位)
3. 案例3:输出每5个换一次行(定义一个变量去计数)
3.1 注意:每次定义变量都要想一想它的作用域要求是什么
3.2 注意:控制语句是嵌套还是并列(逻辑关系是怎样),本题循环里套分支,先判断是否符合条件1,再判断是否符合条件2
4. 案例4:输出a-z和A-Z(考察字符可以加加减减)
5. 案例5:求1-1/2+1/3-1/4…1/100的和(注意1/2的精度问题)
5.1 1/2结果是int类型!!!
5.2 要得到正确的结果要写成1.0/2
5.3 分析判断得到,偶数时是减法,奇数是+法,所以用分支判断就好了