流程控制语句是用来控制程序中各个语句执行顺序的语句,也就是控制程序流程走向,可以把语句组合成完成一定功能的小逻辑模块。
流程控制方式采用结构化程序设计中规定的三种基本流程结构:
-
顺序结构
-
程序从上到下逐行执行,中间没有任何判断和跳转。
-
-
分支结构
-
根据条件选择性地执行某段代码。
-
有if-else和switch-case两种分支语句。
-
-
循环结构
-
根据循环条件,重复执行某段代码。
-
有while、do-while、for三种循环语句。
-
JDK1.5提供了foreach循环,方便的遍历集合、数组。
-
顺序结构
程序从上到下逐行执行,中间没有判断和跳转语句。
分支结构
if-else结构
if语句三种格式:
-
// 如果条件表达式结果为true则执行代码块,否则跳过if语句 if (条件表达式) { 执行代码块; }
-
// 条件表达式1为true执行代码块1,否则执行代码块2 if (条件表达式1) { 执行代码块1; } else { 执行代码块2; }
-
// 条件表达式1为true执行代码块1,否则跳过if,判断else if // 条件表达式2为true执行代码块2,否则跳过该else-if,判断下个else-if // 判断if和所有的else-if没有成立的就执行else if (条件表达式1) { 执行代码块1; } else if (条件表达式2) { 执行代码块2; } ..... else { 执行代码块N; }
if-else使用:
-
条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量。
-
语句块只有一条执行语句时,大括号{}可以省略,但建议保留。
-
if-else语句结构,根据需要可以嵌套使用。
-
当if-else结构是“多选一”时,最后的else时可选的,根据需要可以省略。
练习:
1、由键盘输入三个整数分别存入变量num1、num2、num3,对它们进行排序(使用 if-else if-else),并且从小到大输出。
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入第一个整数:");
int num1 = scanner.nextInt();
System.out.print("请输入第二个整数:");
int num2 = scanner.nextInt();
System.out.print("请输入第三个整数:");
int num3 = scanner.nextInt();
if (num1 >= num2) {
if (num2 >= num3) {
System.out.println(num3 + "," + num2 + "," + num1);
} else if (num3 >= num1) {
System.out.println(num2 + "," + num1 + "," + num3);
} else {
System.out.println(num2 + "," + num3 + "," + num1);
}
} else {
if (num2 <= num3) {
System.out.println(num1 + "," + num2 + "," + num3);
} else if (num3 <= num1) {
System.out.println(num3 + "," + num1 + "," + num2);
} else {
System.out.println(num2 + "," + num3 + "," + num1);
}
}
}
}
2、狗的前两年每一年相当于人类的10.5岁,之后每增加一年就增加4岁。编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人类的年龄,如果用户输入负数,显示一个提示信息。
// 当换成人类的岁数为xx.0时转成int型,否则用double型。
public class Test1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入狗的年龄:");
double humanAge1 = 0.0;
int humanAge2 = 0;
int dogAge = scanner.nextInt();
if (dogAge <= 2) {
humanAge1 = 10.5 * dogAge;
humanAge2 = (int)humanAge1;
if (humanAge1 % humanAge2 != 0) {
System.out.println("狗狗" + dogAge + "岁,换算成人类为" + humanAge1 + "岁");
} else {
System.out.println("狗狗" + dogAge + "岁,换算成人类为" + humanAge2 + "岁");
}
} else if (dogAge > 2){
humanAge1 = (dogAge - 2) * 4 + 10.5 * 2;
humanAge2 = (int)humanAge1;
if (humanAge1 % humanAge2 != 0) {
System.out.println("狗狗" + dogAge + "岁,换算成人类为" + humanAge1 + "岁");
} else {
System.out.println("狗狗" + dogAge + "岁,换算成人类为" + humanAge2 + "岁");
}
} else {
System.out.println("输入有误,请重新输入");
}
}
}
3、假设你想开发一个玩彩票的游戏,程序随机地产生一个两位数的彩票,提示用户输入
一个两位数,然后按照下面的规则判定用户是否能赢。
1)如果用户输入的数匹配彩票的实际顺序,奖金10000美元。
2)如果用户输入的所有数字匹配彩票的所有数字,但顺序不一致,奖金 3000美元。
3)如果用户输入的一个数字仅满足顺序情况下匹配彩票的一个数字,奖金1000美元。
4)如果用户输入的一个数字仅满足非顺序情况下匹配彩票的一个数字,奖金500美元。
5)如果用户输入的数字没有匹配任何一个数字,则彩票作废。
public class Test1 {
public static void main(String[] args) {
Random random = new Random();
// 返回0-90整数,不包括90 [0,90)再加10 = [10,100)
int result = random.nextInt(90) + 10;
Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的彩票号码:");
int number = scanner.nextInt();
// /10得到十位 %10得到个位
if (number == result) {
System.out.println("您中奖了!奖金为10000美元!开奖号码为:" + result);
// 将输入的数字倒转过来匹配
} else if ((number % 10) * 10 + (number / 10) == result) {
System.out.println("您中奖了!奖金为3000美元!开奖号码为:" + result);
// 十位与十位对比,个位与个位对比
} else if (number / 10 == result / 10 || number % 10 == result % 10) {
System.out.println("您中奖了!奖金为1000美元!开奖号码为:" + result);
// 不按顺序的匹配一个数字
} else if (number / 10 == result / 10 || number / 10 == result % 10 || number % 10 == result / 10 || number % 10 == result % 10) {
System.out.println("您中奖了!奖金为500美元!开奖号码为:" + result);
} else {
System.out.println("很遗憾您没有中奖!开奖号码为:" + result);
}
}
}
switch-case语句
结构:
switch(表达式/变量) { case 常量1: 语句1; break; case 常量2: 语句2; break; .......... case 常量N: 语句N; break; default: 语句; break; }
注意:
-
switch(表达式/变量)中表达式的值必须是byte、shrot、char、int、枚举(JDK1.5)、String(JDK1.7)之一。
-
case子句中的值必须是常量,不能为变量或不确定值得表达式。
-
同一个switch语句,所有case子句得常量值不相同。
-
break语句用来执行完一个case分支后使程序跳出switch语句块,如果没有break语句,程序会顺序执行到switch结尾。
-
default子句是可有可无得,当没有匹配得case子句时会执行defalut。
switch和if使用费场景
-
如果判断的具体数值不多,而且符合byte、short、char、int、String、枚举等几种类型,建议使用switch,效率高一点。使用switch-case的都可以改写为if-else。
-
对区间判断,对结果为boolean类型判断,使用if。反之不成立。
练习:
1、使用switch把小写类型的char型转为大写。只转换 a, b, c, d, e。其它的输出 “other”。
public class Test1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("输入a、b、c、d、e其中一个需要转换大写的字母:");
String result = scanner.next();
char c = result.charAt(0);
switch (c) {
case 'a':
c = 'a'- 32;
System.out.println(c);
break;
case 'b':
c = 'b'- 32;
System.out.println(c);
break;
case 'c':
c = 'c'- 32;
System.out.println(c);
break;
case 'd':
c = 'd'- 32;
System.out.println(c);
break;
case 'e':
c = 'e'- 32;
System.out.println(c);
break;
default:
System.out.println("other");
}
}
}
2、从键盘分别输入年、月、日,判断这一天是当年的第几天。
public class Test1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("年:");
int year = scan.nextInt();
System.out.print("月:");
int month = scan.nextInt();
System.out.print("日:");
int day = scan.nextInt();
int allday = 0;
switch (month) {
case 12:
allday += 30;
case 11:
allday += 31;
case 10:
allday += 30;
case 9:
allday += 31;
case 8:
allday += 31;
case 7:
allday += 30;
case 6:
allday += 31;
case 5:
allday += 30;
case 4:
allday += 31;
case 3:
if (year % 4 == 0 && year % 100 != 0) allday += 29;
else allday += 28;
case 2:
allday += 31;
case 1:
allday += day;
}
System.out.println("" + year + "/" + month + "/" + day + "是当年的第" + allday + "天");
}
}
3、编写一个程序,为一个给定的年份找出其对应的中国生肖。中国的生肖基于12年一个周期。
public class Test1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年份,得出当年生肖属相");
int year = scanner.nextInt();
year = year % 12;
switch (year) {
case 0:
System.out.println("猴");
break;
case 1:
System.out.println("鸡");
break;
case 2:
System.out.println("狗");
break;
case 3:
System.out.println("猪");
break;
case 4:
System.out.println("鼠");
break;
case 5:
System.out.println("牛");
break;
case 6:
System.out.println("虎");
break;
case 7:
System.out.println("兔");
break;
case 8:
System.out.println("龙");
break;
case 9:
System.out.println("蛇");
break;
case 10:
System.out.println("马");
break;
case 11:
System.out.println("羊");
break;
}
}
}
循环结构
循环结构:在某些条件满足的情况下,反复执行特定代码的功能。
循环语句分类:
-
for循环
-
while循环
-
do-while循环
循环语句的四个组成部分:
-
初始化部分
-
循环条件部分
-
循环体部分
-
迭代部分
for循环
-
语法格式:
-
for(①初始化部分;②循环条件部分;④迭代部分) { ③循环体部分; }
-
-
执行过程
-
①-②-③-④-②-③-④-②-③-④-.....-②
-
-
说明:
-
②循环条件部分为boolean类型表达式,当值为false时,退出循环
-
①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
-
④可以有多个变量更新,用逗号分隔
-
练习:
1、编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行 上打印出“foo”,在每个5的倍数行上打印“biz”,在每个7的倍数行上打印 输出“baz”。
public class Test1 {
public static void main(String[] args) {
// 编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行
// 上打印出“foo”,在每个5的倍数行上打印“biz”,在每个7的倍数行上打印输出“baz”。
for (int i = 1; i <= 150; i++) {
System.out.print(i);
if (i % 3 == 0) {
System.out.print("foo");
} else if (i % 5 == 0) {
System.out.print("biz");
} else if (i % 7 == 0){
System.out.print("baz");
}
System.out.println();
}
}
}
2、输入两个正整数m和n,求其最大公约数和最小公倍数。
public class Test1 {
public static void main(String[] args) {
// 输入两个正整数m和n,求其最大公约数和最小公倍数。
// 最小公倍数:两个数共同的最小的倍数
// 最大公约数:两个数共同的最大的因子
Scanner scanner = new Scanner(System.in);
System.out.println("输入第一个数:");
int m = scanner.nextInt();
System.out.println("输入第二个数:");
int n = scanner.nextInt();
int min = m >= n ? n : m;
int max = m >= n ? m : n;
// 最大公约数
for (int i = min; i >= 1; i--) {
if (m % i == 0 && n % i == 0) {
System.out.println("" + m + "和" + n + "的最大公约数为:" + i);
break;
}
}
// 最小公倍数
for (int i = max; i <= m * n; i++) {
if (i % m == 0 && i % n == 0) {
System.out.println("" + m + "和" + n + "的最小公倍数为:" + i);
break;
}
}
}
}
3、打印1-100的奇数和。
public class Test1 {
public static void main(String[] args) {
// 1-100的奇数和
int num = 0;
for (int i = 1; i < 100; i++) {
if (i % 2 != 0) {
num += i;
i++;
}
}
System.out.println(num);
}
}
4、打印1-100间的所有是7的倍数的整数个数及总和。
public class Test1 {
public static void main(String[] args) {
// 打印1~100之间所有是7的倍数的整数的个数及总和
int num = 0;
int count = 0;
for (int i = 1; i < 100; i++) {
if (i % 7 == 0) {
num += i;
count++;
}
}
System.out.println("1-100所有7的倍数的个数为" + count + ",总和为:" + num);
}
}
5、输出所有的水仙花数,所谓水仙花数就是一个3位数,各个位数的立方和等于这个数的本身。
public class Test1 {
public static int num(int number) {
number = number * number * number;
return number;
}
public static void main(String[] args) {
// 输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。
for (int i = 100; i < 1000; i++) {
if (num((i / 100)) + num((i / 10 % 10)) + num((i % 10)) == i) {
System.out.println(i);
}
}
}
}
while循环
-
语法格式:
-
①初始化部分 while(②循环条件部分) { ③循环体部分; ④迭代部分; }
-
-
执行过程:
-
①-②-③-④-②-③-④-②-③-④-...-②
-
-
注意:
-
注意不要忘记声明④迭代部分。否则循环将不能结束,变成死循环。
-
for循环和while循环可以相互转换。
-
do-while循环
-
语法格式:
-
①初始化部分; do{ ③循环体部分 ④迭代部分 }while(②循环条件部分);
-
-
执行过程:
-
①-③-④-②-③-④-②-③-④-...②
-
-
注意:do-while是先执行,再判断,也就是说即使循环条件部分不成立也会执行一次循环语句。
练习:
从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
public class Test1 {
public static void main(String[] args) {
// 从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
Scanner scanner = new Scanner(System.in);
int zhengshu = 0;
int fushu = 0;
// 死循环,无限输入正数负数计算个数,直到输入0退出循环
while (true) {
System.out.println("请输入整数:");
int num = scanner.nextInt();
if (num > 0) {
zhengshu++;
} else if (num < 0) {
fushu++;
} else if (num == 0) {
System.out.println("正数个数:" + zhengshu + ",负数个数:" + fushu);
return;
}
}
}
}
嵌套循环(多重循环)
-
将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while,do-while都可以作为外层循环或内层循环。
-
嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才会结束外层的档次循环,开始下一次循环。
-
设置外层循环次数为m,内层循环次数为n,实际上内层需要循环m * n次。
练习: 1、九九乘法表
public class Test1 {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("" + j + "*" + i + "=" + (j * i));
System.out.print("\t");
}
System.out.println();
}
}
}
2、100以内的所有质数
// 第一种
public class Test1 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
if (i == 3 || i == 2 || i == 5) {
System.out.println(i);
} else if (i != 1 & i % 2 != 0 & i % 3 != 0 & i % 5 != 0 & i % 7 != 0 & i % 9 != 0) {
System.out.println(i);
}
}
}
}
// 第二种
public class Test1 {
public static void main(String[] args) {
boolean flag = true;
for (int i = 2; i <= 100; i++) {
for (int j = 2; j < i; j++) {
if (i % j ==0) {
flag = false;
break;
}
}
if (flag == true) {
System.out.println(i);
}
flag = true;
}
}
}
特殊流程控制语句
-
break语句
-
break语句用于终止某个语句块的执行。
-
break语句出现在多层嵌套的语句块时,break在哪层就终止哪层语句块。
-
-
continue语句
-
continue语句只能在循环结构中使用。
-
continue语句用于跳出所在循环语句块的本次循环,继续下次循环。
-
-
return语句
-
并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到return语句时,该方法将被结束。
-
与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环内。
-
标号语句
可以给语句块加标号赋予它们名称,标号位于语句之前。标号只能被continue和break引用。
语句前只允许加一个标号,标号后面不能跟大括号。通过用break后加标号对处于标号中的语句进行控制。往往标号后是for.while.do-while等循环。
1、通过标号对外层循环进行控制(continue):
public class Test1 {
public static void main(String[] args) {
System.out.println("i j");
search:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 50; j++) {
if (j == 3)
continue search;
System.out.println(i+" "+j);
}
}
}
}
// 结果
i j
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
可以看到内层循环并没有执行50次,而是j == 3的时候就通过标号跳出到外层循环,此时执行之前的i++;
2、通过标号对外层循环进行控制(break):
public class Test1 {
public static void main(String[] args) {
System.out.println("i j");
search:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 50; j++) {
if (j == 3)
break search;
System.out.println(i+" "+j);
}
}
}
}
// 结果
i j
0 0
0 1
0 2
可以看出内层循环也没有执行50次,而且break后循环就再也没执行。break跳出的是最外层循环,跳出了标号的范围。
break跳出标号对查询一条记录来说比较有用,当查出自己想要的一条记录时,就可以跳出循环了,不用再执行了。
注意:
-
break只能用于switch语句和循环语句中。
-
continue只能用于循环语句。
-
break与continue功能类似,但continue是终止本次循环,break是终止本层循环。
-
break和continue之后不能有其他的语句,因为程序永远不会执行其后面的语句。
-
标号语句必须紧接在循环的头部且后面不能跟大括号,不能用在非循环语句的前面。