Java入门基础学习笔记35——Java案例课
积攒大家的代码量,以训练提升大家的编程能力,编程思维。
编程思维:运用掌握的Java相关知识进行分析问题并寻找解决方案的方法论,在实际开发中通过编写程序来解决实际问题的能力。
编程思维、编程能力不是一朝一夕形成的,需要大量的思考、练习和沉淀。
具体措施:在前期阶段建议进行模仿学习,在后期则需要通过不断练习和思考来实现创新。为了提高编程能力,在日常学习中应当持续练习代码编写能力和深入思考算法原理,并养成良好的编程习惯与思维方式,则能够熟练掌握并提升自身能力。
案例1:买飞机票:
当用户计划购买机票时,机票价格会根据季节分为淡季和旺季期间,并依据 Headclass 和 Economyclass 的不同情况来制定相应的优惠方案。具体来说,在5月至10月为旺季期间 Headclass 享受9折优惠而 Economyclass 赢得8.5折优惠政策;反之在11月至4月属于淡季期间 Headclass 提供7折待遇而 Economyclass 则可获得6.5折的特惠。为了满足您的需求,请设计一个程序来计算用户的当前机票优惠价格。
分析:
1)方法是否需要接收数据?需要接收机票价、当前月份和舱位类型;
2)方法是否需要返回数据?需要返回计算出机票优惠价;
方法内部:首先采用条件判断方法来确定月份处于何种季节性高低时期,并接着采取switch结构来区分乘客座位类型为头等舱或经济舱。
package cn.ensource;
public class Case1 {
public static void main(String[] args) {
// 目标:买飞机票的案例
double price = calculate(1000, 8,"经济舱");
System.out.println("优惠价是:" + price);
}
public static double calculate(double price, int month, String type) {
// 判断当前月份是淡季还是旺季
if (month >= 5 && month <= 10) {
// 旺季
switch(type) {
case "头等舱":
price *= 0.9;
break;
case "经济舱":
price *= 0.85;
break;
}
} else {
// 淡季
switch(type) {
case "头等舱":
price *= 0.7;
break;
case "经济舱":
price *= 0.65;
break;
}
}
return price;
}
}
java

相信前段传来的数据。
当数据需要判断其所属区间时,在不同的区间内采取相应的处理措施以完成相应的业务处理逻辑时
遇到需要判断数据匹配哪个值,来决定哪个业务,应该用switch分支实现。
判断区间
数据匹配
案例2:开发验证码:
开发一个程序,可以生成指定位数的验证码,每位可以是数字、大小写字母。
分析:
1)分析方法是否需要接收数据?
需要接收一个整数,控制生成验证码的位数,也就是验证码的长度。
2)方法是否需要返回数据?
需要返回生成的验证码。
3)方法内部的业务:
通过for循环逐个生成每一位随机字符,然后将每个生成的字符整合到一个String类型的变量中,最终返回这个String对象即可。
package cn.ensource;
import java.util.Random;
public class Case2 {
public static void main(String[] args) {
// 目标:完成随机验证码
String rs = createCode(5);
System.out.println(rs);
}
public static String createCode(int n) {
Random random = new Random();
String code = "";
for (int i = 1; i <= n; i++) {
// 为每个位置生成一个随机字符,可能是数字、大小写字母
// 思路:随机一个0/1/2之间的数字出来,0 代表随机生成一个数字、1/2代表随机大写字母、小写字母
int type = random.nextInt(3);
switch (type) {
case 0:
// 随机数字字符
code += random.nextInt(10);
break;
case 1:
// 随机大写字母
code += (char) ('A' + random.nextInt(26));
break;
case 2:
// 随机小写字母
code += (char) ('a' + random.nextInt(26));
break;
}
}
return code;
}
}
java

结果:

案例3:评委打分:
通常在歌唱比赛中会有多位裁判为参赛者赋分。其中每位裁判给出的成绩都是介于1到100之间的整数值。计算方法如下:首先排除所有裁判给出的最高和最低评分;然后取剩下的评分数据求其平均值作为最终得分。请设计一个程序用于收集多组裁判评分数据,并计算其最终得分。
分析:
1)方法是否需要接收数据进行处理?需要接收评委的人数。
2)方法是否需要返回数据?需要返回计算出选手最终得分。
方法内部的具体流程包括:首先初始化一个用于存储评委打分的数据结构;然后将评委打出的所有分数依次存储于该数组中;接下来我们将逐一查看这个数组中的每一个分数值;首先计算所有分数之和得到总分;随后确定该组数据中的最高值与最低值;最后将根据总分、最高分与最低分等信息综合得出选手的最终得分,并将结果返回。
package cn.ensource;
import java.util.Scanner;
public class Case3 {
public static void main(String[] args) {
// 案例:评委打分
double rs = getAverageScore(5);
System.out.println("该选手的平均分是: " + rs);
}
public static double getAverageScore(int number) {
// 使用数组来存储评委分数
int[] scores = new int[number];
// 评委打分,存到数组中
Scanner sc = new Scanner(System.in);
System.out.println("开始评委打分:");
for (int i = 1; i <= number; i++) {
System.out.print(i + "号评委的评分: ");
int score = sc.nextInt();
scores[i - 1] = score;
}
//求和
int sum = 0;
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
}
//获得数组中的最高分
int max_value = scores[0];
for (int i = 1; i < scores.length; i++) {
if (scores[i] > max_value) {
max_value = scores[i];
}
}
// 获得数组中的最低分
int min_value = scores[0];
for (int i = 1; i < scores.length; i++) {
if (scores[i] < min_value) {
min_value = scores[i];
}
}
// 使用sum值减去最高分,减去最低分,然后再求平均
double average = (sum - max_value - min_value) / (number - 2);
return average;
}
}
java

结果:

再优化一下代码:
package cn.ensource;
import java.util.Scanner;
public class Case3 {
public static void main(String[] args) {
// 案例:评委打分
double rs = getAverageScore(5);
System.out.println("该选手的平均分是: " + rs);
}
public static double getAverageScore(int number) {
// 使用数组来存储评委分数
int[] scores = new int[number];
// 评委打分,存到数组中
Scanner sc = new Scanner(System.in);
System.out.println("开始评委打分:");
for (int i = 1; i <= number; i++) {
System.out.print(i + "号评委的评分: ");
int score = sc.nextInt();
scores[i - 1] = score;
}
//求和
int sum = 0;
int max_value = scores[0];
int min_value = scores[0];
for (int i = 0; i < scores.length; i++) {
int score = scores[i];
sum += score;
if (score > max_value) {
max_value = score;
}
if (score < min_value) {
min_value = score;
}
}
// 使用sum值减去最高分,减去最低分,然后再求平均
double average = 1.0 * (sum - max_value - min_value) / (number - 2);
return average;
}
}
java

将求和、求最大值和最小值,放到一个for循环中。
然后还有求平均的公式,增加了1.0 *的小技巧。

案例:数字加密
需求:
该系统的数字密码由四位数组成, 例如1983. 为了确保安全性, 其加密过程需遵循特定规则后方可进行传输. 具体而言, 密码中的每一位数字都需要先分别加5, 然后对其取模运算结果进行处理. 最后一步是反转处理后的各位数字顺序, 从而得到最终的加密数值.

分析:
1)方法是否需要接收数据进行处理?
需要接收四位数字密码,进行加密处理。
2)方法是否需要返回数据?
需要返回加密后的结果。
方法内部的具体业务逻辑是:将四位组成的一个密码拆分成一个个单独的单个数字,并将其存储在一个数组中;依次遍历这个数组中的每一个单个数字,并根据题目要求对其进行相应的加密处理;最后将所有加密后的单个单个处理结果进行拼接组合并返回最终结果
package cn.ensource;
import java.util.Scanner;
public class Case4 {
public static void main(String[] args) {
// 目标:数字加密程序的开发
Scanner sc = new Scanner(System.in);
System.out.print("请输入四位数字:");
int a = sc.nextInt();
String res = encrypt(a);
System.out.println("加密结果是:" + res);
}
public static String encrypt(int number) {
// number = 1983
// 拆分成一个一个的数字
int[] numbers = split(number);
for (int i = 0; i < numbers.length; i++) {
numbers[i] = (numbers[i] + 5) % 10;
}
//对加密后的数字进行反转
reverse(numbers);
// 把这些加密后的数字拼接起来作为加密后的结果返回即可
String data = "";
for (int i = 0; i < numbers.length; i++) {
data += numbers[i];
}
return data;
}
public static int[] split(int number) {
int[] numbers = new int[4];
numbers[0] = number / 1000;
numbers[1] = number % 1000 / 100;
numbers[2] = number % 100 / 10;
numbers[3] = number % 10;
return numbers;
}
private static int[] reverse(int[] numbers) {
for(int i = 0; i < numbers.length/2; i++) {
int temp = numbers[i];
numbers[i] = numbers[numbers.length - i - 1];
numbers[numbers.length - i - 1] = temp;
}
return numbers;
}
}
java

结果:

如果一个方法里要做的事情比较多,我们在开发中一般会怎么做呢?
一般会把多个事拆成多个方法去完成,也就是独立功能独立成一个方法。
拆数字、反转方法都是独立方法。
案例:数组拷贝:
需求:请把一个整数数组,例如存了数据:11、22、33 拷贝成一个一模一样的新数组来。
分析:
1)方法是否需要接收数据进行处理?需要接收一个整形数组(原数组)。
2)方法是否需要返回数据呢?肯定需要返回一个新的、一摸一样的整形数组。
方法内部的功能是生成一个与原数组长度一致的整型新数组,并将原数组的元素按位置赋值到该新数组中,最终返回该新数组即可
package cn.ensource;
public class Case5 {
public static void main(String[] args) {
// 测试拷贝
int[] arr = {1,2,3,4,5,6,7,8,9};
int[] res = copy(arr);
System.out.print("原数组: ");
printArray(arr);
System.out.println();
System.out.print("拷贝后的数组: ");
printArray(res);
System.out.println();
System.out.println(arr);
System.out.println(res);
}
public static int[] copy(int[] arr) {
int[] newArr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
return newArr;
}
public static void printArray(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i != arr.length - 1) {
System.out.print(arr[i] + " ");
}else {
System.out.print(arr[i]);
}
}
System.out.print("]");
}
}
java

注意:
如果使用int[] arr3 = arr; 这不是拷贝数组,叫把数组变量赋值给另一个数组。
arr3也会指向同一个数组。两个数组变量名指向同一个数组对象。
数组变量名是在栈内存中,数组对象是在堆内存中。
除此之外,我还打算先搁置一下红包派发、素数计算以及双色球模拟程序这几个案例。
