1. 循环高级
1.1 无限循环
for、while、do...while都有无限循环的写法。
最为常用的是while格式的。
因为无限循环是不知道循环次数的,所以用while格式的
代码示例:
while(true){ }
1.2 跳转控制语句(掌握)
-
跳转控制语句(break)
-
跳出循环,结束循环
-
-
跳转控制语句(continue)
-
跳过本次循环,继续下次循环
-
-
注意: continue只能在循环中进行使用!而目前我们知道break仅只能在循环和switch中使用。
以下几个代码逻辑性较强,需认真看,认真思考。
练习1:逢7过
需求:
朋友聚会的时候可能会玩一个游戏:逢7过
游戏规则:从任意一个数字开始报数,当你要报的数字是包含7或者是7的倍数时都要说过:过
需求:使用程序在控制台打印出1-100之间的满足逢七必过规则的数据
代码示例:
public class LoopDemo4 { public static void main(String[] args) { //目标:听懂并且自己独立写出来 //核心: //不报数字的条件: //个位是7 十位是7 7的倍数 //三个条件只要满足一个,就不报数字 //游戏的规则 //1 2 3 4 5 6 过 8 9 10 11 12 13 过 15 16 过 18 19 20 过... //循环的开始条件:1 //结束条件:100 for (int i = 1; i <= 100; i++) { //i依次表示这个范围之内的每一个数字 if (i % 10 == 7 || i / 10 % 10 == 7 || i % 7 == 0) { System.out.println("过"); continue; } System.out.println(i); } } }
练习2:求平方根
需求:
键盘录入一个大于等于2的整数 x ,计算并返回 x 的 平方根 。
结果只保留整数部分 ,小数部分将被舍去 。
代码示例:
public class LoopDemo5 { public static void main(String[] args) { //目标:听懂思路并且自己独立写出来 //键盘录入10 // 1 * 1 = 1 < 10 // 2 * 2 = 4 < 10 // 3 * 3 = 9 < 10 // 4 * 4 = 16 > 10 //说明:10的平方根在3~4之间。保留整数之后:3 //键盘录入20 //1 * 1 = 1 < 20 // 2 * 2 = 4 < 20 // 3 * 3 = 9 < 20 // 4 * 4 = 16 < 20 // 5 * 5 = 25 > 20 //说明:20的平方根在4~5之间,保留整数之后:4 //键盘录入40 //1 * 1 = 1 < 40 // 2 * 2 = 4 < 40 // 3 * 3 = 9 < 40 // 4 * 4 = 16 < 40 // 5 * 5 = 25 < 40 // 6 * 6 = 36 < 40 // 7 * 7 = 49 > 40 //说明:40的平方根在6~7之间,保留整数之后:6 //思路: //从1开始循环,拿着循环得到的每一个数求平方。 //拿着结果,跟键盘录入的数字比较。 //如果平方之后的结果 == 录入的数字 表示当前数字就是我们题目的结果 //如果平方之后的结果 < 录入的数字 循环继续 //如果平方之后的结果 > 录入的数字 表示前一个数字就是我们题目的结果 //循环的开始条件:1 //循环的结束条件:键盘录入的数字 //1.键盘录入数字 Scanner sc = new Scanner(System.in); System.out.println("请输入一个整数"); int number = sc.nextInt(); //2.循环找结果 for (int i = 1; i <= number; i++) { //循环体 if (i * i == number) { System.out.println(number + "的平方根为" + i); //如果已经找到了,那么后面就不需要再运行了,循环直接停止 break; }else if(i * i > number){ System.out.println(number + "的平方根为" + (i - 1)); //如果已经找到了,那么后面就不需要再运行了,循环直接停止 break; } } } }
练习3:求质数
需求:
键盘录入一个正整数 x ,判断该整数是否为一个质数。
代码示例:
public class LoopDemo6 { public static void main(String[] args) { //目标:听懂思路并且自己独立写出来 //质数:只能被1和本身整除的数。 //7 是一个质数 //13 是一个质数 //8 不是一个质数 //25 不是一个质数 //1.键盘录入一个正整数 Scanner sc = new Scanner(System.in); System.out.println("请输入一个整数"); int number = sc.nextInt(); //2.利用循环进行判断 //思路一:从1开始到本身number结束,在这个范围之内,有多少个数字能被键盘录入的number整除 //如果只有两个,那么表示number是一个质数。 //思路二:从2开始到number-1结束,在这个范围之内,有多少个数字能被number整除 //如果没有数字,那么表示number是一个质数。 //思路二循环的开始条件:2 //循环的结束条件:number-1 int count = 0; for (int i = 2; i < number; i++) { //i依次表示,2~ number-1 这个范围之内的每一个数字 //要求的是,在这个范围之内,有多少个数字能被number整除 if(number % i == 0){ count++; } } //当循环结束之后,表示我们已经找到了,在2 ~ number-1 这个范围之内,有多少个数字能被number整除 if(count == 0){ System.out.println(number + "是一个质数"); }else{ System.out.println(number + "不是一个质数"); } } }
以上几个代码是初学者比较难啃的几个编程思维,不懂得要好好琢磨。慢慢就懂了。
2. Random
Random产生随机数(掌握)
-
概述:
-
Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能
-
API后续课程详细讲解,现在可以简单理解为Java已经写好的代码
-
-
-
使用步骤:
-
导入包
import java.util.Random;
-
创建对象
Random r = new Random();
-
产生随机数
int num = r.nextInt(10);
解释: 10代表的是一个范围,如果括号写10,产生的随机数就是0-9,括号写20,参数的随机数则是0-19
扩展点:如果第三步没有指定范围,那么会在int的取值范围中获取一个随机数。
-
-
示例代码:
import java.util.Random; public class RandomDemo { public static void main(String[] args) { //创建对象 Random r = new Random(); //用循环获取10个随机数 for(int i=0; i<10; i++) { //获取随机数 int number = r.nextInt(10); System.out.println("number:" + number); } //需求:获取一个1-100之间的随机数 int x = r.nextInt(100) + 1;//仔细思考为什么这样写?很精妙 System.out.println(x); } }
Random练习-猜数字小游戏
-
需求:
程序自动生成一个1-100之间的数字,使用程序实现猜出这个数字是多少?
当猜错的时候根据不同情况给出相应的提示
A. 如果猜的数字比真实数字大,提示你猜的数据大了
B. 如果猜的数字比真实数字小,提示你猜的数据小了
C. 如果猜的数字与真实数字相等,提示恭喜你猜中了
-
示例代码:
import java.util.Random; import java.util.Scanner; public class RandomTest { public static void main(String[] args) { //要完成猜数字的游戏,首先需要有一个要猜的数字,使用随机数生成该数字,范围1到100 Random r = new Random(); int number = r.nextInt(100) + 1; while(true) { //使用程序实现猜数字,每次均要输入猜测的数字值,需要使用键盘录入实现 Scanner sc = new Scanner(System.in); System.out.println("请输入你要猜的数字:"); int guessNumber = sc.nextInt(); //比较输入的数字和系统产生的数据,需要使用分支语句。 //这里使用if..else..if..格式,根据不同情况进行猜测结果显示 if(guessNumber > number) { System.out.println("你猜的数字" + guessNumber + "大了"); } else if(guessNumber < number) { System.out.println("你猜的数字" + guessNumber + "小了"); } else { System.out.println("恭喜你猜中了"); break; } } } }
运行如下:
猜数字小游戏扩展1:(掌握)
生成随机数的代码不能写在循环里面。
否则,每猜一次,都会产生一个新的随机数。
猜数字小游戏扩展2:(了解)
很多游戏中,都会有保底机制。
假设,在猜数字小游戏中,三次猜不中就触发保底机制
代码示例:
import java.util.Random; import java.util.Scanner; public class RandomDemo2 { public static void main(String[] args) { //分析: //1.生成一个1-100之间的随机数字 Random r = new Random(); //扩展1:生成随机数的代码,不能写在循环里面,否则每一次都会生成一个新的随机数 //扩展2:保底机制3次 //定义变量记录猜的次数 int count = 0; int number = r.nextInt(100) + 1; System.out.println(number); //2.使用键盘录入的方式去猜 Scanner sc = new Scanner(System.in); while (true) { System.out.println("请输入你要猜的数字"); int guessNumber = sc.nextInt(); //每猜一次,count就++ count++; //判断当前是第几次 //如果达到了保底,直接提示猜中了 if(count == 3){ System.out.println("猜中了"); break; } //3.拿着键盘输入的数字 跟 随机数比较判断 if (guessNumber > number) { System.out.println("大了"); } else if (guessNumber < number) { System.out.println("小了"); } else { System.out.println("猜中了"); break; } } } }
注意: 这里回顾以下,之前在第二天讲的idea有一个设置是自动导包设置,不知道大家还有没有印象,这里就用到了,我们在写代码
Random r = new Random();
的时候,可能你不知道这个类在哪个包,但是我们设置了自动导包,因此文件头部会自动给我们填充上
import java.util.Random;
这就是自动导包设置的好处。