Java编程案例(专题)
各位同学,前面我们已经学习过很多Java的基础知识了,主要有变量、数组、运算符、流程控制、方法等。但是对于这些知识点的运用,掌握得还不是很熟练,所以今天我们专门花一天时间,给同学们讲几个专项练习题,把前面所学习的知识巩固一下。
同时通过这些专项练习题,积攒大家的代码量,以便提升大家的编程能力和编程思维。这里所说的编程思维就是使用Java技术解决问题的思维方式;编程能力就是按照编程思维编写代码的能力。
想要提升编程思维和编程能力,在这里给同学们一些学习上的建议:
- 编程思维、编程能力不是一朝一夕形成的,需要大量思考,练习和时间的沉淀。
- 具体措施:前期,建议先模仿;后期,自然就能创新了;
勤于练习代码,勤于思考,孰能生巧。
中国的航空母舰、战斗机,这些技术都是先模仿,再创新的,而且的模仿的周期是非常长的。所以同学们在使用Java技术解决问题时,也是先模仿一些特定问题的解决思路,以后遇到同类型的问题,就采用同一种思维模式来做就行。
案例一:买飞机票
各位同学,我们先来学习第一个案例《飞机买票》,先仔细阅读一下案例需求
我们来分析一下,这个需求该如何实现。前面我跟同学们讲过,将来我们去做一些需求,都是一个一个方法来实现的,所以在这里我们也采用方法来编写。
这个方法如何编写呢?采用下面的方式来思考
1.首先,考虑方法是否需要接收数据处理?
阅读需求我们会发现,不同月份、不同原价、不同舱位类型优惠方案都不一样;
所以,可以将原价、月份、舱位类型写成参数
2.接着,考虑方法是否有返回值?
阅读需求我们发现,最终结果是求当前用户的优惠票价
所以,可以将优惠票价作为方法的返回值。
3.最后,再考虑方法内部的业务逻辑
先使用if判断月份是旺季还是淡季,然后使用switch分支判断是头等舱还是经济舱,计算 票价
代码如下
public class Test1 {
public static void main(String[] args) {
// 目标:完成买飞机票的案例。
double price = calculate(1000, 11, "头等舱");
System.out.println("优惠价是:" + price);
}
public static double calculate(double price,int month,String type){
// 1、判断当前月份是淡季还是旺季
if(month >= 5 && month <= 10) {
// 旺季
// 2、判断仓位类型。
switch (type){
case "头等舱":
price *= 0.9; // price = price * 0.9;
break;
case "经济舱":
price *= 0.85;
break;
}
}else {
// 淡季
switch (type){
case "头等舱":
price *= 0.7; // price = price * 0.7;
break;
case "经济舱":
price *= 0.65;
break;
}
}
return price;
}
}
案例二:开发验证码
各位同学,接下来,我们学习第二个案例《开发验证码》,同样先阅读一下案例需求
分析一下,需求是要我们开发一个程序,生成指定位数的验证码。考虑到实际工作中生成验证码的功能很多地方都会用到,为了提高代码的复用性,我们还是把生成验证码的功能写成方法比较好。
那生成验证码的方法该怎么写呢?按照下面的三个步骤进行思考
1.首先,考虑方法是否需要接收数据处理?
要求生成指定位数的验证码,到底多少位呢?让调用者传递即可
所以,需要一个参数,用来表示验证码的位数
2.接着,考虑方法是否需要有返回值?
该方法的结果,就是为了得到验证码
所以,返回值就是验证码;
3.最后,再考虑方法内部的业务逻辑
1)先按照方法接收的验证码位数n,循环n次
2)每次循环,产生一个字符,可以是数字字符、或者大小写字母字符
3)定义一个String类型的变量用于记住产生的每位随机字符
按照思路,编写代码如下
public class Test2 {
public static void main(String[] args) {
// 目标:完成生成随机验证码。
System.out.println(createCode(8));
}
public static String createCode(int n){
//1)先按照方法接收的验证码位数n,循环n次
Random r = new Random();
//3)定义一个String类型的变量用于记住产生的每位随机字符
String code = "";
for (int i = 1; i <= n; i++) {
// i = 1 2 3 4 5
//2)每次循环,产生一个字符,可以是数字字符、或者大小写字母字符
// 思路:随机一个0 1 2之间的数字出来,0代表随机一个数字字符,1、2代表随机大写字母,小写字母。
int type = r.nextInt(3); // 0 1 2
switch (type) {
case 0:
// 随机一个数字字符
code += r.nextInt(10); // 0 - 9 code = code + 8
break;
case 1:
// 随机一个大写字符 A 65 Z 65+25 (0 - 25) + 65
char ch1 = (char) (r.nextInt(26) + 65);
code += ch1;
break;
case 2:
// 随机一个小写字符 a 97 z 97+25 (0 - 25) + 97
char ch2 = (char) (r.nextInt(26) + 97);
code += ch2;
break;
}
}
return code;
}
}
案例三:评委打分
各位同学,接下来,我们学习第三个案例《评委打分》,同样先阅读一下案例需求
1.首先,考虑方法是否需要接收数据来处理?
需求中说,有多个评委的打分,但是到底多少个评委呢? 可以由调用者传递
所以,我们可以把评委的个数写成参数;
2.接着,考虑方法是否需要有返回值?
需求中,想要的最终结果是平均分
所以,返回值就是平均分;
3.最后,再考虑方法内部的业务逻辑
1)假设评委的个位为n个,那么就需要n个评委的分数,首先可以新建一个长度为n的数组, 用来存储每一个评委的分数
2)循环n次,使用Scanner键盘录入n个1~100范围内的整数,并把整数存储到数组中
3)求数组中元素的总和、最大值、最小值
4)最后再计算平均值; 平均值 = (和-最大值-最小值)/(数组.length-2);
代码如下
public class Test3 {
public static void main(String[] args) {
// 目标:完成评委打分案例。
System.out.println("当前选手得分是:" + getAverageScore(6));
}
public static double getAverageScore(int n){
// 1、定义一个动态初始化的数组,负责后期存入评委的打分
int[] scores = new int[n]; // 6
// scores = [0, 0, 0, 0, 0, 0]
// 2、遍历数组的每个位置,依次录入评委的分数
Scanner sc = new Scanner(System.in);
for (int i = 0; i < scores.length; i++) {
// i = 0 1 2 3 4 5
System.out.println("请您录入第"+ (i + 1) +"个评委的分数:");
int score = sc.nextInt();
scores[i] = score;
}
// 3、从数组中计算出总分,找出最高分,最低分。
int sum