五、今日内容介绍
1、方法基础知识
2、方法高级内容
3、方法案例
01方法的概述
* A: 为什么要有方法
* 提高代码的复用性
* B: 什么是方法
* 完成特定功能的代码块。
02方法的定义格式
* A: 方法的格式
*
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
方法体语句;
return 返回值;
}
* B: 方法的格式说明
* 修饰符:目前就用 public static。后面我们再详细的讲解其他的修饰符。
* 返回值类型:就是功能结果的数据类型。
* 方法名:符合命名规则即可。方便我们的调用。
* 参数:
* 实际参数:就是实际参与运算的。
* 形式参数;就是方法定义上的,用于接收实际参数的。
* 参数类型:就是参数的数据类型
* 参数名:就是变量名
* 方法体语句:就是完成功能的代码。
* return:结束方法的。
* 返回值:就是功能的结果,由return带给调用者。
03定义方法计算面积
* A: 定义方法计算面积
public class MethodDemo{
public static void main(String[] args){
//调用方法, 方法执行起来
// 在方法main中,调用方法 getArea
int area = getArea(5,6);
System.out.println("面积是: "+area);
}
/*
要求: 计算一个长方形的面积
定义方法解决这个要求
分析方法定义过程:
1.明确方法计算后的结果的数据类型 int 定义格式对应的就是返回值类型
2.方法计算过程中,有没有未知的数据, 宽和长, 未知数据的数据类型 int
未知数的变量,定义在方法的小括号内
*/
public static int getArea(int w, int h){
//实现方法的功能主体
//int area = w * h;
return w * h;
}
}
04调用方法
* A: 调用方法
* a: 在main函数中调用方法,让方法执行起来
* b: 方法的形参
* 方法要什么参数我们就给什么类型的参数。
* c: 方法的返回值
* 方法返回什么类型的值我们就用对应的数据类型的变量来接收
05调用方法执行流程
* A: 调用方法执行流程
* a: 方法的定义是没有顺序的,写在main函数的上边或者下边都可以。
* b: 方法的执行,是把实参传递给形参,从而来执行的。
* c: 方法只有被调用才会执行。
06方法调用的内存图
* A: 方法调用的内存图
* a: 参见day05day05(Java基础语法)day05_source方法内存图.JPG
07方法调用的练习
* A: 案例代码
/*
方法的定义练习
*/
import java.util.Scanner;
public class MethodDemo_1{
public static void main(String[] args){
//printRect();
//int number = getNumber();
//System.out.println(getNumber());
//printRect2(3,5);
double avg = getAvg(2,2,3);
System.out.println(avg);
}
/*
定义有返回值有参数方法,如求三个数的平均值
明确方法计算后的数据类型, 返回值类型 double
明确方法未知数, 三个未知的整数
*/
public static double getAvg(double a, double b,double c){
return (a+b+c)/3;
}
/*
定义无返回值有参数方法,如打印指定M行,每行N个*号的矩形
明确方法计算后结果,控制台输出图形,没有返回值的
方法中有没有未知数,图形行数,和列数,是未知的, 数据类型整数int
*/
public static void printRect2(int m,int n){
for(int i = 0 ; i < m ; i++){
for(int j = 0 ; j < n ; j++){
System.out.print("*");
}
System.out.println();
}
}
/*
定义有返回值无参数方法,如键盘录入得到一个整数
明确方法计算后结果的数据类型 int
明确有没有未知数,没
*/
public static int getNumber(){
Scanner sc = new Scanner(System.in);
//int number = sc.nextInt();
return sc.nextInt();
}
/*
定义无返回值无参数方法,如打印3行,每行3个*号的矩形
为什么没有返回值:
打印矩形 ,输出效果,不需要将结果返回
明确未知数: 不需要未知数
*/
public static void printRect(){
for(int i = 0 ; i < 3 ; i++){
for(int j = 0 ; j < 3 ;j++){
System.out.print("*");
}
System.out.println();
}
}
}
08方法的定义和使用的注意事项
* A: 方法的定义和使用的注意事项
* a: 方法不能定义在另一个方法的里面
* b: 写错方法名字
* c: 写错了参数列表
* d: 方法返回值是void,方法中可以省略return 不写
return 下面不能有代码
* e 方法返回值类型,和return 后面数据类型必须匹配
* f: 方法重复定义问题
* g: 调用方法的时候,返回值是void, 不能写在输出语句中
09方法的重载
* A: 方法的重载
* 在同一个类中,方法名相同,参数列表不同。与返回值类型无关。
* 参数列表不同:
* A:参数个数不同
* B:参数类型不同
* C:参数的顺序不同(算重载,但是在开发中不用)
* B: 案例代码
public static int getSum(int a,int b){
System.out.println("两个int参数");
return a+b;
}
public static int getSum(int a,int b,int c){
System.out.println("三个int参数");
return a+b+c;
}
public static double getSum(double a,double b){
System.out.println("两个double参数");
return a+b;
}
10方法重载注意事项
* A: 方法重载注意事项
* a: 参数列表必须不同
* b: 重载和参数变量名无关
* c: 重载和返回值类型无关
* d: 重载和修饰符无关
* e: 技巧: 重载看方法名和参数列表
11方法参数是基本数据类型
* A: 方法参数是基本数据类型
* a: 方法参数是基本类型时,传递的是值。
12方法参数是引用数据类型
* A: 方法参数是引用数据类型
* a: 方法参数是引用类型时,传递的是内存地址值。
13随机点名器
* A: 案例代码
/*
实现随机点名器
1.存储所有学生姓名
2.预览所有学生姓名,遍历数组
3.随机数作为索引,到数组中找元素
将功能独立出来, 作成方法,调用方法即可
定义三个功能, 用到同一个姓名数据
姓名存储到数组中,三个方法,使用一个数组中的数据, 方法传递参数
*/
import java.util.Random;
public class CallName{
public static void main(String[] args){
//定义数组,存储学生姓名
String[] names = new String[8];
//调用添加姓名方法
addStudent(names);
//调用遍历数组方法
printStudentName(names);
//调用随机姓名的方法
String name = randomStudentName(names);
System.out.println(name);
}
/*
定义方法,随机数,做索引,数组中找到学生姓名
返回值? 学生姓名
参数? 数组
*/
public static String randomStudentName(String[] names){
Random ran = new Random();
int index = ran.nextInt(names.length);
return names[index];
}
/*
定义方法,遍历数组
返回值? 没有
参数? 数组
*/
public static void printStudentName(String[] names){
for(int i = 0 ; i < names.length ;i++){
System.out.println(names[i]);
}
}
/*
定义方法,实现向数组中添加学生姓名
返回值? 没有,
参数? 参数就是数组
*/
public static void addStudent(String[] names){
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
names[3] = "李蕾";
names[4] = "韩梅梅";
names[5] = "小名";
names[6] = "老王";
names[7] = "小华";
}
}
14库存案例代码实现_1
* A: 案例代码
/*
实现商品的库存管理
功能:
1.展示用户选择功能清单
2.根据选择的功能编号,进行不同的操作
A. 展示所有库存
B. 修改库存数量
分析:
1.展示用户清单:
输出语句, 用户输入, 选择功能序号
2.根据选择,调用不同的方法
switch语句
case 1 2 3
A 展示库存
将存储商品的数组,遍历
B 修改库存
修改所有的库存数量
*/
import java.util.Scanner;
public class Shopp{
public static void main(String[] args){
}
/*
定义方法,展示所有的库存清单,遍历
返回值,没有
参数, 数组
*/
public static void printStore(String[] brand,double[] size,double[] price,int[] count){
System.out.println("----------商场库存清单----------");
System.out.println("品牌型号 尺寸 价格 库存数");
//定义变量,计算总库存数,和总价格
int totalCount = 0;
int totalMoney = 0;
//遍历数组,将数组中所有的商品信息打印出来
for(int i = 0 ; i < brand.length ; i++){
System.out.println(brand[i]+" "+size[i]+" "+price[i]+" "+count[i]);
totalCount += count[i];
totalMoney += count[i]*price[i];
}
System.out.println("总库存数: "+totalCount);
System.out.println("商品库存总金额: "+totalMoney);
}
/*
定义方法,实现用户的选择功能,功能的需要返回来
返回值, int
参数, 没有
*/
public static int chooseFunction(){
System.out.println("-------------库存管理------------");
System.out.println("1.查看库存清单");
System.out.println("2.修改商品库存数量");
System.out.println("3.退出");
System.out.println("请输入要执行的操作序号:");
//接受键盘输入
Scanner sc = new Scanner(System.in);
int chooseNumber = sc.nextInt();
return chooseNumber;
}
}
15库存案例代码实现_2
* A: 案例代码
/*
定义方法,修改所有商品的库存
用户输入1个,修改1个
返回值,没有
参数, 库存数的数组, 品名数组
*/
public static void update(String[] brand, int[] count){
//遍历数组,遍历到一个,修改一个
//接受键盘输入
Scanner sc = new Scanner(System.in);
//遍历数组
for(int i = 0; i < brand.length ; i++){
System.out.println("请输入"+brand[i]+"的库存数");
//键盘输入,录入库存, 存储到库存的数组中
int newCount = sc.nextInt();
count[i] = newCount;
}
//int chooseNumber = sc.nextInt();
}
16库存案例代码测试
* A: 案例
/*
实现商品的库存管理
功能:
1.展示用户选择功能清单
2.根据选择的功能编号,进行不同的操作
A. 展示所有库存
B. 修改库存数量
分析:
1.展示用户清单:
输出语句, 用户输入, 选择功能序号
2.根据选择,调用不同的方法
switch语句
case 1 2 3
A 展示库存
将存储商品的数组,遍历
B 修改库存
修改所有的库存数量
*/
import java.util.Scanner;
public class Shopp{
public static void main(String[] args){
//使用数组,保存商品的信息
//品名,尺寸,价格,库存数, 定义5个数组
String[] brand = {"MacBookAir","ThinkpadT450"};
double[] size = {13.3,15.6};
double[] price = {9998.97,6789.56};
int[] count = {0,0};
while(true){
int choose = chooseFunction();
switch(choose){
case 1:
//调用查看库存清单方法
printStore(brand,size,price,count);
break;
case 2:
//调用修改库存的方法
update(brand,count);
break;
case 3:
return ;
default:
System.out.println("没有这个功能");
break;
}
}
}
/*
定义方法,修改所有商品的库存
用户输入1个,修改1个
返回值,没有
参数, 库存数的数组, 品名数组
*/
public static void update(String[] brand, int[] count){
//遍历数组,遍历到一个,修改一个
//接受键盘输入
Scanner sc = new Scanner(System.in);
//遍历数组
for(int i = 0; i < brand.length ; i++){
System.out.println("请输入"+brand[i]+"的库存数");
//键盘输入,录入库存, 存储到库存的数组中
int newCount = sc.nextInt();
count[i] = newCount;
}
//int chooseNumber = sc.nextInt();
}
/*
定义方法,展示所有的库存清单,遍历
返回值,没有
参数, 数组
*/
public static void printStore(String[] brand,double[] size,double[] price,int[] count){
System.out.println("----------商场库存清单----------");
System.out.println("品牌型号 尺寸 价格 库存数");
//定义变量,计算总库存数,和总价格
int totalCount = 0;
int totalMoney = 0;
//遍历数组,将数组中所有的商品信息打印出来
for(int i = 0 ; i < brand.length ; i++){
System.out.println(brand[i]+" "+size[i]+" "+price[i]+" "+count[i]);
totalCount += count[i];
totalMoney += count[i]*price[i];
}
System.out.println("总库存数: "+totalCount);
System.out.println("商品库存总金额: "+totalMoney);
}
/*
定义方法,实现用户的选择功能,功能的需要返回来
返回值, int
参数, 没有
*/
public static int chooseFunction(){
System.out.println("-------------库存管理------------");
System.out.println("1.查看库存清单");
System.out.println("2.修改商品库存数量");
System.out.println("3.退出");
System.out.println("请输入要执行的操作序号:");
//接受键盘输入
Scanner sc = new Scanner(System.in);
int chooseNumber = sc.nextInt();
return chooseNumber;
}
}
六、今日内容介绍
1、自定义类型的定义及使用
2、自定义类的内存图
3、ArrayList集合的基本功能
4、随机点名器案例及库存案例代码优化
01引用数据类型_类
* A: 数据类型
* a: java中的数据类型分为:基本类型和引用类型
* B: 引用类型的分类
* a: Java为我们提供好的类,比如说:Scanner,Random等。
* b: 我们自己创建的类,按照类的定义标准,可以在类中包含多个方法与属性,来供我们使用。
02自定义类的概述
* A: 自定义类的概述
* java代码映射成现实事物的过程就是定义类的过程。
* 举例:
我们就拿一部手机进行分析,它能用来做什么呢?它可以打电话,上网,聊微信等,这些就是手机所提供的功能,也就是方法;手机也有它的特征,如颜色、尺寸大小、品牌型号等,这些就是手机的特征,也就是属性
* 目前,我们只关注类中的属性,类中的方法在面向对象部分再进行学习。
03自定义类的格式
* A: 自定义类的格式
* a: 使用类的形式,对现实中的事物进行描述。
* b: 事物由方法和属性两部分组成。
* 方法: 这个事物具备的功能。
* 属性: 这个事物具备的特征。
* c: 格式
public class 类名{
属性定义
修饰符 数据类型 变量名 = 值
方法定义
修饰符 返回值类型 方法名(参数列表){
}
}
04自定义的手机类
* A: 自定义的手机类
* a: 案例代码
public class Phone{
/*
定义手机的属性
*/
String color ;
String brand ;
double size ;
}
05测试手机类
* A: 调用方法执行流程
* a: 实现引用类型的步骤
* 1: 导入包 , 类都是在同一个文件夹,不需要导入包
* 2: 创建引用类型的变量
* 3: 变量.类型中的功能
* b: 案例代码
public class TestPhone{
public static void main(String[] args){
// 2: 创建引用类型的变量
Phone p = new Phone();
//System.out.println(p); //输出内存的地址
//3: 变量.类型中的功能
//变量 p.的方式,调用类中的属性
//属性就是变量 , 赋值和获取值
p.color = "土豪金";
p.brand = "爱立信";
p.size = 5.0;
//获取属性值
System.out.println(p.color+" "+p.brand+" "+p.size);
}
}
06自定义类的内存图_1
* A: 自定义类的内存图_1
* a: 参见day06day06(面向对象day06_source对象内存图.JPG
07自定义类的内存图_2
* A: 自定义类的内存图_1
* a: 参见day06day06(面向对象day06_source对象内存图.JPG
08两个引用类型变量内存图
* A: 自定义类的内存图_1
* a: 参见day06day06(面向对象day06_source两个引用变量内存图.JPG
09自定义类的练习
* A: 实体类的代码
/*
电饭锅,包含属性(品牌、容量大小、颜色等)
定义类,描述事物,电饭锅
属性: 品牌,大小 ,颜色
定义类,类名字,电饭锅
类的范围,定义三个属性
*/
public class DianFanGuo{
//定义三个属性
String brand ;
double size ;
String color ;
}
/*
汽车,包含属性(品牌、排量、类型等)
定义类,类名 Car
属性 品牌 排量 类型
*/
public class Car{
//定义汽车三个属性
String brand ;
double paiLiang ;
String type;
}
/*
学生,包含属性(姓名,年龄,性别等)
定义类,类名Student
三个属性: 姓名,年龄,性别 (char)
*/
public class Student{
String name;
int age ;
char sex ;
}
* B: 测试类的代码
/*
定义的测试类
同时测试,电饭锅,汽车,学生
*/
public class Test{
public static void main(String[] args){
//创建电饭锅引用类型
DianFanGuo dfg = new DianFanGuo();
dfg.brand = "特斯拉";
dfg.color = "红色";
dfg.size = 30;
System.out.println(dfg.brand+" "+dfg.color+" "+dfg.size);
//创建汽车引用类型
Car c = new Car();
c.brand = "巨力";
c.type = "拖拉机";
c.paiLiang = 0.5;
System.out.println(c.brand+" "+c.type+" "+c.paiLiang);
//创建学生引用类型
Student stu = new Student();
stu.name = "张三";
stu.age = 20;
stu.sex = '男';
System.out.println(stu.name+" "+stu.age+" "+stu.sex);
}
}
10ArrayList创建变量的步骤
* A: ArrayList创建变量的步骤
* a: 导入包 java.util包中
* b: 创建引用类型的变量
数据类型< 集合存储的数据类型> 变量名 = new 数据类型<集合存储的数据类型>();
集合存储的数据类型: 要将数据存储到集合的容器中
创建集合引用变量的时候,必须要指定好,存储的类型是什么
* c: 变量名.方法
注意: 集合存储的数据,8个基本类型对应8个引用类型
存储引用类型,不存储基本类型
11ArrayList创建变量举例
* A: ArrayList创建变量的示例代码
import java.util.ArrayList;
public class ArrayListDemo{
public static void main(String[] args){
//创建集合容器,指定存储的数据类型
//存储字符串
ArrayList
//创建集合容器,存储整数
ArrayList<Integer> array2 = new ArrayList<Integer>();
//创建集合容器,存储手机类型
ArrayList<Phone> array3 = new ArrayList<Phone>();
}
}
12ArrayList的常见方法
* A: ArrayList的常见方法
* a: add(参数) 向集合中添加元素
* b: get(int index) 取出集合中的元素,get方法的参数,写入索引
* c: size() 返回集合的长度, 集合存储元素的个数
* B: 案例代码
import java.util.ArrayList;
public class ArrayListDemo_1{
public static void main(String[] args){
//定义集合,存储字符串元素
ArrayList<String> array = new ArrayList<String>();
//调用集合方法add存储元素
array.add("abc");
array.add("itcast");
array.add("love");
array.add("java");
//输出集合的长度,调用集合方法size, size方法的返回值类型 int
int size = array.size();
System.out.println(size);
//获取出集合中的一个元素,获取1索引的元素
//集合的方法get, 获取元素后结果数据类型
String s = array.get(1);
System.out.println(s);
System.out.println(array.get(0));
System.out.println(array.get(1));
System.out.println(array.get(2));
System.out.println(array.get(3));
}
}
13ArrayList集合的遍历
* A: 案例代码
/*
集合的遍历
实现思想也是索引思想
集合的索引从0开始,到 size()-1
方法get(int index)
*/
import java.util.ArrayList;
public class ArrayListDemo_2{
public static void main(String[] args){
ArrayList<Integer> array = new ArrayList<Integer>();
array.add(121);
array.add(125);
array.add(123);
array.add(120);
array.add(128);
//对集合进行遍历
//使用方法 size+get组合进行遍历
for(int i = 0 ; i < array.size(); i++){
System.out.println( array.get(i) );
}
}
}
14ArrayList补充方法
* A: ArrayList补充方法
* a: add(int 索引,存储的元素) 将元素添加到指定的索引上
* b: set(int 索引,修改后的元素) 将指定索引的元素,进行修改
* c: remove(int 索引) 删除指定索引上的元素
* d: clear() 清空集合中的所有元素
* B: 案例代码
import java.util.ArrayList;
public class ArrayListDemo_3{
public static void main(String[] args){
ArrayList<Integer> array = new ArrayList<Integer>();
array.add(1);
array.add(2);
array.add(3);
array.add(4);
//在索引2上,添加元素7
array.add(2,7);
//将0索引上的元素,修改成10
array.set(0,10);
//将4索引上的元素,删除
array.remove(4);
array.clear();
//使用方法 size+get组合进行遍历
for(int i = 0 ; i < array.size(); i++){
System.out.println( array.get(i) );
}
}
}
15随机点名器案例分析
* A: 随机点名器案例分析
全班同学中随机的找出一名同学,打印这名同学的个人信息。
我们对本案例进行分析,得出如下分析结果:
1.存储全班同学信息(姓名、年龄)
将容器换成集合,集合中存的是Student类型
2.打印全班同学每一个人的信息(姓名、年龄)
遍历集合
3.在班级总人数范围内,随机产生一个随机数,查找该随机数所对应的同学信息(姓名、年龄)
随机点名器明确地分为了三个功能。如果将多个独立功能的代码写到一起,则代码相对冗长,我们可以针对不同的功能可以将其封装到一个方法中,将完整独立的功能分离出来。
而在存储同学姓名时,如果对每一个同学都定义一个变量进行姓名存储,则会出现过多孤立的变量,很难一次性将全部数据持有。此时,我们采用ArrayList集合来解决多个学生信息的存储问题
16随机点名器代码实现
* A: 随机点名器案例代码
/*
随机点名器,集合改进 (学生的姓名和年龄)
现实中有学生这个事物,使用定义类的形式,描述学生事物
属性: 姓名,年龄
姓名存储了数组, 将容器换成是集合
String[] s = {"",""};
集合中,存储的是学生的姓名吗? 应该存储Student类型
存储学生:
学生类型,存储到集合中
总览: 遍历集合
随机: 随机数,作为索引,到集合中找到元素
三个功能,共享的数据,集合容器,
定义三个方法,必须参数传递集合
*/
import java.util.ArrayList;
import java.util.Random;
public class CallName{
public static void main(String[] args){
//定义集合,存储的是StudentName类型变量
ArrayList <StudentName> array = new ArrayList<StudentName>();
//调用添加方法
add (array);
//调用遍历集合
printArrayList(array);
randomStudentName(array);
}
/*
随机数,当作集合的索引,到集合中找到元素
*/
public static void randomStudentName(ArrayList<StudentName> array ){
Random r = new Random();
int number = r.nextInt( array.size());
//随机数,索引,到集合中get
StudentName s = array.get(number);
System.out.println( s.name +" "+s.age);
}
/*
总览学生的信息,遍历集合
*/
public static void printArrayList(ArrayList<StudentName> array){
for(int i = 0 ; i < array.size();i++){
//存储集合的时候, 集合.add(sn1) sn1 是StudentName类型变量
//获取的时候,集合.get方法,获取出来的是什么, 还是StudentName类型变量
StudentName s = array.get(i);
System.out.println(s.name+" "+s.age);
}
}
/*
定义方法,实现存储学生的姓名和年龄
创建StudentName类型变量,存储到集合中
*/
public static void add (ArrayList<StudentName> array){
//创建StudentName类型变量
StudentName sn1 = new StudentName();
StudentName sn2 = new StudentName();
StudentName sn3 = new StudentName();
StudentName sn4 = new StudentName();
StudentName sn5 = new StudentName();
sn1.name = "张三1";
sn1.age = 201;
sn2.name = "张三2";
sn2.age = 202;
sn3.name = "张三3";
sn3.age = 203;
sn4.name = "张三4";
sn4.age = 204;
sn5.name = "张三5";
sn5.age = 205;
//将StudentName变量,存储到集合中
array.add(sn1);
array.add(sn2);
array.add(sn3);
array.add(sn4);
array.add(sn5);
}
}
17库存案例分析加入集合
* A: 库存案例分析加入集合
* a: 参见day06day06(面向对象day06_source对象内存图.JPG
18库存案例添加商品信息
* A: 案例代码
/*
定义,.描述商品的类
商品 4个属性
商品名字 大小 价格 库存
String double double int
定义类,类名Goods
这个类型的变量,存储到集合中
*/
public class Goods{
//定义商品名字
String brand ;
//大小属性
double size ;
// 价格属性
double price ;
//库存属性
int count ;
}
/*
实现库存管理案例:
1.存储商品信息
存储商品类型变量
将商品类型的变量,存储到集合中
*/
//import java.util.ArrayList;
import java.util.*;
public class Shopp{
public static void main(String[] args){
//创建ArrayList集合,存储Goods类型
ArrayList<Goods> array = new ArrayList<Goods>();
//调用添加商品信息的方法
addGoods(array);
}
/*
定义方法,将商品的信息存储到集合中
集合是所有方法的共享数据,参数传递
*/
public static void addGoods (ArrayList<Goods> array){
//创建商品类型变量 Goods类型的变量
Goods g1 = new Goods();
Goods g2 = new Goods();
g1.brand = "MacBook";
g1.size = 13.3;
g1.price = 9999.99;
g1.count = 3;
g2.brand = "Thinkpad";
g2.size = 15.6;
g2.price = 7999.99;
g2.count = 1;
//Goods类型的变量,存储到集合中
array.add(g1);
array.add(g2);
}
}
19库存案例查看库存清单
* A: 案例代码
/*
实现库存管理案例:
1.存储商品信息
存储商品类型变量
将商品类型的变量,存储到集合中
2.查看库存清单
将集合进行遍历, 获取出集合中存储的Goods类型变量
输出每一个Goods类型的属性
计算求和: 总库存,总金额
*/
//import java.util.ArrayList;
import java.util.*;
public class Shopp{
public static void main(String[] args){
//创建ArrayList集合,存储Goods类型
ArrayList<Goods> array = new ArrayList<Goods>();
//调用添加商品信息的方法
addGoods(array);
}
/*
定义方法,查看库存清单,遍历集合
*/
public static void printStore(ArrayList<Goods> array){
//输出表头
System.out.println("----------商场库存清单----------");
System.out.println("品牌型号 尺寸 价格 库存数");
//定义变量,保存总库存数,和总金额
int totalCount = 0 ;
double totalMoney = 0;
//遍历集合
for(int i = 0 ; i < array.size(); i++){
//get(索引)获取出集合中的元素,存储的是Goods类,获取的也是Goods类型
//使用Goods类型变量,接受get方法结果
Goods g = array.get(i);
System.out.println(g.brand+" "+g.size+" "+g.price+" "+g.count);
totalCount = totalCount+g.count;
totalMoney = totalMoney + g.count*g.price;
}
System.out.println("总库存数: "+totalCount);
System.out.println("商品库存总金额: "+totalMoney);
}
/*
定义方法,将商品的信息存储到集合中
集合是所有方法的共享数据,参数传递
*/
public static void addGoods (ArrayList<Goods> array){
//创建商品类型变量 Goods类型的变量
Goods g1 = new Goods();
Goods g2 = new Goods();
g1.brand = "MacBook";
g1.size = 13.3;
g1.price = 9999.99;
g1.count = 3;
g2.brand = "Thinkpad";
g2.size = 15.6;
g2.price = 7999.99;
g2.count = 1;
//Goods类型的变量,存储到集合中
array.add(g1);
array.add(g2);
}
}
20库存案例修改库存清单及测试代码的实现
* A: 案例代码
/*
实现库存管理案例:
1.存储商品信息
存储商品类型变量
将商品类型的变量,存储到集合中
2.查看库存清单
将集合进行遍历, 获取出集合中存储的Goods类型变量
输出每一个Goods类型的属性
计算求和: 总库存,总金额
3.修改商品的库存
集合遍历 ,获取出集合中存储的Goods类型变量
变量调用Goods类的属性count,值进行修改 (键盘输入)
*/
//import java.util.ArrayList;
import java.util.*;
public class Shopp{
public static void main(String[] args){
//创建ArrayList集合,存储Goods类型
ArrayList<Goods> array = new ArrayList<Goods>();
//调用添加商品信息的方法
addGoods(array);
//进入死循环中
while(true){
//调用选择功能的方法,获取到用户输入的功能序号
int number = chooseFunction();
//对序号判断,如果=1 进入查看库存功能 = 2 进入修改库存功能 =3 结束
switch(number){
case 1:
//进入查看库存,调用查看库存的方法,传递存储商品信息的集合
printStore(array);
break;
case 2:
//进入修改库存功能,调用修改库存的方法,传递集合
update(array);
break;
case 3:
return ;
default:
System.out.println("无此功能");
break;
}
}
}
/*
方法定义,修改库存
键盘的输入,将Goods中的属性值,修改
*/
public static void update(ArrayList<Goods> array){
Scanner sc = new Scanner(System.in);
//遍历集合,获取集合中的每个元素
for(int i = 0 ; i < array.size(); i++){
//集合方法get获取的是集合的元素,元素类型Goods
Goods g = array.get(i);
System.out.println("请输入"+g.brand+"的库存数");
//Goods属性,count进行修改
g.count = sc.nextInt();
}
}
/*
定义方法,实现选择菜单,用户根据功能选择菜单
*/
public static int chooseFunction(){
System.out.println("-------------库存管理------------");
System.out.println("1.查看库存清单");
System.out.println("2.修改商品库存数量");
System.out.println("3.退出");
System.out.println("请输入要执行的操作序号:");
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
return number;
}
/*
定义方法,查看库存清单,遍历集合
*/
public static void printStore(ArrayList<Goods> array){
//输出表头
System.out.println("----------商场库存清单----------");
System.out.println("品牌型号 尺寸 价格 库存数");
//定义变量,保存总库存数,和总金额
int totalCount = 0 ;
double totalMoney = 0;
//遍历集合
for(int i = 0 ; i < array.size(); i++){
//get(索引)获取出集合中的元素,存储的是Goods类,获取的也是Goods类型
//使用Goods类型变量,接受get方法结果
Goods g = array.get(i);
System.out.println(g.brand+" "+g.size+" "+g.price+" "+g.count);
totalCount = totalCount+g.count;
totalMoney = totalMoney + g.count*g.price;
}
System.out.println("总库存数: "+totalCount);
System.out.println("商品库存总金额: "+totalMoney);
}
/*
定义方法,将商品的信息存储到集合中
集合是所有方法的共享数据,参数传递
*/
public static void addGoods (ArrayList<Goods> array){
//创建商品类型变量 Goods类型的变量
Goods g1 = new Goods();
Goods g2 = new Goods();
g1.brand = "MacBook";
g1.size = 13.3;
g1.price = 9999.99;
g1.count = 3;
g2.brand = "Thinkpad";
g2.size = 15.6;
g2.price = 7999.99;
g2.count = 1;
//Goods类型的变量,存储到集合中
array.add(g1);
array.add(g2);
}
}
七、今日内容介绍
1、循环练习
2、数组方法练习
01奇数求和练习
* A: 奇数求和练习
* a: 题目分析
* 为了记录累加和的值,我们需要定义一个存储累加和的变量
* 我们要获取到1-100范围内的数
* 判断当前数是否为奇数,是奇数,完成累加和操作
* 累加完毕后,最终显示下累加和的值
* b: 解题步骤
* 定义一个用来记录累加和的变量
* 使用for循环语句,完成1-100之间每个数的获取
* 使用if条件语句,判断当前数是否是奇数,是奇数,进行累加和操作
* 使用输出语句,打印累加和变量的值
* c: 案例代码
public class Test01 {
public static void main(String[] args) {
int sum = 0;
for (int i = 0; i < 100; i++) {
if (i%2==1) {
sum += i;
}
}
System.out.println("累加和的值 " + sum);
}
}
02水仙花练习功能实现
* A: 水仙花练习功能实现
* a: 题目分析
* 明确什么样的数就是水仙花数。水仙花数是指一个3位数(100-999之间),其每位数字立方之和等于该3位数本身。
如153 = 1*1*1 + 3*3*3 + 5*5*5,即 3位数本身 = 百位数立方 + 十位数立方 + 个位数立方;
* 获取水仙花范围内的所有3位数(100-999之间的每个3位数)
* 判断该3位数是否满足水仙花数,满足,打印该3位数
* b: 解题步骤
* 使用for循环,得到100-999之间的每个3位数
* 获取3位数中百位数字、十位数字、个位数字
* 使用if条件语句,判断该3位数是否满足水仙花数,满足,使用输出语句,打印该3位数
* c: 案例代码
public class Test02 {
public static void main(String[] args) {
for (int i = 100; i < 1000; i++) {
int bai = i/100%10;
int shi = i/10%10;
int ge = i%10;
if (i == bai*bai*bai + shi*shi*shi + ge*ge*ge) {
System.out.println(i);
}
}
}
}
03ASCII编码表
* A: ASCII编码表
* a: 英文全称
* American Standard Code for Information Interchange,美国标准信息交换代码
* b: ASCII编码表由来
* 计算机中,所有的数据在存储和运算时都要使用二进制数表示
* a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号, 在计算机中存储时也要使用二进制数来表示
* 具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码)
* 大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,
统一规定了上述常用符号用哪些二进制数来表示。
* c: 中文编码表
* GB2312
* UNICODE
* d: 字符中重要的ASCII码对应关系
* a : 97
* A : 65
* 0 : 48
04char类型的存储
* A: char类型的存储
* a: 取值范围
* short:占两个字节,是有符号数据,取值范围-32768-32767
* char: 占两个字节,是无符号数据,取值范围0-65536
* b: 类型转换
* char类型的数据参加运算时要线程程int数据类型
* c: 案例代码
/*
ASCII编码表演示
字符Java 数据类型,char
整数Java 数据类型,int
int 类型和 char 数据类型转换
char 两个字节, int 四个字节
char转成int类型的时候,类型自动提示,char数据类型,会查询编码表,得到整数
int转成char类型的时候,强制转换,会查询编码表
char存储汉字,查询Unicode编码表
char可以和int计算,提示为int类型, 内存中两个字节
char取值范围是0-65535, 无符号的数据类型
*/
public class ASCIIDemo{
public static void main(String[] args){
char c = 'a';
int i = c + 1;
System.out.println(i);
int j = 90;
char h = (char)j;
System.out.println(h);
System.out.println( (char)6 );
char k = '你';
System.out.println(k);
char m = -1;
}
}
05输出所有英文字母
* A: 输出所有英文字母
* a: 题目分析
* 一共26个大小写字母,那么,可以考虑循环26次。在每次循环中,完成指定字母的大小写打印
* 找出ABCDEFG…XYZ这些字母之间的变化规律
通过ASCII表发现,后面的字母比它前面的字母,ASCII值大1
下一个字母 = 上一个字母 + 1
如: A B C D
65 66 67 68
* 在每次循环中打印上一个字母大小写,并指定下一个字母
* b: 解题步骤
* 定义初始化大写变量,值为’A’; 初始化小写变量,值为’a’
* 使用for循环,进行26次循环
* 在每次循环中,打印大写字母、小写字母。
每次打印完成后,更新大写字母值、小写字母值
* c: 案例代码
public class Test04 {
public static void main(String[] args) {
char da = 'A';
char xiao = 'a';
for (int i = 0; i < 26; i++) {
System.out.println("大写字母 "+da+" ,小写字母 "+xiao);
da++; //更新大写字母值
xiao++; //更新小写字母值
}
}
}
0699乘法表的分析
* A: 99乘法表的分析
* a: 打印格式
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
* b: 题目分析
通过观察发现,如果把1*1=1这样的内容 看做一颗*的话,那么打印结果就成了如下效果:
*
**
***
****
…
这样,就是打印9行星,每行打印星的个数与当前行数相等。
再观察“1*3=3 2*3=6 3*3=9”得出它们如下的变化规律:
每行第n次 +"*"+ 行号 +"="+ 每行第n次 * 行号
如: 1 +"*"+ 2 +"="+ 1*2; // 相当于1*2=2
2 +"*"+ 2 +"="+ 2*2; // 相当于2*2=4
* c: 解题步骤
* 定义一个外层for循环,初始值从1开始,循环9次。用来控制打印的行数
* 在外层for循环内部,定义一个for循环,初始值从1开始,循环次数与当前行数相等。用来完成每行打印指定次数的乘法公式 如1*1=1
* 在内层for循环中,完成每行指定次数的乘法公式打印 如1*1=1
System.out.print(k +"*"+ j +"="+ j*k +" ");
// 变量k代表:每行中的第n次
// 变量j代表:行号
* 在外循环中,当每行指定次数的乘法公式打印完毕后,通过System.out.println()切换到下一行。
这样,再次打印乘法公式时,就在下一行输出打印了
0799乘法表的功能实现
* A: 99乘法表的功能实现
* a: 案例代码
/*
利用嵌套for循环,实现99乘法表示
实现步骤:
1. 定义外循环控制行数
2. 内循环控制个数,个数,每次都在递增
3. 循环中输出,乘法表的格式 1*3=3
*/
public class Test05 {
public static void main(String[] args) {
for (int j = 1; j < 10; j++) {
for (int k = 1; k <= j; k++) {
System.out.print(k +"*"+ j +"="+ j*k +" ");
}
System.out.println();
}
}
}
day07_08(基础语法)实现数组的遍历.avi(14:18)
day07_09(基础语法)数组逆序原理.avi(17:55)
day07_10(基础语法)数组逆序功能实现.avi(9:45)
day07_11(基础语法)选择排序原理.avi(14:01)
day07_12(基础语法)选择排序功能实现.avi(09:07)
day07_13(基础语法)冒泡排序功能实现.avi(16:00)
day07_14(基础语法)数组的折半查找原理.avi(13:15)
day07_15(基础语法)数组的折半查找代码实现.avi(8:23)
08实现数组的遍历
* A: 实现数组的遍历
* a: 题目分析
* 通过循环,我们可以完成数组中元素的获取,数组名[索引]
* 观察发现,每个数组元素之间加入了一个逗号”,”进行分隔;并且,整个数组的前后有一对中括号”[]”包裹数组所有元素。
* b: 解题步骤
* 使用输出语句完成打印 左边的中括号”[”
* 使用循环,输出数组元素值。输出元素值分为两种情况,如下:
* 最后一个数组元素,加上一个右边的中括号”]”
* 非最后一个数组元素,加上一个逗号”,”
* c: 案例代码
/*
定义方法,实现数组的遍历
遍历中,输出结果 [11,33,565,66,78,89]
int[] arr = {3,4,45,7};
结果包含字符串, [ ] ,
实现步骤:
1. 定义方法实现数组的遍历
2. 先打印[ 中括号
3. 遍历数组
输出数组的元素和逗号
判断是否遍历到了数组的最后一个元素,如果是最后一个元素,输出]中括号
*/
public class ArrayMethodTest{
public static void main(String[] args){
int[] arr = {11,44,55,33,66};
printArray(arr);
int[] arr2 = {22,88,99,33,66};
printArray(arr2);
}
/*
定义方法,实现功能
返回值: void
方法参数: 数组
*/
public static void printArray(int[] arr){
//输出一半中括号,不要换行打印
System.out.print("[");
//数组进行遍历
for(int i = 0 ; i < arr.length ; i++){
//判断遍历到的元素,是不是数组的最后一个元素
//如何判断 循环变量 到达 length-1
if( i == arr.length-1 ){
//输出数组的元素和]
System.out.print(arr[i]+"]");
}else{
//不是数组的最后一个元素,输出数组元素和逗号
System.out.print(arr[i]+",");
}
}
System.out.println();
}
}
09数组逆序原理
* A: 数组逆序原理
* a: 题目分析(图解见day07_source/数组的逆序原理.JPG)
* 通过观察发现,本题目要实现原数组元素倒序存放操作。即原数组存储元素为{11,22,33,44},
逆序后为原数组存储元素变为{44,33,22,11}。
* 通过图解发现,想完成数组元素逆序,其实就是把数组中索引为start与end的元素进行互换。
* 每次互换后,start索引位置后移,end索引位置前移,再进行互换
* 直到start位置超越了end位置,互换结束,此时,数组元素逆序完成。
* b: 解题步骤
* 定义两个索引变量start值为0,变量end值为数组长度减去1(即数组最后一个元素索引)
* 使用循环,完成数组索引start位置元素与end位置元素值互换。
* 在循环换过程中,每次互换结束后,start位置后移1,end位置前移1
* 在循环换过程中,最先判断start位置是否超越了end位置,若已超越,则跳出循环
10数组逆序功能实现
* A:案例代码
/*
数组的逆序:
数组中的元素,进行位置上的交换
逆序 不等于 反向遍历
就是数组中最远的两个索引,进行位置交换,实现数组的逆序
使用的是数组的指针思想,就是变量,思想,可以随时变换索引
反转 reverse
实现步骤:
1. 定义方法,实现数组的逆序
2. 遍历数组
实现数组的最远索引换位置
使用临时的第三方变量
*/
public class ArrayMethodTest_1{
public static void main(String[] args){
int[] arr = {3,5,7,1,0,9,-2};
//调用数组的逆序方法
reverse(arr);
//看到数组的元素,遍历
printArray(arr);
}
/*
定义方法,实现数组的逆序
返回值: 没有返回值
参数: 数组就是参数
*/
public static void reverse(int[] arr){
//利用循环,实现数组遍历,遍历过程中,最远端换位
//for的第一项,定义2个变量, 最后,两个变量++ --
for( int min = 0 , max = arr.length-1 ; min < max ; min++,max--){
//对数组中的元素,进行位置交换
//min索引和max索引的元素交换
//定义变量,保存min索引
int temp = arr[min];
//max索引上的元素,赋值给min索引
arr[min] = arr[max];
//临时变量,保存的数据,赋值到max索引上
arr[max] = temp;
}
}
}
11选择排序原理
* A: 选择排序原理
* a: 题目分析(图解见day07_source/选择排序原理.JPG)
* 通过观察发现,本题目要实现把数组元素{13,46,22,65,3}进行排序
* 提到数组排序,就要进行元素值大小的比较,通过上图发现,我们想完成排序要经过若干次的比较才能够完成。
* 上图中用每圈要比较的第一个元素与该元素后面的数组元素依次比较到数组的最后一个元素,把小的值放在第一个数组元素中,数组循环一圈后,则把最小元素值互换到了第一个元素中。
* 数组再循环一圈后,把第二小的元素值互换到了第二个元素中。按照这种方式,数组循环多圈以后,就完成了数组元素的排序。这种排序方式我们称为选择排序。
* b: 解题步骤
* 使用for循环(外层循环),指定数组要循环的圈数(通过图解可知,数组循环的圈数为数组长度 - 1)
* 在每一圈中,通过for循环(内层循环)完成数组要比较的第一个元素与该元素后面的数组元素依次比较到数组的最后一个元素,把小的值放在第一个数组元素中
* 在每一圈中,要参与比较的第一个元素由第几圈循环来决定。如上图所示
* 进行第一圈元素比较时,要比较的第一个元素为数组第一个元素,即索引为0的元素
* 进行第二圈元素比较时,要比较的第一个元素为数组第二个元素,即索引为1的元素
* 依次类推,得出结论:进行第n圈元素比较时,要比较的第一个元素为数组第n个元素,即数组索引为n-1的元素
12选择排序功能实现
* A: 案例代码
/*
数组的排序: 一般都是升序排列,元素,小到大的排列
两种排序的方式
选择排序: 数组的每个元素都进行比较
冒泡排序: 数组中相邻元素进行比较
规则: 比较大小,位置交换
*/
public class ArrayMethodTest_2{
public static void main(String[] args){
int[] arr = {3,1,4,2,56,7,0};
//调用选择排序方法
//selectSort(arr);
printArray(arr);
}
/*
定义方法,实现数组的选择排序
返回值: 没有
参数: 数组
实现步骤:
1.嵌套循环实现排序
外循环,控制的是一共比较了多少次
内循环,控制的是每次比较了多少个元素
2. 判断元素的大小值
小值,存储到小的索引
*/
public static void selectSort(int[] arr){
for(int i = 0 ; i < arr.length - 1; i++){
//内循环,是每次都在减少,修改变量的定义
for(int j = i+1 ; j < arr.length ; j++){
//数组的元素进行判断
if(arr[i] > arr[j]){
//数组的换位
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
/*
定义方法,实现功能
返回值: void
方法参数: 数组
*/
public static void printArray(int[] arr){
//输出一半中括号,不要换行打印
System.out.print("[");
//数组进行遍历
for(int i = 0 ; i < arr.length ; i++){
//判断遍历到的元素,是不是数组的最后一个元素
//如何判断 循环变量 到达 length-1
if( i == arr.length-1 ){
//输出数组的元素和]
System.out.print(arr[i]+"]");
}else{
//不是数组的最后一个元素,输出数组元素和逗号
System.out.print(arr[i]+",");
}
}
System.out.println();
}
}
13冒泡排序功能实现
* A: 冒泡排序功能实现
* a: 题目分析
* 通过观察发现,本题目要实现把数组元素{13,46,22,65,3}进行排序
* 提到数组排序,就要进行元素值大小的比较,通过上图发现,我们想完成排序要经过若干次的比较才能够完成。
* 上图中相邻的元素值依次比较,把大的值放后面的元素中,数组循环一圈后,则把最大元素值互换到了最后一个元素中。
数组再循环一圈后,把第二大的元素值互换到了倒数第二个元素中。按照这种方式,数组循环多圈以后,
就完成了数组元素的排序。这种排序方式我们称为冒泡排序。
* b: 解题步骤
* 使用for循环(外层循环),指定数组要循环的圈数(通过图解可知,数组循环的圈数为数组长度 - 1)
* 在每一圈中,通过for循环(内层循环)完成相邻的元素值依次比较,把大的值放后面的元素中
* 每圈内层循环的次数,由第几圈循环来决定。如上图所示
* 进行第一圈元素比较时,内层循环次数为数组长度 - 1
* 进行第二圈元素比较时,内层循环次数为数组长度 - 2
* 依次类推,得出结论:进行第n圈元素比较时,内层循环次数为数组长度 - n
* c: 案例代码
/*
数组的排序: 一般都是升序排列,元素,小到大的排列
两种排序的方式
选择排序: 数组的每个元素都进行比较
冒泡排序: 数组中相邻元素进行比较
规则: 比较大小,位置交换
*/
public class ArrayMethodTest_2{
public static void main(String[] args){
int[] arr = {3,1,4,2,56,7,0};
//调用选择排序方法
//selectSort(arr);
//调用冒泡排序方法
bubbleSort(arr);
printArray(arr);
}
/*
定义方法,实现数组的冒泡排序
返回值: 没有
参数: 数组
*/
public static void bubbleSort(int[] arr){
for(int i = 0 ; i < arr.length - 1; i++){
//每次内循环的比较,从0索引开始, 每次都在递减
for(int j = 0 ; j < arr.length-i-1; j++){
//比较的索引,是j和j+1
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
/*
定义方法,实现功能
返回值: void
方法参数: 数组
*/
public static void printArray(int[] arr){
//输出一半中括号,不要换行打印
System.out.print("[");
//数组进行遍历
for(int i = 0 ; i < arr.length ; i++){
//判断遍历到的元素,是不是数组的最后一个元素
//如何判断 循环变量 到达 length-1
if( i == arr.length-1 ){
//输出数组的元素和]
System.out.print(arr[i]+"]");
}else{
//不是数组的最后一个元素,输出数组元素和逗号
System.out.print(arr[i]+",");
}
}
System.out.println();
}
}
14数组的折半查找原理
* A: 数组的折半查找原理(图解见day07_source/折半查找原理.JPG)
* a: 题目分析
* 通过观察发现,本题目要实现查找指定数值在元素有序的数组中存储的位置(索引),返回该位置(索引)。
* 我们使用数组最中间位置的元素值与要查找的指定数值进行比较,若相等,返回中间元素值的索引
* 最中间位置的元素值与要查找的指定数值进行比较,若不相等,则根据比较的结果,缩小查询范围为上次数组查询范围的一半;
再根据新的查询范围,更新最中间元素位置,然后使用中间元素值与要查找的指定数值进行比较
比较结果相等,返回中间元素值的索引
比较结果不相等,继续缩小查询范围为上次数组查询范围的一半,更新最中间元素位置,继续比较,依次类推。
* 当查询范围缩小到小于0个元素时,则指定数值没有查询到,返回索引值-1。
* b: 解题步骤
* 定义3个用来记录索引值的变量,变量min记录当前范围最小索引值,初始值为0;变量max记录当前范围最大索引值,初始值为数组长度-1;变量mid记录当前当前范围最中间元素的索引值,初始值为(min+max) / 2
* 使用循环,判断当前范围下,最中间元素值与指定查找的数值是否相等
若相等,结束循环,返回当前范围最中间元素的索引值mid
若不相等,根据比较结果,缩小查询范围为上一次查询范围的一般
中间元素值 比 要查询的数值大,说明要查询的数值在当前范围的最小索引位置与中间索引位置之间,此时,更新查询范围为:
范围最大索引值 = 上一次中间索引位置 -1;
中间元素值 比 要查询的数值小,说明要查询的数值在当前范围的最大索引位置与中间索引位置之间,此时,更新查询范围为:
范围最小索引值 = 上一次中间索引位置 +1;
在新的查询范围中,更新中间元素值的位置,再次使用最中间元素值与指定查找的数值是否相等。
中间索引值 = (范围最小索引值 +范围最大索引值) / 2;
* 每次查询范围缩小一半后,使用if语句判断,查询范围是否小于0个元素,若小于0个元素,则说明指定数值没有查询到,返回索引值-1。
15数组的折半查找代码实现
* A: 案例代码
/*
数组的查找功能
在一个数组中,找一个元素,是否存在于数组中,如果存在,就返回索引
普通查询:
找到元素在数组中出现的索引,如果没有这个 元素,结果就是负数
*/
public class ArrayMethodTest_3{
public static void main(String[] args){
int[] arr = {1,3,5,7,9,11,15};
int index = binarySearch(arr,10);
System.out.println(index);
}
/*
定义方法,实现,折半查找
返回值: 索引
参数: 数组,被找的元素
实现步骤:
1. 需要的变量定义
三个,三个指针
2. 进行循环折半
可以折半的条件 min <= max
3. 让被找元素,和中间索引元素进行比较
元素 > 中间索引 小指针= 中间+1
元素 < 中间索引 大指针= 中间-1
元素 == 中间索引 找到了,结束了,返回中间索引
4. 循环结束,无法折半
元素没有找到 ,返回-1
*/
public static int binarySearch(int[] arr, int key){
//定义三个指针变量
int min = 0 ;
int max = arr.length -1 ;
int mid = 0;
//循环折半,条件 min<=max
while( min <= max){
//公式,计算中间索引
mid = (min+max)/2;
//让被找元素,和中间索引元素进行比较
if(key > arr[mid]){
min = mid + 1;
}else if (key < arr[mid]){
max = mid - 1;
}else{
//找到元素,返回元素索引
return mid;
}
}
return -1;
}
/*
定义方法,实现数组的普通查询
返回值: 索引
参数: 数组, 被找的元素
实现步骤:
1. 遍历数组
2. 遍历过程中,使用元素和数组中的元素进行比较
如果相同,返回元素在数组中的索引
如果不同,返回负数
*/
public static int search(int[] arr, int key){
//遍历数组
for(int i = 0 ; i < arr.length ; i++){
//数组元素,被查找的元素比较
if(arr[i] == key){
//返回索引
return i;
}
}
return -1;
}
}
16总结
- 把今天的知识点总结一遍。
八、今日内容介绍
1、Eclipse开发工具
2、超市库存管理系统
01Eclipse的下载安装
* A: Eclipse的下载安装
* a: 下载
* http://www.eclipse.org
* b: 安装
* 只需要解压后就能使用
* c: 卸载
* 只需要将文件夹删除就可以了
* d: 注意
* 开发软件的安装目录中,尽量不要出现空格与中文
* B: Eclipse的特点
* a: 免费
* b: 纯Java语言编写
* c: 免安装
* d: 扩展性强
02Eclipse的工作空间和新建工程
* A: Eclipse的工作空间和新建工程
* a: 工作空间
* 其实就是我们写的源代码所在的目录
* b: 创建工程(项目)
* 右键/Package Explore 空白区/new /Java Project/输入项目名称如day08/
* c: 创建包(后面讲包的概念)
* 打开上面建立的day08项目/右键/new/package/在弹出的对话框的name中输入报名如"com.itheima.tests"/finish
* d: 创建类
* 创建一个java类:右击包名/new/class/在对话框的name中输入类名/finish
* B: 编译与执行
* a: 编译
* 自动编译,当java代码保存的时候,自动 编译class文件
* b: 运行
* 方式1:点击菜单工具栏中的 绿色带有三角形的 run按钮 运行
* 方式2:点击菜单栏中Run, 点击Run 运行 快捷键是 ctrl+F11
* 方式3:选中要运行的java文件,或者在编写代码的空白区域,右键选择 Run As --> 运行java程序
03Eclipse的HelloWorld编写
* A:HelloWorld编写
* a: 编写过程(参照上个知识点)
* 建立day08项目
* 建立包结构(包的概念还没有学到,不建立包的话,使用默认包结构default)
* 创建HelloWorld类(自动生成main方法)
* b: 案例代码
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
04Eclipse的字体设置
* A: Eclipse的字体设置
* a: 修改编译环境和运行环境
* 编译环境:Window -- Preferences – Java - Compiler
* 运行环境:Window -- Preferences – Java - Installed JREs
* b: 显示行号与隐藏行号
* 显示:在代码区域的左边空白区域,右键 -- Show Line Numbers
* 隐藏:将上面的操作再做一遍
* c: 更改字体大小与颜色
* Java代码区域的字体大小和颜色:
* window -- Preferences -- General -- Appearance -- Colors And Fonts --Java修改 -- Java Edit Text Font--edit进行修改
* 控制台
* window -- Preferences -- General -- Appearance -- Colors And Fonts -- Debug -- Console font
* 其他文件
* window -- Preferences -- General -- Appearance -- Colors And Fonts -- Basic -- Text Font
05Eclipse的窗口设置
* A: 窗口设置
* a: 显示的窗口乱了,还原默认显示模式
* Window – Perspective -- Reset Prespective
* b: 显示控制台
* Window--Show View—Console
06Eclipse的去掉多余的注释
* A: Eclipse的去掉多余的注释
* a:如何去掉默认注释
* Window -- Preferences -- Java -- Code Style -- Code Templates -- Comments – Methods,点击Edit ,将注释部分删除 (不建议删除)
* Window -- Preferences -- Java -- Code Style -- Code Templates -- Code -- Method body,点击Edit ,将注释部分删除
* b: 切换工作空间
* File – Switch Workspace – 指定工作空间 – ok
07Eclipse的快捷键
* A: Eclipse的快捷键
* a: 内容辅助键 Alt+/
* 自动补齐main方法 main 然后 Alt+/
* 自动补齐输出语句 syso 然后 Alt+/
* b: 格式化代码
* Ctrl+Shift+f
* 代码区域右键 -- Source – Format
* c: 自动导包
* Ctrl+Shift+o
* 如果当前类在多个包中都存在,这时候,使用Ctrl+shift+o,进行选择一个包导入即可。
* d: 注释
* 单行注释
* 加注释: 先选中需要注释的内容,然后 Ctrl+/
* 取消注释:先选中需要取消注释的内容, 然后 Ctrl+/
* 多行注释
* 加注释: 先选中需要注释的内容,然后 Ctrl+Shift+/
* 取消注释:先选中需要取消注释的内容, 然后 Ctrl+Shift+
* e: 补充
* 代码上下移动
* 选中代码alt+上/下箭头
* 查看源码
* 选中类名(F3或者Ctrl+鼠标点击)
* 查找具体的类
* ctrl + shift + t,输入要查找的类的名称-->确定
* 查找具体类的具体方法
* ctrl + o
* 给建议
* ctrl+1,根据右边生成左边的数据类型,生成方法
* 删除代码
* ctrl + d
* 抽取方法
* alt + shift + m
* 改名
* alt + shift + r(类名,方法名,变量名)
08Eclipse的断点调试
* A:断点调试(又称为Debug调试)的作用
* 调试程序
* 查看程序执行流程
* B:如何查看程序执行流程
* 什么是断点:
* 就是一个标记,从哪里开始。
* 如何设置断点:
* 你想看哪里的程序,你就在那个有效程序的左边双击即可。
* 在哪里设置断点:
* 哪里不会点哪里。
* 目前:我们就在每个方法的第一条有效语句上都加。
* 如何运行设置断点后的程序:
* 右键 -- Debug as -- Java Application
* 看哪些地方:
* Debug:断点测试的地方
* 在这个地方,记住F6,或者点击也可以。一次看一行的执行过程。
* Variables:查看程序的变量变化
* ForDemo:被查看的源文件
* Console:控制台
* 如何去断点:
* a:再次双击即可
* b:找到Debug视图,Variables界面,找到Breakpoints,并点击,然后看到所有的断点,最后点击那个双叉
09Eclipse的工程删除和导入
* A:删除项目
* 选中项目 – 右键 – 删除
* 从项目区域中删除
* 从硬盘上删除
* B:导入项目
* 在项目区域右键找到import
* 找到General,展开,并找到
* Existing Projects into Workspace
* 点击next,然后选择你要导入的项目
* 注意:这里选择的是项目名称
10超市管理系统功能介绍
* A:超市管理系统功能介绍
* a: 显示主菜单
============欢迎光临ItCast超市============
1: 货物 清单 2: 添加货物 3: 删除货物 4: 修改货物 5: 退出
请您输入要操作的功能序号
* b: 货物清单
输入1:货物清单
================商品库存清单================
商品编号 商品名称 商品单价
9527 少林寺酥饼核桃 12.7
9008 尚康杂粮牡丹饼 5.6
9879 新疆原产哈密瓜 599.6
* c: 添加新货物
输入2:添加新货物
请输入新商品的编号:9523
请输入新商品的名字:斯柯达苹果醋
请输入新商品的单价:19.9
商品添加成功
* d: 删除货物
输入3:删除货物
选择的是删除功能
请输入商品的编号:9523
货物信息删除完毕
* e: 修改货物
输入4:修改货物
选择的是修改功能
请输入您要修改的商品的编号:9527
输入新的商品编号:100
输入新的商品名字:味道好凤梨干
输入新的商品价格:6.5
商品修改成功
* f: 输入5:退出系统
11超市管理系统案例分析
* A: 超市管理系统案例分析
* 完成超市商品初始化。创建商品,将商品添加到集合
* 显示来到超市能做的操作,也就是显示主菜单
* 根据接收到的功能选项,执行对应的功能
* 库存货物查询
* 添加新货物
* 删除货物
* 修改货物
* 退出系统,结束main方法的运行
* 循环,回到 2.显示主菜单
12自定义商品类
* A: 自定义商品类
* a: 目的
* 每种库存商品都拥有多项商品信息,为了方便管理每种商品的信息,我们对商品信息进行封装,编写FruitItem.java文件
* b:案例代码
public class FruitItem {
int ID; //商品编号
String name; //商品名称
double price; //商品单价
double number; //商品数量
double money; //商品金额
}
* 补充
* 上述代码中,对商品信息(编号、名称、单价、数量、金额)进行了封装。这样做的好处在于以后只要找到这个商品,就能够知道该商品的每项信息了。
13初始化商品属性
* A: 初始化商品属性
* a: 案例代码
import java.util.ArrayList;
import java.util.Scanner;
/*
* 超市管理系统主
* 实现:
* 1. 商品数据的初始化
* 2. 用户的菜单选择
* 3. 根据选择执行不同的功能
* 3.1 Read 查看商品
* 3.2 Create 添加商品
* 3.3 Delete 删除商品
* 3.4 Update 修改商品
*
*
* 所有功能 ,必须定义方法实现
* 主方法main 调用作用
*/
public class Shopp {
public static void main(String[] args) {
//创建ArrayList集合,存储商品类型,存储数据类型FruitItem类型
ArrayList<FruitItem> array = new ArrayList<FruitItem>();
//调用商品初始化方法,传递集合
init(array);
}
}
/*
* 定义方法,实现商品数据的初始化
* 先将一部分数据,存储集合中
* 返回值: 无
* 参数 : 集合
* 方法名: init
*/
public static void init(ArrayList<FruitItem> array){
//创建出多个FruitItem类型,并且属性赋值
FruitItem f1 = new FruitItem();
f1.ID = 9527;
f1.name = "少林寺酥饼核桃";
f1.price = 12.7;
FruitItem f2 = new FruitItem();
f2.ID = 9008;
f2.name = "尚康杂粮牡丹饼";
f2.price = 5.6;
FruitItem f3 = new FruitItem();
f3.ID = 9879;
f3.name = "新疆原产哈密瓜";
f3.price = 599.6;
//创建的3个FruitItem类型变量,存储到集合中
array.add(f1);
array.add(f2);
array.add(f3);
}
}
14主菜单功能
* A: 主菜单功能
* a: 案例代码
import java.util.ArrayList;
import java.util.Scanner;
/*
* 超市管理系统主
* 实现:
* 1. 商品数据的初始化
* 2. 用户的菜单选择
* 3. 根据选择执行不同的功能
* 3.1 Read 查看商品
* 3.2 Create 添加商品
* 3.3 Delete 删除商品
* 3.4 Update 修改商品
*
*
* 所有功能 ,必须定义方法实现
* 主方法main 调用作用
*/
public class Shopp {
public static void main(String[] args) {
//创建ArrayList集合,存储商品类型,存储数据类型FruitItem类型
ArrayList<FruitItem> array = new ArrayList<FruitItem>();
//调用商品初始化方法,传递集合
init(array);
while(true){
//调用菜单方法
mainMenu();
}
}
/*
* 定义方法,实现主菜单
* 提示用户哪些选择 让选择序号
* 返回值: 无
* 参数: 无
*/
public static void mainMenu(){
System.out.println();
System.out.println("============欢迎光临ItCast超市============");
System.out.println("1: 货物 清单 2: 添加货物 3: 删除货物 4: 修改货物 5: 退出");
System.out.println("请您输入要操作的功能序号");
}
/*
* 定义方法,实现商品数据的初始化
* 先将一部分数据,存储集合中
* 返回值: 无
* 参数 : 集合
* 方法名: init
*/
public static void init(ArrayList<FruitItem> array){
//创建出多个FruitItem类型,并且属性赋值
FruitItem f1 = new FruitItem();
f1.ID = 9527;
f1.name = "少林寺酥饼核桃";
f1.price = 12.7;
FruitItem f2 = new FruitItem();
f2.ID = 9008;
f2.name = "尚康杂粮牡丹饼";
f2.price = 5.6;
FruitItem f3 = new FruitItem();
f3.ID = 9879;
f3.name = "新疆原产哈密瓜";
f3.price = 599.6;
//创建的3个FruitItem类型变量,存储到集合中
array.add(f1);
array.add(f2);
array.add(f3);
}
}
15用户选择功能
* A: 用户选择功能
* a: 案例代码
import java.util.ArrayList;
import java.util.Scanner;
/*
* 超市管理系统主
* 实现:
* 1. 商品数据的初始化
* 2. 用户的菜单选择
* 3. 根据选择执行不同的功能
* 3.1 Read 查看商品
* 3.2 Create 添加商品
* 3.3 Delete 删除商品
* 3.4 Update 修改商品
*
*
* 所有功能 ,必须定义方法实现
* 主方法main 调用作用
*/
public class Shopp {
public static void main(String[] args) {
//创建ArrayList集合,存储商品类型,存储数据类型FruitItem类型
ArrayList<FruitItem> array = new ArrayList<FruitItem>();
//调用商品初始化方法,传递集合
init(array);
while(true){
//调用菜单方法
mainMenu();
//调用用户选择序号方法
int choose = chooseFunction();
switch (choose) {
case 1:
//调用1: 货物 清单
showFruitList(array);
break;
case 2:
//2: 添加货物
addFruit(array);
break;
case 3:
//3: 删除货物
deleteFruit(array);
break;
case 4:
//4: 修改货物
updateFruit(array);
break;
case 5:
return ;
default:
System.out.println("输入的序号没有");
break;
}
}
}
/*
* 定义方法,实现接受用户的键盘输入
* 返回编号
*/
public static int chooseFunction(){
Scanner sc = new Scanner(System.in);
return sc.nextInt();
}
/*
* 定义方法,实现主菜单
* 提示用户哪些选择 让选择序号
* 返回值: 无
* 参数: 无
*/
public static void mainMenu(){
System.out.println();
System.out.println("============欢迎光临ItCast超市============");
System.out.println("1: 货物 清单 2: 添加货物 3: 删除货物 4: 修改货物 5: 退出");
System.out.println("请您输入要操作的功能序号");
}
/*
* 定义方法,实现商品数据的初始化
* 先将一部分数据,存储集合中
* 返回值: 无
* 参数 : 集合
* 方法名: init
*/
public static void init(ArrayList<FruitItem> array){
//创建出多个FruitItem类型,并且属性赋值
FruitItem f1 = new FruitItem();
f1.ID = 9527;
f1.name = "少林寺酥饼核桃";
f1.price = 12.7;
FruitItem f2 = new FruitItem();
f2.ID = 9008;
f2.name = "尚康杂粮牡丹饼";
f2.price = 5.6;
FruitItem f3 = new FruitItem();
f3.ID = 9879;
f3.name = "新疆原产哈密瓜";
f3.price = 599.6;
//创建的3个FruitItem类型变量,存储到集合中
array.add(f1);
array.add(f2);
array.add(f3);
}
}
16商品的清单功能
* A: 商品的清单功能
* a: 案例代码(显示商品清单的showFruitList(ArrayList<FruitItem>)方法的代码如下)
/*
* 定义方法,实现显示货物清单功能
* 返回值: 无
* 参数: 集合
* 遍历集合,获取集合中的每个FruitItem变量,变量,调用属性
*/
public static void showFruitList(ArrayList<FruitItem> array){
System.out.println();
System.out.println("================商品库存清单================");
System.out.println("商品编号 商品名称 商品单价");
//遍历集合
for(int i = 0 ; i < array.size(); i++){
//集合get方法,获取出每个FruitItem变量,可以使用FruitItem接受get结果
FruitItem item = array.get(i);
//变量item调用类中属性
System.out.println(item.ID+" "+item.name+" "+item.price);
}
}
17商品的添加功能
* A: 商品的添加功能
* a: 案例代码(商品添加功能的addFruit(ArrayList<FruitItem>)方法的代码如下)
/*
* 定义方法,实现商品的添加功能
* 返回值:无
* 参数: 集合
* 提示用户选择的是添加商品的功能
*
* 提示用户输入的是什么
*
* 创建FruitItem变量,变量调用的属性
* 将输入的每个商品属性进行赋值
*/
public static void addFruit(ArrayList<FruitItem> array){
System.out.println("选择的是添加商品功能");
//创建Scanner变量
Scanner sc = new Scanner(System.in);
System.out.print("请输入新商品的编号:");
//输入商品的编号
int ID = sc.nextInt();
//输入商品的名字
System.out.print("请输入新商品的名字:");
String name = sc.next();
//输入商品的单价
System.out.print("请输入新商品的单价:");
double price = sc.nextDouble();
//创建FruitItem变量
FruitItem item = new FruitItem();
//item.属性赋值
item.ID = ID;
item.name = name;
item.price = price;
array.add(item);
System.out.println("商品添加成功");
}
18商品的删除功能
* A: 商品的删除功能(删除商品deleteFruit(ArrayList<FruitItem>)方法的代码如下)
* a: 案例代码
/*
* 定义方法,实现商品的删除功能
* 返回值: 无
* 参数: 集合
*
* 删除依靠的是商品的编号
* 提示用户选择的是删除功能
* 键盘输入商品的编号
* 遍历集合,获取集合中的每个FruitItem变量
* 变量调用属性 ID, 和用户的输入的编号,对比,相同就删除
*/
public static void deleteFruit(ArrayList<FruitItem> array){
System.out.println("选择的是删除功能");
System.out.print("请输入商品的编号:");
Scanner sc = new Scanner(System.in);
int ID = sc.nextInt();
//遍历集合
for(int i = 0 ; i < array.size(); i++){
//获取到每个FruitItem变量
FruitItem item = array.get(i);
//变量,调用属性ID,和用户输入的编号比较
if( item.ID == ID){
//移除集合中的元素
//集合的方法remove实现
array.remove(i);
System.out.println("删除成功");
return;
}
}
System.out.println("你输入的编号不存在");
}
19商品的修改功能
* A: 商品的修改功能
* a: 案例代码(修改商品updateFruit(ArrayList<FruitItem>)方法的代码如下)
/*
* 定义方法,实现商品的修改功能
* 返回值: 无
* 参数: 集合
*
* 提示用户选择的是修改功能
* 提示用户输入需要修改的商品编号
* 遍历集合,获取每个FruitItem变量
* 变量调用ID属性,属性和用户输入的编号比较
* 如果相同:
* 修改调FruitItem中的属性值
* 键盘输入
*/
public static void updateFruit(ArrayList<FruitItem> array){
System.out.println("选择的是修改功能");
System.out.print("请输入您要修改的商品的编号:");
Scanner sc = new Scanner(System.in);
int ID = sc.nextInt();
//遍历集合,获取每个FruitItem变量
for(int i = 0 ; i < array.size(); i++){
FruitItem item = array.get(i);
//获取FruitItem的属性ID,和用户输入的ID比较
if(item.ID == ID){
System.out.print("输入新的商品编号:");
item.ID = sc.nextInt();
System.out.print("输入新的商品名字:");
item.name = sc.next();
System.out.print("输入新的商品价格:");
item.price = sc.nextDouble();
System.out.println("商品修改成功");
return ;
}
}
System.out.println("输入的编号不存在");
}
20总结
- 把今天的知识点总结一遍。