声明:由于版权等原因,本文隐藏了部分内容,由于造成的不便,请大家谅解。
如果你觉得本文对您有用,请跟贴,以示对作者的支持,谢谢。
授课教师:牟勇
课时:100分钟
l 本章技能目标
n 掌握数组的基本用法
n 会使用数组解决简单问题
u 求平均值
u 求最大值,最小值
u 排序
l 本章重点
n定义和使用数组
n会排序,求最大值和最小值
l 本章难点
n使用循环操作数组
l 本章工作任务
升级Java应用程序HelloAccp,输入学员成绩
n统计本次考试平均分
n求出本次考试最高分
n本次考试排名
1. 创建包mypackage.mywork,在包中创建类Welcome
添加一个方法sayHello(),提示输入姓名,然后输出“× ×,欢迎你!”
添加JavaDoc注释
什么情况下使用数组?
如何定义一个int数组?
怎样引用一个数组中的元素?
授课思路:
本章依次讲解3个问题:数组基础,创建和使用数组,数组应用
数组基础:讲解为什么需要数组,以及数组的结构。
创建和使用数组:首先讲解使用数组需要5步,然后结合例子分别讲解
数组应用:讲解如何求最值以及如何使用Arrays类的sort方法进行排序
教员最好现场演示,逐行敲打并解释代码。
为什么使用数组
提问:一次Java内部测试结束后,老师给令狐冲分配了一项任务,计算全班(30人)的平均分,请大家来帮助一下令狐少侠,给他写一个程序吧?
int stu1 = 95; int stu2 = 89; int stu3 = 79; int stu4 = 64; int stu5 = 76; int stu6 = 88; …… avg = (stu1+stu2+stu3+stu4+stu5…+stu30)/30
|
答案:代码如上。
提问:这个程序有什么问题?
答案:变量太多,太多的重复代码,如果计算的人数更多,真的不可想象。
提问:我们先来想想,在现实生活中是如何解决这类问题的。
生活案例:博物架: 解决方案:分类存放。 特征:每个物品都有一个固定的存放空间,每个空间有一个标识。 好处:易查找,易维护。 |
提问:那我们的计算机世界有没有类似的解决数据存储的方法呢?
答案:数组。
数组定义:
数组是一个变量,存储相同数据类型的一组数据。通过下标进行区别。
同一个数组变量,存储的数据类型都是相同的,它们都有同一个变量名,只通过下标来进行区别。
数组在内存中的存储
类似于博物架,把所有物品分类并且是集中存放相似,数组在内存中也是连续存放的。这样,在我们进行数据查找时,计算机的工作速度会非常快,因为CPU在查内存时不用东跳一下,西跳一下。而是连续迅速的完成工作。
小结:
提问:数据有什么好处?
答案:将数据集中,便于操作,提高效率。
提问:下列哪组数据能存储在数组中?数组的类型是什么?
a)“刘星”,“夏雨”,“夏雪”
b)8,98,‘c’,23
c)98.1,341.2,34.3
答案:a和c可以,b不行,因为它有其它的数据类型。
使用数组四步走
1、声明数组:int[] arr;
2、分配空间:arr=new int[5]
3、赋值:arr[0]=10
4、处理数据 :arr[1]=arr[0]*8
数组声明:告诉计算机数据类型是什么
数组初始化:告诉计算机需要多大空间(分配几个格子)
数组赋值:往格子里放东西。
两种方式:
第一种:在声明时就放(硬编码)。如:int[ ] score = {89, 79, 76};或者写成int[ ] score = new int[ ]{89, 79, 76};
第二种:使用循环,由用户完成输入(动态赋值)
Scanner input = new Scanner(System.in); for(int i = 0; i < 30; i ++){ score[i] = input.nextInt(); } |
使用数组求平均值:
题目:求5个学生的平均分:
答案1:正常思路(注意强调下标的使用)
int [ ] score = {60, 80, 90, 70, 85}; double avg; avg = (score[0] + score[1] + score[2] + score[3] + score[4])/5; |
答案2:使用循环(注意强调数组的length属性和累加的写法与变形)
int [ ] score = {60, 80, 90, 70, 85}; int sum = 0; double avg; for(int index = 0; index < score.length; index++){ sum = sum + score[index]; } avg = sum / score.length; |
引申:如何动态求得30名学生的平均分?
(引导学生,一步一步得出正确代码)
/** *HelloAccp1_2.java *计算S253班第一次Java内部测试的平均成绩 */ package s1java.sg.chap8;
import java.util.Scanner;
public class HelloAccp1_2 {
/** * @param args * String[] */ public static void main(String[] args) { // 声明变量 int[] score = new int[10]; // 成绩数组 int sum = 0; // 成绩总和 double avg; // 成绩平均值
// 给数组动态赋值 System.out.println("请依次录入学生成绩:"); Scanner input = new Scanner(System.in); for (int index = 0; index < score.length; index++) { score[index] = input.nextInt(); }
// 计算平均值 for (int index = 0; index < score.length; index++) { sum = sum + score[index]; } avg = sum / score.length;
// 显示输出结果 System.out.println("S253班Java内部测试成绩平均分是: " + avg); } } |
常见错误1:(教员应演示该错误)
public class HelloAccp2{ public static void main(String[ ] args){ int[ ] score = new int[ ]; score[0] = 89; score[1] = 63; System.out.println(score[0]); } } |
答案:数组必须在声明时就确定大小。
常见错误2:(教员应演示该错误)
public class HelloAccp3{ public static void main(String[ ] args){ int[ ] score = new int[2]; score[0] = 89; score[1] = 63; score[2] = 45; System.out.println(score[2]); } } |
答案:数组下标越界。
常见错误3:(教员应演示该错误)
public static void main(String[ ] args){ int[ ] score = new int[5]; score = {60, 80, 90, 70, 85};
int[ ] score2; score2 = {60, 80, 90, 70, 85}; } |
答案:数组声明及初始化应在一行上完成(不能打分号)
基本数据类型的数组元素缺省值为0
public class HelloAccp4{ public static void main(String[ ] args){ int[ ] score = new int[3]; System.out.println(score[1]); } } |
小结2:(由教员让多位学员上机合作完成,下面的学员在纸上练习)
使用数组的步骤是什么?
有一个数列:8,4,2,1,23,344,12
1)循环输出数列的值
2)求数列中所有数值的和
3)猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含此数
求最大值:
题目:从键盘输入本次Java考试五位学生的成绩,求考试成绩最高分
引入生活案例,打擂台的规则: 有1人站在擂台上 第2个人和他比武。如果比他强,则留在擂台上。 依次类推,第3个人和擂台上的人比武,谁赢了谁就是擂主-老大! |
根据这个思路,引导学生写出如下代码:
max = stu[0] ;
if (a[1]>max ){
max=a[1] ;
}
if (a[2]>max ){
max=a[2] ;
}
if (a[3]>max ){
max=a[3] ;
}
……
很明显,可以使用循环:(引导学员逐步写出代码)
//计算成绩最大值 max = score[0]; for (int index = 1;index < 5;index++) { if (score[index] > max) { max = score[index]; } } System.out.println("本次考试的五位学生的最高分是: " + max);
|
小结3:
小明要去买一部手机,他询问了4家店的价格,分别是2800元,2900元,2750元和3100元,显示输出最低价(由几位学员合作上机,其它学员在纸上写)
排序:
循环录入5位学员成绩,进行升序排列后输出结果
讲解要点:使用java.util.Arrays类
java.util包提供了许多存储数据的结构和有用的方法
Arrays类提供许多方法操纵数组,例如:排序,查询
Arrays类的sort()方法: 对数组进行升序排列
小结4:
有一列乱序的字符,‘a’,‘c’,‘u’,‘b’,‘e’,‘p’,‘f’,‘z’,排序并按照英文字母表的逆序输出
char list[ ] = {'a','c','u','b','e','p','f','z'}; Arrays.sort(list); for (int i = list.length - 1; i >= 0; i-- ) { System.out.println(list[i]); } |
答案讲解要点:主要是逆序输出的循环怎么写(有条件的班级,教员也可以引导学员自己写出代码)。
数组的优点是什么?
数组的3种声明方式是什么?
如何引用数组中的元素?
求数列的平均值、最大值以及排序的方法?
数组的声明
数组的使用
平均值,最大值的算法
冒泡排序算法
暂无
习题1:197页至198页选择题
习题2:198页第1,2,3题
习题3:预习第九章,试做课后的选择题