第五周 数组

5.1 数组


5.1.1 初识数组


5.1.2 创建数组

定义数组变量:

  • <类型>[] <名字>= new <类型>[元素个数];

  • int[] grades = new int[100];

  • double[] averages = new double[20];

  • 元素个数必须是整数

  • 元素个数必须给出

  • 元素个数可以是变量


5.1.3 数组的元素

有效的下标

  • 最小的下标是0,最大的下标是数组的元素个数-1
  • 可是编译器不会检查看你是否用了有效的下标
  • 但是如果运行的时候出现了无效的下标
  • 但是如果运行的时候出现了无效的下标,可能会导致程序终止

length:

  • 每个数组有一个内部成员length,会告诉你它的元素的数量
  • 这样的程序具有可扩展性
	for  ( i = 0; i < 100; ++i )
		sum += grade[i];
	最好是:
	for ( i = 0; i < grade.length; ++i )
		sum += grade[i];

5.1.4 数组变量

直接初始化数组:

  • new创建的数组会得到默认的0值
  • int [] scores = {87,98,69,54,65,76,87,99}
  • 直接用大括号给出数组的所有元素的初始值
  • 不需要给出数组的大小,编译器替你数数
  • 如何得到数组的大小?length!
	Scanner in = new Scanner(System.in);
	int [] scores = {87,98,69,54,65,76,87,99};//这样如果需要再加减数组内的元素,就很方便
	System.out.println(scores.length);
	for ( int i = 0; i < scores.length; i++)
	{
		System.out.print(scores[i]+" ");
	}

Java的核心问题:

	Scanner in = new Scanner(System.in);
	int[] a = new int [10];
	a[0] = 5;
	int[] b = a;
	b[0] = 16;
	System.out.println(a[0]);

下图手写笔记是对上面代码块的解释

数组变量:

  • 数组变量是数组的管理者而非数组本身
  • 数组必须创建出来然后交给数组变量来管理
  • 数组变量之间的赋值是管理权限的赋予
  • 数组变量之间的比较是判断是否管理同一个数组

复制数组:

  • 必须遍历源数组将每个元素逐一拷贝给目的数组
	int [] a = {1,2,3,4,5};
	int [] b = new int [a.length];
	for ( int i = 0; i < b.length; i++ )
		b[i] = a[i];

5.2 数组计算


5.2.1投票统计

  • 写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一次数字出现的次数,输入-1表示结束
		int [] numbers = new int[10];
		int x;
		x = in.nextInt();
		while ( x != -1)
		{
			if ( x >= 0 && x <= 9)
			{
				numbers[x]++;
			}
			x = in.nextInt();
		}
		for ( int i = 0; i < numbers.length; i ++ )
		{
			System.out.println(i+":"+numbers[i]);
		}

5.2.2 遍历数组

搜索

  • 在一组给定的数据中,如何找出某个数据是否存在?
		//普通循环
		int [] data = {2,3,5,7,4,9,11,34,12,28};
		int x = in.nextInt();
		int loc = -1;
		for ( int i = 0; i < data.length; i ++)
		{
			if ( x == data[i])
			{
				loc = i;
				break;
			}
		}
		if ( loc > -1 )
		{
			System.out.println(x+"是第"+(loc+1)+"个");
		}
		else
		{
			System.out.println(x+"不在其中");
		}

遍历数组

  • 通常都是使用for 循环,让循环变量i从0到<数组的length,这样循环体内最大的i正好是数组最大的有效下标
  • 常见的错误是:
    • 循环结束条件是<=数组长度
    • 离开循环后,继续用i的值做数组元素的下标

for-each 循环

	for ( <类型> <变量> : <数组> ){
		...
	}
		//for each 循环
		int [] data = {2,3,5,7,4,9,11,34,12,28};
		int x = in.nextInt();
		boolean found = fales;
		for ( int k : data )
		{
			if ( x == k )
			{
				found = true;
				break;
			}
		}
		if ( found )
		{
			System.out.println(x+"在其中");
		}
		else
		{
			System.out.println(x+"不在其中");
		}

5.2.3数组的例子:素数

判断是否能被已知的且<x的素数整除

  • 构造前50个素数的表
int [] primes = new int [50];
  		primes[0] = 2;
  		int cnt = 1;
  		MAIN_LOOP:
  			for ( int x = 3; cnt < primes.length; x++ )
  			{
  				for ( int i = 0; i < cnt; i++ )
  				{
  					if ( x % primes [i] == 0)
  					{
  						continue MAIN_LOOP;
  					}
  				}
  				primes[cnt++] = x;
  			}
  		for ( int k : primes )
  		{
  			System.out.println(k+"");
  		}
  		System.out.println();

构造素数表

  • 欲构造n以内的素数表
  1. 令x为2
  2. 将2x、3x、4x直至ax<n的数标记为非素数
  3. 令x为下一个没有标记为非素数的数,重复2;直到所有的数都已经尝试完毕
  • 欲构造n以内(不含)的素数表
  1. 创建prime为boolean[n],初始化其所有元素为true,prime[x]为true表示为x是素数
  2. 令x=2
  3. 如果x是素数,则对于(i=2;xi<n;i++)令prime[ix]=false
  4. 令x++,如果x<n,重复3,否则结束
		boolean [] isPrime = new boolean[100];
  		for ( int i = 2; i < isPrime.length; i++ )
  		{
  			isPrime[i] = true;
  		}
  		for ( int i = 2; i < isPrime.length; i++ )
  		{
  			if ( isPrime[i] )
  			{
  				for( int k = 2; i*k < isPrime.length; k++ )
  				{
  					isPrime[i*k] = false;
  				}
  			}
  		}
  		for ( int i = 0; i < isPrime.length; i++ )
  		{
  			if ( isPrime[i] )
  			{
  				System.out.println(i+" ");
  			}
  		}
  		System.out.println();

5.3 二维数组


5.3.1 二维数组

二维数组

  • int [][] a = new int [3][5];
  • 通常可以理解为a是一个3行5列的矩阵

二维数组的遍历

for ( i = 0; i < 3; i++ ){
	for ( j = 0; j < 5; j++){
		a[i][j] = i*j;
	}
}
  • a[i][j]是一个int
  • 表示第i行第j列上得到单元
  • a[i,j]并不存在

二维数组的初始化

int [][] a = {
	{1,2,3,4},
	{1,2,3},
};
  • 编译器来数数
  • 每行一个{}。逗号分隔
  • 最后的逗号可以存在,有古老的传统
  • 如果省略,表示补零

井字棋游戏

  • 读入一个3X3的矩阵,矩阵中的数字为1表示该位置上有一个X,为0表示为O
  • 程序判断这个矩阵中是否有获胜的一方,输出表示获胜的一方的字符X或O,或输出无人获胜
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值