回 帖 发 新 帖 刷新版面

主题:[讨论]二维数组里面暗藏的相对二维数组的计算

我用C++编写了如下的一段程序:
#include<iostream.h>
void main()
{
    //声明变量
    int m4,i;
    double k;
    double a[12][10]={
        {2,2,2,2,2,2,2,2,2,2},
        {2,2,2,2,2,2,2,2,2,2},
        {3,3,3,3,3,3,3,3,3,3},
        {4,4,4,4,4,4,4,4,4,4},
        {1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1},
        {2,2,2,2,2,2,2,2,2,2},
        {5,5,5,5,5,5,5,5,5,5},
        {1,1,1,1,1,1,1,1,1,1},
        {0,0,0,0,0,0,0,0,0,0},
        {2,2,2,2,2,2,2,2,2,2},
        {1,1,1,1,1,1,1,1,1,1}
    };
    for (i=1;i<=11;i++)
    {k=a[0][0]*a[i+0][0];
          if (k==4)
          {
             cout<<"   a["<<i<<"][0]";
             cout<<"  i="<<i<<endl;
     }
}
}
程序运行一切正常,运行结果如下:
   a[1][0]  i=1
   a[6][0]  i=6
   a[10[0]   i=10
其中 a[1][0]表示 a[1][0]所在位置的元素的值与a[0][0]所在位置的元素的乘积为我预先给定的值k==4  i=1表示 a[1][0]所在位置的元素的行数。
同理 a[6][0]表示 a[6][0]所在位置的元素的值与a[0][0]所在位置的元素的乘积为我预先给定的值k==4  i=6 表示 a[6][0]所在位置的元素的行数。
现在我想请教大家一个问题:运行结果里面有一句话:a[6][0]  i=6。
如何将行数i=6变为i=0,相应的该元素的列的值就增加6,也就是行减少多少行,列数就增加多少列。相当于a[6][0]变为了a[0][6],但是a[10][0]
不是变为了a[0][10] ,而是变为了a[4][6],(也就是说,原先a[6][0]的行减少多少行,a[10][0]的行也减少多少行 ,a[6][0]的列 增加多少列  ,
a[10][0]的列 也增加多少列,他们的相对位置没有发生改变)再来计算变换后的两个位置a[0][6]和a[4][6]的乘积。请问,在原程序的基础上该怎
么修改?最好把修改后的原程序发上来,因为我学得不好,要好好学学,谢谢!!

回复列表 (共22个回复)

沙发

把自己想象成为一个CPU就容易理解数组了

板凳

我现在不理解你的代码到底要做什么
最清楚要做什么的只有你自己
所谓算法,就是把自己要做的事一步一步完整地写下来,然后转化成代数表达式,再转化成计算机表达式,最终通过具体编程语言实现的一个过程

3 楼


    我说的内容后,不明白我说的啥??我在这里再简明地说明一下,是这样的:
在一个二维数组里面,在它的第一列你随便取一个位置(比如我取[5][0])的数作为研究对象,假设我们给它定义它的新坐标是[0][5],那么它右边第一个数[5][1] 的新坐标是[0][6],它右边第二个数[5][2] 的新坐标是[0][7],它右边第三个数[5][3] 的新坐标是[0][8],依次类推;它[5][0]下面第一个数[6][0]的新坐标是[1][5],它[5][0]下面第二个数[7][0]的新坐标是[2][5],它[5][0]下面第三个数[8][0]的新坐标是[3][5]. 依次类推.然后在,新 坐标里面再来计算两个数(任意的数)乘积.就是这么会事.  
            
       
        {2,2,2,2,2,2,2,2,2,2},
        {3,3,3,3,3,3,3,3,3,3},
        {4,4,4,4,4,4,4,4,4,4},
        {1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1},
        {2,2,2,2,2,2,2,2,2,2},
        {5,5,5,5,5,5,5,5,5,5},
        {1,1,1,1,1,1,1,1,1,1},
        {0,0,0,0,0,0,0,0,0,0},
        {2,2,2,2,2,2,2,2,2,2},
        {1,1,1,1,1,1,1,1,1,1}

4 楼

因为不知道你这么做的意义,而且这么变幻之后你没说明下标是否不允许超界,所以我很迷茫

5 楼

假设列数是行数的2倍(如下数组),并且,下标在不超界的情况(超界就失去了做题的意义了)下来考虑问题.数组的内容可以自己随意编写.

        {2,2,2,2,2,2,2,2,2,2,2,2},
        {2,2,2,2,2,2,2,2,2,2,2,2},
        {3,3,3,3,3,3,3,3,3,3,3,3},
        {4,4,4,4,4,4,4,4,4,4,4,4},
        {1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1},
该怎么做呢??

6 楼

先把新坐标转成旧坐标再计算不就行了

7 楼

就是因为不好转换呀,现在我编写了如下一段代码:
  
#include<iostream.h>
int main()
{
    //声明变量
    int i,mix,m1;
    double k;
    double a[12][24]={
        {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
        {5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
        {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
        {5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
    };
    mix=11;
      for (i=1;i<=11;i++)
      {k=a[0][0]*a[i+0][0];
          if (k==4)
          {
             cout<<"   a["<<i<<"][0]";
             cout<<"  i="<<i<<endl;
            if (i<mix)
                mix=i;
          }
     }
     i=mix; 
    cout<<"mix= "<<mix<<endl;
    m1=a[0][0+i];
    cout<<"a["<<i<<"][0]"<<"转换后的为:"<<"a[0]["<<i<<"]"<<endl;
    cout<<"转换后的值 m1="<<m1<<endl;
}
这段代码可以自动地将满足条件的第一个坐标进行转换,并且将转换后的新坐标的值也保存下来了,也就是a[6][0]转换成了a[0][6],但是a[10][0]还没有转换成我所需要的a[4][6],暂时就编写到这里了.后面的我就不会了.

8 楼

主要就是你记录下那个i之后要对两个维度都进行关于i的处理

9 楼

都转换好了,所有满足条件的都转换好了,但是只有第一个转换好的值是存如变量里面的,后面的,还没有,也就是说,还不能对它们做进一步的处理(比如相加,相乘法),遗憾,代码如下:
#include<iostream.h>
int main()
{
    //声明变量
    int i,mix,m1;
    double k;
    double a[12][24]={
        {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
        {5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
        {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
        {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
        {1,1,1,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1},
        {4,4,4,4,41,1,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
        {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
        {5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0},
        {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
        {5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,1}
    };
    mix=11;
      for (i=1;i<=11;i++)
      {k=a[0][0]*a[i+0][0];
          if (k==10)
          {
             cout<<"   a["<<i<<"][0]";
             cout<<"  i="<<i<<endl;
            if (i<mix)
                mix=i;
          }
     }
    cout<<"mix= "<<mix<<endl;
    for (i=1;i<=11;i++)
      {k=a[0][0]*a[i+0][0];
          if (k==1)
          {
             cout<<"   a["<<i<<"][0]";
             cout<<"  i="<<i<<endl;
             cout<<"a["<<i<<"][0]"<<"转换后的为:"<<"a["<<i-mix<<"]["<<mix<<"]"<<endl;
             cout<<"转换后的值 m1="<<a[i-mix][mix]<<endl;
            }
     }
    m1=a[0][0+i];
}

10 楼

老实说,你的程序基于的数学依据我们没看懂,所以我们不知道该怎么给你建议。能不能把你要做的事尝试用较简单的数学语言描述一下

我来回复

您尚未登录,请登录后再回复。点此登录或注册