昨天的代码补充(if-else,随机数)
/* 编写程序,由键盘输入三个整数分别存入变量num1,num2,num3。 对它们进行排序(使用 if-else if-else),并且从小到大输出 说明: 1.if-else结构可以相互嵌套使用 2.如果if-else结构中的执行语句中只有一行时,相应的一对{}大括号可以省略,但不建议这样做 */ import java.util.Scanner; class IfTest2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入第一个整数"); int num1 = scanner.nextInt(); System.out.println("请输入第二个整数"); int num2 = scanner.nextInt(); System.out.println("请输入第三个整数"); int num3 = scanner.nextInt(); if (num1 > num2){ if(num3 > num1){ System.out.println(num2 + "," + num1 + "," + num3); }else if (num3 <= num2){ System.out.println(num3 + "," + num2 + "," + num1); }else{ System.out.println(num2 + "," + num3 + "," + num1); } }else{ if(num3 > num2){ System.out.println(num1 + "," + num2 + "," + num3); }else if (num3 <= num1){ System.out.println(num3 + "," + num1 + "," + num2); }else{ System.out.println(num1 + "," + num3 + "," + num2); } } //如何获取一个随机数:10 - 99 double value = (int)(Math.random()*90) + 10;//[0.0,1.0) -->[10.0,100.0)-->[10,99] System.out.println(value); //公式:[a,b] : (int)(Math.random()*(b - a + 1) + a) } }
2.5.3 switch-case结构
/* 分支结构之二:switch-case 1.格式 switch(表达式){ case 常量1: 语句1; //break; case 常量2: 语句2: //break; .... case 常量N: 语句N: //break; default: 语句N; //break; } 2.说明: ①根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,则进入相应case结构中,调用其执行语句。 当调用完执行语句后,则仍然继续向下执行其他case结构中的执行语句, 直到遇到break关键字或此switch-case结构末尾结束为止 ②break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构 ③switch结构的表达式,只能是如下的6种数据类型之一: byte,short,char,int,枚举类型(jdk5.0新增),String(7.0新增) ④case之后只能声明变量,不能声明范围 ⑤break关键字是可选的 ⑥default:相当于if-else中的else。 default结构是可选的。 */ class SwitchCaseTest { public static void main(String[] args) { int number = 5; switch(number){ case 0: System.out.println("zero"); break; case 1: System.out.println("one"); break; case 2: System.out.println("two"); break; case 3: System.out.println("three"); break; default: System.out.println("other"); } } }
合并特性说明
/* 例题:对学生成绩大于60分的,输出"合格",低于六十分的输出"不合格" 说明: 如果switch-case结构中的多个case执行语句相同,可以合并 */ class SwitchTest1{ public static void main(String[] args) { /* int score = 78; switch(score){ case 0: case 1: ..... case 100: }*/ int score = 78; switch(case/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; } } }
2.5.4循环结构
在某些条件满足的情况下,反复执行代码的功能。
/* For循环结构的使用 一、循环结构的四个要素 ①初始化条件 ②循环条件 --->循环条件是boolean类型 ③循环体 ④迭代条件 二、for循环的结构 for(①;②;){ ③ } 执行过程:① - ② - ③ - ④ - ② - ③ -.....- ② */ class ForTest { public static void main(String[] args) { for (int i = 1;i <= 5 ;i++ ){//i=1,2,3,4,5 System.out.println("Hello World"); } //练习: int num = 1; for (System.out.print('a');num <= 3 ;System.out.print('c'),num++){ System.out.print('b'); } //输出结果:abcbcbc //例题:遍历100以内的偶数,要输出所有偶数的和 int sum = 0;//记录所有偶数的和 for (int i = 1;i <= 100 ;i++ ){ if(i % 2 == 0){ System.out.println(i); sum += i; } } System.out.println("总和为:" + sum); } }
练习题1:
/* if else 练习题 说明: else结构是可选的 2.针对于条件表达式: >如果多个条件表达式之间是"互斥"的关系(或没有交集的关系),哪个判断和执行语句声明在上面还是在下面,无所谓 >如果多个条件表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构声明在上面 >如果多个条件表达式之间有包含关系,通常情况下需要将范围小的声明在范围大的上面,否则范围小的就没有机会运行了 */ import java.util.Scanner; class IfTest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入你的成绩(0-100):"); int score = scan.nextInt(); if (score == 100){ System.out.println("BMW"); }else if (score > 80 && score <= 99){ System.out.println("iphone"); }else if (score > 60 && score <= 80){ System.out.println("ipad"); }else{ System.out.println("none"); } } }
练习题2:
/* 题目:输入两个正整数m和n,求其最大公约数和最小公倍数 */ import java.util.Scanner; class ForTest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入第一个正整数:"); int m = scan.nextInt(); System.out.println("请输入第一个正整数:"); int n = scan.nextInt(); //获取最大公约数 //获取两个数中的最小值 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就跳出循环 } } //获取最小公倍数 //获取两个数中的较大值 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; } } } }
2.5.5Do-While循环
/* do-while循环使用 一、循环结构的四个要素 ①初始化条件 ②循环条件 --->循环条件是boolean类型 ③循环体 ④迭代条件 二、do-while循环结构 1 do{ 3; 4; }while{2}; 执行过程1-3-4-2-3-4.......-2 说明: 1.do-while循环至少会执行一次循环体 2.开发中,使用for和while更多一些,较少使用do-while */ class DoWhileTest { public static void main(String[] args) { //遍历100以内的偶数,并计算所有偶数的和及偶数的个数 int sum = 0;//记录总和 int count = 0;//记录个数 int num = 1; do{ if (num % 2 == 0){ System.out.println(num); sum += num; count++; } num++; }while(num <=100); System.out.println("总和为" + sum); System.out.println("个数为" + count); //****************** int number1 = 10; while(number1 > 10){ System.out.println("Hello-while") ; number1--; } int number2 = 10; do{ System.out.println("Hello-do"); number2--; }while(number2 > 10); } }
2.5.6 while(true)
/* 题目: 从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时程序结束。 说明: 1.不在循环条件部分限制次数的结构;for(;;)或while(true) 2.结束循环有几种方式: 方式一:循环条件部分返回false 方式二:在循环体中,执行break */ import java.util.Scanner; class ForWhileTest { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int positiveNumber = 0;//记录正数的个数 int negativeNumber = 0;//记录负数的个数 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); } }
2.5.7嵌套循环
/* 嵌套循环的使用 1.嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环 2. 外层循环:循环结构B 内层循环:循环结构A 3.说明 内层循环结构遍历一遍,只相当于外层循环循环体执行了一次 假设外层循环需要执行m次,内层循环需要执行n次,此时内层循环的循环体一共执行了m*n次 4.技巧:外层循环控制行数,内层循环控制列数 */ class ForForTest{ public static void main(String[] args) { //****** System.out.println("******"); for(int i = 1;i <= 6;i++){ System.out.print("*"); } System.out.println(); //**************************** for(int j = 1;j <= 4;j++){ for(int i = 1;i <= 6;i++){ System.out.print("*"); } System.out.println(); } //************************ for (int i = 1;i <= 5 ;i++){//控制行数 for (int j = 1;j <= 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("*"); } System.out.println(); } //**************** //上半部分 //下半部分 } }
练习题3(质数)
/* 100以内所有质数的输出 质数:素数,只能被1和它本身整除的自然数.-->从2开始到这个数-1结束为止,都不能被这个数本身整除 最小的质数是2 */ 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++ ){//被i去除 if (i % j == 0){//i被j除尽 isFlag = false; } } // if(isFlag == true){ System.out.println(i); } //重置isFlag isFlag = true; } } }
练习题3 优化算法
/* 100以内所有质数的输出 质数:素数,只能被1和它本身整除的自然数.-->从2开始到这个数-1结束为止,都不能被这个数本身整除 最小的质数是2 优化方法 无优化 17083ms 优化1 2659ms 优化2 1066ms */ class PrimeNumberTest1 { public static void main(String[] args) { boolean isFlag = true;//表示i是否被j除尽 //获取当前时间的毫秒数 long start = System.currentTimeMillis(); for (int i = 2;i <= 100000 ;i++ ){//遍历100以内的自然数 for (int j = 2;j < Math.sqrt(i);j++ ){//被i去除 if (i % j == 0){//i被j除尽 isFlag = false; break;//优化一:只对本身非质数的自然数是有效的 } } // if(isFlag == true){ System.out.println(i); } //重置isFlag isFlag = true; } long end = System.currentTimeMillis(); System.out.println("所花费的时间为:" + (end-start)); } }
2.5.8特殊关键字的作用
break continue
/* break和continue关键字的使用 使用范围 循环中使用的作用(不同点) 相同点 switch-case break: 循环结构 结束当前循环 关键字后面不再执行语句 continue: 循环结构 结束当次循环 */ class BreakContinueTest { public static void main(String[] args) { for (int i = 1;i <= 10;i++ ){ if (i % 4 == 0){ break; } System.out.print(i); } System.out.println(); for (int i = 1;i <= 10;i++ ){ if (i % 4 == 0){ continue; } System.out.print(i); } } }