三种流程控制结构
1.选择结构:if(单分支、双分支、多分支),Switch
2.循环结构:for,while,do-while
3.顺序结构
流程控制语句之 if 语句
1. if单分支语句
语法:
if(boolean表达式){
code...
}
程序执行到if语句 ,先判断 boolean表达式的值,如果是true ,则进入后面的大括号中执行里面的代码,如果为假 则 跳过后面的大括号
2.if双分支语句
语法:
if(boolean表达式){
code1
}else{
code2
}
先判断 boolean表达式的值 如果为真 则执行code 1 如果为假 则执行code2
3.if多分支语句
语法:
if(boolean表达式1){
code1..
}else if(boolean表达式2){
code2..
}else if(boolean表达式3){
code3....
}
......
else{
code n......
}
先判断 if 后的 boolean表达式1 如果为真 则执行code1 后面的其他分支 全部跳过 ,如果 boolean表达式1 为假 则跳过code1 接着判断 boolean表达式2 如果 为真 则执行 code2
如果为假 则跳过code2 接着判断 boolean表达式3 … 如果 所有的 if 后的 表达式 都为假 则 执行 最后的else coden
练习题:
@Test
public void test4() {
//.输入 一个 年份 四位整数 ,输出 这个年份 是不是闰年
Scanner scanner = new Scanner(System.in);
System.out.println("请输入四位整数");
int year = scanner.nextInt();
//闰年 这个数除以4 余数为0 但是 除以100 余数不能为0 或者 这个数 除以400 余数为0
if((year%4==0&&year%100!=0) || (year%400==0)) {
System.out.println(year+"是闰年");
}else {
System.out.println(year+"不是闰年");
}
}
@Test
public void test5() {
// . 输入一个三位整数 判断这个数是不是水仙花数
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个三位的整数");
int num = scanner.nextInt();
int ge = num%10;
int shi = num/10%10;
int bai = num/100;
int value = gegege+shishishi+baibaibai;
if(value==num) {
System.out.println("是水仙花数");
}else {
System.out.println("不是水仙花数");
}
}
流程控制语句 之 switch
语法:
switch(exp){
case value1:{
code 1;
break;
}
case value2:{
code 2;
break;
}
case value3:{
code 3;
break;
}
......
default:{
code n;
}
}
拿表达式的值 和 case 后的 value 进行匹配,如果匹配的上,就执行该case 后的大括号中的内容;如果大括号中有break 关键字,则中断switch case 语句,如果 exp的值和所有的 case 后的value都没有匹配上,则执行 default 后的内容。
break: 中断关键字
在 switch case 中的作用是中断匹配,一旦执行到break ,就会中断switch case 语句,
但是这里的break 关键字不是必须的 ,如果没有break 则会出现 switch 穿透现象, 会穿透到下一个case 后的大括号中执行, 而不进行匹配,有时会根据 switch 穿透这个特性实现某些功能
注意:
1.case 后的value 值不能重复
2.switch 后的表达式的值得类型支持(byte short char int String Enum)
3.default 语句可以省略
switch穿透
@Test
public void test4() {
// 随机一个小写的英文字母,判断这个字母是不是元音字母
char c = 'a';
int num = (int) (Math.random()26);
char c2 = (char) (c+num);
switch(c2) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':{
System.out.println("随机字母是元音字母"+c2);
break;
}
default:{
System.out.println(c2+"不是元音字母");
}
}
}
流程控制语句 之 while
语法:
while(boolean表达式){
循环体
}
执行流程: 程序执行到while语句,先判断 boolean表达式的值,若表达式的值为真,则执行循环体的内容,执行完循环体之后,再次判断 boolean表达式的值,如果为真,则继续执行循环体,继续判断表达式的值 如此循环,直到表达式的值为假,则停止循环,若表达式的值 一直为真,则一直循环 。( 一般情况,要注意控制循环的终止条件,避免出现死循环)
循环结构的本质: 重复的执行循环体中的代码 直到不满足循环条件
循环结构:
-
初始化部分:指的是初始条件 一般是循环变量的初始值 通过该变量可以控制循环条件的真假 这个变量可以称为循环变量 (循环变量一般在boolean表达式中)
循环条件: while后 小括号中的内容 是一个布尔表达式 每一次循环之前 都要先判断这个表达式的值 如果为真 则执行循环 如果为假 则跳过循环 -
循环体:大括号中的内容 就是循环体 可以是 一条语句 也可以是 多条语句
-
迭代部分: 通常是 循环体的一部分 用来改变循环变量的值 从而改变循环条件 boolean表达式的值
关键点: 使用循环的时候 要对循环条件敏感 要知道什么时候终止循环
流程控制语句之do while
语法:
do{
循环体
迭代部分 一般和循环体写在一起
}while(循环条件);
先执行一次循环体 再判断循环条件 如果为真 则 继续执行循环体 如果为假 则 终止循环
和 while 对比
while是 先判断 循环条件 为真 则循环 为假 不循环
do while 是先执行一次循环体 为真 则循环 为假 不循环 意味着 do while 的循环体 至少执行一次
流程控制语句之 for
语法:
for(初始化部分①;循环条件②;迭代部分③){
循环体 ④
}
① ② ④ ③ ② ④ ③ ② ④ ③ …
执行流程:
- 先执行初始化部分 这部分只执行一次
- 再执行循环条件 这个循环条件是一个布尔表达式 如果为真 则执行循环体 如果为假 则结束循环
- 循环条件为真 执行循环体
- 循环体执行完 再执行迭代部分 迭代部分的代码一般会改变循环变量的值 从而改变循环条件的结果 以此来控制循环是否继续 , 也就是说 迭代部分执行完 ,再次执行循环条件 根据循环条件的结果 判断是否继续执行循环体 继续循环,for 循环都是先判断 后执行
注意:
循环变量的作用域问题 : 如果 是在 循环内部 声明的变量,那么循环变量的作用域就只在循环语句内有效超出循环语句 就无效 ,那么 如果想在for 循环外部 访问 循环变量怎么办? 可以把循环变量声明在 循环语句之外
多重循环 : 循环嵌套
一个循环体内又包含另一个完整的循环结构 ,任何两种循环都可以相互嵌套,可以任意层次循环,但是一般不超过3层。
多重循环执行过程
外层循环变量变化一次,内层循环变量要变化一遍
for(int i=0;i<vakue;i++){
for(int j =0;j<value;j++){
循环体
}
}
------------------
while(循环条件){
for(int i=0;i<value;i++){
循环体
}
}
多重循环
1.打印矩形
@Test
public void test() {
// 在控制台 输出 * 打印出 长10 宽5 的 矩形
for(int i=1;i<=5;i++) {
for(int j=1;j<=10;j++) {
System.out.print("*");
}
System.out.println();
}
}
2.10进制整数转二进制整数
@Test
public void test() {
//使用循环实现将10进值整数变成二进制数
//算法: 采用 除以2 取余数 逆序排列
int num =1024;
String str="";
while(num!=0) {
int yu = num%2; // 0 1 0 1
str = yu + str;
num=num/2;
}
System.out.println(str);
}
3.10进制小数转二进制小数
@Test
public void test() {
//使用循环实现将10进值小数变成二进制数
//算法:十进制小数 乘以 2 取整数部分 正序排列 直到小数部分为0
// 用 十进制小数 乘以 2 得到一个 乘积 把积 的整数部分取出来, 再用2 乘以余下的小数 又得到一个积 再将积的整数部分取出 再用2 乘以小数部分 如此循环 直到小数部分为0
double d = 0.125; // 0.25 0.5 1.0 0.875
String str = "0."; // 0.001
while(d!=0) {
double ji = d*2;
int zs = (int) ji;
str+=zs;
d= ji- zs;
}
System.out.println(str);
}
4.打印平行四边形
@Test
public void test() {
//打印平行四边形
/*
* *****
* *****
* *****
* *****
* */
for(int i=1;i<=5;i++) {
for(int k=1;k<6-i;k++) {
System.out.print(" ");
}
for(int j=1;j<=10;j++) {
System.out.print("*");
}
System.out.println();
}
}
5.打印等腰三角形
@Test
public void test() {
// 打印等腰三角形
/*
* *
* ***
* *****
* *******
* *********
* */
for(int i=0;i<5;i++) {
for(int k=1;k<6-i;k++) {
System.out.print(" ");
}
for(int j=0;j<2*i+1;j++) {
System.out.print("*");
}
System.out.println();
}
}
5.打印菱形
@Test
public void test() {
/*
* 控制台输出菱形
* *
* ***
* *****
* *******
* *********
* *******
* *****
* ***
* *
* */
for(int i=0;i<5;i++) {
for(int k=1;k<6-i;k++) {
System.out.print(" ");
}
for(int j=0;j<2*i+1;j++) {
System.out.print("*");
}
System.out.println();
}
for(int i=0;i<4;i++) {
//打印空格 // i=0 2 i=1 3
for(int k=1;k<3+i;k++) {
System.out.print(" ");
}
// 打印*
for(int j=0;j<7-2*i;j++) {
System.out.print("*");
}
System.out.println();
}
}
6.打印九九乘法表
@Test
public void test() {
// 控制台输出 99 乘法表
/*
* 1*1 =1
* 1*2 =2 2*2=4
*
*
* */
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();
}
}
7.百钱买百鸡
@Test
public void test() {
// 百钱买百鸡 100 文钱 买100 只鸡 公鸡 五文一只 母鸡 三文一只 小鸡 一文三只 怎样才能买到100 只鸡
/**
* 公鸡 i 母鸡 j 小鸡 k
* i+ j +k =100
* 5*i + 3*j + k/3=100
*
* k%3==0
*
* */
for(int i=0;i<20;i++) {
for(int j=0;j<33;j++) {
for(int k=0;k<100;k++) {
if((i+j+k==100)&&(5*i+3*j+k/3==100)&&(k%3==0)) {
System.out.println("公鸡"+i+"只,母鸡"+j+"只,小鸡"+k+"只");
}
}
}
}
}
break : 中断
- 在 switch case 中使用, 中断 case 语句避免缓存穿透;
- 在任何循环语句中, 均可以使用break 中断循环,在循环中执行break 到语句,循环马上停止,后续代码不再执行;
- 注意: 如果在多重循环中 break 只中断 当前的循环
continue 继续
在循环语句中使用,用于中断某次循环,跳过这次循环的后续语句,接着执行下一次循环 ( 跳过本次循环,执行下次循环)
return 返回
使用场景: 在方法当中用于返回方法的返回值,或者表示方法到此结束!
当方法返回值不是 void 的时候,必须有 return 返回返回值;
当方法的返回值是 void 的时候 ,可以有return 表示方法到此结束, 也可以没有return !