Java 快速入门练习

2019-04-16 20:59

第5章 实验 – 数组

5.1实验目标

(1) 理解在Java中如何声明、分配和使用(多维)数组 (2) 学习数组排序和查找的基本算法

(3) 了解JAVA Reflection API 和其他常用类

5.2实验说明

本章实验教程将介绍数组(array)的使用,学习Java数组相关的类Array和Arrays。简单介绍Java反射(Reflection)的用法。

以下的实验包括4种类型, 每种类型都用括号里面的字母表示: D - 例程, 表示这是一个例子, 要求练习者阅读指南和代码; I - 交互式练习, 练习者完成实验指定的简单任务,如修改部分代码, 观察程序运行时的变化等; W - 热身练习, 练习者的编程工作量逐渐加大。

P - 完整编程 ,要求练习者根据要求,完成完整的JAVA程序。

5.3实验准备

从本实验教程光盘中拷贝Lab05文件目录到本地磁盘, 如D: 盘。Lab05文件目录中将包含本次实验所需的所有资料。 Lab05的相关资料也可以从本实验教程的网站下载:http://javaLab/lab05.zip 将Lab04中的MathUtility.java(程序清单4-6)程序拷贝到Lab05目录下。

5.4实验任务

实验5.4.1: (D)数组的基本概念

Java变量(variable)可以存储程序的数据,每个变量有标识、类型和作用域。使用同种类型和作用域的多个数据时,我们通常把这些数据存放在一个数据结构而不是单个的变量中。最常见的数据结构是数组(array)。一个数组中能够存储的数据个数是固定的,并且存放的数据类型相同。尽管数组是一个对象,但是数组的用法与基本数据类型相似。

图5.1可以帮助我们理解数组的结构。

1

图5.1 长度为8的数组

这是一个有8个元素的数组,数组中的每个元素有各自的值。图中每个元素上方的数字表明了元素的索引(index)。数组中的元素总是使用索引引用的。第一个元素的索引总是为0。重复,第一个元素的索引总是为0,而最后一个元素的索引总是“数组长度-1”。上图的数组中,最后一个元素的索引是 8-1 = 7。

我们可以创建任何数据类型的数组。下面来看一个整型数组的例子。

编译并运行ExamScoresl.java,输入0到100之间的一组整数为命令行参数。假设输入的这组整数就是考试成绩,这个程序将显示原始成绩和调整后的成绩。成绩调整的规则是:将最高成绩上调到100分,计算调整的幅度,再根据幅度相应调整其他成绩。

程序清单5-1:ExamScores1.java

// Given a sequence of exam scores as // command-line arguments, displays table // of exam scores and curved scores.

public class ExamScores1 {

public static void main(String[] commandLineArgs) {

if ( commandLineArgs.length == 0 ) {

System.out.print(\ System.out.println(\ System.out.print(\ System.out.println(\ System.out.println(\ System.exit(0);

} // if no command-line arguments

// Named constant for width of displayed columns: final int columnWidth = 5;

// Named constant for the number of scores:

final int numberOfScores = commandLineArgs.length;

// Declare reference to array // which will store exam scores: int[] scores;

// Instantiate (create) the array itself,

2

// i.e. allocate space to store the exam scores: scores = new int[numberOfScores];

// Read scores into array and determine maximum: int maximumScore = 0;

for ( int i = 0; i < scores.length; i++ ) {

scores[i] = Integer.parseInt(commandLineArgs[i]);

maximumScore = Math.max(maximumScore, scores[i]); } // for i

// Determine how many points to curve up all scores: int curveUp = 100 - maximumScore;

// Output table of original scores and curved scores for ( int i = 0; i < scores.length; i++ ) {

// Print original score in a right-justified column: String scoreText = Integer.toString(scores[i]);

for ( int j = scoreText.length(); j < columnWidth; j++ ) System.out.print(\ System.out.print(scoreText);

// Calculate curved score;

int curvedScore = scores[i] + curveUp;

// Print curved score in a right-justified column;

String curvedScoreText = Integer.toString(curvedScore);

for ( int k = curvedScoreText.length(); k < columnWidth; k++ ) System.out.print(\

System.out.println(curvedScoreText); } // for i

} // method main(String[]) } // class ExamScores1

大家可能已经发现,ExamScoresl.java源代码中main方法的命令行参数数组的名字与惯常不同,这里使用了commandLineArgs。其实使用什么名字作为命令行参数的数组名并没有关系,只要这个名字在整个main方法中保持一致就行。在一个具体的程序中,我们通常把命令行参数数组取名为args,把命令行参数个数的变量取名为argv,命令行参数数组是一个字符串数组。

ExamScoresl.java程序中需要跟踪所有的成绩,因此将考试成绩存放在一个int型数组中。创建数组的三个步骤是:(1)声明一个数组引用变量;(2)实例化(创建)数组本身,也就是为数组分配内存空间;(3)初始化数组中的每个变量。

1. 数组的声明

3

数组变量的声明和其他Java变量的声明类似,声明数组的语法模板: DataType ArrayName [ConstIntExpression]; 或

DataType [ConstIntExpression] ArrayName;

DataType是数据类型,即数组中元素的数据类型;ArrayName是合法的变量;[ ]符号中的ConsIntExpression指明数组的大小,即数组中元素的个数。

程序ExamScoresl.java中,声明int数组变量: int [] scores;

另外一种声明数组的方式: int scores[];

这两种数组声明方式在语法上都是正确的,都能被编译器接受。编者个人喜欢第一种(int[] scores)声明方式,因为它更清晰地说明了数组变量的名字是scores,而不是scores[];scores被声明为一个指向整型数组的指针。然而,更普遍使用的是第二种方式,尤其在Java官方文档中更为明显,因为这种方式与C++中的声明方式比较接近。

2. 实例化数组

实例化scores数组的语句如下: scores = new int[numberOfScores];

实例化数组,即为数组元素分配内存空间,是通过new操作符实现的。new操作符后是数据类型以及元素个数。元素个数放在[]运算符中。下面是一些例子:

counts = new int[5];

names = new String[100];

3. 数组元素的初始化

将scores数组中的元素在循环中初始化的语句如下: for ( int i = 0; i < scores.length; i++ ) { scores[i] = Integer.parseInt(commandLineArgs[i]);

scores.length是数组元素的个数,就象commandLineArgs.length是数组commandLineArgs的元素个数一样。数组元素的范围从0到length - 1。

4. 数组声明、实例化和初始化的更多解释

声明和实例化数组的常见形式如下例所示: int[] scores;

scores = new int[numberOfScores];

声明和实例化数组可以合并成一个语句: int[] scores = new int[numberOfScores];

还可以定义初始化列表(Initializer List)来初始化数组元素: int[] numbers = {4, 3, 2, 1};

String[] name = {\

数组的长度是由{}中的元素个数隐含定义的,numbers数组的长度为4,name数组的长度为3。当

4

数组的声明和创建分开时,仍然可以使用初始化列表,只是这种方式不太简练:

int[] numbers;

numbers = new int[]{4, 3, 2, 1};

再次强调一下,数组变量是一个内存位置的名字,这个内存位置存储的不是数组本身,而是数组在内存中存放的地址。因此,数组变量存放了一个指向数组的指针。当数组变量第一次声明时,它并没有真正指向一个数组。数组声明只是开辟一个存放指针的空间。之后,当使用关键字new实例化数组并将其指定给一个数组变量时,该数组变量就存放了一个指向数组的指针。

范例5-1程序的顶端有这样一个声明: final int columnWidth = 5;

这个声明看上去象一个变量的声明,不同的是在最前面有一个关键字final。关键字final意味着columnWidth被声明为一个常量。常量的值在第一次初始化之后就不能改变。

为什么要费心去定义常量,而不在代码中直接使用常量的值呢?原因在于方便程序员修改程序,程序员只需查看代码顶端并修改常量的值,而不需要修改该常量的值出现的每行代码。

实验5.4.2: (I)访问数组元素

引用数组中的元素,使用 [ ] 操作符。范例5-1中,访问scores数组元素: int score = scores[0]; // 得到第一个元素 int score = scores[3]; // 得到第四个元素

[ ]中的索引可以是整数,或者整型变量。索引的取值范围在0到数组元素个数-1之间。数组变量与数组中索引变量的区别在于,数组变量代表整个数组,数组中的索引变量代表了数组中的元素在数组中的位置。

通常我们会使用for循环语句来操作数组元素,见范例5-2。

程序清单5-2:AccessArrayWithForLoop.java

public class AccessArrayWithForLoop { public static void main(String[] args) { String[] months = { \ \ int[] sizes = {31,28,31,30,31,30,31,31,30,31,30,31}; for(int i = 0; i < months.length; i++ ) { System.out.println(months[i] + \ } } }

注意for循环中的变量i,i的取值在0到months.length-1之间。试着把源代码 for(int i = 0; i < months.length; i++ ) 改成:

for(int i = 0; i < = months.length; i++ ) 重新编译、运行程序。回答下面的问题:

5


Java 快速入门练习.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:放下比拿起难VS拿起比放下难【黄执中、熊浩】拙笔复盘

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: