程序的三大结构
- 顺序结构
- 选择结构
- 循环结构
顺序结构
- 顺序结构是java中最常见的一种结构,由于一直在用,所以可能会忽视它
- 除非有特别的操作,否则Java的代码都是自上而下顺序执行的
顺序结构的代码如下:
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
选择结构
- 概念:根据布尔表达式,多个分支选择一个进行执行
- 分类:if选择结构和switch选择结构
if选择结构
- 格式:if(布尔表达式){代码块}
- 分类:单选择,双选择,多选择
if的双选
格式:
if (布尔表达式){ //判断为真,执行方法体1 }else{ //判断为假,执行方法体2 }
代码:
if (score>60){
System.out.println("成绩及格");
}else{
System.out.println("成绩不及格");
}
结果:
- score=70 输出成绩合格
- score=50 输出成绩不合格
if的单选
格式:
if (布尔表达式)){
//方法体
}
代码:
if (str.equals("hello")){
System.out.println(str);
}
结果:
- equals等于hello时,输出hello
- equals不等于hello时,没有任何操作
if的多选
格式:
if(布尔表达式){
//判断为真,则执行方法体1
}else if (布尔表达式 && 布尔表达式){
//判断为假,则执行方法体2
}else{
//上述都不成立,执行如下结果
}
代码:
if(score==100){
System.out.println("恭喜获得了满分");
}else if (score<100 && score>90){
System.out.println("A");
}else{
System.out.println("其他");
}
结果:
- score=100 输出满分
- 90<score<100 输出A
- 不符合上述两种情况输出“其他”
switch多选择
格式:
switch(表达式){
case value:
//方法体
break;
case value:
//方法体
break;
default:
//方法体
}
代码:
switch ((score/10)){
case 10:
System.out.println("恭喜满分");
break;
case 9:
System.out.println("A");
break;
case 8:
System.out.println("B");
break;
case 7:
System.out.println("C");
break;
case 6:
System.out.println("D");
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
System.out.println("不及格");
break;
default:
System.out.println("成绩不合法");
}
结果:
- 输入:99 输出:A
- 输入:30 输出:不及格
- 输入:11111 输出:成绩不合法
表达式的类型:
- switch中的变量类型可以是:byte、short、int、char、String、枚举
- 对于String类型,反编译可以得到它设置一个变量a,让String的那个字符串的hashcode和变量a相关联,最后在使用switch(a)
代码:
public static void main(String[] var0) {
Scanner var1 = new Scanner(System.in);
System.out.println("请输入字符串:");
String var2 = var1.nextLine();
byte var4 = -1;
switch(var2.hashCode()) {
case 2080:
if (var2.equals("AA")) {
var4 = 0;
}
break;
case 2112:
if (var2.equals("BB")) {
var4 = 1;
}
}
switch(var4) {
case 0:
System.out.println("这是A");
break;
case 1:
System.out.println("这是B");
break;
default:
System.out.println(var2);
}
var1.close();
}
case穿透现象:
代码:
switch (str){
case "AA":
System.out.println("这是A");
case "BB":
System.out.println("这是B");
break;
default:
System.out.println(str);
}
结果:
- 输入:str=“AA”
- 输出:这是A 这是B 这是AA
原因:
- 如果不写break,就会出现case穿透现象,就是从符合条件的第一条语句开始顺序执行代码,把后面的所有语句都执行完
- default就是缺省语句,就是匹配不到switch时就会走这个选项,所以default最后执行,而且可以不用写break语句
循环结构
分类
- while循环
- do while循环
- for循环
while循环
格式:
while(布尔表达式){
//循环内容
}
代码:
int i=0;
while (i<10){
System.out.println(i);
i++;
}
注意:
- 为了避免死循环的现象,必须要出现布尔表达式不成立的情况
练习:
使用while计算1到100之间的和
public static void main(String[] args) {
//计算1到100的和
int i=1;//加数
int sum=0;//和
while (i<=100){
sum+=i;
i++;
}
System.out.println("1到100的和是"+sum);
}
do while循环
格式:
do {
方法体
}while (布尔表达式);
代码:
do {
sum+=i;
i++;
}while (i<=100);
注意:
- do while后面必须要加上一个分号
do while和while的区别
- while循环是先判断后循环,do while是先循环后判断
- do while 至少会执行一次,但是while代码可能一次都不会执行
for循环
格式:
for (初始化值;判断条件;步进表达式){
sum+=i;
}
代码:
for (int i=1;i<=100;i++){
sum+=i;
}
快捷键:
100.for+回车
注意:
- 最先执行的就是初始化的语句,可以声明类型。可以初始化多个循环控制变量,也可以是空语句。
- 其后判断布尔表达式的的值,为真就执行循环体,为假就终止循环,执行后面的语句。
- 执行完一次循环之后就执行步进表达式,更改循环控制变量。
- for(;😉//就是一个死循环
练习:
使用for循环,计算1-100之间偶数的和、奇数的和
for (int i = 1; i <=100; i++) {
if ((i%2==1)){//若为奇数
sum1+=i;
}else {//若为偶数
sum2+=i;
}
}
使用for循环打印99乘法表
//内外嵌套循环:分治思想
for (int i = 1; i <= 9; i++) {
for (int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+i*j+"\t");
}
//外层循环换行
System.out.println();
}
增强for循环(主要用于遍历集合)
格式:
for(声明变量:集合){
//遍历操作
}
代码:
int[] numbers={1,2,3,4,5};
for (int number : numbers) {
System.out.println(number);
}
快捷键:
numbers.for
break和continue的区别
- break循环就此终止,不会再循环下去了
- continue跳过这一次的循环,开始下一轮的循环
代码:
for (int i = 0; i < 10; i++) {
if (i==3){
//终止整个循环,结束循环
break;
}
System.out.println(i);
}
结果:
- 0 1 2
- 后续的456789都不会执行了
代码:
for (int i = 0; i < 10; i++) {
if (i==3){
//终止此次循环,开始下一轮循环
continue;
}
System.out.println(i);
}
结果:
- 0、1、2、4、5、6、7、8、9
- 只有3的那一轮循环被跳过去了
goto保留字和标签(不建议使用,麻烦且容易出错)
代码:
//打印101-105之间的质数
//在这个地方做一个标记
outer: for (int i=101;i<=105;i++){
for (int j = 2; j < i/2; j++) {
if ((i%j)==0){
//结束本轮循环后跳转到标记地点
continue outer;
}
}
System.out.println(i);
}
分析:
- 这里的continue只会跳出内层循环,但是一旦出现了其他的因子,他就不是质数了,没必要再循环了,所以这里需要跳到外层循环
- 这里的continue outer效果等同于break,跳到外层循环
小练习:打印三角形(分治思想和for循环)
思路:
- 先打印左边的空白的倒三角形
- 打印由*组成的三角形
1.打印空白的倒三角形
int rows = 0;//打印的行数
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要打印的行数:");
rows = sc.nextInt();
//遍历每一行
for (int i = 1; i <= rows; i++) {
//打印空白组成的倒三角形
for (int j = 1; j <= rows - i; j++) {
System.out.print(" ");
}
}
sc.close();
2.打印*组成的正三角形
int rows = 0;//打印的行数
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要打印的行数:");
rows = sc.nextInt();
//遍历每一行
for (int i = 1; i <= rows; i++) {
//打印空白组成的倒三角形
for (int j = 1; j <= rows - i; j++) {
System.out.print(" ");
}
//打印*组成的正三角形
for (int k = 0; k < i; k++) {
System.out.print("* ");
}
//换行
System.out.println();
}
sc.close();