xx[12]={0,0,0,0,1,1,1,0,1,1,1,0}//double型
yy[12]={0,0,0,0,1,1,1,0,1,1,1,0}
for(i=0;i<4;i++)
{
  for(j=0;j<2;j++)
  {
  y[j]=xx[j];
  printf("\nthis is y=%lf\n",y[j]);  }
  for(j=0;j<1;j++){
  d[j]=yy[j];
  printf("\nthis is d=%lf\n",d[j]);
  }
}想实现每次i循环,xx[],yy[]就把xx[0]-xx[j],yy[0]-yy[j]的值放到最后边,并且后面的数前移。也就是是说xx[],yy[]数组是时刻循环的。例如
以xx[]为例:
xx[0],xx[1],xx[2],xx[3],xx[4],xx[5],xx[6].....xx[11]
第一次循环后得到如下新数组
xx[2],xx[3],xx[4],xx[5],xx[6].....xx[11],xx[0],xx[1]请问怎样实现,谢谢
我c程序不懂。基本想法是这样的

解决方案 »

  1.   

    double dTemp;
    for(int i = 0; i < n; i++)  //move n 
    {
       dTemp = xx[0];
       for(int j = 1; j < 12; j++)
          xx[j-1] = xx[j];
       xx[j] = dTemp;
    }
      

  2.   

    那,如果xx[]数组不是定长的怎么处理?c语言里有没有获得数组长度、判断是否为空的函数?
      

  3.   

    楼上的只移了一位,他说要移两位到后面去
    double dTemp1 = 0;
    double dTemp2 = 0;dTemp1 = xx[0];
    dTemp2 = xx[1];for(int i=2; i < 12-2; i+2)
    {
      xx[i-2] = xx[i];
      xx[i-1] = xx[i+1]; 
    }
    xx[10] = dTemp1;
    xx[11] = dTemp2;
      

  4.   

    1。C中变长的数组不能声明,只能声明数组类型的指针,然后动态申请内存。
    2。C中定长数组的长度可以获得,但是对你没用。
    3。在使用指针时,判断该指针为空可以采用 p==NULL来判断
    4。C中不能直接判断你是否使用了数组中的某一位,除非你自己加以记载或标记
    就  实现每次i循环,xx[],yy[]就把xx[0]-xx[j],yy[0]-yy[j]的值放到最后边,并且后面的数前移。也就是是说xx[],yy[]数组是时刻循环的代码如下:
    A)xx yy数组长度固定 或者你开辟足够大的数组空间
    long xx[1024],yy[1024],l_tmp,l_tmpindex;
    long xx_len ,yy_len;
    int i,j ;
    ..........
    ............
    xx_len = 10 ;
    yy_len = 20 ;for( i = 0 ; i < 5 ; i ++)
    {
    for( j = 0 ;j < 2 ; j ++)
    {
    if ( j >= xx_len ) break ;
    l_tmp = xx[0];
    for( l_tmpindex = 1 ; l_tmpindex < xx_len ; l_tmpindex ++ )
    xx[l_tmpindex-1] = xx[l_tmpindex];
    xx[l_tmpindex] = l_tmp ;
    } for( j = 0 ;j < 2 ; j ++)
    {
    if ( j >= yy_len ) break ;
    l_tmp = yy[0];
    for( l_tmpindex = 1 ; l_tmpindex < yy_len ; l_tmpindex ++ )
    yy[l_tmpindex-1] = yy[l_tmpindex];
    yy[l_tmpindex] = l_tmp ;
    }}
      

  5.   

    谢谢各位,问题已解决。我的代码:
    for(j = 0; j < 2j++)  //move n 
    {
    dTemp = xx[j];
    for(k = 1; k < 12; k++)
    { xx[k-1] = xx[k];}
    xx[k] = dTemp;
    }
      

  6.   

    你的代码有问题!是否应该按照我的解决方式?
    区别在于 你使用了
    dTemp = xx[j];
    此处应该写为 dTemp=xx[0];!!!!!!!!!!!!!!!
      

  7.   

    to  xiaofengxu(徐小锋)
    哦,我写错了,实际程序是
    for(j = 0; j < n[layernum-1]; j++)  //move n 
    {
    //dTemp = xx[j];
      for(k = 1; k < 12; k++)
      { xx[k-1] = xx[k];}
       xx[k] = dTemp;//这个地方对不对?
    }
      

  8.   

    什么 不能循环?
    你的代码应该如下:
    for(j = 0; j < n[layernum-1]; j++)  //move n 
    {
      dTemp = xx[0];  //此处保存第一个值,此处必须有,因为每次循环后xx[0]的值是变化的!!
      for(k = 1; k < 12; k++)
      { xx[k-1] = xx[k];}  //此处将后面的值移到前面,对的
       xx[k] = dTemp;//这个地方对不对?  队的
    }
      

  9.   

    给你一个快速平移的函数把:void movdata(long *XX,long dLength,long dMoveNum)
    {
    long *pTmp ;
    long lIndex , lMaxLen ;


    if (NULL == XX) return ;
    if( dLength <= 0 || dMoveNum <= 0 ) return ;
    while( dMoveNum > dLength ) dMoveNum -= dLength ;

    //下面采用内存方式快速平移
    pTmp = malloc(dLength * sizeof(long));

    memcpy(pTmp , (unsigned char*)XX + dMoveNum*sizeof(long) , (dLength-dMoveNum)*sizeof(long) );
    memcpy((unsigned char *)pTmp + (dLength-dMoveNum)*sizeof(long) , XX , dMoveNum*sizeof(long) );
    memcpy(XX,pTmp,dLength);
    }
    此时XX的数量,有效的长度都可以通过参数传入,你的代码中dMoveNum = 2 dLength=12