AI智能
改变未来

Java语言程序设计(十三)数组及乐透问题的解决

 在执行程序的过程中,经常需要存储大量数据,例如需要读取100个数,计算他们的平均值,然后找出有多少个数大于平均值,首先,程序需要读入这些书并计算他们的平均值,然后每个数与平均值及逆行比较判断它是否大于平均值,为了实现这样的功能,我们必须选择将这些数全部存储到变量中,必须声明100个变量,这时候我们需要一个方法,Java语言提供了一种称为数组(array)的数据结构,用它来存储一个元素个数固定且元素类型相同的有序集,在现在的这个例子中,可以将所有的100个数存储在一个数组中,通过一个一维数组变量访问它,解决方案如下:   

package analyzenumbers;

import java.util.Scanner;

/**
 *
 * @author john
 */
public class AnalyzeNumbers {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        final int NUMBER_OF_ELEMENTS=100;
        double[]numbers=new double[NUMBER_OF_ELEMENTS];
        double sum = 0;
        Scanner input = new Scanner(System.in);
        for(int i=0;i<NUMBER_OF_ELEMENTS;i++){
            System.out.println(\”Enter a number:\”);
            numbers[i]= input.nextDouble();
            sum = sum+numbers[i];
    }
        double average = sum/NUMBER_OF_ELEMENTS;
        int count = 0;
        for(int i =0;i<NUMBER_OF_ELEMENTS;i++)
        {
            if(numbers[i]>average)
                count++;
        }
        System.out.println(\”Average is\”+average);
        System.out.println(\”Number of elements above the average is\”+count);
    }
    
}

      我们这个程序创建了一个有100个元素的数组,并将这些数存储在数组中,将每个数加到sum中,并获得其平均值,之后将数组中的每个数和平均值进行比较。

      数组是用来存储数据的集合,但是我们通常将数组看作一个存储具有相同类型的变量集合,我们无须声明每个单个变量,只要声明一个数组变量,并用numeber[0],number[1]等等来表示单个变量。

      1.声明数组变量

      为了在程序中使用数组,必须声明一个引用数组的变量,并指明数组的元素类型,下面是声明数组变量的语法

      elementType[]arrayRefvar;

      elementType可以是任意数据类型,但是数组中所有的元素都必须具有相同的数据类型,arrayRefvar为引用的数据变量,例如 double[]mylist

     2.创建数组

      不同于基本数据类型变量的声明,声明一个数组变量并不在内存中给数组分配任何空间。它只是创建一个对数组引用的存储位置,如果变量不包含对数组的引用,那么这个变量的值为null,我们可以将声明一个数组变量,创建数组,将数组引用赋值变量合并在一起,例如:double[] mylist = new double[10],这句话生命了数组变量mylist,创建了一个由十个double型元素构成的数组,并将该数组的引用赋值给mylist,我们可以使用下面的语法对数组进行赋值,mylist[0]=5.6;

      3.数组大小

      当给数组分配空间时,必须通过指定该数组能够存储的元素个数来确定数组大小,创建数组后就不能再修改他的大小,我们可以使用arrayRefvar.length来求得数组大小,例如mylist.length为10.

      4.数组下标变量

      数组元素可以通过下标访问,数组下标是基于0的,也就是说,其范围是从0开始到arrayRefvar-1结束的,例如mylist包含10个double值,而下标从0到9,mylist[9]表示数组的最后一个元素

      5.数组初始化语法及处理数组

      Java有一个简洁的记法,可以直接声明,创建并初始化。例如 double[]mylist = {1.0,2.0,3.0,4.0},这种初始化雨打中不适用运算符new,使用数组初始化语法时,必须将声明变量,创建和初始化都放在一条语句中,分开会产生语法错误。

     当我们在处理数组元素时,经常会用到for循环:

      java.util.Scanner input = new java.util.Scanner(System.in);

      System.out.println(\”Enter\”+mylist.length+\”values:\”);

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

      mylist[i]=input.nextDouble();

      我们通过一个具体的例子来使用数组,我们选择乐透号码问题,假如我买了号码,希望它覆盖1到99的所有数字,我们输入数字,检查是否覆盖所有号码,最后一个数字以0结束。

      在写程序之前,我们要先想好算法,我们可以创建一个布尔元素构成的数组,初始状态是,每个元素都是false,当读取一个数时,它对应的元素设置为true。我们从键盘读取每个数字k,通过isCovered[k-1]设置为true将数字k设置为覆盖的,之后if每个isCovered[i]都为true,那么该筹码覆盖所有数字,否则没有覆盖,程序清单如下:

package lottonumbers;

import java.util.Scanner;

/**
 *
 * @author john
 */
public class LottoNumbers {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner input = new Scanner(System.in);
        boolean[]isCovered = new boolean[99];
        int number =input.nextInt();
        while(number!=0){
            isCovered[number-1]=true;
            number = input.nextInt();
        }
        boolean allCovered = true;
        for(int i=0;i<99;i++)
            if(isCovered[i]!=true){
                 allCovered=false;
                 break;
            }
               if (allCovered)
                   System.out.println(\”The tickets cover all numbers \”);
               else
                   System.out.println(\”The tickets not cover all numbers \”);
    }
    
}

     程序正确执行,解决问题。如果我们已经创建了一个名为LottoNumbers.txt的文本文件,该文件包括值以及末尾为0,可以下面的命令运行该程序:

      Java LottoNumbers < LottoNumbers.txt

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Java语言程序设计(十三)数组及乐透问题的解决