【答】数组变量与基本数据类型变量不同点在于,存储单元的分配方式不同,两个变量之间的赋值方式也不同。基本数据类型变量获得存储单元的方式是静态的,声明了变量后系统就为变量分配了存储单元,就可以对变量赋值。两个变量之间的赋值是值本身。
数组变量的引用赋值,数组变量保存的是数组的引用,即数组占用的一片连续存储空间的首地址及长度特性。当声明一个数字变量而未申请空间时,变量是未初始化的,没有地址及特性值。只有申请了存储空间,才能以下标表示数组元素。
16.求一组数中的最大值和最小值。
【答】程序如下:
public class Zuizhi {
public static void main(String[] args)
{ // TODO 自动生成方法存根 int array[]=new int[100]; for(int i=1;i<=30;++i)//初始化数组 array[i]=i; int max=array[1];//保存最大值 int min=array[1];//保存最小值 for(int j=2;j<=30;++j) { max=Math.max(max, array[j]); min=Math.min(min, array[j]); } System.out.println("该数组最大值为:"+max); System.out.println("该数组最小值为:"+min);
}
}
运行结果如下:
该数组最大值为:30
该数组最小值为:1
17.采用一维数组输出杨辉三角形。
程序如下:
public class Yanghui1
{ public static void main(String args[])
{ int n=10; //n表示行数
int[] table = new int[n+1];
table[0]=1; //每行第1个数都为1
for (int i=1;i<=n;i++) //控制输出n行
{ for (int j=0;j<i;j++)
System.out.print(" "+table[j]);
System.out.println();
for (int j=i;j>0;j--)
table[j]=table[j-1]+table[j];
} }}
18.输出下列方阵:
(1) 输出如下形式的数字方阵(当n=4时):
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
程序如下:
Public class Jmat
{ Public static void main(String args[]){}}
(2)输出如下形式的数字方阵(当n=4时):
1 2 5 10
4 3 6 11
9 8 7 12 16 15 14 13
〖解答〗采用二维数组的程序如下。
public class Jmat
{ public static void main(String args[])
{ int n=4;
int[][] mat = new int[n][n];
int k=1;
for (int i=0;i<n;i++)
{ for (int j=0;j<=i;j++)
mat[j][i] = k++;
for (int j=i-1;j>=0;j--)
mat[i][j] = k++;
}
for (int i=0;i<mat.length;i++)
//输出三角形的一维数组 生成下一行数据 //通式 //阶数 是自然数,递增变化 //k先赋值后自加 //输出二维数组元素 // //k
{ for (int j=0;j<mat[i].length;j++) //i、j是行、列下标
System.out.print(" "+mat[i][j]);
System.out.println(); } }}
19.找出一个二维数组的鞍点,即该位置的元素在该行上最大,在列上最小。也可能没有暗点。
〖命题〗一个二维数组如果有鞍点,那么它只有一个鞍点。
〖证明〗反证法。
设该二维数组已有一个鞍点,为M[i,j],则有
M[i,*] <= M[i,j] <= M[*,j]
即i行上的所有元素均小于j列上的所有元素。
假设有另一个鞍点M[x,y],由(1)式知 (1)
M[i,y] <= M[x,j] (2)
而M[x,y]应在该行上最大,有
M[x,y] >= M[x,j]
M[x,y]应在该列上最小,有
M[x,y] <= M[i,y]
根据(2)式,显然(3)和(4)式是不可能同时成立的。
因而假设有另一个鞍点M[x,y]是不成立的。由此证明。
〖解答〗采用二维数组的程序如下。
public class Dort
{ public static void main(String args[])
{ int[][] mat = {{1,2,3},{4,5,6},{7,8,9}};
for (int i=0;i<mat.length;i++) //输出二维数组元素 { for (int j=0;j<mat[i].length;j++) //i、j是行、列下标
System.out.print(" "+mat[i][j]);
System.out.println();
}
boolean find = false; //找到鞍点标记
int row=0; //第1行下标
int max=0; //记录当前行最大值的列下标 while (!find && row<mat.length)
{
max=0; //初始设每行第1列值最大 (3) (4) for (int j=1;j<mat[row].length;j++) //在row行上找最大值 if (mat[row][j]>mat[row][max]) //mat[row][max]为该行最大值 max = j;
boolean yes = true; //再判断mat[row][max]是否在列上最小
int j=0;
while (yes && j<mat.length)
{ if (j!=row && mat[j][max]<mat[row][max]) //在列上找到更小值,则不是鞍点 yes = false;
j++;
}
if (yes)
find = true;
else
row++;
}
if (find)
System.out.println("The dort: "+mat[row][max]);
else
System.out.println("The dort: null"); }
20.设一个一维数组的元素值为:7,4,8,9,1和5,请输出具有以下内容的方阵:
4 8 9 1 5
7 4 8 9 1
1 5 7 4 8 9
9 1 5 7 4 8
8 9 1 5 7 4
4 8 9 1 5 7
【答】程序如下:
public class Shift
{ public static void main(String args[])
{ int table[] = {7,4,8,9,1,5};
System.out.println("左移:");