java方法案例
学点编程,培养编程思维,利用编程解决问题。
学习来源:黑马程序员java零基础
案例进行训练的目的:
案例1:评委打分
package com.itheima.Case;
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
//评委打分机制,写一个计算评委打分的方法,需要求得计算总分,以及去掉最大和最小值的平均值
System.out.println("当前选手的得分是:"+getAverageScore(6));
}
//需要用输入,多少位评委,以及各自的打分情况
public static double getAverageScore(int number) {
//1.定义一个动态初始化数组,负责后期录入评委的打分
int[] scores = new int[number];//以6位评委为例
//scores = [0,0,0,0,0,0]
//遍历数组的每个位置,依次录入评委的打分(需要借助扫描器,放在循环外)
Scanner sc = new Scanner(System.in);
//下面一行的代码可以用快捷键进行生成:scores.fori
for (int i = 0; i < scores.length; i++) {
//i=0,1,2,3,4,5,第一个评委是第0+1
System.out.println("请您录入第" + (i + 1) + "个评委的分数: ");
int score = sc.nextInt(); //用scanner进行录入评委的分数
scores[i] = score; //将获取到的分数,存到动态数组中
}
//3.从数组中计算出总分,找出最高分,最低分
int sum = 0; //求总分用的变量
int max = scores[0];
int min = scores[0]; //都用数组的第一位作为最大值和最小值的初始值进行判断,更新
//遍历数组,求解总数和最大值和最小值
for (int i = 0; i < scores.length; i++) {
int score = scores[i];
//求和
sum += score;
//求最大值和最小值,利用每个元素和最大值和最小值进行比较。满足大于最大值,就交换
//求最小值
if (score < min) {
min = score;
}
//求最大值
if (score > max) {
max = score;
}
}
//4.计算平均值并进行输出,不用去加除了最大值和最小值以外的数值,直接用sum-max-min即可,巧劲
return 1.0 * (sum - min - max) / (number - 2);//利用1.0的原因,目的在于平均值有可能是小数
}
}
运行的结果:
涉及的知识点:
利用循环遍历进行求和
利用当前位置的分数和max,min比较,进行交换
取巧:求平均分利用sum-min-max得到剩下的总分
number-2表示剩下的评委人数
1.0*结果,表示最终的结果是保留小数的
scanner录入当前评委的评分(),Scanner sc放在循环外面
案例2:购买飞机票打折
public class Test1 {
public static void main(String[] args) {
//目标:完成买飞机票的示例
double price = calculate(1000,12,"头等舱");
System.out.println("优惠价是: "+price);
}
//注意点1:方法里面不能套方法。2.String是大写的,括号是英文的
public static double calculate(double price,int month,String type){
//判断当前的月份是淡季还是旺季
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;
}
}
注意if和switch的适用环境:
案例3:开发验证码
package com.itheima.Case;
import java.util.Random;
public class Test2 {
public static void main(String[] args) {
//需求:生成一个指定位数的验证码,每位可以是字母,和大小写字母
System.out.println(creatCode(6));
}
public static String creatCode(int n){
//1.定义用一个for循环来控制产生多少位的随机字符
Random r = new Random();//生成随机数,一来使用switch分支来做判断,二来生成随机数
//3.定义一个String类型的变量用于记住产生的每位随机字符
String code = "";//字符串类型
for (int i = 1; i <=n; i++) {
//i = 1,2,3,. .. n
//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的随机数
break;
case 1:
//表示生成的是一个随机大写字母,需要注意的是随机数只能产生数字,而不能生成字符,但是根据ASCII码,英文字符在计算机内部还是二进制进行存储的
//随机一个大写英文字符,A 65 Z 65+25,利用减加法,化为标准的65->0,即化为(0->25)+65
//需要利用char进行强制类型转换
char ch1 = (char)(r.nextInt(26)+65);
code += ch1;
break;
case 2:
//表示生成的是一个随机的小写英文字符,范围在97->97+25,利用处理大写字母同样的方法进行处理
char ch2 = (char)(r.nextInt(26)+97);
code += ch2;
break;
}
}
return code;
}
}
生成结果图:
涉及的相关知识点:
1.利用加法(连接符)连接起来
2.Random是一个随机数(但大写字母,其实在底层就是对应的数字)
3.加减法,产生65-90之间的随机数(nextInt()
4.利用类型转换(char(数字)转化为字符
5.每循环(循环次数取决于验证码代码输入的个数)一次,根据生成的0->2,进switch分支,并且用0,1,2来表示是数字,还是大小写字母
6.利用String code来存储验证码信息
案例:数字加密
返回类型string是可以有数字的,并且最终的数字需要进行拼接起来,因此返回值用string类型
关于拆分密码,有两种方法:一种是直接进行拆分,另一种是使用方法进行拆分(建议使用第二种,利于开发,也就是方法调用方法)
拆分之后的数据放在一个整型数组中
实现反转有两种方式:
一种:从后往前进行遍历,然后进行拼接起来
第二种:先进行反转数组,然后进行遍历,拼接起来(相当于双指针,用i指向数组的第一位的下标,j指向数组的最后一位的下标,值得注意的是数组下标是从0开始的,因此最后一个元素的下标其实是数组长度减1.
6 4 3 8
反转成8 3 4 6
推荐使用第二种方法的目的:回顾数组的相关重点算法,反转数组,如何交换对应的数组元素。
反转数组也作为一个方法,写好之后进行调用
package com.itheima.Case;
public class Test45 {
public static void main(String[] args) {
//需求:数字加密,和解密其实是同样的一个流程,其实调制和解调制都是同样的操作
//对于数字每一个进行操作,涉及到对数字的拆分,关于数字的拆分,有两种方法,一种是直接拆,另一种是调用方法进行拆分
//在实际的开发中,在一个方法中实现一种需求的难度大多是成指数式增长的,因此要学会用多个方法进行调用解决
//假设某系统的数字密码是一个四位数,比如是1983,加密规则:对密码中的每位数都+5,再对10进行取余,然后进行反转,需要做的第一件事就是对数字进行拆分
//技巧:快捷键,按住split点alt+回车进行创建新方法
System.out.println("加密后的结果是" + encrypt(8346));
}
public static String encrypt(int number){
//number = 1983;
//1.将这个密码进行拆分成一个一个的数字,对每个数字进行加密
int[] numbers = split(number);
// numbers = [1,9,8,3];
//2.遍历这个数组的每个数字,按个进行加密处理
for (int i = 0; i < numbers.length; i++) {
// i= 0,1,2,3
//对每个元素进行加5,对10取余
// numbers[i]+=5;
// numbers[i]%=10;
//合并写
numbers[i]=(numbers[i]+5)%10;
}
//此时的numbers = [6,4,3,8];
// 3.对元素进行反转,将反转这个功能作为一个独立的方法,
revers(numbers);
//4.将这些加密之后的数字拼接起来作为加密后的结果输出即可
//先定义一个字符类型的变量,为存储后续的元素
String data = "";
//进行遍历将加密之后的每个数加在data中
for (int i = 0; i < numbers.length; i++) {
data += numbers[i];
}
return data;
}
//对数组的每个元素进行提取
public static int[] split(int number) {
//以1983为例,如何获取到从前往后获得到各位呢,其实相当于怎么得到千,百,十,个位的数
int[] numbers = new int[4];
numbers[0] = number/1000; //对1000进行除法,得到千位上的数
numbers[1] = (number/100)%10; //对100除法,得到19,需要对10取余就是9
numbers[2] = (number/10)%10;
numbers[3] = number%10;
return numbers;
}
//进行对元素反转操作
public static void revers(int[] numbers) {
//反转数组,利用两个类似指针,i,j分别对应数组的第一个和最后一个元素,使用第一个元素和最后一个元素进行交换,后i++,j--然后呢接着进行交换
//numbers = [6,4,3,8];--->8,3,4,6
for(int i=0,j=numbers.length-1;i<j;i++,j--){
//交换i和j位置处的值,此时需要借用到中间变量,具体怎么做呢
//需要注意的是数组下标是从0开始,因此最后一个位置的下标为数组长度-1,循环终止条件就是i一旦出现在j的右边
//1.把后一个位置的值交给一个临时变量先存起来
int temp = numbers[j];
numbers[j] = numbers[i];
numbers[i] = temp;
}
}
}
实战跟着写代码,再次说明了亲自动手敲代码的重要性,在跟着笔记写代码的时候,遇到一个这样的事情,不是很理解,先放个眼,后续再更。
在使用快捷键alt+回车创建新方法时,没有create的选择,
在上面的main方法中创建,是没有的,但在其他方法里面这样做是可以的
但在main方法可以创建无输入
的方法
就像这样的:
因此,个人理解是在新建方法的话,是新建一种没有输入的方法,其他快捷键创建新方法还是放在别的方法中进行使用。