Day06
案例
案例1:买飞机票
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ldd9HlXA-1668773841245)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221116101055756.png)]
package com.itheima.demo;
import java.util.Scanner;
public class Demo01 {
//用户购买机票时,机票原价会按照淡季、旺季,头等舱还是经济舱的情况进行相应的优惠,优惠方案如下:
// 5-10月为旺季,头等舱9折,经济舱8.5折; 11月到来年4月为淡季,头等舱7折,经济舱6.5折,
// 请开发程序计算出用户当前机票的优惠价。
//接收数据:原价机票价,月份,座位类型
//返回优惠机票价
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入原价机票价");
double money = sc.nextDouble();
System.out.println("请输入月份,(1-12数字)");
int mouth = sc.nextInt();
System.out.println("请输入座位类型(头等舱/经济舱)");
String type = sc.next();
double discountPrice = getDiscountPrice(money,mouth,type);
System.out.println("优惠机票价: "+discountPrice);
}
public static double getDiscountPrice(double money, int mouth, String type) {
if (mouth >= 5 && mouth <= 10) {
switch (type) {
case "头等舱":
money *= 0.9;
break;
case "经济舱":
money *= 0.85;
break;
default:
money = -1;//返回一个-1特殊值,说明不正确
System.out.println("座位类型输入有误");
}
} else if (mouth >= 11 && mouth <= 12 || mouth >= 1 && mouth <= 4) {
switch (type) {
case "头等舱":
money *= 0.7;
break;
case "经济舱":
money *= 0.65;
break;
default:
money = -1;//返回一个-1特殊值,说明不正确
System.out.println("座位类型输入有误");
}
}else {
System.out.println("月份输入有误");
}
return money;
}
}
案例2:验证码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ZsvEnhO-1668773841246)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221116101232863.png)]
package com.itheima.demo;
import java.util.Random;
import java.util.Scanner;
public class Demo02 {
//开发一个程序,可以生成指定位数的验证码,每位可以是数字、大小写字母。
public static void main(String[] args) {
System.out.println(getCode(5));
System.out.println(getCode(7));
}
public static String getCode(int num) {
//1.定义一个空字符串
String code = "";
//random随机字符
Random r = new Random();
//2.for循环,生成随机随机字符
for (int i = 0; i < num; i++) {
//3.先生成随机数:0:大写字母 1:小写字母 2:数字
int type = r.nextInt(3);
//4.得到随机数后判断判断随机生成的是大写字母,小写字母,还是数字,值匹配switch
//每个case里生成随机字符
switch (type) {
//生成随机大写字母,通过ASCII码
//A:65 共26个字母 故Z:65+26-1=90
//范围:65-90
case 0:
char i1 = (char) (r.nextInt(26) + 65);//生成的int,但是需要字符 int -->char 强制转换
code += i1;//运算中有字符串,+为拼接
break;
case 1:
//a:97 26 z:122
char i2 = (char) (r.nextInt(26) + 97);//生成的int,但是需要字符 int -->char 强制转换
code += i2;//运算中有字符串,+为拼接
break;
case 2:
int i3 = r.nextInt(10);
code += i3;
break;
}//因为只有这三种情况,一定会匹配其中一种故不需要写default;
}
return code;
}
}
案例3:评委打分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eiTtckL3-1668773841246)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221116111526023.png)]
package com.itheima.demo;
import java.util.Random;
import java.util.Scanner;
public class Demo03 {
//在唱歌比赛中,可能有多名评委要给选手打分,分数是[0 - 100]之间的整数。
// 选手最后得分为:去掉最高分、最低分后剩余分数的平均分,
// 请编写程序能够录入多名评委的分数,并算出选手的最终得分
public static void main(String[] args) {
System.out.println("选手的最终得分:"+getScore(5));
}
public static double getScore(int num) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[num];
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第"+(i+1)+"位评委的分数(0-100的整数)");
// int i1 = sc.nextInt();
// arr[1] = i1;
arr[i] = sc.nextInt();//注意简写方便!!!
}
int max = arr[0];
int min = arr[0];
int sum = 0;
//三件事儿可以一个循环搞定!
for (int i = 0; i < arr.length; i++) {
if (arr[i]>max){
max = arr[i];
}
if (arr[i]<min){
min = arr[i];
}
sum += arr[i];
}
// for (int i = 0; i < arr.length; i++) {
// if (arr[i] > max) {
// max = arr[i];
// }
// }
//
// for (int i = 0; i < arr.length; i++) {
// if (arr[i]<min){
// min = arr[i];
// }
// }
// for (int i = 0; i < arr.length; i++) {
// sum += arr[i];
// }
double score = (sum-max-min)*1.0/(num-2); //不加*1.0,右边结果是int,会把小数部分舍弃
return score;
}
}
案例4:数字加密
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jIsClWnr-1668773841247)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221116120121100.png)]
package com.itheima.demo;
public class Demo04 {
//某系统的数字密码是一个四位数,如1983,为了安全,需要加密后再传输,
// 加密规则是:对密码中的每位数,都加5,再对10求余,最后将所有数字顺序反转,得到一串加密后的新数,
// 请设计出满足本需求的加密程序!
//这个程序既可以加密也可以解密
public static void main(String[] args) {
System.out.println("加密后的新数"+encrypt(1983));
}
//encrypt加密 ,decrypt解密
public static String encrypt(int num) {
//1.将整数拆成数组
int[] arr = new int[4];
arr[0] = num / 1000;
arr[1] = num / 100 % 10;
arr[2] = num / 10 % 10;
arr[3] = num % 10;
//2.对数组元素加密
for (int i = 0; i < arr.length; i++) {
arr[i] = (arr[i]+5)%10;
}
//3.反转数组元素
for (int i = 0,j =arr.length-1; i < j; i++,j--) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
//4.拼接元素
String pwd = "";
for (int i = 0; i < arr.length; i++) {
pwd += arr[i];
}
return pwd;
}
}
案例5:拷贝数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8vvo56Lb-1668773841247)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221116123813960.png)]
package com.itheima.demo;
public class Demo05 {
//请把一个整型数组,例如存了数据:11,22,33,拷贝成一个一模一样的新数组出来。
public static void main(String[] args) {
int[] arr = {11, 22, 3};
int[] arr2 = newArray(arr);
printArray(arr2);
}
public static void printArray(int[] arr2) {
System.out.print("[");
for (int i = 0; i < arr2.length; i++) {
System.out.print(i == arr2.length - 1 ? arr2[i] : arr2[i] + ",");//因为最后一个就不用逗号了,所以这样写
}
System.out.println("]");
}
//需要返回一个数组,数组:数据类型[]
public static int[] newArray(int[] arr) {
int[] arr2 = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
arr2[i] = arr[i];
}
return arr2;
}
}
案例6:找素数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cgtKSRY7-1668773841248)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221116150241936.png)]
关键点:标记符
package com.itheima.demo;
public class Demo06 {
//找素数 101-200,输出全部
//说明:除了1和它本身以外,不能被其他正整数整除,就叫素数。
//比如:3、7就是素数,而9、21等等不是素数。
public static void main(String[] args) {
int count = getPrimeNumber(101, 200);
System.out.println("101-200素数个数为:"+count);
}
public static int getPrimeNumber(int n, int m) {
//定义一个空变量接素数个数
int count = 0;
//我们要计算一个数是否为,素数,那么就要判断除了1还有本身是否能被其他数整除
//先通过for循环,把101-200的数都遍历出来;
for (int i = n; i <= m; i++) {
//使用一个标记,标记(假设)当前数为素数
boolean flag = true;
//循环遍历2到i-1的数,
// 这里有一个注意点,减少我们的遍历量,就是遍历到当前数的一半,
//若一个数不是素数,如:102 = 2*51, 111 = 2*55.5,一定有小于它一半的数可以除它
for (int j = 2; j <= i / 2; j++) {
if (i % j == 0) {
//说明有数可以整除它,那么之前的假设就不成立
flag = false;
//只要找到一个数可以整除它就说明它不是素数,就不需要再继续执行本循环体了,故用break
break;
}//这里不可以用else,System.out.println();,因为这里只判断了2-i/2的一个数,不能说明它不是质素
//比如:9,它不可以被2除,但是可以被3除,当 j= 2 时,不走if里面的,也不能说明9是素数
}
//这里不可以直接System.out.println(i是素数);因为,不管上面如何,这里遍历的每个i都会输出,不对
//需要判断
if (flag == true) {
System.out.println(i);
count++;
}
}
return count;
}
}
案例7:双色球
1.用户投注一组号码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gYQZISq6-1668773841249)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221116162532971.png)]
2.随机一组中奖号码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OEqWvIfn-1668773841250)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221116173337268.png)]
3.判断中奖情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9P8alqvh-1668773841251)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221116173415706.png)]
package com.itheima.demo;
import java.util.Random;
import java.util.Scanner;
public class Demo08 {
public static void main(String[] args) {
int[] useSelectNumbers= useSelectNumbers();
// printArray(useSelectNumbers);
int[] creatLuckyNumbers = creatLuckyNumbers();
// printArray(creatLuckyNumbers);
judge(useSelectNumbers,creatLuckyNumbers);
}
//需求3:判断用户是否中奖
public static void judge(int[] useSelectNumbers,int[] creatLuckyNumbers) {
//1.定义两个变量进行红球,蓝球个数统计
int red = 0;
int blue = 0;
//2.统计红球,遍历useSelectNumbers
for (int i = 0; i < useSelectNumbers.length-1; i++) {
//3.自己选的号码与中奖号码红色球一一对比,遍历creatLuckyNumbers
for (int i1 = 0; i1 < creatLuckyNumbers.length; i1++) {
if (useSelectNumbers[i] == useSelectNumbers[i1]) {
red++;
break;//因为红色球不允许重复,故只要匹配了,就跳出循环即可
}
}
}
blue = useSelectNumbers[6] == creatLuckyNumbers[6] ? ++blue : blue;//三元运算符 ++blue先加1,再运算
System.out.println("中红球个数为:" + red);
System.out.println("中红球个数为:" + blue);
//4.判断是否中奖
if (red == 1 && blue ==1){
System.out.println("5元");
}else if (red==3 && blue==1 || red==4){
System.out.println("10元");
}else if (red==4 && blue==1 || red==5) {
System.out.println("200元");
}else if (red==5 && blue==1 ){
System.out.println("3000元");
} else if (red==6 ) {
System.out.println("500万元");
}else if (red==6 && blue==1 ){
System.out.println("1000万元");
}else {
System.out.println("没有中");
}
}
//需求2:随机一组中奖号码出来
public static int[] creatLuckyNumbers() {
//1.动态初始化数组
int[] numbers = new int[7];
Random r = new Random();
//2.遍历,获取随机数,红球
for (int i = 0; i < numbers.length-1; i++) {
while (true) {
int red = r.nextInt(33)+1;
//判断是否重复
boolean exists = isExists(numbers, red);
if (exists == false){
numbers[i] = red;
break;
}else {
}
}
}
int blue = r.nextInt(16) + 1;
numbers[6] = blue;
return numbers;
}
//需求1:双色球用户投注一组号码
//6个红球号码的范围是1-33之间,且不能重复;1个蓝球号码的范围在:1-16之间。
public static int[] useSelectNumbers() {
//1.动态初始化数组
int[] numbers = new int[7];
Scanner sc = new Scanner(System.in);
//2.遍历数组,让用户选择6个红色球 ,因为红色与蓝色范围不一样
for (int i = 0; i < numbers.length-1; i++) {
while (true) {//选中在死循环内的代码,ctrl+alt+t
// 3.接收用户输入的号码
System.out.println("请输入第"+(i+1)+"个号码(1-33)");
int red = sc.nextInt();
//4.判断输入的号码是否在1-33这个范围
if (red < 1 || red > 33) {
System.out.println("输入号码有误,请重新输入");//这里判断用户是否输入正确,不正确重新输入,可以使用死循环实现
continue;//如果输入有误,则结束本次循环,继续下一组循环
}
//不输出输入有误,说明输入正确
//还需要判断重复,因为6个数不允许重复
//这里调用方法去判断,需要有一个判断重复的方法
boolean exists = isExists(numbers, red);
if (exists == true) {
System.out.println("号码输入重复,请重新输入");
}else {
numbers[i] = red;
break;
}
}
}
while (true) {
System.out.println("请输入蓝球号码(1-16)");
int blue = sc.nextInt();
if ( blue<1 || blue>16){
System.out.println("输入号码有误,请重新输入");
}else {
numbers[6] = blue;
break;
}
}
return numbers;
}
//判断元素是否重复的方法
public static boolean isExists(int[] arr, int red) {
for (int i = 0; i < arr.length; i++) {
if (red == arr[i]) {
return true;
}
}
return false;
}
public static void printArray(int[] arr2) {
System.out.print("[");
for (int i = 0; i < arr2.length; i++) {
System.out.print(i == arr2.length - 1 ? arr2[i] : arr2[i] + ",");//因为最后一个就不用逗号了,所以这样写
}
System.out.println("]");
}
}
blic static boolean isExists(int[] arr, int red) {
for (int i = 0; i < arr.length; i++) {
if (red == arr[i]) {
return true;
}
}
return false;
}
public static void printArray(int[] arr2) {
System.out.print("[");
for (int i = 0; i < arr2.length; i++) {
System.out.print(i == arr2.length - 1 ? arr2[i] : arr2[i] + ",");//因为最后一个就不用逗号了,所以这样写
}
System.out.println("]");
}
}