1、按行优先顺序和按列优先顺序列出四维数组A[2][2][2][2]所有元素在内存中的存储次序。
解:该四维数组A的按行优先顺序在内存中的存储次序:
A[0][0][0][0],A[0][0][0][1],A[0][0][1][0],A[0][0][1][1],
A[0][1][0][0],A[0][1][0][1],A[0][1][1][0],A[0][1][1][1],
A[1][0][0][0],A[1][0][0][1],A[1][0][1][0],A[1][0][1][1],
A[1][1][0][0],A[1][1][0][1],A[1][1][1][0],A[1][1][1][1].
该四维数组A的按列优先顺序在内存中的存储顺序:
A[0][0][0][0],A[1][0][0][0],A[0][1][0][0],A[1][1][0][0],
A[0][0][0][1],A[1][0][1][0],A[0][1][1][0],A[1][1][1][0]
A[0][0][1][0],A[1][0][0][1],A[0][1][0][1],A[1][1][0][1],
A[0][0][1][1],A[1][0][1][1],A[0][1][1][1],A[1][1][1][1].
2、没定n维数组A[l1,u1][l2,u2]...[ln,un],假如A[l1][l2]...[ln]的存储地址是a,每个元素占用1个存储单元。求出A[i1][i2]...[in]的存储地址。
解:若整个数组采用按行优先存储,则A[i1][i2]...[in]的存储地址如下:
LOC(A[i1][i2]...[in])=a+(i1-1)*(u2-l2+1)*...*(un-ln+1)+
(i2-1)*(u3-l3+1)*...*(un-ln+1)+
.
.
(in-1)
若整个数组采用按列优先存储,则A[i1][i2]...[in]的存储地址如下:
LOC(A[i1][i2]...[in])=a+(in-1)*(un-ln+1)*...*(u2-l2+1)+
(in-1)*(un-ln+1)*...*(u3-l3+1)+
.
.
(i1-1)
3、对于二维数组A[m][n],其中m<=80,n<=80,先读入m和n,然后读该数组的全部元素,对如下三种情况分别编写相应函数:
1)求数组A靠边元素之和;
2)求从A[0][0]开始的互不相邻的各元素之和;
3)当m=n时,分别求两条对角线上的元素之和,否则打印出m!=n的信息。
解:
1)本小题是计算数组A的最外围的4条边的所有元素之和,先分别求出各边的元素之和,累加后减除4个角的重复相加的元素即为所求。
2)本小题的互不相邻是指上、下、左、右对角线均不相邻,即求第0,2,4,...的各行中第0,2,4...列的所有元素之和,函数中用i和j变量控制即可。
3)本小题中一条对角线是A[i][i],其中(0<=i<=m-1),另一条对角线是A[m-i-1,i],其中(0<=i<=m-1),因此用循环实现即可。实现本题功能的程序如下:
#include<stdio.h>
void proc1(matrix A) /*第 1)题解*/
{
int s=0,i,j;
for(i=0;i<m;i++) /*第一列*/
s=s+A[i][1];
for(i=0;i<m;i++) /*最后一列*/
s=s+A[i][n];
for(j=0;j<n;j++) /*第一行*/
s=s+A[1][j];
for(j=0;j<m;j++) /*最后一行*/
s=s+A[m][j];
s=s-A[0][0]-A[0][n-1]-A[m-1][0]-A[m-1][n-1]; /*减去4个角的重复元素值*/
printf("s=%d\n",s);
}
void proc2(matrix A) /*第2)题解*/
{
int s=0,i,j;
i=0;
while(i<m)
{
j=0;
while(j<n)
{
s=s+A[i][j];
j=j+2; /*跳过一列*/
}
i=i+2; /*跳过一行*/
}
printf("s=%d\n",s);
}
void proc3(matrix A) /*第三题解*/
{
int i,s;
if(m!=n) printf("m!=n");
else
{
s=0;
for(i=0;i<m;i++)
s=s+A[i][i]; /*求第一列对角线之和*/
for(i=0;i<n;i++)
s=s+A[n-i-1][i]; /*累加第二条对角线之和*/
printf("s=%d\n",s);
}
}
void main()
{
int m,n,i,j;
matrix A;
printf("m,n:");
scanf("%d %d",&m,&n);
printf("元素值:\n");
for(i=0;i<m;i++) /*建立数组*/
for(j=0;j<n;j++)
scanf("%d",&A[i][j]);
proc1(A); /*调用proc1()*/
proc2(A); /*调用proc2()*/
proc3(A); /*调用proc3()*/
}
4、有数组A[4][4],把1到16个整数分别按顺序放入A[0][0],...,A[0][3],A[1][0],...,A[1][3],A[2][0],...,A[2][3],A[3][0],...,A[3][3]中,编写一个函数获得数据并求出两条对角线元素的乘积。
解:
数组A[3][3]中一条对角线是A[i][i],其中(0<=i<=3),另一条对角线是A[3-i][i],其中(0<=i<=3),因此用循环扫描两条对角线中的每个元素,依次计算其乘乘积。因此,实现本题功能的函数如下:
void mmult()
{
matrix A;
int i,s;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
scanf("%d",A[i][j];
s=1;
for(i=0;i<4;i++)
s=s*A[i][i]; /*求第一条对角线之积*/
for(i=0;i<4;i++)
s=s*A[3-i][i]; /*累加第二条对角线之积*/
printf("两条对角线元素之积:%d\n",s);
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |