目的
复习前半段课程学习的Java编程知识,能够使用所学的知识解决问题,提升同学们的编程能力。
涉及到的知识点
变量、数组
运算符:基本运算符、关系运算符、逻辑运算符...
程序流程控制: if、switch; for、while;死循环、循环嵌套
跳转关键字: break、continue、return。
方法
...
编程思维
使用所学的Java技术解决问题的思维方式和编写代码实现出来的能力。
关于提升编程思维和编程能力的建议
编程思维和编程能力不是一朝一夕形成的,需要时间的沉淀和大量练习。
前期:先模仿,后期:再创新。
具体措施:勤于练习代码,勤于思考,孰能生巧。
需求:
1.机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。
2.机票最终优惠价格的计算方案如下:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)头等舱7折,经济舱6.5折。
package com.WjhJava.MethodDemo;
import java.util.Random;
import java.util.Scanner;
public class MethodDemoTest1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //输入
Random r = new Random(); //随机
/* 需求/目标:
* 需求:
* 1.机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。
*2.机票最终优惠价格的计算方案如下:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)头等舱7折,经济舱6.5折。
* */
System.out.println("请输入当前票价:");
double money = sc.nextDouble();
System.out.println("请输入当前月份:");
int month = sc.nextInt();
System.out.println("请输入乘坐仓位类型:");
String flyType = sc.next();
System.out.println("票价为:"+fly(money, month, flyType));
}
public static double fly(double money,int month,String flyType){
if(month >= 5 && month <=10){ //STring判断时用switch分支,否则值会传输错误
switch (flyType){
case "头等舱":
money *= 0.9;
break;
case "经济舱":
money *= 0.85;
break;
default:
System.out.println("您输入的仓位类型有误,请重新输入!");
money = -1;
}
}else if(month >=1 && month <=4 || month == 11 || month == 12){
switch (flyType){
case "头等舱":
money *= 0.7;
break;
case "经济舱":
money *= 0.65;
break;
default:
System.out.println("您输入的仓位类型有误,请重新输入!");
money = -1;
}
}else{
System.out.println("您输入的月份有误,请重新输入!");
money = -1;
}
return money;
}
}
分析
1.101-200之间的数据可以采用循环依次拿到;每拿到一个数,判断该数是否是素数。
2. 判断规则是:从2开始遍历到该数的一半的数据,看是否有数据可以整除它,有则不是素数,没有则是素数。
package com.WjhJava.MethodDemo;
import java.util.Random;
import java.util.Scanner;
public class MethodDemoTest1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //输入
Random r = new Random(); //随机
/* 需求/目标:
* 需求:
* 找出101-200的所有素数(除了1和它本身能整除的数称为素数!)
* */
//1.定义一个循环,找到101到200的全部数据
for (int i = 101; i <= 200 ; i++) {
//i = 101 102 103 ... 199 200
//信号位:标志
boolean flag = true; //一开始认为当前数据是素数
//2.判断当前遍历的这个数据是否是素数
for (int j = 2; j <= i/2; j++) {
if(i % j == 0){
flag = false;
break;
}
}
//3.根据判定的结果选择是否输出这个数据,是素数则输出
if(flag){
System.out.println(i);
}
}
}
}
需求:定义方法实现随机产生一个5位的验证码,每位可能是数字、大写字母、小写字母。
分析:
1.定义一个方法,生成验证码返回:方法参数是位数、方法的返回值类型是String。
2.在方法内部使用for循环生成指定位数的随机字符,并连接起来。
3把连接好的随机字符作为一组验证码进行返回。
package com.WjhJava.MethodDemo;
import java.util.Random;
import java.util.Scanner;
public class MethodDemoTest1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //输入
Random r = new Random(); //随机
/* 需求/目标:
* 需求:定义方法实现随机产生一个5位的验证码,每位可能是数字、大写字母、小写字母。
分析:
1.定义一个方法,生成验证码返回:方法参数是位数、方法的返回值类型是String。
2.在方法内部使用for循环生成指定位数的随机字符,并连接起来。
3把连接好的随机字符作为一组验证码进行返回。
* */
//调用获取验证码的方法得到一个随机的验证码
String code = createCode(5);
System.out.println("随机验证码:"+code);
}
/*
1.定义一个方法返回一个随机验证码,是否需要返回值类型声明?String 是否需要声明形参?
*/
public static String createCode(int n){
//3.定义一个字符串变量记录生成的随机字符
String code = "";
//2.定义一个for循环,循环n次,依次生成随机字符
Random r = new Random();
for (int i = 1; i <= n; i++) {
//3.随机生成一个字符:英文大小写,数字(0,1,2)
int type = r.nextInt(3); //0 1 2
switch (type){
case 0: //大写(A 65 ~ Z 65+25) (0~25)+65
char ch = (char) (r.nextInt(25)+65); //强制转成char字符类型
code += ch;
break;
case 1: //小写(a 97 ~ z 97+25) (0~25)+97
char ch1 = (char) (r.nextInt(25)+65); //强制转成char字符类型
code += ch1;
break;
case 2: //数字
code += r.nextInt(10); //0~9
break;
}
}
return code;
}
}
案例:数组元素复制
需求:把一个数组中的元素复制到另一个新数组中去。
分析:1.需要动态初始化一个数组,长度与原数组一样。
2.遍历原数组的每个元素,依次赋值给新数组。
3.输出两个数组的内容。
package com.WjhJava.MethodDemo;
/* 需求/目标:
* 需求:把一个数组中的元素复制到另一个新数组中去。
分析:
1.需要动态初始化一个数组,长度与原数组一样。
2.遍历原数组的每个元素,依次赋值给新数组。
3.输出两个数组的内容。
* */
import java.util.Random;
import java.util.Scanner;
public class MethodDemoTest1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //输入
Random r = new Random(); //随机
int[] arr = {10,20,30,40,50};
int[] newArr = new int[arr.length];
System.out.print("原数组:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.print("新数组:");
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < newArr.length; j++) {
newArr[j] = arr[i];
System.out.print(newArr[j]+" ");
break;
}
}
}
}
package com.WjhJava.MethodDemo;
/* 需求/目标:
* 需求:把一个数组中的元素复制到另一个新数组中去。
分析:
1.需要动态初始化一个数组,长度与原数组一样。
2.遍历原数组的每个元素,依次赋值给新数组。
3.输出两个数组的内容。
* */
import java.util.Random;
import java.util.Scanner;
public class MethodDemoTest1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //输入
Random r = new Random(); //随机
int[] arr = {11,22,33,44,55};
int[] copyArr = new int[arr.length];
copy(arr,copyArr);
}
public static void copy(int[] arr,int[] copyArr){
for (int i = 0; i < arr.length ; i++) {
copyArr[i] = arr[i];
}
System.out.println("原数组:");
printArr(arr);
System.out.println("\n");
System.out.println("新数组:");
printArr(copyArr);
}
public static void printArr(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
System.out.print(i == arr.length-1 ? arr[i] : arr[i]+",");
}
System.out.print("]");
}
}
案例:评委打分案例
需求: 在唱歌比赛中,有6名评委给选手打分,分数范围是[0~100]之间的整数。选手的最后得分分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分.
分析:
①把6个评委的分数录入到程序中去---->使用数组
int[] scores = new int[6];
②遍历数组中每个数据,进行累加求和,并找出最高分、最低分。
③按照分数的计算规则算出平均分。
package com.WjhJava.MethodDemo;
/* 需求/目标:
需求:在唱歌比赛中,有6名评委给选手打分,分数汜围定[u~1uu]L也八E 高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分.
分析:
①把6个评委的分数录入到程序中去---->使用数组
int[] scores = new int[6];
②遍历数组中每个数据,进行累加求和,并找出最高分、最低分。
③按照分数的计算规则算出平均分。
* */
import java.util.Random;
import java.util.Scanner;
public class MethodDemoTest1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //输入
Random r = new Random(); //随机
int[] arr = new int[6];
score(arr);
}
public static void score(int[] arr){
Random r = new Random(); //随机
for (int i = 0; i < arr.length; i++) { //随机生成数组最大长度的分数,然后遍历赋值给他
arr[i] =r.nextInt(101);
}
//采用冒泡排序的方法
for (int i = 0; i < arr.length-1; i++) { //次数
for (int j = 0; j < arr.length-i-1; j++) { //轮数
if(arr[j] > arr[j+1]){ //如果j位大于后一位,则交换位置
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//按照上面从小打大排好的数组遍历输出
System.out.print("评委们的分数分别是:");
for (int i = 0; i < arr.length; i++) {
System.out.print(i == arr.length-1 ? arr[i] : arr[i]+",");
}
System.out.println();
double count = 0;
System.out.print("去掉最高分和最低分:");
for (int i = 1; i < arr.length-1; i++) { //去掉最高分和最低分
System.out.print(i == arr.length-2 ? arr[i] : arr[i]+",");
count += arr[i];
}
System.out.println();
System.out.println("选手最终的得分是:"+count/ (arr.length-2)); //输出打印
}
}
需求: 某系统的数字密码:比如1983,采用加密方式进行传输,规则如下︰先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。
package com.WjhJava.MethodDemo;
/* 需求/目标:
需求:某系统的数字密码:比如1983,采用加密方式进行传输,规则如下︰先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。
* */
import java.util.Random;
import java.util.Scanner;
public class MethodDemoTest1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //输入
Random r = new Random(); //随机
//1.定义一个数组存入需要加密的数组
System.out.println("请您输入需要的密码个数:");
int passNum = sc.nextInt();
int[] pass = new int[passNum];
//2.录入需要加密的数字
for (int i = 0; i < pass.length; i++) {
System.out.println("请输入第" + (i + 1) + "位密码:");
int date = sc.nextInt();
pass[i] = date;
}
//3.打印数组内容看一下
printPass(pass); //[1,9,8,3]
//4.核心内容:对数组中的内容进行加密;pass[]={1,9,8,3,}
for (int i = 0; i < pass.length; i++) {
pass[i] = (pass[i] + 5) % 10;
}
//5.核心逻辑:(对数组中加密的数据进行反转,才是最终加密的结果) //pass = {6 ,4 ,3 ,8 }
// 占位: i j
for (int i = 0,j=pass.length-1; i < j; i++,j--) { //
int temp = pass[i];
pass[i] = pass[j];
pass[j] = temp;
}
printPass(pass); //打印加密并反转后的数组 //[8,3,4,6]
}
public static void printPass(int[] pass){
System.out.print("[");
for (int i = 0; i < pass.length; i++) {
System.out.print(i == pass.length-1 ? pass[i] : pass[i]+",");
}
System.out.println("]");
}
}
ps:也可以当成解密程序
P69 08