day06复习
1. 每天一考
/*
第1题:
int m=0,n=3;
if(m>0)
if(n>2)
System.out.println("A");
System.out.println("C");
else
System.out.println("B");
*/
/*
3.一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.
编程 找出1000以内的所有完数。(因子:除去这个数本身的其它约数)
*/
int sum = 0;//累加因子
for(int i = 1;i <= 1000;i++){
for(int j = 1;j <= i/2 ;j++){
if(i % j == 0){
sum += j;
}
}
if(i == sum){
System.out.println(i);
}
//重置
sum = 0;
}
/* i j
****** 1 6
***** 2 5
**** 3 4
*** 4 3
** 5 2
* 6 1
*/
for(int i = 1;i <= 6;i++){
for(int j = 1;j <= 7 - i;j++){
System.out.print('*');
}
System.out.println();
}
2. IDEA的使用
-
傻瓜式的安装
-
启动 - 相关的设置(主题、插件等)-注册…
-
指定路径下,创建一个Java工程,需要制定jdk路径。
-
界面启动以后,我们选中工程,可以new - module (模块)
-
在module下的src目录下,创建package
-
在package下new - class
-
大家下来需要参考课件,将第六章的设置从上到下操作一遍。
尤其需要操作的是字符集的设置:
-
至于快捷键、代码模板后续讲解。
3. 数组的概述
一、数组的理解
* 数组,可以看做是多个相同数据类型的变量按照一定顺序排列的组合(或集合)
*
*
二、变量的分类:基本数据类型(8种) vs 引用数据类型(类、接口、数组)
* 变量的声明格式:数据类型 变量名 = 变量值
三、数组相关的概念
* 1. 数组名
* 2. 数组元素
* 3. 数组的索引(角标、下角标)
* 4. 数组的长度:数组中元素的个数
*
四、说明
* 1. 不管是静态初始化,还是动态初始化,只要数组初始化完成,其长度就是确定的。
* 2. 数组一旦初始化完成,其长度就不可变。
* 3. 数组属于引用数据类型;
* 数组的元素既可以是基本数据类型,也可以是引用数据类型。比如:int[] \ boolean[] \ char[] \ double[] \ String[]
*
4. 一维数组的使用
4.1数组的声明与定义
//数据类型 变量名 = 变量值
double price1 = 34.32;
double price2 = 23.32;
//1. 定义数组
//1.1 数组的声明
double[] prices;
//1.2 数组的初始化
//静态初始化方式:数组变量的赋值与数组元素的赋值同时进行。
prices = new double[]{34.32,23.32,12.35};
int[] nums = new int[]{1,2,3,4,5};
//动态初始化方式:数组变量的赋值与数组元素的赋值分开进行。
String[] names = new String[5];
//错误的定义方式
// int[] ids1 = new int[3]{3,4,5};
// int[3] ids2 = new int[]{3,4,5};
// int[3] ids3 = new int[3];
//也是正确的方式
int[] arr1 = {1,2,3}; //类型推断
int arr2[] = new int[]{1,2,3};
4.2 数组元素的调用
//2. 数组元素的调用:使用角标的方式进行调用
//数组元素的角标是从0开始的,到数组的长度-1结束。
System.out.println(prices[0]);
System.out.println(nums[3]);
names[0] = "张奥";
names[1] = "陈亚飞";
names[4] = "肖华";
// names[5] = "郑璇"; 运行报错
4.3 数组的属性:长度
//3. 数组的长度:length
System.out.println(names.length);//5
System.out.println(nums.length);//5
4.4数组的遍历
for(int i = 0;i < nums.length;i++){//for(int i = 0;i < 5;i++){
System.out.println(nums[i]);
}
4.5 数组元素的默认值
测试数组元素的默认值
* 如果数组的元素是整型,则数组元素的默认值为:0
* 如果数组的元素是浮点类型,则数组元素的默认值为:0.0
* 如果数组的元素是boolean类型,则数组元素的默认值为:false
* 如果数组的元素是char类型,则数组元素的默认值为:0 或 \u0000
*
* 如果数组的元素是引用数据类型,则数组元素的默认值为:null
*
*
* 说明:数组元素的类型可以是基本数据类型,也可以是引用数据类型。
int[] arr1 = new int[5];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println();
//byte[] \ short[] \ long[]
long[] arr2 = new long[3];
System.out.println(arr2[0]);
System.out.println();
double[] arr3 = new double[10];
System.out.println(arr3[0]);
System.out.println();
boolean[] arr4 = new boolean[10];
System.out.println(arr4[0]);
System.out.println();
char[] arr5 = new char[5];
for(int i = 0;i < arr5.length;i++){
System.out.println("****" + arr5[i] + "####");
}
System.out.println(arr5[0] == ' ');//false
System.out.println(arr5[0] == '0');//false
System.out.println(arr5[0] == 0);//true
System.out.println();
String[] arr6 = new String[5];
for(int i = 0;i < arr6.length;i++){
System.out.println(arr6[i]);
}
System.out.println(arr6[0] == null);//true
System.out.println(arr6[0] == "null");//false
4.6 数组的内存解析 (有难度)
-
内存结构的主要部分,及存储的结构
-
内存解析举例
-
练习
public class ArrayTest1 {
public static void main(String[] args) {
int[] arr = new int[]{8, 2, 1, 0, 3};
int[] index = new int[]{2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3};
String tel = "";
for (int i = 0; i < index.length; i++) {
tel += arr[index[i]];
}
System.out.println("联系方式:" + tel);//18...
}
}
- 练习
package com.atguigu.exer;
import java.util.Scanner;
/**
* 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
* 成绩>=最高分-10 等级为’A’
* 成绩>=最高分-20 等级为’B’
* 成绩>=最高分-30 等级为’C’
* 其余 等级为’D’
*
* 提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
*
* @author shkstart
* @create 14:07
*/
public class ArrayTest2 {
public static void main(String[] args) {
//1. Scanner的实例化
Scanner scann = new Scanner(System.in);
//2. 根据提示,获取学生的人数
System.out.print("请输入学生的人数:");
int number = scann.nextInt();
//3. 根据长度,创建指定类型的数组:int[]
int[] scores = new int[number];
//4. 遍历数组,给数组的每一个元素赋值:arr[i] = scanner.nextInt()
System.out.println("请输入" + number + "个成绩:");
int maxScore = 0;//记录最高分
for(int i = 0;i < scores.length;i++){
scores[i] = scann.nextInt();
//5. 获取最高分
if(maxScore < scores[i]){
maxScore = scores[i];
}
}
System.out.println("最高分为:" + maxScore);
//6. 遍历数组,获取每个学生成绩,以及与最高分的差值,并得出等级。
char grade;
for(int i = 0;i < scores.length;i++){
if(scores[i] >= maxScore - 10){
grade = 'A';
}else if(scores[i] >= maxScore - 20){
grade = 'B';
}else if(scores[i] >= maxScore - 30){
grade = 'C';
}else{
grade = 'D';
}
System.out.println("student " + i + " score is " + scores[i] + " grade is " + grade);
}
}
}
5. 二维数组的使用
数组属于引用数据类型;
* 数组的元素既可以是基本数据类型,也可以是引用数据类型。如果数组的元素还是数组的话,则构成了多维数组
5.1数组的声明与定义
//理解
String[] star1 = new String[]{"陈伟霆","13121341234"};
String[] star2 = new String[]{"刘诗诗","13221341234"};
//一维数组star1,star2又作为了另一个一维数组stars的元素,则构成二维数组
String[][] stars = new String[][]{star1,star2};//二维数组
//1. 数组的声明与定义
int[][] arr1;
arr1 = new int[][]{{1,2,3},{5,6,7},{7,8}};//静态初始化
//动态初始化方式1
int[][] arr2 = new int[4][3];
//动态初始化方式2
int[][] arr3 = new int[5][];
//错误的写法
// int[][] arr4 = new int[4][3]{{1,2,3},{5,6,7},{7,8}};
// int[][] arr5 = new int[][3];
//正确的其他写法
int arr6[][] = new int[4][3];
int[] arr7[] = new int[4][];
int[][] arr8 = {{1,2,3},{5,6,7},{7,8}};//类型推断
5.2 数组元素的调用
//2. 数组元素的调用
// 通过角标的方式进行调用
System.out.println(arr1[0][0]);
System.out.println(arr1[2][0]);
arr6[1][2] = 12;
5.3 数组的属性:长度
//3. 数组的属性:长度
System.out.println(arr1.length);//3
System.out.println(arr1[2].length);//2
5.4数组的遍历
for(int i = 0;i < arr1.length;i++){
for(int j = 0;j < arr1[i].length;j++){
System.out.print(arr1[i][j] +"\t");
}
System.out.println();
}
5.5 数组元素的默认值
* 测试二维数组元素的默认值
* 约定:arr1的元素称为外层元素,arr1[0]的元素称为内层元素
*
* 针对格式1:int[][] arr1 = new int[4][3];
* 外层元素的值为:数组的类型和对应的指向一维数组的地址
* 内层元素的值为:与一维数组的默认值相同
* 如果数组的元素是整型,则数组元素的默认值为:0
* 如果数组的元素是浮点类型,则数组元素的默认值为:0.0
* 如果数组的元素是boolean类型,则数组元素的默认值为:false
* 如果数组的元素是char类型,则数组元素的默认值为:0 或 \u0000
* 如果数组的元素是引用数据类型,则数组元素的默认值为:null
*
* 针对格式2:int[][] arr2 = new int[4][];
* 外层元素的值为:null
* 内层元素的值为:报空指针异常的错误。
public static void main(String[] args) {
int[][] arr1 = new int[4][3];
System.out.println(arr1[0]);//[I@1540e19d
System.out.println(arr1[1]);//[I@677327b6
System.out.println(arr1[2]);//[I@14ae5a5
System.out.println(arr1[3]);//[I@7f31245a
double[][] arr2 = new double[3][2];
System.out.println(arr2[0]);//[D@6d6f6e28
String[][] arr3 = new String[3][4];
System.out.println(arr3[0]);//[Ljava.lang.String;@135fbaa4
System.out.println(arr1[0][0]);//0
System.out.println(arr2[0][0]);//0.0
System.out.println(arr3[0][0]);//null
System.out.println("############针对格式2##############");
int[][] arr4 = new int[4][];
System.out.println(arr4[0]);//null
System.out.println(arr4[1]);//null
System.out.println(arr4[2]);//null
System.out.println(arr4[3]);//null
double[][] arr5 = new double[3][];
System.out.println(arr5[0]);//null
//System.out.println(arr4[0][0]);//报错
//最后一行代码报错,但是在开发中,我们确实有可能要遍历或操作二维数组的内层元素。
//当报错的话,表明没有给外层元素进行赋值。则赋值之后即可。
arr4[0] = new int[4];
arr4[1] = new int[]{1,2,4};
System.out.println(arr4[0][0]);//0
}
5.6 数组的内存解析 (有难度)
- 练习
package com.atguigu.exer;
/**
* 二维数组的课后练习
* @author shkstart
* @create 16:23
*/
public class ArrayTest3 {
public static void main(String[] args) {
int[][] arr = new int[][]{{3,5,8},{12,9},{7,0,6,4}};
int sum = 0;//记录数组元素的和
for(int i = 0;i <arr.length;i++){
for(int j = 0;j < arr[i].length ;j ++){
sum += arr[i][j];
}
}
System.out.println("数组元素的和为:" + sum);
}
}
6. 课后练习
-
题目一
-
题目二
-
题目三:常见的算法:针对于数值类型的数组(比如int[]),获取数组的最大值、最小值、总和、平均数
-
思考题:数组的反转、排序、复制
关于Arrays工具类的使用;
两种异常:ArrayIndexOutOfBoundsException \ NullPointerException