卖飞机票
package com.basic.comprehensive;
import java.util.Scanner;
/**
* @author soso
* @PackageName:com.basic.comprehensive
* @ClassName:demo01
* @Description:求飞机票
* @date 2024/9/416:45
*/
public class demo01 {
public static void main(String[] args) {
/*输入:机票原价,月份,头等舱或经济舱;
* 输出:机票价格*/
//1.读入需要的数据
Scanner sc = new Scanner(System.in);
System.out.println("输入机票原价:");
double oranginalPrice = sc.nextDouble();
System.out.println("出行月份:");
int month = sc.nextInt();
System.out.println("是否经济舱(经济舱输入0,头等舱输入1):");
int level = sc.nextInt();
//分装计算机票价格的方法
double price = getPrice(oranginalPrice,month,level);
//3.打印机票价格
if (price != 0){
System.out.println("机票现价是:"+price);
}
sc.close();
}
public static double getPrice(double oranginalPrice,int month,int level){
//2.进行判断,头等舱还是经济舱
if (level == 0){
//2.1.继续判断,是否旺季,同样可以封装为方法
return tellMonth(oranginalPrice,month,0.85,0.65);
}else if (level == 1){
return tellMonth(oranginalPrice,month,0.9,0.7);
}else{
System.out.println("不存在该舱位。");
return 0;
}
}
public static double tellMonth(double oranginalPrice,int month,double v1,double v2){
if(month>=5 && month<=10){
return oranginalPrice*v1;
}else if(month>12 || month<1){
System.out.println("不存在该月份。");
return 0;
}else{
return oranginalPrice*v2;
}
}
}
结果图:
ctrl+alt+M可以自动抽取方法
开发验证码
缺点在于还未实现数字位置的随机
package com.basic.comprehensive;
import java.util.Random;
/**
* @author soso
* @PackageName:com.basic.comprehensive
* @ClassName:demo02
* @Description:开发验证码
* @date 2024/9/418:38
*/
public class demo02 {
public static void main(String[] args) {
/*长度为5,前四位为大小写字母的随机,最后一位为数字的随机*/
//1.定义大小写字母数组
char[] chs = new char[52];
for (int i = 0; i < chs.length; i++) {
if (i <=25 ){
chs[i] = (char) (i + 'A');//利用ASC码得到
}else{
chs[i] = (char) (i-26 + 'a');
}
}
//2.随机抽取字母和数字并赋值给一个新的数组
Random rand = new Random();
char[] verifyCode= new char[4];
//可以改为Sting result="";
// 后面相对应的变为result字母数组+char[randIndex]
//最后打印可以直接print(result+number)
for (int i = 0; i < 4; i++) {
int r = rand.nextInt(chs.length);
verifyCode[i] = chs[r];
}
//3.打印验证码
for (int i = 0; i < verifyCode.length; i++) {
System.out.print(verifyCode[i]);
}
System.out.println(rand.nextInt(10));
}
}
结果图:
评委打分
1.读取六位评委打的分数,可以用数组存储
2.剔除不合法的分数,小于0或大于100
3.得到最大值
3.1比较最大值
3.2返回最大值
4.得到最小值
4.1比较最小值
4.2返回最小值
5.计算得到剩余数组的平均值
6.打印选手得分
package com.basic.comprehensive;
import java.util.Scanner;
/**
* @author soso
* @PackageName:com.basic.comprehensive
* @ClassName:demo03
* @Description:评委打分,得到不合法数据后剔除再算平均,去掉一个最高分和一个最低分
* @date 2024/9/419:04
*/
public class demo03 {
public static void main(String[] args) {
//1.读取六位评委打的分数,可以用数组存储
int[] score=getValue();
//2.剔除不合法的分数,小于0或大于100,替换为零同时打印反馈
int[] reScore = deleteIllegality(score);
//3.找到最大值
int max = getMax(reScore);
//4.替换最小值为零
int min = getMin(reScore);
//5.计算得到剩余数组的平均值
double scoreMean = getMean(reScore,max,min);
//6.打印选手得分
System.out.println("The score is " + scoreMean);
}
//1.
public static int[] getValue(){
int[] score=new int[6];
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 6; i++) {
System.out.println("Enter score:");
score[i] = sc.nextInt();
}
sc.close();
return score;
}
//2.
public static int[] deleteIllegality(int[] arr){
int count=0;
boolean flag=false;
for (int i = 0; i < arr.length; i++) {
if(arr[i]<0||arr[i]>100){
System.out.println("存在非法分数:"+arr[i]);
arr[i]=-1;//只要是原始数组中不可能存在的数就行,便于后续剔除
count++;
flag=true;
}
}
if(flag){
int[] res=new int[arr.length - count];
int flag_index=0;
int i = 0;
for (int j = flag_index; j < arr.length; j++) {
flag_index++;
if(arr[j]==-1){
continue;
}else{
res[i]=arr[j];
i++;
}
}
//用了两个循环来得到剔除不合法数据的数组,是否可以改进?
return res;
}
return arr;
}
//3.
public static int getMax(int[] arr){
// 3.1比较最大值
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max){
max = arr[i];
}
}
// 3.2返回最大值
return max;
}
//4.
public static int getMin(int[] arr){
// 4.1比较最小值
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]<min){
min = arr[i];
}
}
// 4.2返回最小值
return min;
}
//5.
public static double getMean(int[] arr, int max, int min){
double mean = 0;
//求和
for (int i = 0; i < arr.length; i++) {
mean += arr[i];
}
//求减去的平均
mean = (mean -max -min )/ (arr.length - 2);
return mean;
}
}
结果图:
非法测试:
数字加密
1.用数组读入数据
2.每一位都是相同的操作,利用循环加五以及对十取余
3.反转得到新的数组
4.打印得到的数组
package com.basic.comprehensive;
import java.util.Scanner;
/**
* @author soso
* @PackageName:com.basic.comprehensive
* @ClassName:demo04
* @Description:数字加密
* @date 2024/9/420:14
*/
public class demo04 {
public static void main(String[] args) {
//1.用数组读入数据
Scanner sc = new Scanner(System.in);
System.out.println("输入密码: ");
//1.1将密码看为一个整数读入
int passTemp = sc.nextInt();
int passNum = passTemp;
//1.2根据密码长度确认数组长度
int n = 0;
while (passNum != 0) {
passNum = passNum / 10;
n++;
}
//1.3 将密码存储于数组中,注意密码中数字的顺序
int[] password=new int[n];
for (int i = 0; i < n; i++) {
int ge = passTemp % 10;
passTemp /= 10;
password[n-1-i] = ge;
}
//2.每一位都是相同的操作,利用循环加五以及对十取余
for (int i = 0; i < n; i++) {
password[i] = (password[i]+5) % 10;
}
//3.反转得到新的数组
for (int i = 0,j= password.length-1; i < j; i++,j--) {
int temp=password[i];
password[i]=password[j];
password[j]=temp;
}
//4.打印得到的数组,可以不打印空格直接打印,也可以乘以10还原整数
int number = 0;
for (int i = 0; i < n; i++) {
number = number*10+password[i];
}
System.out.println(number);
sc.close();
}
}
结果图:
问题:是否可以使输入的密码不显示?
数字解密
数字加密的逆操作,对10取余的逆操作是?
根据第一步加五确定范围,范围为5~14;故对10取余的逆操作时,如果是0到4之间,则需要加上10;如果是5到9之间,则是本身。
- 利用数组读入加密的数字(同数字加密)
- 将数字反转
- 判断范围
3.1. 0到4之间,加上10
3.2 5到9之间,本身不变 - 加上5
- 打印结果
为了方便解密,将上述加密代码封装了函数更改为:
package com.basic.comprehensive;
import java.util.Scanner;
/**
* @author soso
* @PackageName:com.basic.comprehensive
* @ClassName:demo04
* @Description:数字加密
* @date 2024/9/420:14
*/
public class demo04 {
public static void main(String[] args) {
//1.用数组读入数据
Result result = getResult();
//2.每一位都是相同的操作,利用循环加五以及对十取余
for (int i = 0; i < result.n(); i++) {
result.password()[i] = (result.password()[i]+5) % 10;
}
//3.反转得到新的数组,数组改变的是地址,不用再次返回
extracted(result);
//4.打印得到的数组,可以不打印空格直接打印,也可以乘以10还原整数
int number = getNumber(result);
System.out.println(number);
}
public static int getNumber(Result result) {
int number = 0;
for (int i = 0; i < result.n(); i++) {
number = number*10+ result.password()[i];
}
return number;
}
//原先抽取的函数是private,改为public的话数字解密继续用
public static void extracted(Result result) {
for (int i = 0, j = result.password().length-1; i < j; i++,j--) {
int temp= result.password()[i];
result.password()[i]= result.password()[j];
result.password()[j]=temp;
}
}
public static Result getResult() {
Scanner sc = new Scanner(System.in);
System.out.println("输入密码: ");
//1.1将密码看为一个整数读入
int passTemp = sc.nextInt();
int passNum = passTemp;
//1.2根据密码长度确认数组长度
int n = 0;
while (passNum != 0) {
passNum = passNum / 10;
n++;
}
//1.3 将密码存储于数组中,注意密码中数字的顺序
int[] password=new int[n];
for (int i = 0; i < n; i++) {
int ge = passTemp % 10;
passTemp /= 10;
password[n-1-i] = ge;
}
Result result = new Result(sc, n, password);
sc.close();
return result;
}
public record Result(Scanner sc, int n, int[] password) {
}
//自动抽取获得的方法,暂时还不知道record是个什么东西
}
更改后的代码:
package com.basic.comprehensive;
import java.util.Scanner;
/**
* @author soso
* @PackageName:com.basic.comprehensive
* @ClassName:demo05
* @Description:数字解密
* @date 2024/9/420:50
*/
public class demo05 {
public static void main(String[] args) {
//1.利用数组读入加密的数字(同数字加密)
demo04.Result result = demo04.getResult();
//2.将数字反转
demo04.extracted(result);
//3.判断范围
for (int i = 0;i < result.n();i++){
//3.1 0到4之间,加上10
//3.2 5到9之间,本身不变
if(result.password()[i]>=0 && result.password()[i]<=4){
result.password()[i]+=10;
}
}
//4.减去5
for (int i = 0;i < result.n();i++){
result.password()[i]-=5;
}
//5.打印结果
int Number = demo04.getNumber(result);
System.out.println(Number);
}
}
结果图:
双色球系统
- 随机生成中奖号码
1.1 定义一个数组用于存储红球中奖号码,定义一个数字用于存储篮球中奖号码。
1.2 随机生成红球号码,要求1-33之间生成六个数字且不重复。
1.2.1 生成随机数字
1.2.2 判断是否重复
1.3 随机生成篮球号码,1-16之间 - 读入用户输入的号码,用数组存储
2.1 定义一个数组用于存储中奖号码。
2.2 判断输入的数字是否重复,重复则要求重新输入
2.3 将输入的数字存储于数组中 - 比较两个数组的号码判断获奖情况;红球数字不需要位置相同
3.1 判断红球的号码是否在中奖号码中,同时计数
3.2 根据上述计数判断获奖情况
3.2.1 当红球中奖个数小于4个时,判断篮球号码是否相同,不同则直接打印“未能中奖”;相同则继续根据红球个数判断中奖情况
3.2.2 当红球中奖而概述大于等于4个时,根据篮球和红球个数一起判断中奖情况
package com.basic.comprehensive;
import java.util.Scanner;
import java.util.Random;
/**
* @author soso
* @PackageName:com.basic.comprehensive
* @ClassName:demo06
* @Description:双色球中奖条件和奖金表
* @date 2024/9/510:21
*/
public class demo06 {
public static void main(String[] args) {
//1. 随机生成中奖号码
// 1.1 定义一个数组用于存储中奖号码
int[] prizeNumber = new int[7];
// 1.2 随机生成红球号码,要求1-33之间生成六个数字且不重复。
getPrizeNumber(prizeNumber);
//2. 读入用户输入的号码,用数组存储
// 2.1 定义一个数组用于存储用户号码。
int[] userNumber = new int[prizeNumber.length];
getUserRedNumber(userNumber);
//3. 比较两个数组的号码判断获奖情况;红球数字不需要位置相同
printPrize(userNumber, prizeNumber);
}
//1.2
private static void getPrizeNumber(int[] arr) {
// 1.2
// 1.2.1 生成随机数字
Random rand = new Random();
boolean flag = false;
for (int i = 0; i < arr.length - 1; ) {
int r = rand.nextInt(33)+1;
// 1.2.2 判断是否重复
flag = isPrize(r,arr);
if (!flag) {
arr[i] = r;
i++;
}
}
// 1.3 随机生成篮球号码,1-16之间
arr[arr.length - 1] = rand.nextInt(16)+1;
}
//1.2.2
private static boolean isPrize(int number,int[] arr) {
for (int i = 0; i < arr.length; i++) {
if (number == arr[i]) {
return true;
}
}
return false;
}
//2.
private static void getUserRedNumber(int[] arr) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < arr.length - 1; ) {
// 2.2 读入用户数字
System.out.print("请输入第"+(i+1)+ "个红球号码:");
int number = sc.nextInt();
// 2.3 判断输入的数字是否重复,重复则要求重新输入
if (number <=33 && number >=1) {
if (!isPrize(number, arr)) {
arr[i] = number;
i++;
}else{
System.out.println("输入号码重复,请重新输入。");
}
}else{
System.out.println("输入号码无效,请输入1-33之间的数字。");
}
}
//2.4 输入篮球数字
System.out.print("请输入篮球号码:");
for ( ; ; ) {
int blueNumber = sc.nextInt();
if (blueNumber <=16 && blueNumber >=1) {
arr[arr.length - 1] = blueNumber;
break;
}else{
System.out.println("输入号码无效,请输入1-16之间的号码。");
}
}
sc.close();
}
//3.
private static void printPrize(int[] userNumber,int[] prizeNumber) {
// 3.1 判断红球的号码是否在中奖号码中,同时计数
int count=0;
for (int i = 0; i < userNumber.length - 1; i++) {
if (isPrize(userNumber[i],prizeNumber)) {
count++;
}
}
// 3.2 根据上述计数判断获奖情况
// 3.2.1 当红球中奖个数小于4个时,判断篮球号码是否相同,不同则直接打印“未能中奖”;相同则继续根据红球个数判断中奖情况
if (count < 4){
if (userNumber[userNumber.length-1] == prizeNumber[prizeNumber.length-1]) {
if (count <=2){
System.out.println("恭喜您中奖5元!");
}else{
System.out.println("恭喜您中奖10元!");
}
}else{
System.out.println("很遗憾您未能中奖。");
}
}else{
// 3.2.2 当红球中奖而概述大于等于4个时,根据篮球和红球个数一起判断中奖情况
if (userNumber[userNumber.length-1] == prizeNumber[prizeNumber.length-1]) {
if (count ==4){
System.out.println("恭喜您中奖200元!");
}else if (count ==5){
System.out.println("恭喜您中奖3000元!");
}else if (count ==6){
System.out.println("恭喜您中奖最高一千万!");
}
}else{
if (count ==4){
System.out.println("恭喜您中奖10元!");
}else if (count ==5){
System.out.println("恭喜您中奖200元!");
}else if (count ==6){
System.out.println("恭喜您中奖最高500万!");
}
}
}
}
}
结果图:
缺点:判断中奖的循环存在问题,可以直接用中奖金额来分情况判断。
二维数组
内存图:
特殊情况:
一维数组的内存空间可以先不给出,即定义二维数组时可定义:int[][] arr=new int[2][];
或者定义了之后也可以赋值维度不同的一维数组,因为二维数组存储的是一维数组的地址。