Java语法基础案例(二)
目录
案例六:抢红包
一个大V直播时发起了抢红包活动,分别有: 9、666、 188、520、 99999五个红包。请模拟粉丝来抽奖,按照先来先得,随机抽取,抽完即止,注意:一个红包只能被抽一-次,先抽或后抽哪一个红包是随机的。
方法:写个for循环控制抽奖5次,每次抽奖,都从数组中随机找出一个金额,如果该金额不是0,则代表抽中,接着用0替换该位置处的金额,然后继续下一个粉丝的抽奖;如果抽中的金额发现是0,代表该位置处的红包之前被别人抽走了,则从新从数组中随机找出一个金额,继续判断!直至抽中的金额不是0!
代码:
package com.itheima;
import java.util.Random;
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
int[] moneys={9,66,188,520,99999};
start(moneys);
}
public static void start(int[] moneys){
//假设money=[9,66,188,520,99999]
Scanner sc=new Scanner(System.in);
Random r=new Random();//随机数对象
//定义一个for循环,控制抽奖五次
for (int i = 1; i <= 5; i++) {
System.out.println("请您输入任意内容进行抽奖");
sc.next();//等待用户输入内容,回车才往下走
//为当前粉丝随机一个红包出来
while (true) {//除非抽到不等于0的红包,否则一直抽
int index = r.nextInt(moneys.length);//获得0-4的随机索引
int money = moneys[index];//将对应索引的钱取出来
//判断这个红包不为0
if (money != 0) {
System.out.println("恭喜您,您抽中了红包:" + money + "元");
moneys[index] = 0;
break;//结束这次抽奖
}
}
}
System.out.println("活动结束");
}
}
案例七:找素数
素数:除了1和它本身,不能被其他正整数整除就叫素数,比如3,7就是素数,9,21不是素数
方法一:
方法内部的实现逻辑:使用for循环来产生如101到200之间的每个数;每拿到一个数,判断该数是否是素数;判断规则是:从2开始遍历到该数的一半的数据,看是否有数据可以整除它,有则不是素数,没有则是素数;根据判定的结果来决定是否输出这个数据( 是素数则输出) ;最后还需要统计素数的个数并返回。
代码:
package com.itheima;
public class Test7 {
public static void main(String[] args) {
System.out.println("当前素数的个数是"+search(101, 200));
}
public static int search(int start, int end) {
int count = 0;
//假设start=101 end=200
for (int i = start; i <= end; i++) {
boolean flag = true;
for (int j = 2; j <= i / 2; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag) {
System.out.println(i);
count++;
}
}
return count;
}
}
方法二:
每当i%j==0时,这个数就已经不是素数了,没有向下循环的必要,而break和continue只能结束当前循环,所以我们需要为外部循环指定一个标签,从而直接跳出外部循环进行下一个数字的判断
代码
package com.itheima;
public class Test7 {
public static void main(String[] args) {
System.out.println("当前素数的个数是"+search(101, 200));
}
public static int search(int start, int end) {
int count = 0;
Out://为外部循环指定标签
//假设start=101 end=200
for (int i = start; i <= end; i++) {
for (int j = 2; j <= i / 2; j++) {
if (i % j == 0) {
continue Out;//直接跳出外部循环
}
}
count++;
System.out.println(i);
}
return count;
}
}
方法三:
直接将判断素数的过程定义为一个方法,通过判断方法是否true来输出素数并计数
package com.itheima;
public class Test7 {
public static void main(String[] args) {
System.out.println("当前素数的个数是"+search(101, 200));
}
public static int search(int start, int end) {
int count=0;
for (int i = start; i <=end ; i++) {
if (check(i)){
System.out.println(i);
count++;
}
}
return count;
}
public static boolean check(int data){
for (int i = 2; i <data ; i++) {
if (data%i==0){
return false;
}
}
return true;
}
}
案例八:实现双色球
模拟双色球:业务分析,用户投注一组号码
设计步骤:
1.让用户投注一组号码,并返回用户投注的号码
2.系统随机一组中奖号码,并返回这组中奖号码
3.传入两组号码,用来判断用户投注号码的中奖情况,并输出
代码:
package com.itheima;
import java.util.Random;
import java.util.Scanner;
public class Test8 {
public static void main(String[] args) {
int[] userNumbers=userSelectNumbers();
System.out.println("您投注的号码:");
printArray(userNumbers);
int[] luckNumbers=createLuckNumbers();
System.out.println("中奖的号码:");
printArray(luckNumbers);
judge(userNumbers,luckNumbers);
}
public static void printArray(int[] arr){//输出数组
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(i==arr.length-1?arr[i]:arr[i]+",");//判断循环已经到达数组的最后一个位置,如果到达则直接打印数组中的数,如果没到则打印的数字后加一个逗号
}
System.out.println("]");
}
public static int[] userSelectNumbers() {//此方法用于让用户投注一组号码并返回
int[] numbers = new int[7];//前六个是红球最后一个是蓝球
Scanner sc = new Scanner(System.in);
for (int i = 0; i < numbers.length - 1; i++) {
while (true) {
System.out.println("请您输入第" + (i + 1) + "个红球号码(1-33之间,不难重复)");
int number = sc.nextInt();
if (number < 1 || number > 33) {//判断号码是否在1-33之间
System.out.println("对不起,您输入的红球号码不在1-33之间,请确认!");
} else {
if (exist(numbers, number)) {//判断号码是否重复
System.out.println("对不起,您当前输入的红球号码与前面的号码重复了,请确认!");
} else {
numbers[i] = number;
break;//结束当前死循环
}
}
}
}
//投注最后一个蓝球号码
while (true) {
System.out.println("请您输入最后一个蓝球号码(1-16)");
int number = sc.nextInt();
if (number < 1 || number > 16) {
System.out.println("对不起,您输入的蓝球号码范围不对哦!");
} else {
numbers[6] = number;
break;//蓝球号码录入成功,结束死循环
}
}
return numbers;
}
public static boolean exist(int[] numbers, int number) {//判断number这个数字是否在numbers这个数组中存在,也就是判断输入的数字是否重复
for (int i = 0; i < numbers.length; i++) {
if (numbers[i]==0){
break;
}
if (numbers[i] == number) {
return true;
}
}
return false;
}
public static int[] createLuckNumbers(){//随机中奖号码
int[] numbers=new int[7];
Random r=new Random();
for (int i = 0; i < numbers.length-1; i++)
while (true) {
{
//为当前位置随机一个红球号码存入 1-33==>-1==>(0-32)+1
int number=r.nextInt(33)+1;
//判断这个号码是否之前出现过(红球号码不难重复)
if (!exist(numbers,number)){
numbers[i]=number;
break;//结束死循环
}
}
}
//随机一个蓝球号码
numbers[6]=r.nextInt(16)+1;
return numbers;
}
public static void judge(int[] userNumbers,int[] luckNumbers){//判断用户的中奖情况
//分别定义2个变量用于记住红球命中了几个以及蓝球命中了几个
int redBall=0;
int blueBall=0;
//先判断红球命中的数量
for (int i = 0; i < userNumbers.length-1; i++) {
for (int j = 0; j < luckNumbers.length-1; j++) {
if (userNumbers[i]==luckNumbers[j]){
redBall++;
break;
}
}
}
//判断蓝球是否命中
blueBall=userNumbers[6]==luckNumbers[6]?1:0;
System.out.println("您命中的红球数量是:"+redBall+"个");
System.out.println("您命中的蓝球数量是:"+blueBall+"个");
if (redBall==6&&blueBall==1){
System.out.println("恭喜您,中奖1000万,不用当程序员了");
}
else if (redBall==6&&blueBall==0){
System.out.println("恭喜您,中奖500万,不用担心裁员了");
}
else if (redBall==5&&blueBall==1){
System.out.println("恭喜您,中奖3000元,可以出去吃顿小龙虾了");
}
else if (redBall==5&&blueBall==0||redBall==4&&blueBall==1){
System.out.println("恭喜您中奖200元");
}
else if (redBall==4&&blueBall==0||redBall==3&&blueBall==1){
System.out.println("中了10元");
}
else if (redBall==3&&blueBall==1){
System.out.println("中了5元");
}else {
System.out.println("谢谢惠顾~");
}
}
}
关于本项目所用所有方法的解释:
public static void printArray(int[] arr){:输出数组
通过遍历数组输出数组,需要注意的点是判断输出的数字是否已经到达了数组的最后一个位置,如果是则不需要加逗号了
public static int[] userSelectNumbers()
:使用户输入号码
此方法用于让用户投注一组号码并返回,红球与蓝球分开输入,红球要6个,在数组的位置是numbers.length - 1及之前的,需要注意判断输入的数字是否在1-33之间已经是否重复,符合要求就存入数组,蓝球则直接定位到数组下标为6的地方,其余注意的地方与红球相同,特别要注意这里所用的死循环的秒处
public static boolean exist(int[] numbers, int number)
:判断重复
判断number这个数字是否在numbers这个数组中存在,也就是判断输入的数字是否重复,其中
if (numbers[i]==0){
break;
}
的应用使代码更加简洁,减去了多余的无用的运行
public static int[] createLuckNumbers()
:随机中奖号码,与用户输入时类似,唯一需要注意的是以为想让系统随机1-33之间的数,所以用到了减加法,1-33==>-1>==>(0-32)+1
r.nextInt(33)+1;
即可随机1-33之间的数字
r.nextInt(16)+1;
即可随机1-16之间的数字
public static void judge(int[] userNumbers,int[] luckNumbers)
:判断用户的中奖情况,使用嵌套循环数组遍历判断红球的命中情况,对于判断奖项问题只是纯粹的if...else if问题。