网易云课堂java考试_网易云课堂JAVA学习笔记第五周

5.1.1 初始数组

new 是创建

package diwuzhou1;

import java.util.Scanner;

public class Diwuzhou1 {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner in = new Scanner(System. in);

int x;

double sum = 0;

int cnt = 0;

int [] numbers = new int[100];

x = in.nextInt();

while( x != -1)

{

numbers[ cnt] = x;

sum += x;

cnt++;

x = in.nextInt();

}

if( cnt > 0);

{

double average = sum/ cnt;

for( int i=0; i< cnt; i++)

{

if ( numbers[ i]> average)

{

System. out.println( numbers[ i]);

}

}

}

}

}

创建数组的代码

int [] numbers = new int[100]; 这里有个隐患,就是数组的元素不能超过100个。话说跟C比起来,这个创建好复杂

while( x != -1)表示对数组元素的初始化是以输入-1结束的

5.1.2创建数组

数组一旦创建,大小就不能改变(是一种容器)

数组中所有的元素都是一样的

定义数组变量

类型[]名字=new 类型[元素个数]

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

元素个数必须是整数,个数必须给出,且可以是变量

前边这个方框内是不能给数字的

与C相同,数组也是从0开始的,第一个元素是a[0]

下标又叫做索引

5.1.3数组的元素

100个数组的元素是下标是从0开始,到99.

编译器并不检查下标是否有效,运行的时候下标越界会是程序终止

数组元素的个数是可以由用户输入的,这个大小是程序运行的时候才知道,但是这个大小也是不能改变的

数组的固有成员,叫做length

比如一个100元素的数字,遍历的时候可以

for(i=0;i<100;++i)

sum += grade[i];

最好是:

for(i=0;i < grade.length;++i)

sum += grade[i];

grade是数组名

数组元素的初始化全部为0.与C一样

5.1.4 例子:投票统计

输入一些[0,9]内的整数,统计各个数字出现多少次

代码

int [] numbers = new int[10];

int x;

x = in.nextInt();

while(x != -1)

{

if (x>=0 && x<=9)

{

numbers[x]++;

}

x = in.nexrInt();

}

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

{

System.out.println(i+”:”+numbers[i]);

}

5.2.1数组变量

直接初始化数组

如int [] sorces = {1,2,55,87}

这跟new创建的数组是不一样的,new常见的数组默认是0

这种方法直接用大括号给出数组的所有元素的初始值,可以用length得到数组的大小,这是C中的数据不具备的。使用length具备可扩展性

JAVA是没有指针的,C中的数组本质上就是指针,所以两者的数组不同之处很多。

JAVA中数组变量和数组不是同一个东西,数组变量是管理者,不是数组本身。

如int [] a = new int [10];

a[0] = 5;

int[]b = a;

b[0]=16,则输出a[0]的结果将是16

这是因为现在b也是数组的管理者,与a一样都是管理者,它们都可以改变数组内的元素。

b也是这个数组的管理者,当然可以改变b[0]的值。可以说数组中的这个单元既叫做b[0],也叫做a[0]

数组管理者(数组变量)里边没有数据,只是管理某个地方的数组,不是所有者

new的意思是在某个地方制造一个别的东西给你

JAVA没有指针,用管理者的概念

tips

数组变量是数组的管理者而非数组本身

数组必须创建出来然后交给数组变量去管理(两者是分开的)

数组变量之间的赋值是管理权限的赋予

数组变量之间的比较是判断是否管理同一个数组(不是内容)

如int[] a= {1,2,3}

int[] b = a ,则a==b的结果为true

int[] b = {1,2,3}的话,a==b的结果就是false,虽然两者的内容一致,但是不是相同的管理权限,就认为a和b这两个数组变量不相同

复制数组:

只能使用遍历的方法这个拷贝(拷贝过来的仅仅是数组元素的值想等,不是管理权限想等。也就是即便for循环让b[i]=a[i]了,a==b的结果仍然是false)

如果判断两个数组是否想等,只能使用for循环,逐个判断对应元素的大小是否相等。每个对应的数组元素都相等,就认为是数组想等。虽然a==b的结果仍然是 false

5.2.2遍历数组

可以像C一样,使用三段式for循环来判断

for(i=0;i < data.length;i++)

if(x == data[i])…..

这个还可以知道某个数字在数组中的位置。

JAVA中还有个遍历的办法,for-each循环

格式是for (类型 变量:数组)

for(int k :data)

if (k==x)

{

found =true;

break;

}

对于data这个数组中的每一个元素,循环中的每一轮把它拿出来,作为k,所以每一轮,k是不断变化的。第一轮,k=data[1],第二轮k=data[2].这也是一种按轮把数组中的元素找出来的方法。与三段式的for相比,这样的效率还高一点。缺点是:

不能知道某个数字在第几位;

不能对数组中的数据进行修改(当然输出是可以的)

5.2.3 素数

循环改进的方案:

判断的时候可以不用判断偶数,从3到x-1,可以每次加2.

也可以值判断到根号下x, sqrt(x)

0818b9ca8b590ca3270a3433284dd417.png

还可以根据已经产生的素数决定下一个素数。

对于x,比它小的素数数量当然少于比它少的自然数。

package diwuzhou2;

public class Diwuzhouu2 {

public static void main(String[] args) {

// TODO Auto-generated method stub

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; //发现一个素数,写在以 cnt为下标的数组primes的

} //那一位去,同时 cnt++,也就是下一个运算操作的是primes数组的下一位

//cnt即表达有多少个素数,也表达下一位的素数应该放到数组的哪一位去(还好数组从0开始计数)

for ( int k : primes)

{

System. out.print( k+ " ");

}

System. out.println();

}

}

程序的一点解释:

primes是用来存放素数的数组。cnt是它的下标,同时也可以表示数组内有几个元素。这取决于primes[ cnt++] = x;这里的x是先使用,再自加。

如,cnt=3,则primes[3]=x,x的值放在数组第四位(primes[0]primes[1]primes[2]primes[3]),然后cnt自加,变成4.

另外,x%primes[i] == 0,判断x是否能被数组中的某个素数整除(余数为0)。可以整除,说明这个数不是素数,就结束本次MAIN_LOOP循环,也就是不会执行primes[ cnt++] = x;即不把这个数放在素数的数组中。

在这个循环中i是数组下标(不是cnt),则这个for循环不会按照自然数的递增来判断,只需要按照已有的素数是否能判断就行。这是因为小于x的素数的数量当然比自然数的数量小。x自加,连续递增的。

然后遍历输出 for ( int k : primes)

一种从素数的概念出发的思考方式:任何素数的倍数都不是素数。把所有素数的倍数都挑走。

可以构造一个布尔型,把已知素数的倍数,如2的2倍,3倍,n倍的数字都标记为false.然后开始标记3,5(4已经被标记为false)等等。

算法不一定要和人的想法一样

package diwuzhou3;

public class Diwuzhou3 {

public static void main(String[] args) {

// TODO Auto-generated method stub

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.print( i+ " ");

}

}

}

} 第一个循环,使所有数组的元素变为true.默认是false,但程序需要true。注意这个数组是boolean型的数组(C里边还真没见过),数组元素100个。当然最后输出的素数不是100个,而是100以内的素数。 第二个循环,先把2的倍数(小于100的)全标记为false。标记完了以后,用if ( isPrime[ i]),对下一个没被标记的数字,也就是紧接着是素数的那个数,3,开始进行倍数的标记false。 第三个循环,输出所有标记为true的数。注意这些数字不是放在数组中的,输出的不是数组元素,而是输出i,数组的下标

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值