三种程序结构 – 重点
顺序执行结构
- 执行完毕上一行代码, 执行当前行代码 (逐行执行)
判断分支结构
- 根据判断结果, 分为两种情况, 分别执行不同区域的代码
循环结构
- 再某些特定的情况下 ,一个代码块 循环的执行 !
任何程序的逻辑, 都可以通过这三种程序结构, 来搭配实现 !
判断分支 if结构 – 重点
在进行if语句的编写时, 如果判断的代码块中只有一行代码, 可以省略大括号
格式1:
if(boolean表达式){
//判断代码块
}
与顺序执行结构 有点区别: 判断代码块中的代码, 只有当关系表达式的结果为true时 , 才会执行 !
练习:
- 接收用户输入一个int值, 判断是否大于1000 , 如果大于则打印
:您输入的值过大
- 观察如下代码, 通过补充代码, 完成注释中的需求:
import java.util.Scanner;
public class Demo2{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print(“请输入第1个数:”);
int a = input.nextInt();
System.out.print(“请输入第2个数:”);
int b = input.nextInt();
System.out.print(“请输入第3个数:”);
int c = input.nextInt();
System.out.print(“请输入第4个数:”);
int d = input.nextInt();
//通过分支结构 ,找到最大的那个数字, 并输出打印:
int max1 = b;
if(a>b){
max1 = a;
}
int max2 = d;
if(c>d){
max2 = c;
}
int max = max2;
if(max1>max2){
max = max1;
}
System.out.println("最大值为:"+max);
}
}
格式2:
if(boolean表达式){
当表达式结果为true时 , 执行这里的代码
}else{
当表达式的结果位false时 ,执行这里的代码
}
案例:
import java.util.*;
public class Demo3{
public static void main(String[] args){
//用户输入两个数字, 我将最大的数字输出
Scanner input = new Scanner(System.in);
System.out.print("请输入两个数字,使用空格隔开:");
int a = input.nextInt();
int b = input.nextInt();
if(a>=b){
System.out.println("您输入的两个数字中, 最大的是:"+a);
}else{
System.out.println("您输入的两个数字中, 最大的是:"+b);
}
}
}
格式3:
if(boolean表达式1){
如果boolean表达式1的结果为true , 则这里代码执行
}else if(boolean表达式2){
如果boolean表达式1的结果为false,且boolean表达式2的结果为true , 则这里代码执行
...
}else if(booolean表达式n){
上述所有表达式 , 只有n的结果为true时 , 则这里代码执行
}
格式4.
if(boolean表达式1){
如果boolean表达式1的结果为true , 则这里代码执行
}else if(boolean表达式2){
如果boolean表达式1的结果为false,且boolean表达式2的结果为true , 则这里代码执行
…
}else if(booolean表达式n){
上述所有表达式 , 只有n的结果为true时 , 则这里代码执行
}else{
上述所有表达式 , 结果都为false时 , 则这里代码执行
}
练习:
设计一款程序,
需求:
提示用户输入学生的考试程序, 我们帮他判断学生成绩的等级 :
用户输入的内容 是整型的数字: 0-100;
成绩==100 : 等级为 完美
成绩>=90分: 等级为 优秀
成绩>=70分: 等级为 良
成绩>=60分: 等级为 及格
成绩>=0 : 等级为不及格
其他成绩: 提示输入错误 !
练习:
出租车计费方式:由里程钱数和等候时间钱数相加得出。
里程数前3公里10元,超过3公里到15公里部分每公里2元,15公里以上部分每公里3元。
等候时间每2分半1元,不足部分不要钱。
输入公里数和等候秒数,输出车费。
比如: 16公里,等候290秒,车费 = 10 + (15-3)*2 + (16-15)*3 + 1 = 38
- 提示用户输入里程 与 等待时长, 计算价格:
import java.util.Scanner;
public class Demo5{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请输入公里数:");
int km = input.nextInt();
System.out.print("请输入等候时长:");
int s = input.nextInt();
//计算等待时长需要的钱
int money = s/150;
if(km>15){
money = money+(km-15)*3+(15-3)*2+10;
}else if(km>3){
money = money+(km-3)*2+10;
}else{
money+=10;
}
System.out.println("本次出租车的付款金额为:"+money+"¥");
}
}
判断分支结构 选择 switch-case – 熟练掌握
语法结构:
switch(表达式){
case 值1:
//表达式的结果与当前值1相同则执行这里的代码
break;
case 值2:
//表达式的结果与当前值2相同则执行这里的代码
break;
....
case 值n:
//表达式的结果与当前值n相同则执行这里的代码
break;
default:
//表达式的结果与上面的所有值都不同, 则执行这里的代码
break;
}
//xxx
注意: default 块可以省略不写 !
例如:
int a = 10;
switch(a){
case 100:
System.out.println(“第一个选项”);
case 10:
System.out.println(“第二个选项”);
break;
case 11:
System.out.println(“第三个选项”);
}
System.out.println("结束");
表达式的结果类型 :
int
byte
char
short
再jdk7.0 switch 支持了字符串类型的表达式
练习
1. 董飞去参加 比浪大会 ~
如果董飞获得第一名, 将出任浪林盟主 !
如果董飞获得第二名, 将出任浪林副盟主 !
如果董飞获得第三名, 将退出浪林界, 嫁给旭东 ~
获得其他名次, 则重新修炼, 等待东山再浪 ~
import java.util.*;
public class Demo7{
public static void main(String[] args){
Random r = new Random();
//随机产生董飞的名次
int a = r.nextInt(3)+1;
System.out.println("随机结果为:"+a);
switch(a){
case 1:
System.out.println("恭喜董飞获得第一名, 出任浪林盟主");
//break;
case 2:
System.out.println("恭喜董飞获得第二名, 出任浪林副盟主");
//break;
case 3:
System.out.println("很遗憾 , 董飞获得了第三名, 决定退出浪林界, 嫁给旭东");
//break;
default:
System.out.println("董飞因为气球买多了, 肾有点不好, 耽误了行程,没有参加比浪大会");
//break;
}
}
}
2. 提示用户输入1-12月份, 我们帮用户判断对应的季节并输出到控制台 !
import java.util.Scanner;
public class Demo8{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入一个月份(1-12) , 我来计算季节: ");
int m = input.nextInt();
switch(m){
case 3:
case 4:
case 5:
System.out.println("您输入的季节为春天");
break;
case 6:
case 7:
case 8:
System.out.println("您输入的季节为夏天");
break;
case 9:
case 10:
case 11:
System.out.println("您输入的季节为秋天");
break;
case 12:
case 1:
case 2:
System.out.println("您输入的季节为冬天");
break;
default:
System.out.println("是不是傻");
break;
}
}
}
练习:
模拟命令解析器(菜单)
使用switch-case结构实现
输入1打印显示所有用户,
输入2显示增加新用户,
输入3显示修改用户信息,
输入4显示删除用户,
输入5显示退出。
import java.util.Scanner;
public class Demo9{
public static void main(String[] args){
System.out.println(“———员工管理系统———”);
System.out.println(“———请操作: ———”);
Scanner input = new Scanner(System.in);
int type = input.nextInt();
switch(type){
case 1:
System.out.println("---------显示所有用户------");
break;
case 2:
System.out.println("---------增加新用户 ------");
break;
case 3:
System.out.println("---------修改用户信息------");
break;
case 4:
System.out.println("---------4. 删除用户---------");
break;
case 5:
System.out.println("---------5. 退出---------");
break;
}
System.out.println("程序执行结束");
}
}
循环结构
生活中带有重复元素的事情:
使用循环的步骤:
1. 分析一个业务中 具备的 [循环元素 ]
2. 分析这个循环元素中的 循环条件 和 循环的操作
3. 套用循环的代码 (可以是while循环, 可以是for循环)
4. 检查循环是否能够退出 ! (除非遇到特殊的需求, 一般情况下尽量避免死循环的操作)
面试题:
while循环与do while循环的区别:
特点:
while循环: 先判断 , 再执行
do while 循环: 先执行 , 再判断
区别:
区别只在于 如果循环条件最初就不满足时 ,
while循环不会执行循环代码块,
而do while循环 会执行一次循环代码块
三种循环
while循环
语法格式:
while(1.boolean表达式){
//2.循环代码块
//当boolean类型表达式为true时 , 执行这里的代码
}执行流程:
jvm遇到while时 , 首先执行: 1. 判断boolean表达式结果是否为true 2. 如果为true则执行循环代码块 ,否则跳过循环代码块! 然后重复执行第一步, 第二步 , 直到boolean类型表达式结果为false , 则循环结束 ,跳过循环代码块 !
练习:
向控制台输出数字: 1.2.3.4.5.6…100
boolean flag = true;
int count = 1;
while(flag){
if(count==100){
flag = false;
}
System.out.println(count++);
}- do while循环
语法结构:
do{
//循环代码块
}while(boolean表达式);
do while循环:
先执行一次循环代码块, 再判断boolean表达式
练习:
向控制台输出数字: 100.99.98.97...1
int count = 100;
do{
System.out.println(count--);
}while(count==0);
for循环
语法格式:
for(初始化循环参数;boolean表达式;更新循环变量){ 循环代码块 } for循环执行流程: 1. 初始化循环参数 2. 判断boolean类型表达式结果是否为true 为true则循环, false则循环结束 3. 执行循环代码块 4. 更新循环变量 在这里4个步骤中循环的是 2 3 4
for循环与while循环:
while(true){} 等价于: for(;true;){}
//1. 定义循环变量
int count = 1;
//2. 判断boolean表达式
while(count <=100 ){
//3. 循环体执行
//4.更新循环变量;
count++;
}
//累加: 1+2+3+4...+100
int sum = 0;
//1. 定义循环变量
int count = 1;
//2. 判断循环条件
while(count<=100){
//3. 执行循环代码
sum+=count;
//4. 更新循环变量
count++;
}
System.out.println(sum);
int sum = 0;
for(int count=1;count<=100;count++){
sum+=count;
}
System.out.println(sum);
练习:
找出1-1000这些数字中的水仙花数 :
1 5 3 = 1^3 + 5^3 + 3^3
水仙花数:
数字的值, 等于 各个位数上的数字的立方和
使用循环的步骤:
1. 分析一个业务中 具备的 [循环元素 ]
100-1000
2. 分析这个循环元素中的 循环条件 和 循环的操作
循环变量小于1000 , 循环操作:判断一个数字是否为水仙花数
3. 套用循环的代码 (可以是while循环, 可以是for循环)
for(int i=100;i<1000;i++){
}
有一个三位的未知数i , 求它是不是水仙花数
999/100 = 9 999%100= 99/10 = 9 999%10 = 9
958/100 = 9 958%100= 58/10 = 5 958%10 = 8
900/100 = 9 900%100= 0/10 = 0 900%10 = 0
计算百位数: 这个数字除以100 , 得到的结果就是百位数的数字
计算十位数: 这个数字模以100 , 再除以10 , 得到的结果就是十位数
计算个位数: 这个数字模以10 , 结果为个位数 !
3 7 0
27 343 0
4. 检查循环是否能够退出 ! (除非遇到特殊的需求, 一般情况下尽量避免死循环的操作)
跳出循环:
break; 这个关键字, 用于跳出代码块 , 再循环中的含义就是: 立即跳出并结束循环
案例:
for(int i=0;i<100;i++){
if(i==10){
break;
}
System.out.println(i);
}
跳出本次循环体
continue : 用于再循环中, 结束本次循环体, 开始下次循环体
for(int i=0;i<100;i++){
if(i==10){
continue;
}
System.out.println(i);
}
多重循环
循环的两层嵌套
例如: for循环的嵌套:
外层循环里面的逻辑, 依然是具备循环色彩的!
for(;;){
for(;;){
}
}
案例:
输出10次 1-10
for(int j=0;j<10;j++){
for(int i=1;i<=10;i++){
System.out.print(i+” “);
}
System.out.println();
}
多层循环打印行和列时 , 外层循环控制的是 有多少行 内层循环控制的是有多少列
案例:
通过循环嵌套, 打印99乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
....
第1 行 有1列
第2 行 有2列
for(int i=1;i<=9;i++){//外层循环控制行, 表示有9行
//列的长度是变化的, 与i相同
for(int j=1;j<=i;j++){
System.out.println(j+"*"+i+"="+(j*i));
}
}
作业:
1. 使用*号, 打印三角形:
(1)
*
* *
* * *
* * * *
* * * * *
for(){
for(){}
}
(2)
----*
---***
--*****
-*******
*********
for(){
for(){
}
for(){
}
}
(3)
—-*
—*
–*
-*
–*
—*
—-*
(4)
----*
---* *
--* *
-* *
--* *
---* *
----*