1.1、分支结构(if)
- 条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量;
- 语句块只有一条执行语句时,一对{}可以省略,但建议保留;
- if-else语句结构,根据需要可以嵌套使用;
- 当if-else结构是“多选一”时,最后的else是可选的,根据需要可以省略;
- 当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓当多个条件是“包含”关系时,“小上大下/ 子上父下”。
1.2、分支结构(switch)
说明:
① 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,进入相应case结构中,执行相关语句。
当调用完执行语句后,则仍然继续向下执行其他case语句,直到遇到break关键字或末尾结束为止。
② break, 可以使用switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构。
③ switch结构中的表达式,只能是如下的六种数据类型之一:byte、short、char、int、枚举类型(JDK5.0)、String类型(JDK7.0),不能使用浮点类
型和布尔类型
④ case 之后之能声明常量。不能声明范围。
⑤ break关键字是可选的。
⑥ default:相当于if-else结构中的else。
default 结构是可选的,而且位置是灵活的。
/*
对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
说明:如果switch-case语句中多个相同语句,可以进行合并。
*/
class SwitchTest1{
public static void main(String[] args){
int score = 78;
//方案一
switch(score / 10){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("不合格");
break;
case 6:
case 7:
case 8:
case 9:
case 10:
System.out.println("合格");
break;
}
//更优的解法
switch(score /60){
case 0:
System.out.println("不及格");
break;
case 1:
System.out.println("合格");
break;
}
}
}
/*
编写程序:从键盘上输入2020年的“month”和“day”,
要求通过程序输出输入的日期为2019年的第几天。
2 15 : 31 + 15
5 7: 31 + 28 +31 +30 + 7
...
说明:break在switch-case中是可选的。
*/
import java.util.Scanner;
class DayTest{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入2020年的month");
int month = scan.nextInt();
System.out.println("请输入2020年的day");
int day = scan.nextInt();
//定义一个变量来保存天数
int sumDays = 0;
switch(month){
case 12:
sumDays += 30;
case 11:
sumDays += 31;
case 10:
sumDays += 30;
case 9:
sumDays += 31;
case 8:
sumDays += 31;
case 7:
sumDays += 30;
case 6:
sumDays += 31;
case 5:
sumDays += 30;
case 4:
sumDays += 31;
case 3:
sumDays += 29;
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println("2020年" + month + "月" + day + "日是当年的第" + sumDays + "天");
}
}
1.3、输入语句
具体步骤:
1.导包:import java.util.Scanner;
2.Scanner的实例化;
3.调用Scanner类的相关方法,来获取指定的变量。
import java.util.Scanner;//导包
class IFTest{
public static void main(String[] args){
//声明一个Scanner
Scanner scan = new Scanner(System.in);//实例化
int num = scan.nextInt();//调用类中的方法
System.out.println(num);
}
}
练习
/*
岳小鹏参加Java考试,他和父亲岳不群达成承诺:
如果:成绩为100分时,奖励一辆BMW;
成绩为(80,99]时,奖励一台iphone xs max;
当成绩为[60,80]时,奖励一个iPad;
其它时,什么奖励也没有。
请从键盘输入岳小鹏的期末成绩,并加以判断
说明:
1.else结构是可选的。
2.针对于条件表达式:
① 如果多个条件表达式之间的关系是“互斥”关系(或没有交集的关系),哪个判断和执行语句声明在上面还是下面,无所谓;
② 如果多个条件表达式之间是有交集的关系,需要根据实际情况,需要考虑实际情况,考虑清楚应该将哪个结构声明在上面。
③ 如果多个条件表达式之间有包含的关系,通常情况下,需要将范围小的声明在范围大的上面。否则,范围小的就没机会运行。
*/
import java.util.Scanner;
class IFTest02{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入岳小鹏的成绩:");
int score = scan.nextInt();
if(score == 100){
System.out.println("奖励一辆BMW");
}else if(score >80 && score <=99){
System.out.println("奖励一台iphone xs max");
}else if(score >= 60 && score <= 80){
System.out.println("奖励一个iPad");
}else{
System.out.println("奖励?学习去!!!");
}
}
}
小贴士:
产生一个[a,b]的随机数的方法:int value=(int)(Math.random()*(b-a+1))+a
例:
/*
假设你想开发一个玩彩票的游戏,程序随机地产生一个两位数的彩票,
提示用户输入一个两位数,然后按照下面的规则判定用户是否能赢。
1)如果用户输入的数匹配彩票的实际顺序,奖金10 000美元。
2)如果用户输入的所有数字匹配彩票的所有数字,但顺序不一致,奖金3 000美元。
3)如果用户输入的一个数字仅满足顺序情况下匹配彩票的一个数字,奖金1 000美元。
4)如果用户输入的一个数字仅满足非顺序情况下匹配彩票的一个数字,奖金500美元。
5)如果用户输入的数字没有匹配任何一个数字,则彩票作废。
提示:使用(int)(Math.random() * 90 + 10)产生随机数。
Math.random() : [0,1) * 90 [0,90) + 10 [10,100)[10,99]
*/
import java.util.Scanner;
class CaiTest{
public static void main(String[] args){
//1、随机产生一个两位数
//System.out.println(Math.random());//产生[0,1)
int number = (int)(Math.random()*90 + 10);//得到[10,99],即[10,100)
//System.out.println(number);
int numberShi = number/10;
int numberGe = number%10;
//2、用户输入一个两位数
Scanner input = new Scanner(System.in);
System.out.print("请输入一个两位数:");
int guess = input.nextInt();
int guessShi = guess/10;
int guessGe = guess%10;
if(number == guess){
System.out.println("奖金10 000美元");
}else if(numberShi == guessGe && numberGe == guessShi){
System.out.println("奖金3 000美元");
}else if(numberShi==guessShi || numberGe == guessGe){
System.out.println("奖金1 000美元");
}else if(numberShi==guessGe || numberGe == guessShi){
System.out.println("奖金500美元");
}else{
System.out.println("没中奖");
}
System.out.println("中奖号码是:" + number);
}
}
1.4、循环结构(for)
/*
输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。
例如:153 = 1*1*1 + 3*3*3 + 5*5*5
*/
class ForTest2{
public static void main(String[] args){
for(int i = 100;i <= 999;i++){
int a = i / 100; //获取百位
int b = i % 100 /10; //获取十位
int c = i % 10; //获取个位
if(a*a*a + b*b*b + c*c*c == i){
System.out.println("此数值为满足条件的水仙花数:" + i);
}
}
}
}
/*
输入两个正整数m和n,求其最大公约数和最小公倍数。
比如:12和20的最大公约数是4,最小公倍数是60。说明:break关键字的使用
*/
import java.util.Scanner;
class GnumberTest{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入m:");
int m = scan.nextInt();
System.out.println("请输入n:");
int n = scan.nextInt();
//获取m和n的较大值
int max = (m > n) ? m : n;
//获取m和n的最小值
int min = (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;
}
}
}
}
1.5、循环结构(while)
①初始化部分
while(②循环条件部分){
③循环体部分;
④迭代部分;
}
/*
从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
说明:
1.不在循环条件部分限制次数的结构:while(true) , for(;;)
2.结束循环的几种方式:
方式一:循环条件部分返回false;
方式二:在循环体中,执行break;
*/
import java.util.Scanner;
class While{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
int poNumber=0;
int neNumber=0;
while(true){
int number=scan.nextInt();
if(number>0){
poNumber++;}
else if(number<0){
neNumber++;}
else{break;}
}
System.out.println("正数的个数:" + poNumber);
System.out.println("负数的个数:" + neNumber);
}}
1.6、循环结构(do while)
do-while循环结构的使用
一、循环结构的四个要素
① 初始化条件
② 循环条件 --->是boolean类型
③ 循环体
④ 迭代条件
二、do-while循环的结构
①
do{
③;
④;
}while(②);
执行过程:① - ③ - ④ - ② - ① - ③ - ④ - ... - ②
说明:do-while循环至少执行一次循环体。
1.7、嵌套结构
/*
技巧
外层循环控制行数,内层循环控制列数
100以内的所有质数
质数:素数,只能被1和它本身整除的自然数。
最小的质数是:2
*/
class PrimeNuberTest{
public static void main(String[] args){
boolean isFlag = true; //标识是否被除尽,一旦除尽,修改其值。
for(int i = 2;i <= 100;i++){ //遍历100以内的自然数
for(int j =2;j <Math.sqrt(i) ;j++){ //j:被i去除
if(i % j == 0){ //i被j除尽
isFlag = false;
break;
}
}
if(isFlag == true){
System.out.println(i);
}
//重置isFlag
isFlag = true;
}
}
}
1.8、break,continue
1、break的使用
break语句用于终止某个语句块的执行,
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ......
label2: { ......
label3: { ......
break label2;
......
}
}
}
2、continue的使用
continue 语句
continue只能使用在循环结构中
continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环
continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
3、return的使用
return:并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。
与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。
4、特殊流程控制语句说明
- break只能用于switch语句和循环语句中。
- continue 只能用于循环语句中。
- 二者功能类似,但continue是终止本次循环,break是终止本层循环。
- break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
- 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
- 很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同于goto的。