HM Day 04
6-1
IntelliJ IDEA的安装与使用
安装之前要提前下载好安装包,步骤如下:
IDEA的项目project,模块module,包package的创建
project(项目、工程)
-- Module(模块)
-- Package(包)
-- Class(类)
-- Class(类)
-- Package(包)
-- Class(类)
-- Class(类)
-- Module(模块)
...
在使用IDEA来创建Java项目的时候,一定要满足上面的目录结构,否则代码跑不起来。
IDEA创建项目
1.创建项目
Crete New Project-->在左边选择Empty Project --> Next--> 填写项目名称(BasiceCode)
-->Finish
2.创建模块
点击+号-->New Module--> Next --> 填写模块的名称(myModule) -->finish --> Applye And Ok
3.在模块中创建包
选中src目录右键-->New --> Package --> 填写包的名称 (com.itheima.demo)
4.在包中新建类
选中包文件夹右键-->New --> Class --> 写具体代码
5.编译和运行
编译:自动编译
运行:
1)点击main方法左边的绿色三角按钮
2)右键-->Run
IDEA的快捷键
psvm: 一键生成主方法
sout: 生成输出语句
ctrl+alt+L: 格式化代码
alt+Enter: 代码修正提示
(fn)+shift+f6:修改名称(类名、文件名、包名、变量名...)
ctrl+/: 添加(取消)单行注释
ctrl+shift+/ : 添加(取消)多行注释
ctrl+D : 复制当前行的代码
ctrl+X : 剪切
ctrl+V : 粘贴
alt+1: 打开/隐藏项目结构
alt+4: 打开/隐藏控制台
10.fori : 10次的for循环
修改快捷键
如果你的快捷键用不了,就可以按照下面的步骤重置快捷键。
File-->Setting(设置)-->keymap(快捷键)-->搜索想要的快捷键
1.先移除原来的快捷键(remove shortcut)
2.添加新的快捷键(add keyboard)
其他的配置
1.设置主题
File-->Setting(设置)-->Apperance-->Theme(主题)
2.设置字体大小
File-->Setting(设置)-->Editor(编辑)-->font(字体)-->size(大小)
3.设置注释的颜色
File-->Setting(设置)-->Editor(编辑)
-->Color Schame-->Language Default-->Comments(注释)
4.设置背景图片
File-->Setting(设置)-->Apperance-->Background Image(背景图片)
在已有的项目中新建模块
点击工具栏右边的按钮,如图所示。新建新的模块
删除已有的模块
在项目的结构页面,点击 减号 就可以删除模块。但是需要到项目文件夹中,手动删除才能彻底删除模块。
关闭已有项目
File --> Close Project
数组
格式:数组的定义有两种格式
//数据类型[] 数组名;
int[] array;
//数据类型 数组名[];
int array[];
数组的动态初始化
动态初始化的格式
//数据类型[] 数组名 = new 数据类型[长度];
int[] array = new int[3];
下面的格式也可以,但是不建议使用
//定义数组格式- 动态初始化
数据类型 数组名[]=new 数据类型[长度];
int arrayA[]=new int[3]; //定义一个长度为3的数组,元素类型为int
byte arrayB[]=new byte[2]; //定义一个长度为2的数组,元素类型为byte
Java的内存分配
要点
- 这部分内容了解就行,目的是帮助我们更深入的理解数组的底层原理
学习素材
栈内存:存储局部变量(方法中的变量)
堆内存:new出来的数据
方法区:存储字节码的信息
HelloWorld.class (字节码文件,给JVM执行)
本地方法区:操作系统维护的内存区域
寄存器:给CPU使用的
一个数组的内存图解
两个数组的内存图解
每一个数组在堆内存中都有自己独立的空间,互不影响。
两个引用指向同一个数组
当两个引用指向同一个堆内存的地址,一个引用修改了堆内存中的数据,第二个引用去访问时数据已经被修改过了。
数组的静态初始化
静态初始化格式
//数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
int[] array = new int[]{1,2,3,4,5,6};
//数据类型[] 数组名 = {元素1,元素2,元素3...};
int[] array = {1,2,3,4,5,6};
数组中常见的问题
1.ArrayIndexOutOfBoundsException: 数组索引越界
数组的最小索引是0,最大的索引是长度-1
2.NullPointerException: 空指针异常
数组的变量,没有指向任何地址
生成for循环的快捷方式:
//遍历数组快捷键:数组名.fori
//数组的长度:array.length
HM Day 05
6-2
Java经典题型练习
1.斐波那契数列
package ClassicP1;
import java.util.Scanner;
/**
* @Package: ClassicP1
* @ClassName: test5
* @Author: PC
* @CreateTime: 2021/6/2 14:44
* @Description: 斐波那契数列: 1 1 2 3 5 8 13 21 34 55 ...
* 求:斐波那契数列的第n个数是多少.
* 通过观察发现规律:
* 1.第一个数和第二个数都是1
* 2.从第三个数开始,这个等于前面两个数之和
* 分析思路:
* 1.定义一个数组,数组的长度就是n
* int[] array=new int[n];
* 2.按照规律给数组中的元素赋值
* array[0]=1;
* array[1]=1;
* 3. 是使用循环遍历从2索引开始的元素,给元素赋值
* array[i]=array[i-1]+array[i-2];
*/
public class test5 {
public static void main(String[] args) {
// 1,键入一个整数n
System.out.println("~~~~~~~斐波那契数列~~~~~~");
System.out.println("请输入一个数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n < 3) {
System.out.println("斐波那契数列的第" + n + "个数是:" + 1);
} else {
// 2,定义一个数组
int[] arr = new int[n];
// 3,赋值
arr[0] = 1;
arr[1] = 1;
int i = 2;
while (i < n) {
arr[i] = arr[i - 1] + arr[i - 2];
i++;
}
System.out.println("斐波那契数列的第" + n + "个数是" + arr[n - 1]);
}
}
}
2,数组逆序(两种方式逆序)
package ClassicP1;
/**
* @Package: ClassicP1
* @ClassName: test4
* @Author: PC
* @CreateTime: 2021/6/2 14:07
* @Description: 数组逆序 需求:把数组中的元素逆序,如{1,2,3,4,5},逆序之后{5,4,3,2,1}
* 分析:
* 新建一个数组把要输出的数组倒着输出,或者找个中间变量来接收;
*/
public class test4 {
public static void main(String[] args) {
// 1,定义一个有序数组
int[] arr = {1, 2, 3, 4, 5};
// 2,定义一个接受的数组(第一种方法)
int[]arr1 = new int[arr.length];
// 3,第一种方法开始接收
// int j = arr.length-1;
for (int i= 0;i<arr.length;i++){
arr1[j] = arr[i];
j--;
}
// 4,第二种方法利用一个中间变量来倒序接受
int head = 0;
int tail =arr.length-1;
while (head<tail){
int temp = arr[head];
arr[head] = arr[tail];
arr[tail] =temp;
head++;
tail--;
}
// 5,打印倒序的结果
System.out.println("~~~~倒序数组~~~~");
// 第一种倒序结果
// for (int i= 0;i<arr1.length;i++){
// System.out.print(arr1[i]+" ");
// }
// 第二种倒序结果
for (int i= 0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
3,折半查找
package ClassicP1;
import java.util.Scanner;
/**
* @Package: ClassicP1
* @ClassName: test3
* @Author: PC
* @CreateTime: 2021/6/2 11:21
* @Description:折半查询
******** 前提是该数组必须是有序数组*************
*/
public class test3 {
public static void main(String[] args) {
// 1,定义一个有序数组
int []arr ={1,2,3,4,5,6,7,8,9,10};
// 2,定义索引的头,尾和标记
int head =0;
int tail =arr.length-1;
int tab =-1;
// 3,键入需要查找的值
System.out.println("~~~~~~~折半查找~~~~~~~");
System.out.println("请输入你要查询的值:");
Scanner sc = new Scanner(System.in);
int key =sc.nextInt();
int mid = 0;
// 4,折半查找
for (int i=0;i<arr.length;i++){
mid = (head+tail)/2;//重新给中间量赋值
if (key>arr[mid]){
head = mid+1;
}else if (key<arr[mid]){
tail = mid -1;
}else{
tab++;
break;
}
}
if (tab!=-1){
System.out.println("你查找的值在第"+(mid+1)+"位");
}else{
System.out.println("抱歉,该数组没有你要查找的值");
}
}
}
4,打印九九乘法表
package ClassicP1;
/**
* @Package: ClassicP1
* @ClassName: test1
* @Author: PC
* @CreateTime: 2021/6/2 10:29
* @Description: 打印九九乘法表
* 1*1=1
* 1*2=2 2*2=4
* 1*3=3 2*3=6 3*3=9
* ...
* 1*9=1 2*9=18 ... 9*9=81
*/
public class test1 {
public static void main(String[] args) {
System.out.println("~~~~~九九乘法表~~~~~");
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
if (i == j) {
System.out.println(j+ "*" + i + "=" + i * j);
} else {
System.out.print(j+ "*" + i+ "=" + i * j + " ");
}
}
}
}
}
5,炸金花
package ArrayP1;
import java.util.Random;
/**
* @Package: ArrayP1
* @ClassName: demo6
* @Author: PC
* @CreateTime: 2021/6/1 20:34
* @Description: 需求: 在炸金花游戏中,有54张扑克牌,每人发3张,
* 然后比谁的牌大谁的牌小。 现在我们可以写代码完成随机发3张牌的要求
* 实现步骤:
* 1. 定义一个数组arr1,用来存储牌的点数
* 思考🙄:牌的点数是固定的("A","2"..."10","J","Q","K"),用静态初始化好?还是动态初始化好?
* 2. 定义一个数组arr2,用来存储牌的花色
* 思考🙄:牌的花色是固定的("♥","♠","♣","♦"),用静态初始化好?还是动态初始化好?
* 3. 定会一个数组arr3,长度为54,用来存储所有的牌(每一张牌包含花色+点数,如:"♥A","♦6")
* 思考🙄:如何将每一种花色和点数组合成一张牌,并存到数组中
* 思考🙄:大王和小王单独添加到数组中
* 4. 定义一个数组arr4,长度为3,从arr3数组中随机的产生3个元素存储到arr4数组中(元素不能重复)
* 5. 打印arr4中的每一个元素
*/
public class demo6 {
public static void main(String[] args) {
Random r = new Random();
// 1,定义一个数组arr1,用来存储牌的点数
String[] c1 = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
// 2,定义一个数组arr2,用来存储牌的花色
String[] c2 = {"♥", "♠", "♣", "♦"};
// 3,定义一个数组arr3,长度为54,用来存储所有的牌(包括大王和小王)
String[] c3 = new String[54];
// 4,遍历
int count = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 13; j++) {
c3[count] = c2[i] + c1[j];
count++;
}
}
c3[52] = "大王";
c3[53] = "小王";
// 5,定义一个arr4的数组,长度是3,用于接收随机抽到的三张牌
String[] c4 = new String[3];
int[] arr = new int[3];
// 6,接收三张牌,并筛选掉重复的牌
for (int i = 0; i < 3; i++) {
int random = r.nextInt(53);
// ***************************关键的一步,加入标记判断是否有重合,而不是在里面直接赋值;*****
int count1 = -1;
// for (int j = 0; j < 3; j++) {
*******另一个关键步骤,利用抽到的牌和手里的牌去作比较,从而确定抽到的三张牌不重复;*****
// if (c4[random].equals(c4[j])) {
// count1++;
// }
// }
// *******另一种方法:可以比较随机抽到的牌和存储在数组中的牌进行比较;
for (int j = 0; j < 3; j++) {
if (c3[random].equals(c4[j])) {
count1++;
}
}
if (count1 != -1) {
i--;
}else{
c4[i] = c3[random];
}
}
// 7,打印出随机抽到的三张牌
System.out.println("~~~~~炸金花~~~~");
System.out.println("你抽到的三张牌是:");
for (int i = 0; i < 3; i++) {
System.out.print(c4[i] + " ");
}
}
}
6,人品计算器
package ArrayP1;
import java.util.Random;
import java.util.Scanner;
/**
* @Package: ArrayP1
* @ClassName: demo5
* @Author: PC
* @CreateTime: 2021/6/1 20:22
* @Description:
* 需求:定义一个字符串数组,用来存储可能出现的人品。然后键盘录入一个姓名,
* 这里的姓名其实就起到掩人耳目的作用(让你以为是通过姓名算的),实际上是随机从人品数组中找的一个元素
* 思路分析:
* 1.定义一个字符串数组,存储人品信息,数组元素已经给你准备好了,直接复制就行。
* {
* "你的人品堪忧啊,多做善事吧",
* "我上辈子肯定欠你的,不要上我见到你,快走、快走....",
* "你印堂发黑,有血光之灾啊",
* "帅哥,感觉你要走桃花运啊,带带我呗",
* "迎娶白富美,走上人生巅峰",
* "你的人生巅峰,就是现在",
* "明天出门可能捡到钱",
* "好臭啊,感觉你踩到狗屎的🐶",
* "给你一个双色球号码 06 08 13 18 26 33 + 10 包中奖"}
* 2.键盘录入一个姓名(仅仅只是录入一个姓名而已)
* 3.随机从人品数组中,产生一个元素,并打印
*/
public class demo5 {
public static void main(String[] args) {
String[] s ={"你的人品堪忧啊,多做善事吧","我上辈子肯定欠你的," +
"不要上我见到你,快走、快走....", "你印堂发黑,有血光之灾啊",
"帅哥,感觉你要走桃花运啊,带带我呗", "迎娶白富美,走上人生巅峰",
"你的人生巅峰,就是现在", "明天出门可能捡到钱", "好臭啊,感觉你踩到狗屎的🐶",
"给你一个双色球号码 06 08 13 18 26 33 + 10 包中奖" };
System.out.println("~~~请输入你的名字查询个人命运~~~");
Scanner sc = new Scanner(System.in);
String name = sc.next();
Random r= new Random();
int destiny =r.nextInt(name.length());
System.out.println("你的命运评语是:"+s[destiny]);
}
}
7,随机点名器
package ArrayP1;
import java.util.Random;
/**
* @Package: ArrayP1
* @ClassName: demo4
* @Author: PC
* @CreateTime: 2021/6/1 20:13
* @Description:点名器
* 需求:定义一个数组,存储班级所有学生的姓名,然后随机的从数组中抽取一个元素并打印。
* 姓名为同学们准备好了,直接拷贝就行
* "彭思源","陈才","彭状","周巍","张武","汪颢","江源","王杰","陈晨","夏炎","张文晟","刘礼","郭荆","舒望","白迎暄",
* "丁爽","刘亚","罗青濠","陈奕欣","王翔","余世豪","汪北川","刘刚丞","王凯","李陈林","蔡情原","毛俊辉","黄宏",
* "陈卓","童亮","徐壮","龚旭","王震","袁立","孙逸杰","李子豪","杨勇","师杨","胡贻文","王志明","王志","王金宇",
* "杨东","张宇","王云博","黄灿","王高林","程莱星"
* 思路分析:
* 1.元素都给你准备好了,定义数组,你觉得用【静态初始化】还是【动态初始化】呢?
* 2.我们只学过随机产生一个整数,怎么从数组中随机找一个元素呢?
* //提示:元素和索引是对应的,如果能够随机产生索引,是不是就随机产生了一个元素?
* 3.通过索引获取元素,并打印
*/
public class demo4 {
public static void main(String[] args) {
String[] s = {"彭思源","陈才","彭状","周巍","张武","汪颢",
"江源","王杰","陈晨","夏炎","张文晟","刘礼","郭荆",
"舒望","白迎暄", "丁爽","刘亚","罗青濠","陈奕欣",
"王翔","余世豪","汪北川","刘刚丞","王凯","李陈林",
"蔡情原","毛俊辉","黄宏", "陈卓","童亮","徐壮","龚旭",
"王震","袁立","孙逸杰","李子豪","杨勇","师杨","胡贻文",
"王志明","王志","王金宇", "杨东","张宇","王云博","黄灿",
"王高林","程莱星" };
Random r =new Random();
int luck = r.nextInt(s.length);
System.out.println("~~~~~~随机点名器~~~~~~");
System.out.println("这个幸运儿是:"+s[luck]);
}
}
8,双色球彩票
package ArrayP1;
import java.util.Random;
/**
* @Package: ArrayP1
* @ClassName: demo3
* @Author: PC
* @CreateTime: 2021/6/1 19:43
* @Description:
* 需求:双色球彩票由6个红球(1~33的整数)和1个蓝球(1~16的整数)组成。
* 实现步骤:
* 1.定义一个长度为7的数组,前6个存储红球,最后一个存储蓝球
* 2.随机产生6个红球和1个篮球,存储到数组中
* 3.遍历数组中的每一个元素,打印格式如下:
* 双色球开奖号码:6,3,8,13,16,32+16
*/
public class demo3 {
public static void main(String[] args) {
// 1.定义一个长度为7的数组,前6个存储红球,最后一个存储蓝球
int[] result =new int[7];
Random r =new Random();
// 2,抽六个红球并保存到数组
for (int i =0;i<6;i++){
int num1 = r.nextInt(32)+1;
// 设置一个判定条件
int count = -1;
for (int j=0;j<6;j++){
if (num1==result[j]){
count++;
}
}
if (count==-1){
result[i] = num1;
}else{
i--;
}
}
// 3,抽一个篮球并保存到数组
int num2 = r.nextInt(15)+1;
result[6] = num2;
// 4,打印中将的双色球号码
System.out.println("~~~~~~本期中将的双色球号码~~~~~~~");
for (int i = 0;i<7;i++){
if (i==6){
System.out.println(result[i]);
}else{
System.out.print(result[i]+" ");
}
}
}
}
9,评委打分
package ArrayP1;
import java.util.Scanner;
/**
* @Package: ArrayP1
* @ClassName: Demo
* @Author: PC
* @CreateTime: 2021/5/31 11:55
* @Description:
* 在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数。
* 选手的最后得分为:去掉一个最高分和一个最低分的4个评委的平均值(不考虑小数部分)。
* 数组的练习;
* 分析: 1 ·首先定义一个数组用于接收键盘录入的打分成绩和分数之和sum;
* 2遍历,用for循环找到max和min值
* 3根据题目要求计算平均值;
*/
public class Demo {
public static void main(String[] args) {
//1 ·首先定义一个数组用于接收键盘录入的打分成绩和分数之和sum;
Scanner sc = new Scanner(System.in);
int sum = 0;
int[] arr = new int[6];
//2.遍历,接受键盘输入的分值;
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "位评委的打分:");
int score = sc.nextInt();
//3,判断输入分值是否合法
if (score >= 0 && score <= 100) {
arr[i] = score;
sum += arr[i];
} else {
System.out.println("你的输入有误!请重新输入");
i--;
}
}
//4,求最大值max和最小值min;
int max = arr[0];
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
//5,根据要求计算平均值;
int resault = 0;
resault = (sum - max - min) / 4;
System.out.println("~~~~~评委评分结果~~~~~");
System.out.println("评委的平均分为:" + resault);
}
}
System.out.println("你的输入有误!请重新输入");
i--;
}
}
//4,求最大值max和最小值min;
int max = arr[0];
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
//5,根据要求计算平均值;
int resault = 0;
resault = (sum - max - min) / 4;
System.out.println("~~~~~评委评分结果~~~~~");
System.out.println("评委的平均分为:" + resault);
}
}