Java学习记录
第一次学习总结:12.8-12.13
完成第二章第二节环境搭建:学习Java课程的前置任务,如JDK安装与工具安装
完成第二章第三节基础语法:学习Java基础语法
完成第二章第四节流程控制:学习Java中一些基本的流程逻辑
完成第二章第五节数组:学习Java中的数组相关知识以及一些常用算法
完成第二章第六节综合案例: 章节练习
第二章第二节 环境搭建
环境搭建:
- 先安装 JDK11;
- 配置环境变量 ;
- 安装 eclipse;
第二章第三节 基础语法
- 数据类型与变量;
需要注意的是:
float f1 = 100.1f;
long l1 = 2200000000l;
char c1 = “”; ‘’:一个字符 可以进行数字计算 - 方法使用 ;
haha:for(;😉{//为循环起名
}
//接受用户输入之前判断输入的类型是否为int
if(input.hasNextInt()){
//写内容
}
- 运算符;
- 转义字符;
第二章第四节 流程控制
- 程序执行结构概述;
- 分支执行结构;
- 循环执行结构;
第四节作业
小王的面试任务
- 定义一个整型变量并赋任意五位正整数作为初始值,判断它是不是五位
回文数
(五位回文数:个位与万位相同,十位与千位相同,例如:12321): - 定义一个整型变量并赋任意五位正整数作为初始值,输出各位数字之和
(例如:12345 各位之和是:1+2+3+4+5 。也就是 15) - 定义整型变量 a、b,写出将 a、b 两个变量值进行互换的程序
(要求不能使用第三个变量) - 请写出一段遵守编码规范的 Hello World 代码
package com.kaikeba.demo;
import java.util.Scanner;
public class Xiaowang {
public static void main(String[] args) {
// 1、 定义一个整型变量并赋任意五位正整数作为初始值,判断它是不是五位回文数
int a = 12321;
int a1 = a / 10000;//取万位
int a2 = a % 10000 / 1000;//取千位
int a3 = a % 1000 / 100;//取百位
int a4 = a % 100 / 10;//取十位
int a5 = a % 10;//取个位
if(a1==a5 && a2==a4) {
System.out.println("是五位回文数!");
}else {
System.out.println("不是五位回文数!");
}
// 2、 定义一个整型变量并赋值五位正整数作为初始值,输出各个数字之和
int b = 12345;
int b1 = b / 10000;//取万位
int b2 = b % 10000 / 1000;//取千位
int b3 = b % 1000 / 100;//取百位
int b4 = b % 100 / 10;//取十位
int b5 = b % 10;//取个位
int b6 = b1+b2+b3+b4+b5;
System.out.println("五位正整数各个数字之和为:"+b6);
// 3、 定义整型变量a、b,写出将a、b两个变量值进行互换的程序
a = a + b;
b = a - b;
a = a - b;
System.out.println("交换后a的值为:" + a);
System.out.println("交换后b的值为:" + b);
// 4、请写出一段遵循编码规范的Hello World 代码
System.out.println("Hello World");//输出Hello World
}
}
出租车计费训练任务
package com.kaikeba.demo;
import java.util.Scanner;
public class TaxiFree {
/*
* isAppointment=是否预约
* appointmentTime=预约时间
* totalDistance=总里程数
* totalTime=总时间
* isLowSpeed=是否低速行驶
* lowSpeedTime=低速时间
* isMorningRushHour=是否早晚发高峰
* isCarryingPassengersBackForth=是否往返载客
* isNight=是否夜间
*/
public static void main(String[] args) {
// 1、 定义需要的变量,用于存储数据
float sum = 0; //总价
float appointmentFree = 0; //预约叫车费用
float distanceFree=0; //里程费
float basicFree=2.3f; //基本单价
float lowSpeedFree=0; //低速行驶费用
float airFareFree=0; //空驶费
float nightFree=0; //夜间费用
float oilFree=1f; //然后附加费
Scanner input = new Scanner(System.in);
// 2、 预约叫车
System.out.println("您是否预约叫车 1:是 0:否");
int isAppointment = input.nextInt();
if(isAppointment==1) {
System.out.println("你已成功预约");
System.out.println("请输入提前多久预约-超过4h收取服务费6元,4h以下为5元");
float appointmentTime = input.nextFloat();
if(appointmentTime>4) {
appointmentFree = 6;
}else {
appointmentFree = 5;
}
}
// 3、 总乘车时间
System.out.println("请输入您乘车总时长");
float onTaxiTime = input.nextFloat();
System.out.println("您乘车总时长为:"+onTaxiTime);
// 4、 总里程
System.out.println("请输入您乘车总里程数");
float totalDistance = input.nextFloat();
if(totalDistance > 3) {
distanceFree = (float) ((totalDistance-3) * basicFree + 13);
}else {
distanceFree = 13;
}
// 5、 输入是否需要低速形式和是否是早高峰
System.out.println("您是否进入低速行驶 1:是 0:否");
int isLowSpeed = input.nextInt();
if(isLowSpeed==1) {
System.out.println("请您输入低速行驶时间");
float lowSpeedTime = input.nextFloat();
System.out.println("您是否在早高峰时间段 (7:00(含)-9:00(不含);17:00(含)-19:00不含()) 1:是 0:否");
int isMorningRushHour = input.nextInt();
if(isMorningRushHour==1) {
lowSpeedFree = lowSpeedTime / 5 * 2 * basicFree;
}else {
lowSpeedFree = lowSpeedTime / 5 * basicFree;
}
}
// 6、 空驶费
if(totalDistance > 15) {
System.out.println("您是否是往返行驶 1:是 0:否");
int isCarryingPassengersBackForth = input.nextInt();
if(isCarryingPassengersBackForth==1) {
airFareFree = (float) ((totalDistance - 15) * basicFree * 1.5);
}
}else {
airFareFree = 0;
}
// 7、 是否夜间形式
System.out.println("您是否是夜间行驶 (23:00(含)-次日5:00(不含)) 1:是 0:否");
int isNight = input.nextInt();
if(isNight==1) {
nightFree = (float) ((totalDistance-3) * basicFree * 0.2);
}else {
nightFree = 0;
}
// 8、 总费用
sum = appointmentFree + nightFree + airFareFree + lowSpeedFree + distanceFree + oilFree;
System.out.println("***********打印输出详情***********");
System.out.println("总费用为:"+ Math.round(sum) + "元");
System.out.println("预约叫车的费用为:"+ Math.round(appointmentFree) +"元");
System.out.println("里程费为:"+ Math.round(distanceFree) +"元");
System.out.println("低速行驶费为:"+ Math.round(lowSpeedFree) +"元");
System.out.println("空驶费为:"+ Math.round(airFareFree) +"元");
System.out.println("夜间费用为:"+ Math.round(nightFree) +"元");
System.out.println("燃油附加费为:"+ Math.round(oilFree) +"元");
}
}
流程控制的逻辑训练任务
1 、计算应缴金额
商场根据会员积分打折:
2000 分以内打 9 折,
4000 分以内打 8 折,
8000 分以内打 7.5 折,
8000 分以上打 7 折,使用 if-else-if 结构,实现手动输入购物金额和积分,计算出应缴金额
2 、计算该年该月天数
一年中有 12 个月,而每个月的天数是不一样的。其中大月 31 天,分别为1,3,5,7,8,10,12 月,小月 30 天,分别 为 4,6,9,11 月。还有二月比较特殊,平年的二月只有 28 天,而闰年的二月有 29 天,由用户在控制台输入年份和月份,程序计算该年该月的天数。
3 、图形打印任务
4 、打印九九乘法表
5 、打印三位数中的所有水仙花数
package com.kaikeba.demo;
import java.util.Scanner;
public class ProcessControl {
public static void main(String[] args) {
// 1、 计算应缴金额
//cast();
// 2、 计算该年该月天数
//calculateData();
// 3、 图形打印任务
//Graph.rightAngle(); // 1、 5行5列正方的直角三角形
//Graph.downRightAngle(); // 2、 5行5列倒置直角三角形
//Graph.isosceles(); // 3、 5行9列的等腰三角形
//Graph.diamond(); // 4、 9行9列的实心菱形
//Graph.diamondEmpty(); // 5、 9行9列的空心菱形
// 4、 打印九九乘法表
multiplicationTable();
// 5、 打印三位数中的所有水仙花数
narcissisticNumber();
}
public static void cast() {
System.out.println("尊敬的会员您好,请输入您的购物金额!");
Scanner input = new Scanner(System.in);
float money = input.nextFloat();
System.out.println("尊敬的会员您好,请输入您的积分!");
float defaultMoney = money;
float points = input.nextFloat();
if(points <= 2000f) {
money *= 0.9;
}else if(2000 < points && points <= 4000f){
money *= 0.8;
}else if(4000 < points && points <= 8000f){
money *= 0.75;
}else{
money *= 0.7;
}
System.out.println("尊敬的会员您好,您拥有"+points+"分!"+" 本次购物需付"+defaultMoney+"元"+ " 折扣后实付"+money+"元");
}
public static void calculateData() {
System.out.println("请输入年份");
Scanner input = new Scanner(System.in);
int year = input.nextInt();
System.out.println("请输入月份");
int month = input.nextInt();
int days = 31;
if(month == 4 ||month == 6 || month == 9 || month == 11) {
days = 30;
}
if(month == 2) {
if(year % 400 == 0 || year % 4 == 0 && year % 100!=0) {
days = 29;
}else {
days = 28;
}
}
System.out.println(year + "年" + month + "月有" + days + "天。");
}
public static void multiplicationTable() {
System.out.println("乘法口诀表:");
for(int i = 1 ; i <= 9 ; i++) {
for(int j = 1 ; j <= i ; j++) {
System.out.print(j + "*" + i + "=" + ( i * j ) + "\t");
}
System.out.println();
}
}
public static void narcissisticNumber() {
for(int i = 100 ; i < 1000 ; i++) {
int a1 = i % 1000 / 100;//取百位
int a2 = i % 100 / 10;//取十位
int a3 = i % 10;//取个位
int a = (int) (Math.pow(a1, 3) + Math.pow(a2, 3) + Math.pow(a3, 3));
if(i == a){
System.out.println(i);
}
}
}
}
第二章第五节 数组
- 数组概述;
- 数组常用算法;
第五节作业
选队长
今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。请你通过编写程序,求出一组人中的队长是原来第几位同学。
package com.kaikeba.demo;
import java.util.Scanner;
public class ChooseLeader {
public static void main(String[] args) {
/*
* 选队长游戏训练任务
* 今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举一个人作为出游的临时队长。
* 为了体现合理公平,大家提出了一个比较有趣的规则。
* 所有人围成一圈,顺序排号。
* 从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。
* 请你通过编写程序,求出一组人中的队长是原来第几位同学。
*/
// 定义下标和报数
int flag = 0;
int count = 0;
// 输入参加人数
Scanner input = new Scanner(System.in);
System.out.println("请输入参加游戏的人数");
int number = input.nextInt();
//定义数组存储参加人员 初始都设为1
int nums[] = new int[number];
int changeNum = nums.length;
for(int i = 0 ; i < nums.length ; i++) {
nums[i] = 1;
}
//判断人数是否大于1
while(changeNum > 1) {
//开始报数
if(nums[flag] == 1) {
count++;
}
//报到3时退出,人数-1,重新计数
if(count==3) {
nums[flag] = 0;
changeNum--; //出错处!!是数组-1,不是总人数-1
count = 0;
}
//下一位同学
flag++ ;
//如果到了最后一位同学时,循环重新开始
if(flag == number) {
flag = 0;
}
}
for(int i = 0 ; i < nums.length ; i++) {
if(nums[i] == 1) {
System.out.println("最后留下当选为队长的人是原来的第"+(i+1)+"位");
}
}
}
}
//还可以采用System.arraycopy的方法
流程控制的逻辑训练任务
1 、查找某个整数
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。 然后将输
入一个整数,查找此整数,找到输出下标, 没找到给出提示。
2 、找出数组的最值
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组
的最大值、最小值。
3 、两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为
目标值的那两个整数,并输出他们的数组下标
假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以输出 0,1
4 、排序并查找
对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 6 并
输出排序后的下标。
5 、移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保
持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
package com.kaikeba.demo;
import java.util.Scanner;
public class ArrayGrammarTraining {
public static void main(String[] args) {
//find1(); // 1、 查找某个整数
//findMax(); // 2、 找出数组的最值
//addNumbers(); // 3、 两数之和
sortAndFind(); // 4、 排序并查找
//moveZero(); // 5 、移动零
}
public static void find1() {
// 1、 查找某个整数
// 定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。 然后输入一个整数,查找此整数,找到输出下标, 没找到给出提示。
// 1.1 首先进行素组整数输入
int[] nums = new int[10];
int target = 1; //标记是否找到
Scanner num = new Scanner(System.in);
for(int i = 0 ; i < nums.length ; i++) {
System.out.println("请输入一个整数");
nums[i] = num.nextInt();
}
// 1.2 输入一个整数并查找
System.out.println("请输入一个整数进行查找");
int num1 = num.nextInt();
for(int i = 0 ; i < nums.length ; i++) {
if(nums[i] == num1) {
System.out.println("查找成功,位子为:" + i);
target = 1;
break;
}else {
target = -1;
}
}
if(target == -1) {
System.out.println("该整数并不在此数组范围内");
}
}
public static void findMax() {
// 2、 找出数组的最值
// 定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组的最大值、最小值。
// 2.1 首先进行素组整数输入
int[] nums = new int[10];
Scanner num = new Scanner(System.in);
for(int i = 0 ; i < nums.length ; i++) {
System.out.println("请输入一个整数");
nums[i] = num.nextInt();
}
// 2.2 输出数组的最大值、最小值
System.out.println("查找最大最小值");
int max = nums[0];
int min = nums[0];
for(int i = 1 ; i < nums.length ; i++) {
if(max <= nums[i]) {
max = nums[i];
}
if(min >= nums[i]) {
min = nums[i];
}
}
System.out.println("数组中的最大值为: " + max +" 最小值为: " + min);
}
public static void addNumbers() {
// 3、 两数之和
/* 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值 的那两个整数,并输出他们的数组下标
假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以输出 0,1
*/
// 3.1 给定一个整数数组 nums 和一个目标值 target
int[] nums = {2,7,11,15};
int target = 9;
for(int i = 0; i < nums.length ; i++) {
for(int j = i + 1 ; j < nums.length ; j++)
if(target - nums[i] == nums[j]) {
System.out.println("存在,下标为: "+i+","+j);
}
}
}
public static void sortAndFind() {
// 4、 排序并查找
// 对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 6 并输出排序后的下标。
// 4.1 排序
int[] nums = {1,3,9,5,6,7,15,4,8};
for(int i = 0; i < nums.length - 1 ; i++) {
for(int j = 0;j < nums.length - i - 1 ; j++) {
if(nums[j] > nums[j+1]) {
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
// 打印排序完数组
for(int i = 0; i < nums.length ; i++) {
System.out.print(nums[i] + " ");
}
System.out.println();
// 4.2 查找
int num = 6;
int maxIndex = nums.length - 1;
int minIndex = 0;
int centerIndex = (maxIndex + minIndex) / 2;
while(true) {
if(nums[centerIndex] > num) {
maxIndex = centerIndex - 1;
}else if(nums[centerIndex] < num) {
minIndex = centerIndex + 1;
}else {
//找到了
System.out.println("找到了,数据位置为: " + centerIndex);
break;
}
if(minIndex > maxIndex) {
centerIndex = -1;
break;
}
centerIndex = (maxIndex + minIndex) / 2;
}
}
public static void moveZero() {
// 5、 移动零
/*
* 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
* 示例:
* 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
*
*/
// 5.1 排序
int[] nums = {0,1,0,3,12};
int[] nums1 = new int[nums.length];//新建数组先存放nums中不为0的值,再补齐缺少的长度即为0
int s = 0;
for(int i = 0 ; i < nums.length; i++) {
if(nums[i] != 0) {
nums1[s] = nums[i];
s++;
}
}
for(int i = s ; s < nums.length; s++) {
nums1[i]=0;
}
// 打印排序完数组
for(int i = 0; i < nums.length ; i++) {
System.out.print(nums1[i] + " ");
}
System.out.println();
}
}
第二章第六节 综合案例与赏金任务卡
第六节作业
见第五节选队长
第三章第二节 综合案例与赏金任务卡
第二节作业
快递 E 栈训练任务
包含功能:
功能介绍:
- 角色切换(快递员和普通用户)
快递员功能:存快递,删除快递,修改快递,查看所有快递
普通用户功能:取快递 - 存快递
- 删除快递
- 修改快递
- 查看所有快递
- 取快递
package com.kaikeba.demo;
import java.util.Scanner;
public class Estack {
//创建三个数组用于存储快递单号 公司名称 取件码
static int[] expressNumber = new int[100];
static String[] companyName = new String[100];
static int[] pickupCode = new int[100];
//用于存储快递的index
static int index = 0;
public static void main(String[] args) {
// for(int i = 0 ; i < pickupCode.length - 1 ;i++) {
// System.out.println(pickupCode[i]);
// }
start();
}
public static void start() {
// 1. 角色切换(快递员和普通用户)
Scanner input = new Scanner(System.in);
System.out.println("=====欢迎使用新职课快递柜=====");
System.out.println("请输入您的身份: 1-快递员, 2-用户");
int id = input.nextInt();
switch(id) {
case 1:
courierChooseId();
case 2:
userChooseId();
default:
System.out.println("输入有误,请检查输入!");
start();
}
}
public static void courierChooseId() {
System.out.println("请选择操作:1-存快递 2-删除快递 3-修改快递信息 4-查看所有快递");
Scanner input = new Scanner(System.in);
int number = input.nextInt();
switch(number) {
case 1:
//1-存快递
saveDelivery();
case 2:
//2-删除快递
deleteDelivery();
case 3:
//3-修改快递信息
changeDelivery();
case 4:
//4-查看所有快递
showDelivery();
default:
System.out.println("您的输入有误,请检查输入!");
start();
}
}
public static void userChooseId() {
getDelivery();
}
public static void saveDelivery() {
System.out.println("请输入快递单号:");
Scanner input = new Scanner(System.in);
expressNumber[index] = input.nextInt();
System.out.println("请输入公司名称:");
companyName[index] = input.next();
int code = (int) ((Math.random()+1)*1000);
pickupCode[index] = code;
System.out.println("快递已存入,取件码是:"+ code);
index++;
start();
}
public static void deleteDelivery() {
boolean isDelete = false;
System.out.println("请输入要删除的快递单号:");
Scanner input = new Scanner(System.in);
int delectNum = input.nextInt();
for(int i = 0 ; i < expressNumber.length - 1 ;i++) {
if(expressNumber[i] == delectNum) {
expressNumber = kickOff(expressNumber, i);
pickupCode = kickOff(pickupCode, i);
companyName = kickOff2(companyName, i);
isDelete = true;
break;
}
}
if(isDelete) {
System.out.println("删除成功!");
showDelivery();
}else {
System.out.println("未找到快递!");
start();
}
}
public static void changeDelivery() {
boolean isChange = false;
System.out.println("请输入要修改的快递单号:");
Scanner input = new Scanner(System.in);
int change = input.nextInt();
for(int i = 0 ; i < expressNumber.length - 1 ;i++) {
if(expressNumber[i] == change) {
System.out.println("请输入新的快递单号:");
int deliNew = input.nextInt();
System.out.println("请输入新的公司名称:");
String comNew = input.next();
expressNumber[i] = deliNew ;
companyName[i] = comNew;
isChange = true;
break;
}
}
if(isChange) {
System.out.println("修改成功!");
}else {
System.out.println("未找到快递!");
start();
}
}
// public static void showDelivery() {
// System.out.println("所有快递信息如下:");
// System.out.printf("%-9s%-9s%-9s\n","快递单号","公司名称","取件码");
// for(int i = 0 ; i < expressNumber.length - 1 ;i++) {
// if(expressNumber[i] != 0 && pickupCode[i] != 0) {
// System.out.printf("%-9s%-9s%-9s\n",expressNumber[i],companyName[i],pickupCode[i]);
// }
// }
// start();
// }
public static void showDelivery() {
System.out.println("所有快递信息如下:");
System.out.println("快递单号\t公司名称\t取件码");
for(int i = 0 ; i < expressNumber.length - 1 ;i++) {
if(expressNumber[i] != 0 && pickupCode[i] != 0) {
System.out.println(expressNumber[i]+"\t"+companyName[i]+"\t"+pickupCode[i]);
}
}
start();
}
public static void getDelivery() {
boolean isGet = false;
System.out.println("请输入取件码:");
Scanner input = new Scanner(System.in);
int code = input.nextInt();
for(int i = 0 ; i < expressNumber.length - 1 ;i++) {
if(pickupCode[i] == code && code != 0) {
expressNumber = kickOff(expressNumber, i);
pickupCode = kickOff(pickupCode, i);
companyName = kickOff2(companyName, i);
isGet = true;
break;
}
}
if(isGet) {
System.out.println("取件成功");
start();
}else {
System.out.println("未找到该快递");
start();
}
}
//改进: int删除方法
private static int[] kickOff(int[] a,int index) {
int[] b = new int[a.length - 1];
System.arraycopy(a, 0, b, 0, index);
System.arraycopy(a, index + 1, b, index, a.length - index -1);
return b;
}
private static String[] kickOff2(String[] companyName2,int index) {
String[] b = new String[companyName2.length - 1];
System.arraycopy(companyName2, 0, b, 0, index);
System.arraycopy(companyName2, index + 1, b, index, companyName2.length - index -1);
return b;
}
}
// 任存在一些逻辑上的小BUG,后期改进