zhyin 发表于 2016-4-27 13:32:35

循环数组右移

题目:输入9个数存入一长度为9的数组中,然后输入正整数m,使得数组元素循环右移m位,移出的元素再从左端移入
#include <stdio.h>
int main ()
{
        int i, m, j, t, str;
        printf ("数组元素循环右移位数为: ");
        scanf ("%d",&m);
        printf ("please input 9 numbers :\n");
        for (i = 0; i <= 8 ; i++)
                scanf (" %d ",&str);
        for (j = 1; j <= m; j++)
                for (i = 7; i >= 0; i--)
                {
                        t = str;
                        str = str;
                        str = t;
                }
                for (i = 0; i <= 8; i++)
                        printf("%d",str);
                return 0;
               
}
这是我打的代码,不知道怎么的就是弄不出正确结果,而且一开始输入9个数,可我这个却输入10个数,但我觉得这个for (i = 0; i <= 8 ; i++)没错啊??

zhyin 发表于 2016-4-27 19:45:29

我弄出来了,谢谢你们的指点
#include <stdio.h>
int main ()
{
        int i, m, j, t, str;
        printf ("数组元素循环右移位数为: ");
        scanf ("%d",&m);
        printf ("please input 9 numbers :\n");
        for (i = 0; i < 9; i++)
                scanf ("%d",&str);
       
        for (j = 1; j <= m; j++)
        {
                t = str;
                for (i = 7; i >= 0; i--)
                {   
                        str = str;
                }
      str = t;
        }
               
                for (i = 0; i < 9; i++)
                {
                        printf (" ");
                        printf ("%d",str);
                }
                printf ("\n");
        return 0;
}

LeoChou 发表于 2016-4-27 14:13:02

输入的问题是因为你在%d前后加了多余的空格;结果不正确是因为str还没后移值就被覆盖改了。str=t;应该在内层for循环的外面,等所有元素都后移一位再将最后一个元素赋值给第一个元素。

haomingzi 发表于 2016-4-27 14:18:12

先不说方法对错,这句话: for (j = 1; j <= m; j++)的循环体是谁?

zhyin 发表于 2016-4-27 19:17:34

haomingzi 发表于 2016-4-27 14:18
先不说方法对错,这句话: for (j = 1; j

是后面那个for语句{:10_269:}

zhyin 发表于 2016-4-27 19:18:12

LeoChou 发表于 2016-4-27 14:13
输入的问题是因为你在%d前后加了多余的空格;结果不正确是因为str还没后移值就被覆盖改了。str=t;应 ...

是哦,我都没考虑到这个

zhyin 发表于 2016-4-27 19:29:39

我现在改成这样
#include <stdio.h>
int main ()
{
        int i, m, j, t, str;
        printf ("数组元素循环右移位数为: ");
        scanf ("%d",&m);
        printf ("please input 9 numbers :\n");
        for (i = 0; i < 9; i++)
                scanf ("%d",&str);
        t = str;
        for (j = 1; j <= m; j++)
        {
                for (i = 7; i >= 0; i--)
                {
                        str = str;
                }
        }
                str = t;
                for (i = 0; i < 9; i++)
                        printf("%d",str);
                printf ("\t");
        return 0;
}
但最后结果是 911234567{:10_285:}

zhyin 发表于 2016-4-27 19:35:09

如果输入m=1结果就正确,可是m=2就错了

mingcxx 发表于 2016-4-27 20:06:11

本帖最后由 mingcxx 于 2016-4-27 20:08 编辑

内层for执行完,每个元素覆盖下一个。执行完后,最后一个元素被覆盖消失,所以for之前临时保存最后一个元素,for之后把它写到首元素,完成数组每个元素向后移动一位:
t = str;
for (i = 7; i >= 0; i--)
{
        str = str;
}
str = t;
向后移动m位怎么办呢?外层再套一个for,再执行m-1次内层for:
for (j = 1; j <= m; j++)
{
        t = str;
        for (i = 7; i >= 0; i--)
        {
                str = str;
        }
        str = t;
}

zxc123qwe 发表于 2016-4-28 20:51:27

本帖最后由 zxc123qwe 于 2016-4-29 11:07 编辑

zhyin 发表于 2016-4-27 19:35
如果输入m=1结果就正确,可是m=2就错了
觉得你先定义两个数组,一个作要输入的数据,一个作保护数据

看了之后又写了个代码;写的不好,主要是想探讨学习一下,那种能一键复制代码的,我不会,还望见谅,如果你会,可以留言教我一下。谢谢!

/*这个程序基本能用,输入部分我给标注掉了,可以自己加上,
大致思想是定义两个一样的数组,一个输入,一个作保护数组数据,
算法上的思想是未覆盖的作一组处理,被覆盖的用引用的数组加以赋值还原,
在偏移量上负数不纳入判定范围,偏移量>=9时,就是偏移量0-8的循环,程序没写出。
还有很多要修正的毛病可以改改,帮我完善一下*/
#include <stdio.h>
int main ()
{
int i, m, j = 0, t, str={1,2,3,4,5,6,7,8,9},a={1,2,3,4,5,6,7,8,9};
#if(0)printf ("??????哈哈哈?????: ");
      printf("请输入9个数:");
      
      for (i = 0; i < 9; i++)
{ str=a;
   scanf ("%d",&str);
}
#endif
printf("输入偏移量:");//这里偏移量范围是(0-9)
scanf("%d",&m);
      for (i = 0;i < m;i++)
      {
   if(i+m< 9)
   {   
   
    str = str;
   }
   else
   {
    str=str;
   }
      }
for(i=m;i<9;i++,j++)
{
   if(i+m<9)
   {
    str=a;
   }
   else
   {
    str=a;
   }
}
         
      for (i = 0,j=0; i < 9,j<9;j++, i++)
{
   printf("%d",str);
            printf ("\t");
}
      return 0;
}

桃花飞舞 发表于 2016-5-2 23:43:36

虽然我说不明白为什么,看了楼主的代码后我改了下就像楼主置顶的代码那样,是可以达到题目要求的。

zhyin 发表于 2016-5-4 11:38:12

桃花飞舞 发表于 2016-5-2 23:43
虽然我说不明白为什么,看了楼主的代码后我改了下就像楼主置顶的代码那样,是可以达到题目要求的。

9楼有解释 说的挺清楚的,你可以看看 {:10_282:}

桃花飞舞 发表于 2016-5-4 13:03:18

是的,解释的还可以,我是想说,楼主的代码,我看到后可以修改,只是不会解释那样的,
页: [1]
查看完整版本: 循环数组右移