1 顺序结构
2 分支结构
2.1 if-else
2.1.1 if-else三种格式
2.1.2 if-else使用说明


// 上面的练习进阶版:int x = 4;int y = 1;if (x > 2)if (y > 2)System.out.println(x + y);else //就近原则System.out.println("x is " + x); // 输出4//课后练习:测算狗的年龄int dogAge = 6;if(dogAge >= 0 && dogAge <= 2){System.out.println("相当于人的年龄:" + dogAge * 10.5);}else if( dogAge > 2){System.out.println("相当于人的年龄:" + (2 * 10.5 + (dogAge - 2) * 4));}else{System.out.println("狗狗还没出生呢!");}//课后练习:如何获取一个随机数:10 - 99int value = (int)(Math.random() * 90 + 10);// [0.0,1.0) --> [0.0,90.0) --->[10.0, 100.0) -->[10,99]System.out.println(value);//公式:[a,b] : (int)(Math.random() * (b - a + 1) )+ a
2.2 switch-case
2.2.1 switch-case格式
2.2.2 switch-case使用说明

//**************如下的两种情况都编译不通过*********************//情况一:switch表达式不能是布尔值/*boolean isHandsome = true;switch(isHandsome){case true:System.out.println("我好帅啊~~~");break;case false:System.out.println("我好丑啊~~~");break;default:System.out.println("输入有误~~~");}*///情况二:case子句必须是常量/*int age = 10;switch(age){case age > 18:System.out.println("成年了");break;default:System.out.println("未成年");}*/
2.2.3 switch-case与if-else对比

/*练习题:从键盘分别输入年、月、日,判断这一天是当年的第几天注:判断一年是否是闰年的标准:1)可以被4整除,但不可被100整除或2)可以被400整除说明:1. 凡是可以使用switch-case的结构,都可以转换为if-else。反之,不成立。2. 我们写分支结构时,当发现既可以使用switch-case,(同时,switch中表达式的取值情况不太多),又可以使用if-else时,我们优先选择使用switch-case。原因:switch-case执行效率稍高。*/import java.util.Scanner;class SwitchCaseExer {public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println("请输入year:");int year = scan.nextInt();System.out.println("请输入month:");int month = scan.nextInt();System.out.println("请输入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://判断year是否是闰年if((year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0){sumDays += 29;}else{sumDays += 28;}case 2:sumDays += 31;case 1:sumDays += day;}System.out.println(year + "年" + month + "月" + day + "日是当年的第" + sumDays + "天");}}/*例题:对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。说明:如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。*/class SwitchCaseTest1 {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;}}}
3 循环结构
3.1 for循环


//练习:int num = 1;for(System.out.print('a');num <= 3;System.out.print('c'),num++){System.out.print('b');}//输出结果:abcbcbc/*题目:输入两个正整数m和n,求其最大公约数和最小公倍数。比如: 12和20的最大公约数是4,最小公倍数是60。说明: break关键字的使用。*/import java.util.Scanner;public class Test{public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.println("请输入第一个整数:");int num1 = scan.nextInt();System.out.println("请输入第二个整数:");int num2 = scan.nextInt();// 求最大公约数int min = (num1 <= num2)? num1 : num2;for(int i = min; i >= 1; i--){if(num1 % i == 0 && num2 % i == 0){System.out.println("最大公约数是:" + i);break;}}// 求最小公倍数int max = (num1 >= num2)? num1 : num2;for (int i = max; i <= num1*num2; i++){if(i % num1 == 0 && i % num2 == 0){System.out.println("最小公倍数为:" + i);break;}}}}
3.2 while循环

class WhileTest{public static void main(String[] args) {//遍历100以内的所有偶数int i = 1;while(i <= 100){if(i % 2 == 0){System.out.println(i);}i++;}//出了while循环以后,仍可以调用。System.out.println(i);//101}}
3.3 do-while循环

//遍历100以内的偶数,并计算所有偶数的和及偶数的个数int num = 1;int sum = 0;//记录总和int count = 0;//记录个数do{if(num % 2 == 0){System.out.println(num);sum += num;count++;}num++;}while(num <= 100);System.out.println("总和为:" + sum);System.out.println("个数为:" + count);//*************体会do-while至少执行一次循环体***************int number1 = 10;while(number1 > 10){System.out.println("hello:while");//不会输出number1--;}int number2 = 10;do{System.out.println("hello:do-while");//会输出number2--;}while(number2 > 10);
3.4 循环其他知识点
3.4.1 无限循环
不在循环条件部分限制次数的结构:for(;;) 或 while(true)
结束循环有几种方式?
方式一:循环条件部分返回false
方式二:在循环体中,执行break
/*题目:从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。*/import java.util.Scanner;class ForWhileTest {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int positiveNumber = 0;//记录正数的个数int negativeNumber = 0;//记录负数的个数for(;;){//while(true){int number = scan.nextInt();//判断number的正负情况if(number > 0){positiveNumber++;}else if(number < 0){negativeNumber++;}else{//一旦执行break,跳出循环break;}}System.out.println("输入的正数个数为:" + positiveNumber);System.out.println("输入的负数个数为:" + negativeNumber);}}
3.4.2 循环嵌套

嵌套循环的使用:
- 嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环
- 外层循环:循环结构B
- 内层循环:循环结构A
- 说明 ① 内层循环结构遍历一遍,只相当于外层循环循环体执行了一次② 假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m * n次
- 技巧:外层循环控制行数,内层循环控制列数。
练习一:九九乘法表
public class Hello {public static void main(String[] args) {for (int row = 1; row <= 9; row++) {for (int col = 1; col <= row; col++) {System.out.print(row + " * " + col + " = " + (row*col) + " ");}System.out.println();}}}
练习二:求100以内的质数
(第一版)【思路】
100个小人排队进景点,从前门进,先穿上一个黄马甲,然后进审核区,
裁判经过一些过程评定小人是不是质数,若最终判定小人不是质数就在黄马甲上打一个叉,
然后来到后门,若马甲是干净的就从后门进入景点,若马甲脏了,就不能进入景点,而且把马甲洗干净送回到前门给下一个小人穿上,然后下一个小人继续。。。。
class PrimeNumberTest {public static void main(String[] args) {boolean isFlag = true; // 标识i是否被j除尽,一旦除尽,修改其值for(int i = 2; i <= 100; i++){ // 遍历100以内的自然数for(int j = 2; j < i; j++){ // j:被i去除if(i % j == 0){ // i被j除尽isFlag = false;}}if(isFlag == true){System.out.println(i);}// 重置isFlagisFlag = true;}}}
(第二版)【思路优化】
整体流程不变,主要是审核区的裁判,判定小人是不是质数的时间变快了
class PrimeNumberTest1 {public static void main(String[] args) {boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值int count = 0;//记录质数的个数for(int i = 2;i <= 100;i++){//遍历100以内的自然数//优化二:对本身是质数的自然数是有效的。//for(int j = 2;j < i;j++){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);count++;}//重置isFlagisFlag = true;}System.out.println("质数的个数为:" + count);}}
(第三版)【思路优化】
小人不用再穿马甲了,每个小人排队从前门进入审核区,如果裁判认定小人不是质数,小人当场就消失了,
下一个小人补入继续判断,只有判定是质数的小人才能从后门进入景点。
class PrimeNumberTest2 {public static void main(String[] args) {int count = 0;//记录质数的个数label: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除尽continue label;}}//能执行到此步骤的,都是质数count++;}System.out.println("质数的个数为:" + count);}}
3.4.3 关键字(break、continue、return)



break 与 continue 的比较:
class BreakContinueTest {public static void main(String[] args) {for(int i = 1;i <= 10;i++){if(i % 4 == 0){break;//123//continue;//123567910//System.out.println("今晚迪丽热巴要约我!!!"); // 会报错}System.out.print(i);}//******************************label:for(int i = 1;i <= 4;i++){for(int j = 1;j <= 10;j++){if(j % 4 == 0){//break;//默认跳出包裹此关键字最近的一层循环。//continue;//break label;//结束指定标识的一层循环结构continue label;//结束指定标识的一层循环结构当次循环}System.out.print(j);}System.out.println();}}}

