一、程序流程结构
1、顺序结构
自上而下
2、条件/选择结构
场景:需要先判断条件,再决定程序是否执行
实现方式:
(1)if
- 简单if结构
if(条件){
//代码块
}
/*条件:boolean表达式
boolean变量,关系表达式,逻辑表达式*/
/*执行顺序:先判断条件,如果条件为true,就执行代码块*/
- if…else…
if(/*条件*/){
//代码块1
}else{
//代码块2
}
/*执行:先判断条件,条件成立,则执行代码块1,
不成立,则执行代码块2*/
三目运算符: 变量 = boolean表达式?值表达式:值2;
- 多重if结构
if(条件1){
//代码1
}else if(条件2){
//代码2
}else if(条件3){
//代码3
}else if(条件4){
//代码4
}else{
//代码5
}
/*执行顺序:先判断条件1,条件成立,则执行代码1
条件1不成立,就判断条件2,条件2成立,则执行代码2
条件2不成立,就判断条件3,条件3成立,则执行代码3
,,,前面条件都不成立,则执行到else
场景:一个维度连续区间的多路分支*/
- 嵌套if结构
if(条件1){
if(条件2){
}else{
}
}else{
if(条件){
}
}
//场景:多个维度的多路分支
(2)switch
场景:等值比较
switch(表达式){
case 常量1:
//代码块1
break;
case 常量2:
//代码块2
break;
case 常量3:
//代码块3
break;
default:
break;
}
/*执行顺序:先计算表达式的值,
然后和case后面的常量进行等值比较匹配上则执行其后代码块,碰到break结束。
都不匹配不上,则执行default。*/
注意事项:
1、表达式 的结果可以是byte short int char String(jdk1.7+) enum枚举 (没有double,float,long)
2、case 后面的常量没有顺序,不能重复,数据类型要和表达式的一致
3、default 其它情况
1)只有所有的case都不匹配的才执行。
2)和case没有先后顺序之分,通常放置在最后。
3)可以省略
4、break 跳出switch结构
省略的话,会引起case穿透。但有时可以利用case穿透简化代码
3、综合项目:if和switch嵌套
练习:
-
菜单功能
欢迎进入xxx系统 1登录 2注册 3退出 请选择:1 登录
import java.util.Scanner;
public class caidan {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("欢迎进入xxxxxxxxx系统");
System.out.println("\t1、登录");
System.out.println("\t2、注册");
System.out.println("\t3、退出");
System.out.print("\t\t请选择:");
int a = input.nextInt();
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. 学习餐厅发布食谱,周一周三吃米 周二周四吃面,周五周六吃饺子,周日休息
import java.util.Scanner;
public class food {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("餐厅食谱:\n\t周一、周三吃米饭\n\t周二周四吃面\n\t周五周六吃饺子\n\t周七休息");
System.out.print("请输入星期几:");
int week = sc.nextInt();
switch(week){
case 1:
case 3:
System.out.println("米饭");
break;
case 2:
case 4:
System.out.println("面条");
break;
case 5:
case 6:
System.out.println("饺子");
break;
case 7:
System.out.println("休息");
break;
default:
System.out.println("输入错误");
break;
}
}
}
3. 根据月份,输出天数
import java.util.Scanner;
public class month {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入月份:");
int month = sc.nextInt();
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println("该月31天。");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println("该月30天。");
break;
case 2:
System.out.println("请输入对应的年份:");
int year = sc.nextInt();
if ((year%400 == 0)||(year%4 == 0 && year%100 == 0)) {
System.out.println("本年的二月有29天;");
}else {
System.out.println("本年的二月有28天;");
}
break;
default:
System.out.println("请输入正确的月份!");
break;
}
}
}
4、循环结构
- 场景:有重复做的事情(可以一样的事情,也可以是有规律的事情)
- 循环的特点:
- 循环操作:重复做的事情
- 循环条件:循环继续的条件;循环结束的条件
(循环结束不了—死循环/程序中要避免死循环)
- 实现方式:
(1)while
while(循环条件){
//循环操作
}
/*执行:先判断条件,条件成立,则执行循环操作;
循环操作执行结束,会继续判断条件;
条件成立,则执行循环操作;...直到循环条件不成立,循环结束
特点:先判断,后执行
如果条件一开始就不成立,循环操作一次都不执行*/
(2)do…while
do{
//循环操作
}while(条件);
/*执行:
先执行一次循环操作,
判断条件,条件成立,再循环操作
。。。
直到条件不成立,循环结束。
特点:先执行,后判断
循环操作至少会执行一次*/
(3) for循环
for(1 循环变量的初始化; 2条件 ; 3 循环变量的更新){
//4循环操作
}
/*执行:
124 324 324 32(条件不成立,循环结束)
特点:先判断后执行,循环操作有可能一次也不执行
场景:循环次数固定*/
-
选用循环结构的原则: 循环次数是否固定
-
固定:优先for
-
不固定:循环操作是否有可能一次都不执行
-
如果有可能,那就用while
-
如果至少会执行一次,优先用do…while
会执行多次,while、do…while
(4)双重循环一个循环里嵌套了另一个循环外层循环执行一次,内层循环执行一遍 总共执行次数:外层次数与内层的次数之积
语法:while 、do…while、 for
break
跳出所在层的循环
continue
结束所在层那一轮循环
5、while练习
- 整数反转 123 输出321
import java.util.Scanner;
public class fanzhuan {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num1 = input.nextInt();
int yu = 0, num2 = 0;
while (num1 != 0) {
yu = num1 % 10;
num2 = num2 * 10 + yu;
num1 = num1 / 10;
}
System.out.print("其倒置后的数为:" + num2);
}
}
- 判断一个整数是不是回文数
import java.util.Scanner;
public class fanzhuan {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num1 = input.nextInt();
int a = num1;
int yu = 0, num2 = 0;
while (num1 != 0) {
yu = num1 % 10;
num2 = num2 * 10 + yu;
num1 = num1 / 10;
}
System.out.println("其倒置后的数为:" + num2);
if (a == num2) {
System.out.println(num2 + "为回文数字");
}
}
}
break(中断指令)
switch结构中,跳出switch
循环中,跳出循环
continue
只能用在循环中
结束本轮的循环,继续下一轮
6、程序调试
1、编译报错----语法错误
2、运行时报错---看控制台报错,从上往下找第一行自己代码的地方
3、运行结果不对---逻辑问题
1)借助syso,观察变量的变化
2)debug:1、分析问题,确定断点(程序会停留的地方)
2、启动调试
3、单步执行。Step into F5
Step over F6
4、观察变量和控制台的变化
5、找到问题原因,修改代码
打印图形(外层控制行数,内层控制列数)
12345
12345
12345
*
**
***
****
*****
外层 i [1,5]
内层 j [1,i]
i=1 1 [1,1]
i=2 2 [1,2]
i=3 3 [1,3]
*****
****
***
**
*
*
**
***
****
*****
外层 i[1,5]
内层 :先打空,再打*,再打换行
空格[1,5-i] *[1,i]
i=1 4 1
i=2 3 2
i=3 2 3
i=4 1 4
*
***
*****
*******
*********
1
121
12321
1234321
123454321
外层 :i [1,5]
内层 :空[1,5-i] 数字 x[-(i-1),(i-1)]
i=3 1 2 3 2 1 y y=i-|x|
-2 -1 0 1 2 x x [-(i-1),(i-1)]
y i i
* 1 1 -3
** 2 2 -2
*** 3 3 -1
**** 4 4 0
*** 3 5 1
** 2 6 2
* 1 7 3
Y=-|x|+4 x=i-4----->y=-|i-4|+4
外层 i[1,7]
内层 j[1,i]&&[1,8-i]
或j [1,-|i-4|+4]
外层i [-3,3]
内层y=-|i|+4
扩展
i 空 *
* -3 3 1
** -2 2 2
*** -1 1 3
**** 0 0 4
*** -1 1 3
** -2 2 2
* -3 1 1
*
***
*****
*******
*****
***
*
九九乘法表
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25