JAVA模块六------ 综合案例基础巩固
- 1 逢7跳过
- 2 数组元素求和
- 3 判断两个数组的内容是否相同
- 4 查找某个数组元素索引
- 5 数组元素反转输出:(逆序输出)
- 6 评委打分
- 7 随机产生验证码
- 其他:
- 方法抽取:
1 逢7跳过
要求:
数字包含7或者是7的倍数的,跳过
控制台打印1-100满足的数字
my:
百位的判断是不必要的:百位最高是1
continue也不必要:continue语句后没有其他语句了,会自动进行下次循环判断,可以省略
修改后:
2 数组元素求和
题目要求
my:
缺点:只针对该数组的方法,局限性过强(不具有普适性)
使用方法传参(传址)后:
3 判断两个数组的内容是否相同
题目要求
输出结果是:true
4 查找某个数组元素索引
题目要求:
我的:
优化后(前提假设,找到后break,后面不再进行遍历):
但是,如果元素在数组中多次出现:
注意:return只能返回一个结果数据,需要返回多个结果怎么办
可以将多个结果存放在一个数组容器当中,将这个数组返回去
那么这个用于存放结果的数组使用哪种初始化
(1)静态初始化:需要知道存放的内容,显然不可能
(2)动态初始化需要知道数组的长度(元素个数):
可以定义一个计数器,对数组中的元素进行遍历
完整代码:
public class FindSuoyin {
public static void main(String[] args) {
int[] arr={19,28,37,46,50,19,19};
// 0 1 2 3 4 5 6
int[] results=findSuoyin(19,arr);
if(results.length==0){
System.out.println("你要查找的数字在该数组中不存在");
}else{
for (int i = 0; i < arr.length; i++) {
System.out.println(results[i]);
}
}
}
// 查找索引位置
public static int[] findSuoyin(int number,int[] arr){
// 1 先统计要查找的元素,在数组中出现的个数
int count=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]==number)
count++;
}
// 2 根据统计的个数动态初始化数组
int[] results=new int[count];
// 3 查找并且存储要找元素的索引值
int index=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]==number){
results[index]=i;
index++;
}
}
// 整个结束之后,result数组中存放的就是要找的数字的全部索引值
// 将这个数组返回
return results;
}
}
5 数组元素反转输出:(逆序输出)
题目要求
我的:
思路:首尾互换
数组长度为5,需要交换2次(5/2=2)
数组长度为6(偶数次),需要交换3次(6/2=3)
交换的动作重复执行:可以使用循环(循环条件为i<arr.length)
实现方法1:
public class Test5 {
/*
已知一个数组arr为{11,22,33,44,55,}
交换后{55,44,33,22,11}
1 确定好谁跟谁换:
第一个和倒数第一个
第二个和倒数第二个
第三个和倒数第三个
arr[i]和arr[arr.length-1-i]
*/
public static void main(String[] args) {
int[] arr={11,22,33,44,55};
for (int i = 0; i < arr.length / 2; i++) {
int temp=arr[i];
arr[i]=arr[arr.length-1-i];
arr[arr.length-1-i]=temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
方法二:
设置两个指针:其中一个指向首元素,另一个指向最后一个元素
指针所指向的位置就进行交换动作,交换之后,两指针分别都向中间移动
思路步骤:
1 定义两个变量,模拟开始和结束两个指针
2 交换
3 每一次交换完成,指针向中间移动(只要首地址所指向的位置<=尾地址所指向的位置就继续移动)
public static void main(String[] args) {
int[] arr={11,22,33,44,55};
//模拟首尾两个指针
int start=0,end=arr.length-1;
//交换动作
for(;start<end;start++,end--){
int temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
6 评委打分
题目要求:
思路:
1 键盘录入这六个数据(读取)
2 求和,找到最大值,最小值,并减去
3 除法求平均值
初始代码:有bug
public static void main(String[] args) {
int[] arr=new int[6];
//1 键盘录入,召唤精灵
Scanner sc=new Scanner(System.in);
System.out.println("请输入六个打分:");
//键盘录入6个数组中于数组中
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第"+(i+1)+"位评委的打分:");
arr[i]= sc.nextInt();
}
//2 求和
int sum=0;
for (int i = 0; i < arr.length; i++) {
sum+=arr[i];
}
//3 找最大值
int max=arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max)
max=arr[i];
}
//4 找最小值
int min=arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]<min)
min=arr[i];
}
//5 求平均分=(总和-最大值-最小值)/4
double aver=(sum-max-min)/((arr.length-2)*1.0);
System.out.println("选手的最终得分为"+aver);
}
精进后:防止录入过大或者负数(分数校验)
public static void main(String[] args) {
int[] arr=new int[6];
//1 键盘录入,召唤精灵
Scanner sc=new Scanner(System.in);
System.out.println("请输入六个打分:");
//键盘录入6个数组中于数组中
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "位评委的打分:");
int score = sc.nextInt();
if (score > 0 && score < 100) {
arr[i] = score;
} else {
System.out.println("您的输入有误,请重新输入:");
i--;
}
}
//求和
int sum=0;
for (int i = 0; i < arr.length; i++) {
sum+=arr[i];
}
//3 找最大值
int max=arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max)
max=arr[i];
}
//4 找最小值
int min=arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]<min)
min=arr[i];
}
//5 求平均分=(总和-最大值-最小值)/4
double aver=(sum-max-min)/((arr.length-2)*1.0);
System.out.println("选手的最终得分为"+aver);
}
再次精进:将各个逻辑放到独立的方法当中去(方法抽取)
public static void main(String[] args) {
//1 初始化数组
int[] arr = initDate();
//2 求和
int sum = getSum(arr);
//3 找最大值
int max = getMax(arr);
//4 找最小值
int min = getMin(arr);
//5 求平均分=(总和-最大值-最小值)/4
double aver=(sum-max-min)/((arr.length-2)*1.0);
System.out.println("选手的最终得分为"+aver);
}
private static int getMin(int[] arr) {
int min= arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]<min)
min= arr[i];
}
return min;
}
private static int getMax(int[] arr) {
int max= arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max)
max= arr[i];
}
return max;
}
private static int getSum(int[] arr) {
int sum=0;
for (int i = 0; i < arr.length; i++) {
sum+= arr[i];
}
return sum;
}
private static int[] initDate() {
int[] arr=new int[6];
//1 键盘录入,召唤精灵
Scanner sc=new Scanner(System.in);
System.out.println("请输入六个打分:");
//键盘录入6个数组中于数组中
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "位评委的打分:");
int score = sc.nextInt();
if (score > 0 && score < 100) {
arr[i] = score;
} else {
System.out.println("您的输入有误,请重新输入:");
i--;
}
}
return arr;
}
7 随机产生验证码
题目要求
思路:考虑从数组中随机取出元素
代码实现
public static void main(String[] args) {
String[] sArr={"noodles","rice","soup"};
//0 1 2
Random r=new Random();
int i=r.nextInt(sArr.length);//i读取的随机数的范围是0-5但不包含5
//将随机数当作索引去数组中获取对应的元素
System.out.println(i);
System.out.println(sArr[i]);
}
可以用于制作自己吃什么饭,抽奖等…
问题实现:
思路:
1 随机生成验证码
2 将生成的验证码拼接到一个字符串上
3 键盘录入用户输入的字符串
4 和随机生成的字符串进行比较
public static void main(String[] args) {
char[] chs={
'a','b','c','d','e',
'A','B','C','D','R',
'1','4','8'
};
Random r=new Random();
String checkCode="";
//产生5个随机字符组成的验证码
for(int i=1;i<=5;i++){
int index=r.nextInt(chs.length);
checkCode+=chs[index];
}
System.out.println("产生的验证码为"+checkCode);
//校验验证码
System.out.println("请输入验证码");
Scanner sc=new Scanner(System.in);
//字符串变量来接收用户键盘录入的验证码
String inputCode=sc.next();
//将用户输入和随机生成的验证码进行比对
// if(checkCode==inputCode){
//
// }
}
代码优化:
1 数组进行动态初始化
注意:打印字符数组数组名,输出的结果是字符数组的内容,不是地址(源代码会对字符串进行遍历输出)
2 将模块化的逻辑抽取为方法
public static void main(String[] args) {
char[] chs = getConents();
String checkCode = getCheckCode(chs);
System.out.println("产生的验证码为"+checkCode);
//校验验证码
System.out.println("请输入验证码");
Scanner sc=new Scanner(System.in);
//字符串变量来接收用户键盘录入的验证码
String inputCode=sc.next();
//将用户输入和随机生成的验证码进行比对
// if(checkCode==inputCode){
//
// }
}
private static String getCheckCode(char[] chs) {
Random r=new Random();
String checkCode="";
//产生5个随机字符组成的验证码
for(int i=1;i<=5;i++){
int index=r.nextInt(chs.length);
checkCode+= chs[index];
}
return checkCode;
}
private static char[] getConents() {
char[] chs=new char[26+26+10];
int index=0;
// 使用循环将数组动态初始化
for(char c='a';c<='z';c++) {
chs[index]=c;
index++;
}
System.out.println();
for(char c='A';c<='Z';c++){
chs[index]=c;
index++;
}
for(char c='0';c<='9';c++){
chs[index]=c;
index++;
}
return chs;
}
其他:
方法抽取:
抽取某段逻辑为独立的方法快捷键:ctrl+alt+m