论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

数据结构题集--数组(二维数组-1)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:45:44

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);
}

上一篇:{应用}数据结构题集--数组(二维数组) 人气:5370
下一篇:{应用}N皇后问题 人气:6488
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058