1.数组的定义
数组是一种放东西的容器,特点有:
a.其中所有元素是相同的数据类型
b.数组创建后就不能改变大小了。
c.数组中的索引或下标是从0开始的。
注意:编译器不会检查到你使用了无效下标,但是运行时,程序可能会发生终止。
2.定义数组变量
<类型>[]<名字>= new <类型>[元素个数]
例如:int[] num=new int[50];
注:元素个数必须给出,也可以是一个确定值的变量;
例1:
输入一串数字,输出其大于平均值的数值以及这些数的和。
思路:
1.要将输入的数字先存储起来。2.算出平均值后,将每个数值与其比较,若大于平均值则输出。主要考察数组的使用。
package spoc;
import java.util.Scanner;
public class Array {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
double sum=0;
int j=0;
System.out.print("要输入的个数:");
int arr=in.nextInt();
if(arr>0)
{
int [] num=new int [arr];//创建数组
//int x=in.nextInt();
int[]sor={11,22,44,66,88};
while( j<arr)
{
int x=in.nextInt();
num[j++]=x;
sum+=x;
}
double av=sum/arr;
System.out.print("大于平均数的值有: ");
for(int i=0;i<num.length;i++)
{
if(num[i]>av)
System.out.print(num[i]+" ");
}
System.out.print("\n 平均值为:"+av+" ");
System.out.print("\n和为:"+sum+" ");
}
else
System.out.println("输入错误");
return ;
}
}
输出结果:
例2:投票统计
package spoc;
import java.util.Scanner;
public class vote {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int []num=new int [10];
int i=in.nextInt();
while(i>0&&i<9)
{ num[i]++;
i=in.nextInt();
}
//另一种方式
// while(i>0&&i<9)
// {
// switch(i)
// {
// case 1:num[1]++;break;
// case 2:num[2]++;break;
// case 3:num[3]++;break;
// case 4:num[4]++;break;
// case 5:num[5]++;break;
// case 6:num[6]++;break;
// case 7:num[7]++;break;
// case 8:num[8]++;break;
// case 9:num[9]++;break;
// default:break;
// }
//
// i=in.nextInt();
// }
for(int j=1;j<num.length;j++)
{if(num[j]!=0)
System.out.println("第"+j+"位票数为:"+num[j]);
}
System.out.println("未输出者票数为0");
}
}
输出结果:
例3:遍历数组
package spoc;
import java.util.Scanner;
public class through_arryy {
public static void main(String[] args) {
// 遍历数组
int [] num={1,2,5,16,5,12,13};
Scanner in =new Scanner(System.in);
int x=in.nextInt();
int flag=0;
boolean found=false;
for(int i=0;i<num.length;i++)
{
if(x==num[i])
{ flag=1;
System.out.println("num["+i+"]的值为"+num[i]);
}
}
// for(int k:num)
// { if(k==x)
// {
// found=true;//for-each语句不能修改数组值,只能输出
// }
// }
if(flag==0)
System.out.println("未查询到相同的值");
}
}
输出结果:
例4:高效率输出素数:
package spoc;
public class imp_prime1 {
public static void main(String[] args) {
int[] primes=new int[50];
primes[0]=2;
int cut=1;//素数表的下标
MAIN_LOOP:
for (int x=3;cut<primes.length;x++)//x为数值
{
for(int i=0;i<cut;i++)//表未满则循环
{
if(x%primes[i]==0)
continue MAIN_LOOP;
}
primes[cut++]=x;
}
for(int k:primes)
{
System.out.print(k+" ");
}
System.out.println();
}
}
结果输出:
思路:
a.创建一个存放素数的数组primes,把2放入primes[0];
b.设置一个变量x,让数值从3开始自加,加到素数数值满为止;
3.用当前x的值依次除以素数表当前存在的元素,若相除为0则x不为素数,则跳到最开头位置,让x++;
若x为素数,则执行primes[cut++]=x;将当前元素放入素数表,将数组下标加1,为放入下一位素数做准备。放入后x加一进行下一轮循环。
3.二维数组
例1:
题目描述:假如1获胜,代表有一行同为1或者一列,对角线,反对角线同为1,满足四种的任一种即获胜;
若出现0,1都满足条件了,则根据程序,看哪个先满足则哪方获胜。
实现代码:
package spoc;
import java.util.Scanner;
public class tic_tac_toe {
public static void main(String[] args) {
// 二维数组
// int [][]g=new int[3][5];
// int [][]g={
// {1,2,3,4,5},//里面的{}为行,行与行之间用逗号分开
// {2,3,4,5}//即使有4个元素,但也为四列
// };//如果省略补零
Scanner in=new Scanner(System.in);
int SIZE=3;
boolean result1=false;
int [][]a=new int [SIZE][SIZE];
int numsO=0;
int numsX=0;
for(int i=0;i<a.length;i++) //表示矩阵有多少行
{
for(int j=0;j<a[i].length;j++) //表示矩阵第i行有多少列
{
a[i][j]=in.nextInt();
}
}
for(int i=0;i<a.length;i++)//输出矩阵
{
for(int j=0;j<a[i].length;j++)
{
System.out.print(a[i][j]+" ");
}
System.out.println();
}
//检查行
for (int i=0;i<SIZE;i++)
{
numsO=0;
numsX=0;
for (int j=0;j<SIZE;j++)
{
if(a[i][j]==1)
numsX++;
else
numsO++;
}
if(numsO==SIZE||numsX==SIZE)
{
result1=true;
}
}
//检查列
if(!result1)
{
for (int i=0;i<SIZE;i++)
{
numsO=0;
numsX=0;
for (int j=0;j<SIZE;j++)
{
if(a[j][i]==1)
numsX++;
else
numsO++;
}
if(numsO==SIZE||numsX==SIZE)
{
result1=true;
}
}
}
//判断对角
if(!result1)
{
numsO=0;
numsX=0;
for(int i=0;i<SIZE;i++)
{
if(a[i][i]==1)
numsX++;
else
numsO++;
if(numsO==SIZE||numsX==SIZE)
{
result1=true;
}
}
}
//判断反对角
if(!result1)
{numsO=0;
numsX=0;
for (int i=0;i<SIZE;i++)
{
numsO=0;
numsX=0;
if(a[i][SIZE-1-i]==1)
numsX++;
else
numsO++;
}
if(numsO==SIZE||numsX==SIZE)
{
result1=true;
}
}
if(result1)
{
if(numsO==SIZE)
System.out.println("O win");
else
System.out.println("X win" );
}
else
System.out.println("无人获胜");
}
}
运行结果:
思路:
1.设置三个变量 numsO代表0的个数; numsX为1的个数;布尔值result1,代表是否满足条件;
2.判断行,一行是否全为1或0,若出现某列成立则将result1变量赋为真,则不再进行以下判断
3.若未满足条件时,继续判断行。行与列相似都需要两层循环,若满足,则不再判断
4.若未满足条件,再依次判断对角线,反对角线。这两个只需一层循环即可判断。