Java基础学习笔记:第二章(下)Java的流程控制

    技术2022-07-10  200

    知识点1:switch-case

    /* 从键盘分别输入年、月、日,判断这一天是当年的第几天 注:判断一年是否是闰年的标准: 1)可以被4整除,但不可被100整除 或 2)可以被400整除 */ import java.util.Scanner; class SwitchCaseTest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入年份:"); int year = scan.nextInt(); System.out.println("请输入月份:(1-12)"); int month = scan.nextInt(); System.out.println("请输入日:(1-31)"); 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: if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){//判断year是否是闰年 sumDays +=29; }else{ sumDays +=28; } //。。。。 case 2: sumDays +=31; case 1: sumDays += day; } System.out.println(year + "年" + month + "月" + day + "日是当前的第" + sumDays + "天"); } } switch-case中不一定要使用break /* 例题:对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。 */ class SwitchCaseTest1 { public static void main(String[] args) { int score = 78; /* if(score >= 60){ System.out.println("合格"); }else{ System.out.println("不合格"); } */ /* switch(score){ case 0: System.out.println("不合格"); break; case 1: //... } */ //方式一: switch(score / 10){ //0 - 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; } } } 说明:如果多个case结构的执行语句相同,则可以考虑合并执行语句。

    知识点2:for

    循环结构的4个要素 ① 初始化条件 ② 循环条件 --->boolean类型 ③ 循环体 ④ 迭代部分 for(①;②;④){ ③ } 执行过程:① - ② - ③ - ④ - ② - ③ - ④ - ② - ③ - ④ - .... - ② class ForTest { public static void main(String[] args) { /* System.out.println("Hello World!"); System.out.println("Hello World!"); System.out.println("Hello World!"); System.out.println("Hello World!"); System.out.println("Hello World!"); */ for(int i = 1;i <= 5;i++){// System.out.println("Hello World!"); } //此时出了for循环结构,所以此时的i不可用。 //System.out.println(i); //练习 int i = 1; for(System.out.print('a');i <= 3;System.out.print('c'),i++){ System.out.print('b'); } //输出结果:abcbcbc System.out.println(); //练习:遍历100以内的偶数,并计算偶数的和,偶数的个数 //体会:累加的思想 int sum = 0;//记录偶数的和 int count = 0;//记录偶数的个数 for(int j = 1;j <= 100;j++){ if(j % 2 == 0){ System.out.println(j); sum += j; count++; } } System.out.println("偶数总和为:" + sum); System.out.println("偶数个数为:" + count); } } 练习1 /* 编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行上打印出“foo”, 在每个5的倍数行上打印“biz”,在每个7的倍数行上打印输出“baz”。 */ class ForTest1 { public static void main(String[] args) { for(int i = 1;i <= 150;i++){ System.out.print(i + " "); if(i % 3 == 0){ System.out.print("foo "); } if(i % 5 == 0){ System.out.print("biz "); } if(i % 7 == 0){ System.out.print("baz "); } System.out.println(); } } } 练习2 /* 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 比如:12和20的最大公约数是4,最小公倍数是60。 说明:使用在循环中,表示一旦执行break,就跳出循环结构 */ class ForTest2 { public static void main(String[] args) { int m,n; m = 12; n = 20; //获取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("最大公约数为:" + i); break;//使用在循环中,表示一旦执行break,就跳出循环结构 } } //获取m和n的较大值 int max = (m > n)? m : n; for(int i = max;i <= m * n;i++){ if(i % m == 0 && i % n == 0){ System.out.println("最小公倍数为:" + i); break; } } } }

    知识点3:while

    ① 初始化条件 ② 循环条件 --->boolean类型 ③ 循环体 ④ 迭代部分 while循环的结构:while(){ ③ ④ } 执行过程:① ---------- ... - ② 说明: 1. for循环和while循环是可以相互转换的 2. while循环结束后,初始化条件中如果定义了变量,还可以继续使用。而for循环不可以。 class WhileTest { public static void main(String[] args) { //遍历100以内的偶数 int i = 1; while(i <= 100){ if(i % 2 == 0){ System.out.println(i); } //一定不要忘了迭代条件! i++; } // System.out.println(i);//101 } }

    知识点4:do-while

    ① 初始化条件 ② 循环条件 --->boolean类型 ③ 循环体 ④ 迭代部分 do-while循环的结构:do{ ③ ④ }while(); 执行过程:① ------- ... - ② 说明:do-while循环的循环体至少执行一次! 开发中使用forwhile居多。 class DoWhileTest { public static void main(String[] args) { //遍历100以内的偶数 int i = 1; do{ if(i % 2 == 0){ System.out.println(i); } i++; }while(i <= 100); //########测试:do-while至少会执行一次################ int num = 10; do{ System.out.println("hello,do-while!"); num--; }while(num > 10); //################# int num1 = 10; while(num1 > 10){ System.out.println("hello,while!"); num1--; } } }

    知识点5:嵌套循环

    嵌套循环的使用 1. 理解:在一个循环结构A的循环体中,又出现了另一个循环结构B。则构成嵌套循环。 其中,循环结构A称为外层循环;循环结构B称为内层循环 2. 外层循环每执行一次,内层循环就需要完成的遍历一遍所有的数据。 3. 外层循环遍历m次,内层循环遍历n次,则内层循环的循环体一共需要执行m * n次 4. 技巧:外层循环控制行数,内层循环控制列数 class ForForTest { public static void main(String[] args) { //******** for(int i = 1;i <= 8;i++){ System.out.print("*"); } System.out.println(); System.out.println(); /* ******** ******** ******** ******** ******** */ for(int i = 1;i <= 5;i++){//外层循环 for(int j = 1;j <= 8;j++){//内层循环 System.out.print("*"); } System.out.println(); } /* i j(*的个数) j == i * 1 1 ** 2 2 *** 3 3 **** 4 4 ***** 5 5 */ for(int i = 1;i <= 5;i++){ for(int j = 1;j <= i;j++){ System.out.print("*"); } System.out.println(); } /* i j(*的个数) i + j = 5 -> j = 5 - i **** 1 4 *** 2 3 ** 3 2 * 4 1 */ for(int i = 1;i <= 4;i++){ for(int j = 1;j <= 5 - i;j++){ System.out.print("*"); } System.out.println(); } /* ----* ---* * --* * * -* * * * * * * * * -* * * * --* * * ---* * ----* */ //上半部分 for(int i = 1;i <= 5;i++){ //- for(int j = 1;j <= 5 - i;j++){ System.out.print(" "); } //* for(int j = 1;j <= i;j++){ System.out.print("* "); } System.out.println(); } } } 练习:九九乘法表 /* 九九乘法表 1 * 1 = 1 1 * 2 = 2 2 * 2 = 4 1 * 3 = 3 ... 3 * 3 = 9 ... 1 * 9 = 9 ... 9 * 9 = 81 */ class NineNineTable { public static void main(String[] args) { for(int i = 1;i <= 9;i++){ for(int j = 1;j <= i;j++){ System.out.print(j + "*" + i + "=" + j * i + " "); } System.out.println(); } } }

    质数的输出

    基本实现: /* 100以内的所有质数 质数(素数):只能被1和它本身整除的自然数。 --> 从2开始到这个数-1为止,没有任何一个自然数是这个数本身的约数。 比如:2 3 5 7 11 .... 8 (2-7) */ class PrimeNumberTest { public static void main(String[] args) { /* 方式一: for(int i = 2;i <= 100;i++){ int count = 0; for(int j = 2;j < i;j++){ if(i % j != 0){ count++; } } if(count == i - 2){ System.out.println(i); } } */ //方式二 boolean flag = true; for(int i = 2;i <= 100;i++){ for(int j = 2;j < i;j++){ if(i % j == 0){ flag = false; } } if(flag){//if(flag == true){ System.out.println(i); } flag = true; } } } 优化以后: /* 100以内的所有质数 优化的操作 如何衡量一个算法的优劣? > 时间复杂度(更关注) > 空间复杂度 */ class PrimeNumberTest1 { public static void main(String[] args) { long start = System.currentTimeMillis();//开始时间 int count = 0;//记录质数的个数 boolean flag = true; for(int i = 2;i <= 100000;i++){ for(int j = 2;j <= Math.sqrt(i);j++){//优化二:临界值改为Math.sqrt(i) if(i % j == 0){ flag = false; break;//优化一:针对于非质数 } } if(flag){//if(flag == true){ //System.out.println(i); count++; } flag = true; } long end = System.currentTimeMillis();//结束时间 System.out.println("花费的时间为:" + (end - start));//14943 - 1675 - 543 System.out.println(count);//9592 } } 使用带标签的continue的实现: //使用带标签的continue的实现 class PrimeNumberTest2 { public static void main(String[] args) { l:for(int i = 2;i <= 100;i++){ for(int j = 2;j <= Math.sqrt(i);j++){//优化二:临界值改为Math.sqrt(i) if(i % j == 0){ continue l; } } System.out.println(i); } } }

    如何结束一个循环结构

    1. 循环结构如果不结束,那就是一个死循环! 2. 开发中,要避免出现死循环! 3. 如何结束一个循环结构呢? > 方式一:循环条件返回false > 方式二:循环体中执行break 4. while(true) 或 for(;;)的使用 练习 class ForWhileTest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int positiveNumber = 0;//记录正数的个数 int negativeNumber = 0;//记录负数的个数 for(;;){//while(true){ System.out.println("请输入一个整数。(退出请输入0)"); int num = scan.nextInt(); if(num == 0){ break; }else if(num > 0){//正数 positiveNumber++; }else{//负数 negativeNumber++; } } System.out.println("正数的个数为:" + positiveNumber); System.out.println("负数的个数为:" + negativeNumber); } }

    知识点6:break和continue

    /* break和continue关键字的使用 使用范围 在循环结构中表示的意思 共同点 break: switch-case 循环结构 跳出当前循环 在关键字的后面不能编写执行语句 continue: 循环结构 跳出当次循环 在关键字的后面不能编写执行语句 了解带标签的break和continue的使用 */ class BreakContinueTest { public static void main(String[] args) { for(int i = 1;i <= 10;i++){ if(i % 4 == 0){ //break; continue; //不能编写执行语句 //System.out.println("今晚迪丽热巴请我吃饭!!"); } System.out.print(i); } System.out.println("#######################"); //############################## label:for(int i = 1;i <= 5;i++){ for(int j = 1;j <= 10;j++){ if(j % 4 == 0){ //break;//默认:结束包裹break关键字的最近的一层循环。 //continue;//默认:结束包裹continue关键字的最近的一次循环。 //了解带标签的break和continue的使用 //break label; continue label; } System.out.print(j); } System.out.println(); } } }

    练习

    class Exer{ public static void main(String[] args){ int a = 10; int b = 35; int c = 45; int max; if(a >= b){ if(a >= c){ max = a; }else{ max = c; } }else{ if(b >= c){ max = b; }else{ max = c; } } System.out.println(max); //##################### int max1; if(a >= b && a >= c){ max1 = a; }else if(b >= a && b >= c){ max1 = b; }else{ max1 = c; } } } /* 编写程序:由键盘输入三个整数分别存入变量num1、num2、num3,对它们进行排序(使用 if-else if-else),并且从小到大输出。 */ import java.util.Scanner; class Exer1 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入第一个整数num1:"); int num1 = scan.nextInt(); System.out.println("请输入第二个整数num2:"); int num2 = scan.nextInt(); System.out.println("请输入第三个整数num3:"); int num3 = scan.nextInt(); if(num1 >= num2 && num1 >= num3){ if(num2 > num3){ System.out.println("从小到大排列为" + num3 +"-" + num2 + "-" + num1); }else{ System.out.println("从小到大排列为" + num2 + "-" + num3 + "-" + num1); } }else if(num1 <= num2 && num3 <= num2){ if(num1 > num3){ System.out.println("从小到大排列为" + num3 + "-" + num1 + "-" + num2); }else{ System.out.println("从小到大排列为" + num1 + "-" + num3 + "-" + num2); } }else if(num3 >= num1 && num3 >= num2){ if(num1 > num2){ System.out.println("从小到大排列为" + num2 + "-" + num1 + "-" + num3); }else{ System.out.println("从小到大排列为" + num1 + "-" + num2 + "-" + num3); } } //##################### Scanner scan = new Scanner(System.in); System.out.println("请输入第一个数字"); int num1 = scan.nextInt(); System.out.println("请输入第二个数字"); int num2 = scan.nextInt(); System.out.println("请输入第三个数字"); int num3 = scan.nextInt(); int temp = 0; if(num1 > num2){ temp = num2; num2 = num1; num1 = temp; } if(num1 > num3){ temp = num3; num3 = num1; num1 = temp; } if(num2 > num3){ temp = num3; num3 = num2; num2 = temp; } System.out.println("从小到大输出:" + num1 + " "+ num2 + " " + num3); //########推荐############# Scanner scan = new Scanner(System.in); System.out.println("请输入三个整数:"); int num1 = scan.nextInt(); int num2 = scan.nextInt(); int num3 = scan.nextInt(); if(num1 > num2 ){ if(num2 > num3){ System.out.println(num1 + "," + num2 + "和" + num3 +"的从小到大的顺序为:" + num3 + "," + num2 + "," + num1); }else if(num3 > num1){ System.out.println(num1 + "," + num2 + "和" + num3 +"的从小到大的顺序为:" + num2 + "," + num1 + "," + num3); }else{ System.out.println(num1 + "," + num2 + "和" + num3 +"的从小到大的顺序为:" + num2 + "," + num3 + "," + num1); } }else{ if(num2 < num3){ System.out.println(num1 + "," + num2 + "和" + num3 +"的从小到大的顺序为:" + num1 + "," + num2 + "," + num3); }else if(num3 < num1){ System.out.println(num1 + "," + num2 + "和" + num3 +"的从小到大的顺序为:" + num3 + "," + num1 + "," + num2); }else{ System.out.println(num1 + "," + num2 + "和" + num3 +"的从小到大的顺序为:" + num1 + "," + num3 + "," + num2); } } } } /* 编写程序:从键盘上输入2020年的“month”和“day”,要求通过程序输出输入的日期为2020年的第几天。 说明:在switch-case结构中不一定使用break。 */ import java.util.Scanner; class Exer2 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入月份:(1-12)"); int month = scan.nextInt(); System.out.println("请输入日:(1-31)"); 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; } } } /* 拓展1:见Exer3.java 已知2020年1月1日是星期三,从键盘输入2020年的任意一天,请判断它是星期几 */ import java.util.Scanner; class Exer3 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入月份:(1-12)"); int month = scan.nextInt(); System.out.println("请输入日:(1-31)"); 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; } String info; switch(sumDays % 7 ){ case 0: info = "星期二"; break; case 1: info = "星期三"; break; case 2: info = "星期四"; break; case 3: info = "星期五"; break; case 4: info = "星期六"; break; case 5: info = "星期日"; break; case 6: info = "星期一"; break; default: info = ""; } System.out.println(month + "月" + day + "日是2020年的" + info); } }
    Processed: 0.038, SQL: 9