4. 对数据进行处理
现在使用数组解决 8.1 节提出的计算 30 位学员平均分的问题。为了简单起见,先计算五位学员的平均分,如示例 1 所示。
示例1
package cn.jbit.array; import java.util.Scanner; public class ArrayDemo { public static void main(String[] args) { int[] scores = new int[5]; //成绩数组 int sum = 0; //成绩总和 Scanner input = new Scanner(System.in); System.out.println("请输入5位学员的成绩:"); for (int i = 0; i < scores.length; i++) { scores[i] = input.nextInt(); sum = sum + scores[i]; //成绩累加 } //计算并输出平均分 System.out.println("学员的平均分是:" + (double)sum/scores.length); } }
示例 1 的运行结果如图 8.3 所示。
图 8.3 示例 1 的运行结果
在循环中,循环变量 i 从 0 开始递增直到数组的最大长度 scores.length。因此,每次循环 i 加 1 ,实现数组的每个元素和的累加。
注意:数组一经创建,其长度(数组中包含元素的数目)是不可改变的,如果越界访问(即数组下标超过 0 至数组长度 -1 的范围),程序会报错。因此,当我们需要使用数组长度时,一般用如下的方式。
数组名.length;
例如,示例 1 的代码中,循环变量 i 小于数组长度,我们写成
i < scores.length;
而不是写成
i < 5;
如果定义的数组是基本数据类型的数组,即 int、double、char 和 boolean 类型,在 Java中定义数组之后,若没有指定初始值,则依数据类型的不同,会给数组元素赋一个默认值,如表 8-1 所示。
表 8-1 数组元素初始值
8.2.2 常见错误
数组是编程中常用的存储数据的结构,但在使用的过程中会出现一些错误,在这里进行归纳,希望能够引起大家的重视。
1.数组下标从0开始
常见错误1
package cn.jbit.array; public class ErrorDemo1 { public static void main(String[] args) { int[] scores = new int[]{90, 85, 65, 89, 87}; System.out.println("第3位同学的成绩应修改为92"); scores[3] = 92; System.out.println("修改后,5位同学的成绩是:"); for (int i = 0; i < scores.length; i++) { //通过 for 循环输出数组元素,即遍历数组 System.out.print(scores[i] + " "); } } }
程序运行结果如图 8.4 所示。
图 8.4 常见错误 1 的运行结果
由运行结果可以看到,第三位同学的成绩仍然是 65, 而第四位同学的成绩变成了92。分析原因,是第三位同学的成绩在数组中的下标是 2, 而不是 3 。
排错方法:将赋值语句改为 scores[2] = 92 。
这样再运行程序,就可以将第三位同学的成绩修改为 92 分。
2.数组访问越界
常见错误2
package cn.jbit.array; public class ErrorDemo2 { public static void main(String[] args){ int[] scores = new int[2]; scores[0] = 90; scores[1] = 85; scores[2] = 65; System.out.println(scores[2]); } }
运行程序,发现编译器报错,如图 8.5 所示。
图 8.5 常见错误 2 的运行结果
如图 8.5 中所示,控制台打印出了 "java.lang.ArraylndexOutOfBoundsException", 意思是数组下标超过范围,即数组越界,这是异常类型(关于异常将在后续课程中学习,这里可以简单理解为程序能捕获的错误)。 "ErrorDemo2.java:9" 指出了出错位置,这里是程序的第 9 行,即 scores[2] = 65;。
因为数组下标范围是 0〜数组长度-1, 所以上面的数组下标范围是 0〜1, 而程序中的下标出现了 2, 超出了该范围,造成数组访问越界,所以编译器报错。
排错方法:增加数组长度或删除超出数组下标范围的语句。
注意:数组下标从 0 开始,而不是从 1 开始。如果访问数组元素时指定的下标小于 0 ,或者大于等于数组的长度,都将出现数组下标越界异常。
8.2.3 技能训练
上机练习 1
指导——显示商品名称
训练要点
定义数组
初始化数组
需求说明
定义特价商品数组,存储五件商品名称,在控制台显示特价商品名称。
程序运行结果如图 8.6 所示。
图 8.6 上机练习 1 的运行结果
实现思路及关键代码
(1) 创建一个长度为 5 的 String 类型数组,存储商品名称。
(2) 使用循环输出商品名称。
参考解决方案
package cn.jbit.array; public class GoodsOutput { /** * 输出商品名称 */ public static void main(String[] args) { String[] goods = new String[]{"Nike背包","Adidas运动衫","李宁运动鞋","Kappa外套","361°腰包"}; System.out.println("本次活动特价商品有:"); for(int i = 0; i < goods.length; i++){ System.out.println(goods[i]); } } }
上机练习2
练习——购物金额结算
需求说明
某会员本月购物五次,输入五笔购物金额,以表格的形式输出这五笔购物金额及总金额。
程序运行结果如图 8.7 所示。
提示
参考实现步骤如下。
(1) 创建一个长度为 5 的 double 类型数组,存储购物金额。
(2) 循环输入五笔购物金额,并累加总金额。
(3) 利用循环输出五笔购物金额,最后输出总金额。
图 8.7 上机练习 2 的运行结果
参考代码示范
package cn.jbit.array; import java.util.Scanner; public class ShoppingList { /** * 购物金额结算 */ public static void main(String[] args) { double[] cashes = new double[5]; double sum = 0.0; //总金额 System.out.println("请输入会员本月的消费记录"); Scanner input = new Scanner(System.in); //循环输入金额 for(int i = 0; i < cashes.length; i++){ System.out.print("请输入第" +(i+1)+ "笔购物金额:"); cashes[i] = input.nextDouble(); sum = sum + cashes[i]; //累加总金额 } //循环输出每笔金额 System.out.println("\n序号\t\t金额(元)"); for(int i = 0; i < cashes.length; i++){ System.out.println((i+1) + "\t\t" + cashes[i]); } System.out.println("总金额\t\t" + sum); } }